Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1v9310-0098mB-8v for pgsql-hackers@arkaria.postgresql.org; Wed, 15 Oct 2025 15:02:09 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1v930z-006vZ1-5A for pgsql-hackers@arkaria.postgresql.org; Wed, 15 Oct 2025 15:02:08 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1v930y-006vYt-Ni for pgsql-hackers@lists.postgresql.org; Wed, 15 Oct 2025 15:02:07 +0000 Received: from mail-pl1-x633.google.com ([2607:f8b0:4864:20::633]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1v930v-001v3F-2c for pgsql-hackers@postgresql.org; Wed, 15 Oct 2025 15:02:06 +0000 Received: by mail-pl1-x633.google.com with SMTP id d9443c01a7336-2697899a202so7749375ad.0 for ; Wed, 15 Oct 2025 08:02:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760540524; x=1761145324; darn=postgresql.org; h=mime-version:to:from:subject:message-id:date:from:to:cc:subject :date:message-id:reply-to; bh=kl09ApokZfOytv1HmSP7utSNudMyrsVa3cdUw4nuXyE=; b=eQdHIe3CF/1Twweg3BJRHJ9G5ixL6Yq3UHvliltvbz1sRzp8fW1DEc7C5godut+WnQ yieMX/B+3O0C2gZF4RFVYeQHgN0W7x4x4zHIWk7lxoe7IRXaMI5sGciVPuAxh4MipZQH IOg2EBADrhQA3CbwKD9/66bHnwBIM4sADVfHLr212GaqCRvOUAXHVQADXpfyOzlOKE/9 vyQV+59/MGQhDt2te+I5lDYmtno1IvAzMXvqudaFIwJVWdxUGcTOsI5bz1BIvveJ5+IG XZ7uuzLHjHUtTz9RqrAIr7KIFa/YZrKXjcf2My4QYRTjuIhkiRUchLXCVhswWBiVCbMY aH9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760540524; x=1761145324; h=mime-version:to:from:subject:message-id:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=kl09ApokZfOytv1HmSP7utSNudMyrsVa3cdUw4nuXyE=; b=FVjMH8QAX0O8092yscbU65w3rXjeDLQt4C798Blg+Gb+LSZGiFV2MYFzqQtNOW+3Pn VmwIole4Ey8xD92TEBBAdMhyxvO+Ju0JnI2AomriD5dNlZyW1d7cJZK4ODXAjPpHD4xk CPtsZO3dLvG+jLRdFBpDKoGlBK+L0OEUjM7D0oJuQi8XYLB5KcAYn8Y4DfeYp9iHXsPi WwGRYRabJgB3gvJPmlLBgYhmgYqFuIJsVCdcz1nwiRjCRQtMJwQLTu1kJRhTi1A8u7Cq i5cPQi9gCqEP7XBmRZgbYMaJxVuZyc5UCGh5x9DaRMqf2dOb2NeeWXdnXJQhnRAB517a 0Ktg== X-Gm-Message-State: AOJu0YxinWbzjWuwYTk/PS//SFRYMVSaqll5Sm/Z7oIPajf2GmcGbSDG i2NZjw8lu2foiWhVZ7lKXoPjSQWRB8HubKBEJtFufdaz5Iiz0fCR/qJ/jEAScg== X-Gm-Gg: ASbGncvKx7ObbESVum5sq8VZvxxAAUIoRMIrs7co/Ttve4r7Khni5tfsk2UG6O4Sr2/ 4zVrqAudJkE9LpFpgsPVNifba+HrxbbLpuR7kqycpvPn8kZKMivFGvRxE+XlJVovIhkWWAUXv/q UG80znStT4aYvZvR2d3sO9C8y+MD/9/Aa1ifbUSpz0QEzFf95xIaXJdtLYGokeGCwdNKR4yJa8G x/h47bVKncH6uW8VcjGM7eSDGISgySXaxURV5TkwznP1kRXxsAGo4hHJ+wkynH9j8H3CW3AhVOx 3GqugsLocMjuUg0WhHw5m0VtfADgKDgIz9B0xegTr/GDf5F36SRk0sJH4j4UKhlsl6klfCWJ9jf PLkYezlcWVAU3xTvSeWw8Hni/Br4zMdhhtJmvWZ7+XzthQsbbIvYCn+MaUZE5Tkesp8xEg7JU/E Q= X-Google-Smtp-Source: AGHT+IEzLy1eF33jPaSeBdZVNojpu8AkUd0iuEdSbZCcxB4MMu+ALw1kLdfrqV4mk9j6zCOQN7gJxw== X-Received: by 2002:a17:902:fac8:b0:271:fa2d:534c with SMTP id d9443c01a7336-29091b3c2ddmr3344925ad.22.1760540523912; Wed, 15 Oct 2025 08:02:03 -0700 (PDT) Received: from localhost ([2804:14d:328a:a59c:f10d:3e41:7f46:26f1]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-29034f09069sm199592925ad.75.2025.10.15.08.02.02 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 15 Oct 2025 08:02:03 -0700 (PDT) Content-Type: multipart/mixed; boundary=43ff612df70f2b5bf8ab53fc81e48d2d03ef4233f313cb87696a9573b948 Date: Wed, 15 Oct 2025 12:02:01 -0300 Message-Id: Subject: postgres_fdw: Use COPY to speed up batch inserts From: "Matheus Alcantara" To: Mime-Version: 1.0 X-Mailer: aerc 0.21.0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --43ff612df70f2b5bf8ab53fc81e48d2d03ef4233f313cb87696a9573b948 Content-Type: multipart/alternative; boundary=b3513e00cc083b93e584db43123a983c527ff950015d93704e49c7682d8f --b3513e00cc083b93e584db43123a983c527ff950015d93704e49c7682d8f Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Content-Type: text/plain; charset=UTF-8 Hi all, Currently on postgres_fdw we use prepared statements to insert batches into foreign tables. Although this works fine for the most use cases the COPY command can also be used in some scenarios to speed up large batch inserts. The attached patch implements this idea of using the COPY command for batch inserts on postgres_fdw foreign tables. I've performed some benchmarks using pgbench and the results seem good to consider this. I've performed the benchmark using different batch_size values to see when this optimization could be useful. The following results are the best tps of 3 runs. Command: pgbench -n -c 10 -j 10 -t 100 -f bench.sql postgres batch_size: 10 =C2=A0 =C2=A0 master tps: 76.360406 =C2=A0 =C2=A0 patch tps: 68.917109 batch_size: 100 =C2=A0 =C2=A0 master tps: 123.427731 =C2=A0 =C2=A0 patch tps: 243.737055 batch_size: 1000 =C2=A0 =C2=A0 master tps: 132.500506 =C2=A0 =C2=A0 patch tps: 239.295132 It seems that using a batch_size greater than 100 we can have a considerable speed up for batch inserts. The attached patch uses the COPY command whenever we have a *numSlots > 1 but the tests show that maybe we should have a GUC to enable this? I also think that we can have a better patch by removing the duplicated code introduced on this first version, specially on the clean up phase, but I tried to keep things more simple on this initial phase to keep the review more easier and also just to test the idea. Lastly, I don't know if we should change the EXPLAIN(ANALYZE, VERBOSE) output for batch inserts that use the COPY to mention that we are sending the COPY command to the remote server. I guess so? (this proposal is based on a patch idea written by Tomas Vondra in one of his blogs posts) -- Matheus Alcantara --b3513e00cc083b93e584db43123a983c527ff950015d93704e49c7682d8f-- --43ff612df70f2b5bf8ab53fc81e48d2d03ef4233f313cb87696a9573b948 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=v1-0001-postgres_fdw-Use-COPY-to-speed-up-batch-inserts.patch Content-Type: text/plain; charset=utf-8; name=v1-0001-postgres_fdw-Use-COPY-to-speed-up-batch-inserts.patch RnJvbSBkNDA0MTgxNGJhMzc3NDc1YTFmYTM2YjY5NzJkNWNmNWY5ODlhMzhmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXRoZXVzIEFsY2FudGFyYSA8bXRocy5kZXZAcG0ubWU+CkRh dGU6IEZyaSwgMTAgT2N0IDIwMjUgMTY6MDc6MDggLTAzMDAKU3ViamVjdDogW1BBVENIIHYxXSBw b3N0Z3Jlc19mZHc6IFVzZSBDT1BZIHRvIHNwZWVkIHVwIGJhdGNoIGluc2VydHMKCi0tLQogY29u dHJpYi9wb3N0Z3Jlc19mZHcvZGVwYXJzZS5jICAgICAgfCAgMzIgKysrKysrKysrCiBjb250cmli L3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuYyB8IDEwOCArKysrKysrKysrKysrKysrKysrKysr KysrKysrCiBjb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuaCB8ICAgMSArCiAzIGZp bGVzIGNoYW5nZWQsIDE0MSBpbnNlcnRpb25zKCspCgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wb3N0 Z3Jlc19mZHcvZGVwYXJzZS5jIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvZGVwYXJzZS5jCmluZGV4 IGU1YjVlMWE1ZjUxLi5jZDgwYmI3MzA2YSAxMDA2NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19m ZHcvZGVwYXJzZS5jCisrKyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2RlcGFyc2UuYwpAQCAtMjIz OCw2ICsyMjM4LDM4IEBAIHJlYnVpbGRJbnNlcnRTcWwoU3RyaW5nSW5mbyBidWYsIFJlbGF0aW9u IHJlbCwKIAlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1Ziwgb3JpZ19xdWVyeSArIHZhbHVlc19l bmRfbGVuKTsKIH0KIAorLyoKKyAqICBCdWlsZCBhIENPUFkgRlJPTSBTVERJTiBzdGF0ZW1lbnQg dXNpbmcgdGhlIFRFWFQgZm9ybWF0CisgKi8KK3ZvaWQKK2J1aWxkQ29weVNxbChTdHJpbmdJbmZv IGJ1ZiwgUmVsYXRpb24gcmVsLCBMaXN0ICp0YXJnZXRfYXR0cnMpCit7CisJTGlzdENlbGwgICAq bGM7CisJVHVwbGVEZXNjCXR1cGRlc2MgPSBSZWxhdGlvbkdldERlc2NyKHJlbCk7CisJYm9vbAkJ Zmlyc3QgPSB0cnVlOworCisJYXBwZW5kU3RyaW5nSW5mbyhidWYsICJDT1BZICIpOworCWRlcGFy c2VSZWxhdGlvbihidWYsIHJlbCk7CisJYXBwZW5kU3RyaW5nSW5mbyhidWYsICIoIik7CisKKwlm b3JlYWNoKGxjLCB0YXJnZXRfYXR0cnMpCisJeworCQlpbnQJCQlhdHRudW0gPSBsZmlyc3RfaW50 KGxjKTsKKwkJRm9ybV9wZ19hdHRyaWJ1dGUgYXR0ciA9IFR1cGxlRGVzY0F0dHIodHVwZGVzYywg YXR0bnVtIC0gMSk7CisKKwkJaWYgKGF0dHItPmF0dGdlbmVyYXRlZCkKKwkJCWNvbnRpbnVlOwor CisJCWlmICghZmlyc3QpCisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIiwgIik7CisK KwkJZmlyc3QgPSBmYWxzZTsKKworCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgcXVvdGVf aWRlbnRpZmllcihOYW1lU3RyKGF0dHItPmF0dG5hbWUpKSk7CisJfQorCWFwcGVuZFN0cmluZ0lu Zm9TdHJpbmcoYnVmLCAiKSBGUk9NIFNURElOIChGT1JNQVQgVEVYVCwgREVMSU1JVEVSICcsJyki KTsKK30KKwogLyoKICAqIGRlcGFyc2UgcmVtb3RlIFVQREFURSBzdGF0ZW1lbnQKICAqCmRpZmYg LS1naXQgYS9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuYyBiL2NvbnRyaWIvcG9z dGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jCmluZGV4IDQ1NmIyNjdmNzBiLi45ODVjOWJjNWJlNyAx MDA2NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmMKKysrIGIvY29u dHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmMKQEAgLTQwNjYsNiArNDA2Niw1MCBAQCBj cmVhdGVfZm9yZWlnbl9tb2RpZnkoRVN0YXRlICplc3RhdGUsCiAJcmV0dXJuIGZtc3RhdGU7CiB9 CiAKKy8qCisgKiAgV3JpdGUgdGFyZ2V0IGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSBmbXN0YXRlIGlu dG8gYnVmIGJ1ZmZlciB0byBiZSBzZW50IGFzCisgKiAgQ09QWSBGUk9NIFNURElOIGRhdGEKKyAq Lworc3RhdGljIHZvaWQKK2NvbnZlcnRfc2xvdF90b19jb3B5X3RleHQoU3RyaW5nSW5mbyBidWYs CisJCQkJCQkgIFBnRmR3TW9kaWZ5U3RhdGUgKmZtc3RhdGUsCisJCQkJCQkgIFR1cGxlVGFibGVT bG90ICpzbG90KQoreworCUxpc3RDZWxsICAgKmxjOworCVR1cGxlRGVzYwl0dXBkZXNjID0gUmVs YXRpb25HZXREZXNjcihmbXN0YXRlLT5yZWwpOworCWJvb2wJCWZpcnN0ID0gdHJ1ZTsKKworCWZv cmVhY2gobGMsIGZtc3RhdGUtPnRhcmdldF9hdHRycykKKwl7CisJCWludAkJCWF0dG51bSA9IGxm aXJzdF9pbnQobGMpOworCQlDb21wYWN0QXR0cmlidXRlICphdHRyID0gVHVwbGVEZXNjQ29tcGFj dEF0dHIodHVwZGVzYywgYXR0bnVtIC0gMSk7CisJCURhdHVtCQlkYXR1bTsKKwkJYm9vbAkJaXNu dWxsOworCisJCS8qIElnbm9yZSBnZW5lcmF0ZWQgY29sdW1uczsgdGhleSBhcmUgc2V0IHRvIERF RkFVTFQgKi8KKwkJaWYgKGF0dHItPmF0dGdlbmVyYXRlZCkKKwkJCWNvbnRpbnVlOworCisJCWlm ICghZmlyc3QpCisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIiwiKTsKKwkJZmlyc3Qg PSBmYWxzZTsKKworCQlkYXR1bSA9IHNsb3RfZ2V0YXR0cihzbG90LCBhdHRudW0sICZpc251bGwp OworCisJCWlmIChpc251bGwpCisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIlxcTiIp OworCQllbHNlCisJCXsKKwkJCWNvbnN0IGNoYXIgKnZhbHVlID0gT3V0cHV0RnVuY3Rpb25DYWxs KCZmbXN0YXRlLT5wX2ZsaW5mb1thdHRudW0gLSAxXSwKKwkJCQkJCQkJCQkJCSAgIGRhdHVtKTsK KworCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsIHZhbHVlKTsKKwkJfQorCX0KKworCWFw cGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJ1xuJyk7Cit9CisKIC8qCiAgKiBleGVjdXRlX2ZvcmVp Z25fbW9kaWZ5CiAgKgkJUGVyZm9ybSBmb3JlaWduLXRhYmxlIG1vZGlmaWNhdGlvbiBhcyByZXF1 aXJlZCwgYW5kIGZldGNoIFJFVFVSTklORwpAQCAtNDA5Nyw2ICs0MTQxLDcwIEBAIGV4ZWN1dGVf Zm9yZWlnbl9tb2RpZnkoRVN0YXRlICplc3RhdGUsCiAJaWYgKGZtc3RhdGUtPmNvbm5fc3RhdGUt PnBlbmRpbmdBcmVxKQogCQlwcm9jZXNzX3BlbmRpbmdfcmVxdWVzdChmbXN0YXRlLT5jb25uX3N0 YXRlLT5wZW5kaW5nQXJlcSk7CiAKKwkvKgorCSAqIFVzZSBDT1BZIGNvbW1hbmQgZm9yIGJhdGNo IGluc2VydCBpZiB0aGUgb3JpZ2luYWwgcXVlcnkgZG9uJ3QgaW5jbHVkZSBhCisJICogUkVUVVJO SU5HIGNsYXVzZQorCSAqLworCWlmIChvcGVyYXRpb24gPT0gQ01EX0lOU0VSVCAmJiAqbnVtU2xv dHMgPiAxICYmICFmbXN0YXRlLT5oYXNfcmV0dXJuaW5nKQorCXsKKwkJaW50CQkJaTsKKwkJU3Ry aW5nSW5mb0RhdGEgY29weV9kYXRhOworCisJCS8qIEJ1aWxkIENPUFkgY29tbWFuZCAqLworCQlp bml0U3RyaW5nSW5mbygmc3FsKTsKKwkJYnVpbGRDb3B5U3FsKCZzcWwsIGZtc3RhdGUtPnJlbCwg Zm1zdGF0ZS0+dGFyZ2V0X2F0dHJzKTsKKworCQkvKiBTZW5kIENPUFkgY29tbWFuZCAqLworCQlp ZiAoIVBRc2VuZFF1ZXJ5KGZtc3RhdGUtPmNvbm4sIHNxbC5kYXRhKSkKKwkJCXBnZmR3X3JlcG9y dF9lcnJvcihOVUxMLCBmbXN0YXRlLT5jb25uLCBzcWwuZGF0YSk7CisKKwkJLyogZ2V0IHRoZSBD T1BZIHJlc3VsdCAqLworCQlyZXMgPSBwZ2Zkd19nZXRfcmVzdWx0KGZtc3RhdGUtPmNvbm4pOwor CQlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19DT1BZX0lOKQorCQkJcGdmZHdfcmVw b3J0X2Vycm9yKHJlcywgZm1zdGF0ZS0+Y29ubiwgc3FsLmRhdGEpOworCisJCS8qIENvbnZlcnQg dGhlIFR1cGxlVGFibGVTbG90IGRhdGEgaW50byBhIFRFWFQtZm9ybWF0dGVkIGxpbmUgKi8KKwkJ aW5pdFN0cmluZ0luZm8oJmNvcHlfZGF0YSk7CisJCWZvciAoaSA9IDA7IGkgPCAqbnVtU2xvdHM7 IGkrKykKKwkJeworCQkJLyoKKwkJCSAqIFhYWChtYXRoZXVzKTogU2hvdWxkIHdlIGhhdmUgYSBD T1BZQlVGU0laIGxpbWl0IHRvIHNlbmQgbGFyZ2UKKwkJCSAqIGRhdGEgaW4gYmF0Y2hlcyBpbnN0 ZWFkIG9mIGdyb3cgdGhlIGJ1ZmZlciB0b28gbXVjaD8KKwkJCSAqLworCQkJY29udmVydF9zbG90 X3RvX2NvcHlfdGV4dCgmY29weV9kYXRhLCBmbXN0YXRlLCBzbG90c1tpXSk7CisJCX0KKworCQkv KiBTZW5kIENPUFkgZGF0YSAqLworCQlpZiAoUFFwdXRDb3B5RGF0YShmbXN0YXRlLT5jb25uLCBj b3B5X2RhdGEuZGF0YSwgY29weV9kYXRhLmxlbikgPD0gMCkKKwkJCXBnZmR3X3JlcG9ydF9lcnJv cihOVUxMLCBmbXN0YXRlLT5jb25uLCBzcWwuZGF0YSk7CisKKwkJLyogRW5kIHRoZSBDT1BZIG9w ZXJhdGlvbiAqLworCQlpZiAoUFFwdXRDb3B5RW5kKGZtc3RhdGUtPmNvbm4sIE5VTEwpIDwgMCB8 fCBQUWZsdXNoKGZtc3RhdGUtPmNvbm4pKQorCQkJcGdmZHdfcmVwb3J0X2Vycm9yKE5VTEwsIGZt c3RhdGUtPmNvbm4sIHNxbC5kYXRhKTsKKworCQkvKgorCQkgKiBHZXQgdGhlIHJlc3VsdCwgYW5k IGNoZWNrIGZvciBzdWNjZXNzLgorCQkgKi8KKwkJcmVzID0gcGdmZHdfZ2V0X3Jlc3VsdChmbXN0 YXRlLT5jb25uKTsKKwkJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0gUEdSRVNfQ09NTUFORF9P SykKKwkJCXBnZmR3X3JlcG9ydF9lcnJvcihyZXMsIGZtc3RhdGUtPmNvbm4sIHNxbC5kYXRhKTsK KworCQluX3Jvd3MgPSBhdG9pKFBRY21kVHVwbGVzKHJlcykpOworCisJCS8qIEFuZCBjbGVhbiB1 cCAqLworCQlQUWNsZWFyKHJlcyk7CisKKwkJTWVtb3J5Q29udGV4dFJlc2V0KGZtc3RhdGUtPnRl bXBfY3h0KTsKKworCQkqbnVtU2xvdHMgPSBuX3Jvd3M7CisKKwkJLyoKKwkJICogUmV0dXJuIE5V TEwgaWYgbm90aGluZyB3YXMgaW5zZXJ0ZWQvdXBkYXRlZC9kZWxldGVkIG9uIHRoZSByZW1vdGUK KwkJICogZW5kCisJCSAqLworCQlyZXR1cm4gKG5fcm93cyA+IDApID8gc2xvdHMgOiBOVUxMOwor CX0KKwogCS8qCiAJICogSWYgdGhlIGV4aXN0aW5nIHF1ZXJ5IHdhcyBkZXBhcnNlZCBhbmQgcHJl cGFyZWQgZm9yIGEgZGlmZmVyZW50IG51bWJlcgogCSAqIG9mIHJvd3MsIHJlYnVpbGQgaXQgZm9y IHRoZSBwcm9wZXIgbnVtYmVyLgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9z dGdyZXNfZmR3LmggYi9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuaAppbmRleCBl Njk3MzUyOThkNy4uYzAxOThiODY1ZjMgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3 L3Bvc3RncmVzX2Zkdy5oCisrKyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5o CkBAIC0yMDQsNiArMjA0LDcgQEAgZXh0ZXJuIHZvaWQgcmVidWlsZEluc2VydFNxbChTdHJpbmdJ bmZvIGJ1ZiwgUmVsYXRpb24gcmVsLAogCQkJCQkJCSBjaGFyICpvcmlnX3F1ZXJ5LCBMaXN0ICp0 YXJnZXRfYXR0cnMsCiAJCQkJCQkJIGludCB2YWx1ZXNfZW5kX2xlbiwgaW50IG51bV9wYXJhbXMs CiAJCQkJCQkJIGludCBudW1fcm93cyk7CitleHRlcm4gdm9pZCBidWlsZENvcHlTcWwoU3RyaW5n SW5mbyBidWYsIFJlbGF0aW9uIHJlbCwgTGlzdCAqdGFyZ2V0X2F0dHJzKTsKIGV4dGVybiB2b2lk IGRlcGFyc2VVcGRhdGVTcWwoU3RyaW5nSW5mbyBidWYsIFJhbmdlVGJsRW50cnkgKnJ0ZSwKIAkJ CQkJCQkgSW5kZXggcnRpbmRleCwgUmVsYXRpb24gcmVsLAogCQkJCQkJCSBMaXN0ICp0YXJnZXRB dHRycywKLS0gCjIuNTEuMAoK --43ff612df70f2b5bf8ab53fc81e48d2d03ef4233f313cb87696a9573b948 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=bench.sql Content-Type: application/x-sql; name=bench.sql LS0gVGFibGUgc2V0dXAKLS0gQ1JFQVRFIFRBQkxFIHQgKAotLSAgICAgaWQgaW50ZWdlciBub3Qg bnVsbCwKLS0gICAgIHZhbHVlIElOVEVHRVIgTk9UIE5VTEwsCi0tICAgICBub3RlIFRFWFQKLS0g KTsKCklOU0VSVCBJTlRPIHQgKGlkLCB2YWx1ZSwgbm90ZSkKU0VMRUNUIGdlbmVyYXRlX3Nlcmll cygxLCAxMDAwMCksCiAgICAgICByYW5kb20oKSAqIDEwMDAwMCwKICAgICAgICdiYXRjaCBpbnNl cnQgdGVzdCBkYXRhJyB8fCBnZW5lcmF0ZV9zZXJpZXMoMSwgMTAwMDApOwo= --43ff612df70f2b5bf8ab53fc81e48d2d03ef4233f313cb87696a9573b948--