aboutsummaryrefslogtreecommitdiff
path: root/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-01-09 10:55:03 +0100
committerCharles <sircharlesaze@gmail.com>2020-01-09 13:09:38 +0100
commit04d6d5ca99ebfd1cebb8ce06618fb3811fc1a8aa (patch)
tree5c691241355c943a3c68ddb06b8cf8c60aa11319 /srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test
parent7e0d85db834d6351ed85d01e5126ac31dc510b86 (diff)
downloadft_server-04d6d5ca99ebfd1cebb8ce06618fb3811fc1a8aa.tar.gz
ft_server-04d6d5ca99ebfd1cebb8ce06618fb3811fc1a8aa.tar.bz2
ft_server-04d6d5ca99ebfd1cebb8ce06618fb3811fc1a8aa.zip
phpmyadmin working
Diffstat (limited to 'srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test')
-rw-r--r--srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/DataTest.php74
-rw-r--r--srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/RefProvider.php50
-rw-r--r--srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/SearchTest.php178
-rw-r--r--srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/SlimDataTest.php59
-rw-r--r--srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/cleaner.js193
-rw-r--r--srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/data/mysql_test_case_1.html235
-rw-r--r--srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/data/mysql_test_case_2.html1211
-rw-r--r--srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/data/mysql_test_case_3.html339
-rw-r--r--srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/data/ultraSlimDataTestWithVariables.json51
-rw-r--r--srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/index.js12
-rw-r--r--srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/parser.js129
-rw-r--r--srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/phpunit.xml27
-rw-r--r--srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/templates.js218
13 files changed, 2776 insertions, 0 deletions
diff --git a/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/DataTest.php b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/DataTest.php
new file mode 100644
index 0000000..c12f576
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/DataTest.php
@@ -0,0 +1,74 @@
+<?php
+declare(strict_types = 1);
+namespace Williamdes\MariaDBMySQLKBS\Test;
+
+use \PHPUnit\Framework\TestCase;
+use \Swaggest\JsonSchema\Schema;
+use \Swaggest\JsonSchema\Context;
+use \stdClass;
+
+class DataTest extends TestCase
+{
+
+ /**
+ * Validate json data
+ *
+ * @param stdClass $contents The file contents
+ * @param string $id The schema id
+ * @example validate($slimData, "urn:williamdes:mariadb-mysql-kbs:slimdata");
+ * @return bool
+ */
+ public static function validate(stdClass $contents, string $id): bool
+ {
+ $options = new Context();
+ $options->setRemoteRefProvider(new RefProvider());
+ $schema = Schema::import($id, $options);
+ $schema->in($contents);
+ return true;// No exception occured
+ }
+
+ /**
+ * test files
+ *
+ * @return void
+ */
+ public function testFileSample(): void
+ {
+ $slimDataTestData = json_decode((string) file_get_contents(__DIR__."/data/ultraSlimDataTestWithVariables.json"));
+ $this->assertTrue(self::validate($slimDataTestData, "urn:williamdes:mariadb-mysql-kbs:ultraslimdata"));
+ }
+
+ /**
+ * test slim data
+ *
+ * @return void
+ */
+ public function testFileSlim(): void
+ {
+ $slimData = json_decode((string) file_get_contents(__DIR__."/../dist/merged-slim.json"));
+ $this->assertTrue(self::validate($slimData, "urn:williamdes:mariadb-mysql-kbs:slimdata"));
+ }
+
+ /**
+ * test ultra slim data
+ *
+ * @return void
+ */
+ public function testFileUltraSlim(): void
+ {
+ $slimData = json_decode((string) file_get_contents(__DIR__."/../dist/merged-ultraslim.json"));
+ $this->assertTrue(self::validate($slimData, "urn:williamdes:mariadb-mysql-kbs:ultraslimdata"));
+ }
+
+ /**
+ * test ultra slim data
+ *
+ * @return void
+ */
+ public function testFileRaw(): void
+ {
+ $slimData = json_decode((string) file_get_contents(__DIR__."/../dist/merged-raw.json"));
+ $this->assertTrue(self::validate($slimData, "urn:williamdes:mariadb-mysql-kbs:rawdata"));
+ }
+
+}
diff --git a/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/RefProvider.php b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/RefProvider.php
new file mode 100644
index 0000000..50b25cc
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/RefProvider.php
@@ -0,0 +1,50 @@
+<?php
+declare(strict_types = 1);
+namespace Williamdes\MariaDBMySQLKBS\Test;
+
+use \Swaggest\JsonSchema\RemoteRefProvider;
+
+class RefProvider implements RemoteRefProvider
+{
+
+ /**
+ * Preloaded urn schemas
+ *
+ * @var \stdClass[]
+ */
+ private $urnSchemas = [];
+
+ /**
+ * Create a new RefProvider instance
+ */
+ public function __construct()
+ {
+ $files = glob(__DIR__ . "/../schemas/*.json");
+ if ($files === false) {
+ return;
+ } else {
+ foreach ($files as $filename) {
+ $schema = json_decode((string) file_get_contents($filename));
+ if (isset($schema) && isset($schema->{'$id'}) && $schema !== null) {
+ $this->urnSchemas[$schema->{'$id'}] = $schema;
+ }
+ }
+ }
+ }
+
+ /**
+ * @param string $url The file url
+ * @return \stdClass|false json_decode of $url resource content
+ */
+ public function getSchemaData($url)
+ {
+ if (isset($this->urnSchemas[$url])) {// Handle urn: urls
+ return $this->urnSchemas[$url];
+ } elseif (is_file($url)) {// Handle file
+ return json_decode((string) file_get_contents($url));
+ } else {// Handle URL
+ return json_decode((string) file_get_contents(rawurldecode($url)));
+ }
+ }
+
+}
diff --git a/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/SearchTest.php b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/SearchTest.php
new file mode 100644
index 0000000..cc15ac9
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/SearchTest.php
@@ -0,0 +1,178 @@
+<?php
+declare(strict_types = 1);
+namespace Williamdes\MariaDBMySQLKBS\Test;
+
+use \PHPUnit\Framework\TestCase;
+use \Williamdes\MariaDBMySQLKBS\SlimData;
+use \Williamdes\MariaDBMySQLKBS\Search;
+use \Williamdes\MariaDBMySQLKBS\KBException;
+
+class SearchTest extends TestCase
+{
+
+ /**
+ * Load slim data
+ *
+ * @return void
+ */
+ public static function setUpBeforeClass(): void
+ {
+ $sd = new SlimData();
+ $sd->addVariable("variable-1", "boolean", true);
+ $sd->addVariable("variable-2", null, null);
+ $sd->addVariable("variable-3", null, true);
+ $variable4 = $sd->addVariable("variable-4", null, false);
+ $variable4->addDocumentation("https://mariadb.com/testurl/for/variable/4", "myanchor");
+ $variable4->addDocumentation("https://dev.mysql.com/testurl_for-variable/4", "my_anchor");
+ Search::loadTestData($sd);
+ }
+
+ /**
+ * test get by name
+ *
+ * @return void
+ */
+ public function testGetByName(): void
+ {
+ $found = Search::getByName("variable-4");
+ $this->assertEquals("https://mariadb.com/testurl/for/variable/4#myanchor", $found);
+ }
+
+ /**
+ * test get by name for MySQL
+ *
+ * @return void
+ */
+ public function testGetByNameMYSQL(): void
+ {
+ $found = Search::getByName("variable-4", Search::MYSQL);
+ $this->assertEquals("https://dev.mysql.com/testurl_for-variable/4#my_anchor", $found);
+ }
+
+ /**
+ * test get by name for MARIADB
+ *
+ * @return void
+ */
+ public function testGetByNameMARIADB(): void
+ {
+ $found = Search::getByName("variable-4", Search::MARIADB);
+ $this->assertEquals("https://mariadb.com/testurl/for/variable/4#myanchor", $found);
+ }
+
+ /**
+ * test get by name
+ *
+ *
+ * @return void
+ */
+ public function testException(): void
+ {
+ $this->expectException(KBException::class);
+ $this->expectExceptionCode(0);
+ $this->expectExceptionMessageRegExp('/(.+) does not exist for this type of documentation !/');
+ Search::getByName("variable-3", Search::MARIADB);
+ }
+
+ /**
+ * test get by name not found variable
+ *
+ *
+ * @return void
+ */
+ public function testExceptionNoFoundGetVariableType(): void
+ {
+ $this->expectException(KBException::class);
+ $this->expectExceptionCode(0);
+ $this->expectExceptionMessageRegExp('/(.+) does not exist !/');
+ Search::getVariableType("acbdefghi0202");
+ }
+
+ /**
+ * test get by name not found variable
+ *
+ *
+ * @return void
+ */
+ public function testExceptionNoFound(): void
+ {
+ $this->expectException(KBException::class);
+ $this->expectExceptionCode(0);
+ $this->expectExceptionMessageRegExp('/(.+) does not exist !/');
+ Search::getByName("acbdefghi0202", Search::MARIADB);
+ }
+
+ /**
+ * test get by name not found variable
+ *
+ *
+ * @return void
+ */
+ public function testExceptionNoFoundGetVariable(): void
+ {
+ $this->expectException(KBException::class);
+ $this->expectExceptionCode(0);
+ $this->expectExceptionMessageRegExp('/(.+) does not exist !/');
+ Search::getVariable("acbdefghi0202");
+ }
+
+ /**
+ * test load data fail
+ *
+ * @runInSeparateProcess
+ *
+ * @return void
+ */
+ public function testExceptionLoadData(): void
+ {
+ $this->expectException(KBException::class);
+ $this->expectExceptionCode(0);
+ $this->expectExceptionMessageRegExp('/(.+) does not exist !/');
+ Search::$DATA_DIR = ".";
+ Search::$loaded = false;
+ Search::loadData();
+ }
+
+ /**
+ * test get variables with dynamic status
+ *
+ * @return void
+ */
+ public function testGetVariablesWithDynamic(): void
+ {
+ $dynamic = Search::getVariablesWithDynamic(true);
+ $this->assertEquals($dynamic, Search::getDynamicVariables());
+ $static = Search::getVariablesWithDynamic(false);
+ $this->assertEquals($static, Search::getStaticVariables());
+ $this->assertEquals(2, count($dynamic));
+ $this->assertEquals(1, count($static));
+ $common = \array_intersect($dynamic, $static);
+ $this->assertEquals(0, count($common));// Impossible to be dynamic and not
+ }
+
+ /**
+ * test Exception get variable type has no type
+ *
+ *
+ * @return void
+ */
+ public function testExceptionGetVariableType(): void
+ {
+ $this->expectException(KBException::class);
+ $this->expectExceptionCode(0);
+ $this->expectExceptionMessageRegExp('/(.+) does have a known type !/');
+ Search::getVariableType("variable-2");
+ }
+
+ /**
+ * test get variable type
+ *
+ * @return void
+ */
+ public function testGetVariableType(): void
+ {
+ $type = Search::getVariableType("variable-1");
+ $this->assertEquals("boolean", $type);
+ }
+
+}
diff --git a/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/SlimDataTest.php b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/SlimDataTest.php
new file mode 100644
index 0000000..30a1d18
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/SlimDataTest.php
@@ -0,0 +1,59 @@
+<?php
+declare(strict_types = 1);
+namespace Williamdes\MariaDBMySQLKBS\Test;
+
+use \PHPUnit\Framework\TestCase;
+use \Williamdes\MariaDBMySQLKBS\SlimData;
+
+class SlimDataTest extends TestCase
+{
+
+ /**
+ * Create an instance of SlimData
+ *
+ * @return SlimData
+ */
+ public function testCreateInstance(): SlimData
+ {
+ $slimData = new SlimData();
+ $this->assertInstanceOf(SlimData::class, $slimData);
+ return $slimData;
+ }
+
+ /**
+ * Test json_encode empty object
+ *
+ * @param SlimData $slimData SlimData instance
+ * @depends testCreateInstance
+ * @return void
+ */
+ public function testToJsonEmpty(SlimData $slimData): void
+ {
+ $this->assertEquals('{"version":1}', json_encode($slimData));
+ }
+
+ /**
+ * Test json_encode with variables
+ *
+ * @param SlimData $slimData SlimData instance
+ * @depends testCreateInstance
+ * @return void
+ */
+ public function testToJsonWithVariables(SlimData $slimData): void
+ {
+ $slimData->addVariable("Test_var", "boolean", true);
+ $slimData->addVariable("another-variable", "string", false);
+ $kbe = $slimData->addVariable("doc-variable_ok", "integer", true);
+ $kbe->addDocumentation("https://example.org/williamdes/mariadb-mysql-kbs", "a_doc-variable_ok");
+ $kbe->addDocumentation("https://example.org/williamdes/mariadb-mysql-kbs", "a_href_ok");
+ $kbe->addDocumentation("https://example.org/williamdes/mariadb-mysql-kbs/_doc-variable_ok");
+ $kbe->addDocumentation("https://dev.mysql.com/");
+ $kbe->addDocumentation("https://mariadb.com/");
+ $kbe->addDocumentation("https://mariadb.com/", "anchorname");
+ $this->assertEquals(
+ file_get_contents(__DIR__."/data/ultraSlimDataTestWithVariables.json"),
+ json_encode($slimData, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)
+ );
+ }
+
+}
diff --git a/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/cleaner.js b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/cleaner.js
new file mode 100644
index 0000000..007207e
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/cleaner.js
@@ -0,0 +1,193 @@
+'use strict';
+
+const expect = require('chai').expect;
+const cleaner = require(__dirname + '/../src/cleaner');
+
+module.exports = function() {
+ suite('cleaner', function() {
+ test('clean cli html code', function(done) {
+ const cli = cleaner.cleanCli('<code>--test-argument</code>');
+ expect(cli).to.equal('--test-argument');
+ done();
+ });
+ test('clean cli html code not closed', function(done) {
+ const cli = cleaner.cleanCli('<code>--test-argument');
+ expect(cli).to.equal('--test-argument');
+ done();
+ });
+ test('clean cli nothing to clean', function(done) {
+ const cli = cleaner.cleanCli('--test-argument');
+ expect(cli).to.equal('--test-argument');
+ done();
+ });
+ test('clean cli undefined', function(done) {
+ const cli = cleaner.cleanCli(undefined);
+ expect(cli).to.equal(undefined);
+ done();
+ });
+ test('clean range undefined', function(done) {
+ const range = cleaner.cleanRange(undefined);
+ expect(range).to.deep.equal(undefined);
+ done();
+ });
+ test('clean range.from typeof object (dataset-1)', function(done) {
+ const range = cleaner.cleanRange({
+ from: null,
+ to: null,
+ });
+ expect(range).to.deep.equal({});
+ done();
+ });
+ test('clean range.from typeof object (dataset-2)', function(done) {
+ const range = cleaner.cleanRange({
+ to: null,
+ });
+ expect(range).to.deep.equal({});
+ done();
+ });
+ test('clean range.from typeof object (dataset-3)', function(done) {
+ const range = cleaner.cleanRange({
+ from: null,
+ });
+ expect(range).to.deep.equal({});
+ done();
+ });
+ test('clean range.from typeof object (dataset-4)', function(done) {
+ const range = cleaner.cleanRange({
+ from: undefined,
+ to: undefined,
+ });
+ expect(range).to.deep.equal({});
+ done();
+ });
+ test('clean range.from typeof object (dataset-5)', function(done) {
+ const range = cleaner.cleanRange({
+ to: undefined,
+ });
+ expect(range).to.deep.equal({});
+ done();
+ });
+ test('clean range.from typeof object (dataset-6)', function(done) {
+ const range = cleaner.cleanRange({
+ from: undefined,
+ });
+ expect(range).to.deep.equal({});
+ done();
+ });
+ test('clean range.from typeof object (dataset-7)', function(done) {
+ const range = cleaner.cleanRange({
+ from: NaN,
+ to: NaN,
+ });
+ expect(range).to.deep.equal({});
+ done();
+ });
+ test('clean range.from typeof int', function(done) {
+ const range = cleaner.cleanRange({
+ from: 1024,
+ });
+ expect(range).to.deep.equal({
+ from: 1024,
+ });
+ done();
+ });
+ test('clean range.from typeof string', function(done) {
+ const range = cleaner.cleanRange({
+ from: '1024',
+ });
+ expect(range).to.deep.equal({});
+ done();
+ });
+ test('clean range.to typeof int', function(done) {
+ const range = cleaner.cleanRange({
+ to: 1024,
+ });
+ expect(range).to.deep.equal({
+ to: 1024,
+ });
+ done();
+ });
+ test('clean range.to typeof string', function(done) {
+ const range = cleaner.cleanRange({
+ to: '1024',
+ });
+ expect(range).to.deep.equal({});
+ done();
+ });
+ test('clean range.to typeof object', function(done) {
+ const range = cleaner.cleanRange({
+ to: {},
+ });
+ expect(range).to.deep.equal({});
+ done();
+ });
+ test('clean range to upwards', function(done) {
+ const range = cleaner.cleanRange({
+ to: 'upwards',
+ });
+ expect(range).to.deep.equal({
+ to: 'upwards',
+ });
+ done();
+ });
+ test('clean range to upwards match', function(done) {
+ const range = cleaner.cleanRange({
+ to: '(128KB) upwards',
+ });
+ expect(range).to.deep.equal({
+ to: 'upwards',
+ });
+ done();
+ });
+ test('clean binary types in bytes', function(done) {
+ const type = cleaner.cleanType('in bytes');
+ expect(type).to.deep.equal('byte');
+ done();
+ });
+ test('clean binary types size in mb', function(done) {
+ const type = cleaner.cleanType('size in mb');
+ expect(type).to.deep.equal('byte');
+ done();
+ });
+ test('clean binary types number of bytes', function(done) {
+ const type = cleaner.cleanType('number of bytes');
+ expect(type).to.deep.equal('byte');
+ done();
+ });
+ test('clean binary types number of', function(done) {
+ const type = cleaner.cleanType('number of');
+ expect(type).to.deep.equal('integer');
+ done();
+ });
+ test('clean binary types size of', function(done) {
+ const type = cleaner.cleanType('size of');
+ expect(type).to.deep.equal('integer');
+ done();
+ });
+ test('clean binary types in microseconds', function(done) {
+ const type = cleaner.cleanType('in microseconds');
+ expect(type).to.deep.equal('integer');
+ done();
+ });
+ test('clean binary types in seconds', function(done) {
+ const type = cleaner.cleanType('in seconds');
+ expect(type).to.deep.equal('integer');
+ done();
+ });
+ test('clean wtf type', function(done) {
+ const type = cleaner.cleanType('wtf');
+ expect(type).to.deep.equal(undefined);
+ done();
+ });
+ test('clean enumeration type', function(done) {
+ const type = cleaner.cleanType('enumeration');
+ expect(type).to.deep.equal('enumeration');
+ done();
+ });
+ test('clean undefined type', function(done) {
+ const type = cleaner.cleanType(undefined);
+ expect(type).to.deep.equal(undefined);
+ done();
+ });
+ });
+};
diff --git a/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/data/mysql_test_case_1.html b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/data/mysql_test_case_1.html
new file mode 100644
index 0000000..5855c10
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/data/mysql_test_case_1.html
@@ -0,0 +1,235 @@
+<html>
+
+<div class="itemizedlist">
+ <ul class="itemizedlist" style="list-style-type: disc; ">
+ <li class="listitem">
+ <p><a name="option_mysqld_ndbcluster"></a>
+ <a class="indexterm" name="idm139716308207376"></a>
+
+ <a class="indexterm" name="idm139716308205888"></a>
+
+ <a class="link" href="mysql-cluster-options-variables.html#option_mysqld_ndbcluster"><code
+ class="option">--ndbcluster</code></a>
+ </p>
+ <div class="table">
+ <a name="ndbcluster-detailtable"></a>
+ <p class="title"><b>Table&nbsp;21.207
+ Type and value information for ndbcluster</b></p>
+ <div class="table-contents">
+ <table>
+ <colgroup>
+ <col width="35%">
+ <col width="65%">
+ </colgroup>
+ <thead>
+ <tr>
+ <th scope="col">Property</th>
+ <th scope="col">Value</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td scope="row">Name</td>
+ <td><code
+ class="literal"><a class="link" href="mysql-cluster-options-variables.html#option_mysqld_ndbcluster">ndbcluster</a></code>
+ </td>
+ </tr>
+ <tr>
+ <td scope="row">Command Line</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td scope="row">System Variable</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td scope="row">Status Variable</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td scope="row">Option File</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td scope="row">Scope</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td scope="row">Dynamic</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td scope="row">Type</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td scope="row">Default, Range</td>
+ <td>FALSE (Version: NDB 7.5-7.6)</td>
+ </tr>
+ <tr>
+ <td scope="row">Notes</td>
+ <td>
+ <p>
+ DESCRIPTION: Enable NDB Cluster (if this version
+ of MySQL supports it)
+ </p>
+ <p>
+ Disabled by
+ <a class="link"
+ href="mysql-cluster-options-variables.html#option_mysqld_skip-ndbcluster"><code
+ class="option">--skip-ndbcluster</code></a>.
+ </p>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <div class="table-contents">
+ <table cellpadding="0" cellspacing="0"
+ style="position: fixed; top: 0px; display: none; left: 431px; width: 705px;">
+ <thead>
+ <tr>
+ <th scope="col" style="width: 247px;">Property</th>
+ <th scope="col" style="width: 457px;">Value</th>
+ </tr>
+ </thead>
+ </table>
+ </div>
+
+ </div>
+ <br class="table-break">
+ <p>
+ The <a class="link" href="mysql-cluster.html"
+ title="Chapter&nbsp;21&nbsp;MySQL NDB Cluster 7.5 and NDB Cluster 7.6"><code
+ class="literal">NDBCLUSTER</code></a> storage engine
+ is necessary for using NDB Cluster. If a
+ <a class="link" href="mysqld.html" title="4.3.1&nbsp;mysqld β€” The MySQL Server"><span
+ class="command"><strong>mysqld</strong></span></a> binary includes support for the
+ <a class="link" href="mysql-cluster.html"
+ title="Chapter&nbsp;21&nbsp;MySQL NDB Cluster 7.5 and NDB Cluster 7.6"><code
+ class="literal">NDBCLUSTER</code></a> storage engine,
+ the engine is disabled by default. Use the
+ <a class="link" href="mysql-cluster-options-variables.html#option_mysqld_ndbcluster"><code
+ class="option">--ndbcluster</code></a> option to
+ enable it. Use <code class="option">--skip-ndbcluster</code> to
+ explicitly disable the engine.
+ </p>
+ <p>
+ It is not necessary or desirable to use this option
+ together with <a class="link" href="server-options.html#option_mysqld_initialize"><code
+ class="option">--initialize</code></a>.
+ Beginning with NDB 7.5.4, <code class="option">--ndbcluster</code> is
+ ignored (and the <code class="literal">NDB</code> storage engine is
+ <span class="emphasis"><em>not</em></span> enabled) if
+ <code class="option">--initialize</code> is also used. (Bug #81689,
+ Bug #23518923)
+ </p>
+ </li>
+ <li class="listitem">
+ <p><a name="option_mysqld_ndb-allow-copying-alter-table"></a>
+ <a class="indexterm" name="idm139716308160304"></a>
+
+ <a class="indexterm" name="idm139716308158800"></a>
+
+ <code class="option">--ndb-allow-copying-alter-table=[ON|OFF]</code>
+ </p>
+ <div class="table">
+ <a name="ndb-allow-copying-alter-table-detailtable"></a>
+ <p class="title"><b>Table&nbsp;21.208
+ Type and value information for ndb-allow-copying-alter-table</b></p>
+ <div class="table-contents">
+ <table>
+ <colgroup>
+ <col width="35%">
+ <col width="65%">
+ </colgroup>
+ <thead>
+ <tr>
+ <th scope="col">Property</th>
+ <th scope="col">Value</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td scope="row">Name</td>
+ <td><code
+ class="literal"><a class="link" href="mysql-cluster-options-variables.html#option_mysqld_ndb-allow-copying-alter-table">ndb-allow-copying-alter-table</a></code>
+ </td>
+ </tr>
+ <tr>
+ <td scope="row">Command Line</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td scope="row">System Variable</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td scope="row">Status Variable</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td scope="row">Option File</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td scope="row">Scope</td>
+ <td>Both</td>
+ </tr>
+ <tr>
+ <td scope="row">Dynamic</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td scope="row">Type</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td scope="row">Default, Range</td>
+ <td>ON (Version: NDB 7.5-7.6)</td>
+ </tr>
+ <tr>
+ <td scope="row">Notes</td>
+ <td>
+ <p>
+ DESCRIPTION: Set to OFF to keep ALTER TABLE from
+ using copying operations on NDB tables
+ </p>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <div class="table-contents">
+ <table cellpadding="0" cellspacing="0"
+ style="position: fixed; top: 0px; display: none; left: 431px; width: 911px;">
+ <thead>
+ <tr>
+ <th scope="col" style="width: 319px;">Property</th>
+ <th scope="col" style="width: 591px;">Value</th>
+ </tr>
+ </thead>
+ </table>
+ </div>
+
+ </div>
+ <br class="table-break">
+ <p>
+ Let <a class="link" href="alter-table.html" title="13.1.8&nbsp;ALTER TABLE Syntax"><code
+ class="literal">ALTER TABLE</code></a> and other
+ DDL statements use copying operations on
+ <code class="literal">NDB</code> tables. Set to
+ <code class="literal">OFF</code> to keep this from happening; doing
+ so may improve performance of critical applications.
+ </p>
+ </li>
+ <li class="listitem">
+ <p><a name="option_mysqld_ndb-batch-size"></a>
+ <a class="indexterm" name="idm139716308121008"></a>
+
+ <a class="indexterm" name="idm139716308119520"></a>
+
+ <code class="option">--ndb-batch-size=<em class="replaceable"><code>#</code></em></code>
+ </p>
+
+</html>
diff --git a/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/data/mysql_test_case_2.html b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/data/mysql_test_case_2.html
new file mode 100644
index 0000000..2c3c1c5
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/data/mysql_test_case_2.html
@@ -0,0 +1,1211 @@
+<html>
+<div class="itemizedlist">
+ <ul class="itemizedlist" style="list-style-type: disc; ">
+ <li class="listitem">
+ <p><a name="sysvar_binlog_gtid_simple_recovery"></a>
+ <a class="indexterm" name="idm140532554077552"></a>
+
+ <a class="indexterm" name="idm140532554076512"></a>
+
+ <a class="link" href="replication-options-gtids.html#sysvar_binlog_gtid_simple_recovery"><code
+ class="literal">binlog_gtid_simple_recovery</code></a>
+ </p>
+ <div class="informaltable">
+ <table frame="box" rules="all" summary="Properties for binlog_gtid_simple_recovery">
+ <colgroup>
+ <col width="30%">
+ <col width="70%">
+ </colgroup>
+ <thead>
+ <tr>
+ <th scope="col">Property</th>
+ <th scope="col">Value</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Command-Line Format</strong></span></td>
+ <td><code class="literal">--binlog-gtid-simple-recovery[={OFF|ON}]</code></td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>System Variable</strong></span></td>
+ <td><code
+ class="literal"><a class="link" href="replication-options-gtids.html#sysvar_binlog_gtid_simple_recovery">binlog_gtid_simple_recovery</a></code>
+ </td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Scope</strong></span></td>
+ <td>Global</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Dynamic</strong></span></td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong><a class="link"
+ href="optimizer-hints.html#optimizer-hints-set-var"
+ title="Variable-Setting Hint Syntax"><code
+ class="literal">SET_VAR</code></a> Hint Applies</strong></span></td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Type</strong></span></td>
+ <td>Boolean</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Default Value</strong></span></td>
+ <td><code class="literal">ON</code></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <p>
+ This variable controls how binary log files are iterated
+ during the search for GTIDs when MySQL starts or restarts.
+ </p>
+ <p>
+ When
+ <a class="link" href="replication-options-gtids.html#sysvar_binlog_gtid_simple_recovery"><code
+ class="literal">binlog_gtid_simple_recovery=TRUE</code></a>,
+ which is the default in MySQL 8.0, the values of
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_executed"><code
+ class="literal">gtid_executed</code></a> and
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a> are computed at
+ startup based on the values of
+ <code class="literal">Previous_gtids_log_event</code> in the most recent
+ and oldest binary log files. For a description of the
+ computation, see
+ <a class="xref" href="replication-gtids-lifecycle.html#replication-gtids-gtid-purged"
+ title="The gtid_purged System Variable">The <code class="literal">gtid_purged</code> System
+ Variable</a>. This setting
+ accesses only two binary log files during server restart. If
+ all binary logs on the server were generated using MySQL 5.7.8
+ or later,
+ <a class="link" href="replication-options-gtids.html#sysvar_binlog_gtid_simple_recovery"><code
+ class="literal">binlog_gtid_simple_recovery=TRUE</code></a>
+ can always safely be used.
+
+
+ </p>
+ <p>
+ If any binary logs from MySQL 5.7.7 or older are present on
+ the server (for example, following an upgrade of an older
+ server to MySQL 8.0), with
+ <a class="link" href="replication-options-gtids.html#sysvar_binlog_gtid_simple_recovery"><code
+ class="literal">binlog_gtid_simple_recovery=TRUE</code></a>,
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_executed"><code
+ class="literal">gtid_executed</code></a> and
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a> might be
+ initialized incorrectly in the following two situations:
+ </p>
+ <div class="itemizedlist">
+ <ul class="itemizedlist" style="list-style-type: circle; ">
+ <li class="listitem">
+ <p>
+ The newest binary log was generated by MySQL 5.7.5 or
+ earlier, and <a class="link" href="replication-options-gtids.html#sysvar_gtid_mode"><code
+ class="literal">gtid_mode</code></a>
+ was <code class="literal">ON</code> for some binary logs but
+ <code class="literal">OFF</code> for the newest binary log.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ A <code class="literal">SET @@GLOBAL.gtid_purged</code> statement
+ was issued on MySQL 5.7.7 or earlier, and the binary log
+ that was active at the time of the <code class="literal">SET
+ @@GLOBAL.gtid_purged</code> statement has not yet been
+ purged.
+
+
+ </p>
+ </li>
+ </ul>
+ </div>
+ <p>
+ If an incorrect GTID set is computed in either situation, it
+ will remain incorrect even if the server is later restarted
+ with
+ <a class="link" href="replication-options-gtids.html#sysvar_binlog_gtid_simple_recovery"><code
+ class="literal">binlog_gtid_simple_recovery=FALSE</code></a>.
+ If either of these situations apply or might apply on the
+ server, set
+ <a class="link" href="replication-options-gtids.html#sysvar_binlog_gtid_simple_recovery"><code
+ class="literal">binlog_gtid_simple_recovery=FALSE</code></a>
+ before starting or restarting the server.
+ </p>
+ <p>
+ When
+ <a class="link" href="replication-options-gtids.html#sysvar_binlog_gtid_simple_recovery"><code
+ class="literal">binlog_gtid_simple_recovery=FALSE</code></a>
+ is set, the method of computing
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_executed"><code
+ class="literal">gtid_executed</code></a> and
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a> as described in
+ <a class="xref" href="replication-gtids-lifecycle.html#replication-gtids-gtid-purged"
+ title="The gtid_purged System Variable">The <code class="literal">gtid_purged</code> System
+ Variable</a> is changed to
+ iterate the binary log files as follows:
+ </p>
+ <div class="itemizedlist">
+ <ul class="itemizedlist" style="list-style-type: circle; ">
+ <li class="listitem">
+ <p>
+ Instead of using the value of
+ <code class="literal">Previous_gtids_log_event</code> and GTID log
+ events from the newest binary log file, the computation
+ for <a class="link" href="replication-options-gtids.html#sysvar_gtid_executed"><code
+ class="literal">gtid_executed</code></a>
+ iterates from the newest binary log file, and uses the
+ value of <code class="literal">Previous_gtids_log_event</code> and
+ any GTID log events from the first binary log file where
+ it finds a <code class="literal">Previous_gtids_log_event</code>
+ value. If the server's most recent binary log files do not
+ have GTID log events, for example if
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_mode"><code
+ class="literal">gtid_mode=ON</code></a> was used but
+ the server was later changed to
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_mode"><code
+ class="literal">gtid_mode=OFF</code></a>, this
+ process can take a long time.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ Instead of using the value of
+ <code class="literal">Previous_gtids_log_event</code> from the
+ oldest binary log file, the computation for
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a> iterates from
+ the oldest binary log file, and uses the value of
+ <code class="literal">Previous_gtids_log_event</code> from the first
+ binary log file where it finds either a nonempty
+ <code class="literal">Previous_gtids_log_event</code> value, or at
+ least one GTID log event (indicating that the use of GTIDs
+ starts at that point). If the server's older binary log
+ files do not have GTID log events, for example if
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_mode"><code
+ class="literal">gtid_mode=ON</code></a> was only set
+ recently on the server, this process can take a long time.
+ </p>
+ </li>
+ </ul>
+ </div>
+ </li>
+ <li class="listitem">
+ <p><a name="sysvar_enforce_gtid_consistency"></a>
+ <a class="link" href="replication-options-gtids.html#sysvar_enforce_gtid_consistency"><code
+ class="literal">enforce_gtid_consistency</code></a>
+ </p><a class="indexterm" name="idm140532554003024"></a><a class="indexterm" name="idm140532554001920"></a>
+ <div class="informaltable">
+ <table frame="box" rules="all" summary="Properties for enforce_gtid_consistency">
+ <colgroup>
+ <col width="30%">
+ <col width="70%">
+ </colgroup>
+ <thead>
+ <tr>
+ <th scope="col">Property</th>
+ <th scope="col">Value</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Command-Line Format</strong></span></td>
+ <td><code class="literal">--enforce-gtid-consistency[=value]</code></td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>System Variable</strong></span></td>
+ <td><code
+ class="literal"><a class="link" href="replication-options-gtids.html#sysvar_enforce_gtid_consistency">enforce_gtid_consistency</a></code>
+ </td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Scope</strong></span></td>
+ <td>Global</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Dynamic</strong></span></td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong><a class="link"
+ href="optimizer-hints.html#optimizer-hints-set-var"
+ title="Variable-Setting Hint Syntax"><code
+ class="literal">SET_VAR</code></a> Hint Applies</strong></span></td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Type</strong></span></td>
+ <td>Enumeration</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Default Value</strong></span></td>
+ <td><code class="literal">OFF</code></td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Valid Values</strong></span></td>
+ <td>
+ <p class="valid-value"><code class="literal">OFF</code></p>
+ <p class="valid-value"><code class="literal">ON</code></p>
+ <p class="valid-value"><code class="literal">WARN</code></p>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <p>
+ Depending on the value of this variable, the server enforces
+ GTID consistency by allowing execution of only statements that
+ can be safely logged using a GTID. You
+ <span class="emphasis"><em>must</em></span> set this variable to
+ <code class="literal">ON</code> before enabling GTID based replication.
+ </p>
+ <p>
+ The values that
+ <a class="link" href="replication-options-gtids.html#sysvar_enforce_gtid_consistency"><code
+ class="literal">enforce_gtid_consistency</code></a> can
+ be configured to are:
+ </p>
+ <div class="itemizedlist">
+ <ul class="itemizedlist" style="list-style-type: circle; ">
+ <li class="listitem">
+ <p>
+ <code class="literal">OFF</code>: all transactions are allowed to
+ violate GTID consistency.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ <code class="literal">ON</code>: no transaction is allowed to
+ violate GTID consistency.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ <code class="literal">WARN</code>: all transactions are allowed to
+ violate GTID consistency, but a warning is generated in
+ this case.
+ </p>
+ </li>
+ </ul>
+ </div>
+ <p>
+ Only statements that can be logged using GTID safe statements
+ can be logged when
+ <a class="link" href="replication-options-gtids.html#sysvar_enforce_gtid_consistency"><code
+ class="literal">enforce_gtid_consistency</code></a> is
+ set to <code class="literal">ON</code>, so the operations listed here
+ cannot be used with this option:
+ </p>
+ <div class="itemizedlist">
+ <ul class="itemizedlist" style="list-style-type: circle; ">
+ <li class="listitem">
+ <p>
+ <a class="link" href="create-table-select.html"
+ title="13.1.20.5&nbsp;CREATE TABLE ... SELECT Syntax"><code class="literal">CREATE
+ TABLE ... SELECT</code></a> statements
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ <a class="link" href="create-table.html" title="13.1.20&nbsp;CREATE TABLE Syntax"><code
+ class="literal">CREATE
+ TEMPORARY TABLE</code></a> or
+ <a class="link" href="drop-table.html" title="13.1.32&nbsp;DROP TABLE Syntax"><code
+ class="literal">DROP TEMPORARY
+ TABLE</code></a> statements inside transactions
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ Transactions or statements that update both transactional
+ and nontransactional tables. There is an exception that
+ nontransactional DML is allowed in the same transaction or
+ in the same statement as transactional DML, if all
+ <span class="emphasis"><em>nontransactional</em></span> tables are
+ temporary.
+ </p>
+ </li>
+ </ul>
+ </div>
+ <p>
+ <a class="link" href="replication-options-gtids.html#sysvar_enforce_gtid_consistency"><code
+ class="option">--enforce-gtid-consistency</code></a> only
+ takes effect if binary logging takes place for a statement. If
+ binary logging is disabled on the server, or if statements are
+ not written to the binary log because they are removed by a
+ filter, GTID consistency is not checked or enforced for the
+ statements that are not logged.
+ </p>
+ <p>
+ For more information, see
+ <a class="xref" href="replication-gtids-restrictions.html"
+ title="17.1.3.6&nbsp;Restrictions on Replication with GTIDs">Section&nbsp;17.1.3.6, β€œRestrictions on
+ Replication with GTIDs”</a>.
+ </p>
+ <p>
+ Prior to MySQL 5.7 and in early releases in that release
+ series, the boolean
+ <a class="link" href="replication-options-gtids.html#sysvar_enforce_gtid_consistency"><code
+ class="literal">enforce_gtid_consistency</code></a>
+ defaulted to <code class="literal">OFF</code>. To maintain compatibility
+ with these earlier releases, the enumeration defaults to
+ <code class="literal">OFF</code>, and setting
+ <a class="link" href="replication-options-gtids.html#sysvar_enforce_gtid_consistency"><code
+ class="option">--enforce-gtid-consistency</code></a>
+ without a value is interpreted as setting the value to
+ <code class="literal">ON</code>. The variable also has multiple textual
+ aliases for the values: <code class="literal">0=OFF=FALSE</code>,
+ <code class="literal">1=ON=TRUE</code>,<code class="literal">2=WARN</code>. This
+ differs from other enumeration types but maintains
+ compatibility with the boolean type used in previous releases.
+ These changes impact on what is returned by the variable.
+ Using <code class="literal">SELECT @@ENFORCE_GTID_CONSISTENCY</code>,
+ <code class="literal">SHOW VARIABLES LIKE
+ 'ENFORCE_GTID_CONSISTENCY'</code>, and <code class="literal">SELECT *
+ FROM INFORMATION_SCHEMA.VARIABLES WHERE 'VARIABLE_NAME' =
+ 'ENFORCE_GTID_CONSISTENCY'</code>, all return the textual
+ form, not the numeric form. This is an incompatible change,
+ since <code class="literal">@@ENFORCE_GTID_CONSISTENCY</code> returns
+ the numeric form for booleans but returns the textual form for
+ <code class="literal">SHOW</code> and the Information Schema.
+ </p>
+ </li>
+ <li class="listitem">
+ <p><a name="sysvar_gtid_executed"></a>
+ <a class="indexterm" name="idm140532553933872"></a>
+
+ <a class="indexterm" name="idm140532553932816"></a>
+
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_executed"><code
+ class="literal">gtid_executed</code></a>
+ </p>
+ <div class="informaltable">
+ <table frame="box" rules="all" summary="Properties for gtid_executed">
+ <colgroup>
+ <col width="30%">
+ <col width="70%">
+ </colgroup>
+ <thead>
+ <tr>
+ <th scope="col">Property</th>
+ <th scope="col">Value</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td scope="row"><span class="bold"><strong>System Variable</strong></span></td>
+ <td><code
+ class="literal"><a class="link" href="replication-options-gtids.html#sysvar_gtid_executed">gtid_executed</a></code>
+ </td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>System Variable</strong></span></td>
+ <td><code
+ class="literal"><a class="link" href="replication-options-gtids.html#sysvar_gtid_executed">gtid_executed</a></code>
+ </td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Scope</strong></span></td>
+ <td>Global</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Scope</strong></span></td>
+ <td>Global, Session</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Dynamic</strong></span></td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Dynamic</strong></span></td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong><a class="link"
+ href="optimizer-hints.html#optimizer-hints-set-var"
+ title="Variable-Setting Hint Syntax"><code
+ class="literal">SET_VAR</code></a> Hint Applies</strong></span></td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong><a class="link"
+ href="optimizer-hints.html#optimizer-hints-set-var"
+ title="Variable-Setting Hint Syntax"><code
+ class="literal">SET_VAR</code></a> Hint Applies</strong></span></td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Type</strong></span></td>
+ <td>String</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <p>
+ When used with global scope, this variable contains a
+ representation of the set of all transactions executed on the
+ server and GTIDs that have been set by a
+ <a class="link" href="set-variable.html" title="13.7.6.1&nbsp;SET Syntax for Variable Assignment"><code
+ class="literal">SET</code></a>
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a> statement. This
+ is the same as the value of the
+ <code class="literal">Executed_Gtid_Set</code> column in the output of
+ <a class="link" href="show-master-status.html" title="13.7.7.23&nbsp;SHOW MASTER STATUS Syntax"><code
+ class="literal">SHOW MASTER STATUS</code></a> and
+ <a class="link" href="show-slave-status.html" title="13.7.7.34&nbsp;SHOW SLAVE STATUS Syntax"><code
+ class="literal">SHOW SLAVE STATUS</code></a>. The value of
+ this variable is a GTID set, see
+ <a class="xref" href="replication-gtids-concepts.html#replication-gtids-concepts-gtid-sets"
+ title="GTID Sets">GTID Sets</a> for
+ more information.
+ </p>
+ <p>
+ When the server starts,
+ <code class="literal">@@GLOBAL.gtid_executed</code> is initialized. See
+ <a class="link" href="replication-options-gtids.html#sysvar_binlog_gtid_simple_recovery"><code
+ class="literal">binlog_gtid_simple_recovery</code></a>
+ for more information on how binary logs are iterated to
+ populate <a class="link" href="replication-options-gtids.html#sysvar_gtid_executed"><code
+ class="literal">gtid_executed</code></a>. GTIDs
+ are then added to the set as transactions are executed, or if
+ any
+ <a class="link" href="set-variable.html" title="13.7.6.1&nbsp;SET Syntax for Variable Assignment"><code
+ class="literal">SET</code></a>
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a> statement is
+ executed.
+ </p>
+ <p>
+ The set of transactions that can be found in the binary logs
+ at any given time is equal to
+ <a class="link" href="gtid-functions.html#function_gtid-subtract"><code class="literal">GTID_SUBTRACT(@@GLOBAL.gtid_executed,
+ @@GLOBAL.gtid_purged)</code></a>; that is, to all transactions
+ in the binary log that have not yet been purged.
+ </p>
+ <p>
+ Issuing <a class="link" href="reset-master.html" title="13.4.1.2&nbsp;RESET MASTER Syntax"><code
+ class="literal">RESET MASTER</code></a> causes the
+ global value (but not the session value) of this variable to
+ be reset to an empty string. GTIDs are not otherwise removed
+ from this set other than when the set is cleared due to
+ <code class="literal">RESET MASTER</code>.
+ </p>
+ <p>
+ In some older releases, this variable could also be used with
+ session scope, where it contained a representation of the set
+ of transactions that are written to the cache in the current
+ session. The session scope is now deprecated.
+ </p>
+ </li>
+ <li class="listitem">
+ <p><a name="sysvar_gtid_executed_compression_period"></a>
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_executed_compression_period"><code
+ class="literal">gtid_executed_compression_period</code></a>
+ </p><a class="indexterm" name="idm140532553874368"></a><a class="indexterm" name="idm140532553873280"></a>
+ <div class="informaltable">
+ <table frame="box" rules="all" summary="Properties for gtid_executed_compression_period">
+ <colgroup>
+ <col width="30%">
+ <col width="70%">
+ </colgroup>
+ <thead>
+ <tr>
+ <th scope="col">Property</th>
+ <th scope="col">Value</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Command-Line Format</strong></span></td>
+ <td><code class="literal">--gtid-executed-compression-period=#</code></td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>System Variable</strong></span></td>
+ <td><code
+ class="literal"><a class="link" href="replication-options-gtids.html#sysvar_gtid_executed_compression_period">gtid_executed_compression_period</a></code>
+ </td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Scope</strong></span></td>
+ <td>Global</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Dynamic</strong></span></td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong><a class="link"
+ href="optimizer-hints.html#optimizer-hints-set-var"
+ title="Variable-Setting Hint Syntax"><code
+ class="literal">SET_VAR</code></a> Hint Applies</strong></span></td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Type</strong></span></td>
+ <td>Integer</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Default Value</strong></span></td>
+ <td><code class="literal">1000</code></td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Minimum Value</strong></span></td>
+ <td><code class="literal">0</code></td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Maximum Value</strong></span></td>
+ <td><code class="literal">4294967295</code></td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <p>
+ Compress the <code class="literal">mysql.gtid_executed</code> table each
+ time this many transactions have been processed. A setting of
+ 0 means that this table is not compressed. Since no
+ compression of the table occurs when using the binary log,
+ setting the value of the variable has no effect unless binary
+ logging is disabled.
+ </p>
+ <p>
+ See
+ <a class="xref" href="replication-gtids-concepts.html#replication-gtids-gtid-executed-table-compression"
+ title="mysql.gtid_executed Table Compression">mysql.gtid_executed Table Compression</a>,
+ for more information.
+ </p>
+ </li>
+ <li class="listitem">
+ <p><a name="sysvar_gtid_mode"></a>
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_mode"><code
+ class="literal">gtid_mode</code></a>
+ </p><a class="indexterm" name="idm140532553833104"></a><a class="indexterm" name="idm140532553832016"></a>
+ <div class="informaltable">
+ <table frame="box" rules="all" summary="Properties for gtid_mode">
+ <colgroup>
+ <col width="30%">
+ <col width="70%">
+ </colgroup>
+ <thead>
+ <tr>
+ <th scope="col">Property</th>
+ <th scope="col">Value</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Command-Line Format</strong></span></td>
+ <td><code class="literal">--gtid-mode=MODE</code></td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>System Variable</strong></span></td>
+ <td><code
+ class="literal"><a class="link" href="replication-options-gtids.html#sysvar_gtid_mode">gtid_mode</a></code>
+ </td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Scope</strong></span></td>
+ <td>Global</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Dynamic</strong></span></td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong><a class="link"
+ href="optimizer-hints.html#optimizer-hints-set-var"
+ title="Variable-Setting Hint Syntax"><code
+ class="literal">SET_VAR</code></a> Hint Applies</strong></span></td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Type</strong></span></td>
+ <td>Enumeration</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Default Value</strong></span></td>
+ <td><code class="literal">OFF</code></td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Valid Values</strong></span></td>
+ <td>
+ <p class="valid-value"><code class="literal">OFF</code></p>
+ <p class="valid-value"><code class="literal">OFF_PERMISSIVE</code></p>
+ <p class="valid-value"><code class="literal">ON_PERMISSIVE</code></p>
+ <p class="valid-value"><code class="literal">ON</code></p>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <p>
+ Controls whether GTID based logging is enabled and what type
+ of transactions the logs can contain. You must have privileges
+ sufficient to set global system variables. See
+ <a class="xref" href="system-variable-privileges.html"
+ title="5.1.9.1&nbsp;System Variable Privileges">Section&nbsp;5.1.9.1, β€œSystem Variable
+ Privileges”</a>.
+ <a class="link" href="replication-options-gtids.html#sysvar_enforce_gtid_consistency"><code
+ class="literal">enforce_gtid_consistency</code></a> must
+ be true before you can set
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_mode"><code
+ class="literal">gtid_mode=ON</code></a>. Before
+ modifying this variable, see
+ <a class="xref" href="replication-mode-change-online.html"
+ title="17.1.5&nbsp;Changing Replication Modes on Online Servers">Section&nbsp;17.1.5, β€œChanging
+ Replication Modes on Online Servers”</a>.
+ </p>
+ <p>
+ Logged transactions can be either anonymous or use GTIDs.
+ Anonymous transactions rely on binary log file and position to
+ identify specific transactions. GTID transactions have a
+ unique identifier that is used to refer to transactions. The
+ different modes are:
+ </p>
+ <div class="itemizedlist">
+ <ul class="itemizedlist" style="list-style-type: circle; ">
+ <li class="listitem">
+ <p>
+ <code class="literal">OFF</code>: Both new and replicated
+ transactions must be anonymous.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ <code class="literal">OFF_PERMISSIVE</code>: New transactions are
+ anonymous. Replicated transactions can be either anonymous
+ or GTID transactions.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ <code class="literal">ON_PERMISSIVE</code>: New transactions are
+ GTID transactions. Replicated transactions can be either
+ anonymous or GTID transactions.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ <code class="literal">ON</code>: Both new and replicated
+ transactions must be GTID transactions.
+ </p>
+ </li>
+ </ul>
+ </div>
+ <p>
+ Changes from one value to another can only be one step at a
+ time. For example, if
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_mode"><code
+ class="literal">gtid_mode</code></a> is currently set to
+ <code class="literal">OFF_PERMISSIVE</code>, it is possible to change to
+ <code class="literal">OFF</code> or <code class="literal">ON_PERMISSIVE</code> but
+ not to <code class="literal">ON</code>.
+ </p>
+ <p>
+ The values of <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a> and
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_executed"><code
+ class="literal">gtid_executed</code></a> are persistent
+ regardless of the value of
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_mode"><code
+ class="literal">gtid_mode</code></a>. Therefore even
+ after changing the value of
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_mode"><code
+ class="literal">gtid_mode</code></a>, these variables
+ contain the correct values.
+ </p>
+ </li>
+ <li class="listitem">
+ <p><a name="sysvar_gtid_next"></a>
+ <a class="indexterm" name="idm140532553773568"></a>
+
+ <a class="indexterm" name="idm140532553772512"></a>
+
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_next"><code
+ class="literal">gtid_next</code></a>
+ </p>
+ <div class="informaltable">
+ <table frame="box" rules="all" summary="Properties for gtid_next">
+ <colgroup>
+ <col width="30%">
+ <col width="70%">
+ </colgroup>
+ <thead>
+ <tr>
+ <th scope="col">Property</th>
+ <th scope="col">Value</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td scope="row"><span class="bold"><strong>System Variable</strong></span></td>
+ <td><code
+ class="literal"><a class="link" href="replication-options-gtids.html#sysvar_gtid_next">gtid_next</a></code>
+ </td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Scope</strong></span></td>
+ <td>Session</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Dynamic</strong></span></td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong><a class="link"
+ href="optimizer-hints.html#optimizer-hints-set-var"
+ title="Variable-Setting Hint Syntax"><code
+ class="literal">SET_VAR</code></a> Hint Applies</strong></span></td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Type</strong></span></td>
+ <td>Enumeration</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Default Value</strong></span></td>
+ <td><code class="literal">AUTOMATIC</code></td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Valid Values</strong></span></td>
+ <td>
+ <p class="valid-value"><code class="literal">AUTOMATIC</code></p>
+ <p class="valid-value"><code class="literal">ANONYMOUS</code></p>
+ <p class="valid-value"><code class="literal">UUID:NUMBER</code></p>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <p>
+ This variable is used to specify whether and how the next GTID
+ is obtained.
+ </p>
+ <p>
+ Setting the session value of this system variable is a
+ restricted operation. The session user must have either the
+ <a class="link" href="privileges-provided.html#priv_replication-applier"><code
+ class="literal">REPLICATION_APPLIER</code></a> privilege
+ (see <a class="xref" href="replication-privilege-checks.html"
+ title="17.3.3&nbsp;Replication Privilege Checks">Section&nbsp;17.3.3, β€œReplication Privilege
+ Checks”</a>), or
+ privileges sufficient to set restricted session variables (see
+ <a class="xref" href="system-variable-privileges.html"
+ title="5.1.9.1&nbsp;System Variable Privileges">Section&nbsp;5.1.9.1, β€œSystem Variable
+ Privileges”</a>).
+ </p>
+ <p>
+ <code class="literal">gtid_next</code> can take any of the following
+ values:
+ </p>
+ <div class="itemizedlist">
+ <ul class="itemizedlist" style="list-style-type: circle; ">
+ <li class="listitem">
+ <p>
+ <code class="literal">AUTOMATIC</code>: Use the next
+ automatically-generated global transaction ID.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ <code class="literal">ANONYMOUS</code>: Transactions do not have
+ global identifiers, and are identified by file and
+ position only.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ A global transaction ID in
+ <em class="replaceable"><code>UUID</code></em>:<em
+ class="replaceable"><code>NUMBER</code></em>
+ format.
+ </p>
+ </li>
+ </ul>
+ </div>
+ <p>
+ Exactly which of the above options are valid depends on the
+ setting of <a class="link" href="replication-options-gtids.html#sysvar_gtid_mode"><code
+ class="literal">gtid_mode</code></a>, see
+ <a class="xref" href="replication-mode-change-online-concepts.html"
+ title="17.1.5.1&nbsp;Replication Mode Concepts">Section&nbsp;17.1.5.1, β€œReplication Mode
+ Concepts”</a> for
+ more information. Setting this variable has no effect if
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_mode"><code
+ class="literal">gtid_mode</code></a> is
+ <code class="literal">OFF</code>.
+ </p>
+ <p>
+ After this variable has been set to
+ <em class="replaceable"><code>UUID</code></em>:<em class="replaceable"><code>NUMBER</code></em>,
+ and a transaction has been committed or rolled back, an
+ explicit <code class="literal">SET GTID_NEXT</code> statement must again
+ be issued before any other statement.
+ </p>
+ <p>
+ <a class="link" href="drop-table.html" title="13.1.32&nbsp;DROP TABLE Syntax"><code
+ class="literal">DROP TABLE</code></a> or
+ <a class="link" href="drop-table.html" title="13.1.32&nbsp;DROP TABLE Syntax"><code class="literal">DROP TEMPORARY
+ TABLE</code></a> fails with an explicit error when used on a
+ combination of nontemporary tables with temporary tables, or
+ of temporary tables using transactional storage engines with
+ temporary tables using nontransactional storage engines.
+ </p>
+ </li>
+ <li class="listitem">
+ <p><a name="sysvar_gtid_owned"></a>
+ <a class="indexterm" name="idm140532553718736"></a>
+
+ <a class="indexterm" name="idm140532553717680"></a>
+
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_owned"><code
+ class="literal">gtid_owned</code></a>
+ </p>
+ <div class="informaltable">
+ <table frame="box" rules="all" summary="Properties for gtid_owned">
+ <colgroup>
+ <col width="30%">
+ <col width="70%">
+ </colgroup>
+ <thead>
+ <tr>
+ <th scope="col">Property</th>
+ <th scope="col">Value</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td scope="row"><span class="bold"><strong>System Variable</strong></span></td>
+ <td><code
+ class="literal"><a class="link" href="replication-options-gtids.html#sysvar_gtid_owned">gtid_owned</a></code>
+ </td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Scope</strong></span></td>
+ <td>Global, Session</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Dynamic</strong></span></td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong><a class="link"
+ href="optimizer-hints.html#optimizer-hints-set-var"
+ title="Variable-Setting Hint Syntax"><code
+ class="literal">SET_VAR</code></a> Hint Applies</strong></span></td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Type</strong></span></td>
+ <td>String</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <p>
+ This read-only variable is primarily for internal use. Its
+ contents depend on its scope.
+ </p>
+ <div class="itemizedlist">
+ <ul class="itemizedlist" style="list-style-type: circle; ">
+ <li class="listitem">
+ <p>
+ When used with global scope,
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_owned"><code
+ class="literal">gtid_owned</code></a> holds a list
+ of all the GTIDs that are currently in use on the server,
+ with the IDs of the threads that own them. This variable
+ is mainly useful for a multi-threaded replication slave to
+ check whether a transaction is already being applied on
+ another thread. An applier thread takes ownership of a
+ transaction's GTID all the time it is processing the
+ transaction, so <code class="literal">@@global.gtid_owned</code>
+ shows the GTID and owner for the duration of processing.
+ When a transaction has been committed (or rolled back),
+ the applier thread releases ownership of the GTID.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ When used with session scope,
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_owned"><code
+ class="literal">gtid_owned</code></a> holds a single
+ GTID that is currently in use by and owned by this
+ session. This variable is mainly useful for testing and
+ debugging the use of GTIDs when the client has explicitly
+ assigned a GTID for the transaction by setting
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_next"><code
+ class="literal">gtid_next</code></a>. In this case,
+ <code class="literal">@@session.gtid_owned</code> displays the GTID
+ all the time the client is processing the transaction,
+ until the transaction has been committed (or rolled back).
+ When the client has finished processing the transaction,
+ the variable is cleared. If
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_next"><code
+ class="literal">gtid_next=AUTOMATIC</code></a> is
+ used for the session,
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_owned"><code
+ class="literal">gtid_owned</code></a> is only
+ populated briefly during the execution of the commit
+ statement for the transaction, so it cannot be observed
+ from the session concerned, although it will be listed if
+ <code class="literal">@@global.gtid_owned</code> is read at the
+ right point. If you have a requirement to track the GTIDs
+ that are handled by a client in a session, you can enable
+ the session state tracker controlled by the
+ <a class="link" href="server-system-variables.html#sysvar_session_track_gtids"><code
+ class="literal">session_track_gtids</code></a>
+ system variable.
+ </p>
+ </li>
+ </ul>
+ </div>
+ </li>
+ <li class="listitem">
+ <p><a name="sysvar_gtid_purged"></a>
+ <a class="indexterm" name="idm140532553678512"></a>
+
+ <a class="indexterm" name="idm140532553677504"></a>
+
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a>
+ </p>
+ <div class="informaltable">
+ <table frame="box" rules="all" summary="Properties for gtid_purged">
+ <colgroup>
+ <col width="30%">
+ <col width="70%">
+ </colgroup>
+ <thead>
+ <tr>
+ <th scope="col">Property</th>
+ <th scope="col">Value</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td scope="row"><span class="bold"><strong>System Variable</strong></span></td>
+ <td><code
+ class="literal"><a class="link" href="replication-options-gtids.html#sysvar_gtid_purged">gtid_purged</a></code>
+ </td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Scope</strong></span></td>
+ <td>Global</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Dynamic</strong></span></td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong><a class="link"
+ href="optimizer-hints.html#optimizer-hints-set-var"
+ title="Variable-Setting Hint Syntax"><code
+ class="literal">SET_VAR</code></a> Hint Applies</strong></span></td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td scope="row"><span class="bold"><strong>Type</strong></span></td>
+ <td>String</td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <p>
+ The global value of the
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a> system variable
+ (<code class="literal">@@GLOBAL.gtid_purged</code>) is a GTID set
+ consisting of the GTIDs of all the transactions that have been
+ committed on the server, but do not exist in any binary log
+ file on the server.
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a> is a subset of
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_executed"><code
+ class="literal">gtid_executed</code></a>. The following
+ categories of GTIDs are in
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a>:
+ </p>
+ <div class="itemizedlist">
+ <ul class="itemizedlist" style="list-style-type: circle; ">
+ <li class="listitem">
+ <p>
+ GTIDs of replicated transactions that were committed with
+ binary logging disabled on the slave.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ GTIDs of transactions that were written to a binary log
+ file that has now been purged.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ GTIDs that were added explicitly to the set by the
+ statement <code class="literal">SET @@GLOBAL.gtid_purged</code>.
+ </p>
+ </li>
+ </ul>
+ </div>
+ <p>
+ When the server starts, the global value of
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a> is initialized to
+ a set of GTIDs. For information on how this GTID set is
+ computed, see <a class="xref" href="replication-gtids-lifecycle.html#replication-gtids-gtid-purged"
+ title="The gtid_purged System Variable">The <code class="literal">gtid_purged</code> System
+ Variable</a>.
+ If binary logs from MySQL 5.7.7 or older are present on the
+ server, you might need to set
+ <a class="link" href="replication-options-gtids.html#sysvar_binlog_gtid_simple_recovery"><code
+ class="literal">binlog_gtid_simple_recovery=FALSE</code></a>
+ in the server's configuration file to produce the correct
+ computation. See the description for
+ <a class="link" href="replication-options-gtids.html#sysvar_binlog_gtid_simple_recovery"><code
+ class="literal">binlog_gtid_simple_recovery</code></a>
+ for details of the situations in which this setting is needed.
+ </p>
+ <p>
+ Issuing <a class="link" href="reset-master.html" title="13.4.1.2&nbsp;RESET MASTER Syntax"><code
+ class="literal">RESET MASTER</code></a> causes the
+ value of <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a> to be
+ reset to an empty string.
+ </p>
+ <p>
+ You can set the value of
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a> in order to
+ record on the server that the transactions in a certain GTID
+ set have been applied, although they do not exist in any
+ binary log on the server. An example use case for this action
+ is when you are restoring a backup of one or more databases on
+ a server, but you do not have the relevant binary logs
+ containing the transactions on the server.
+ </p>
+ <p>
+ From MySQL 8.0, there are two ways to set the value of
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a>. You can either
+ replace the value of
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a> with your
+ specified GTID set, or you can append your specified GTID set
+ to the GTID set that is already held by
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a>. If the server
+ has no existing GTIDs, for example an empty server that you
+ are provisioning with a backup of an existing database, both
+ methods have the same result. If you are restoring a backup
+ that overlaps the transactions that are already on the server,
+ for example replacing a corrupted table with a partial dump
+ from the master made using <a class="link" href="mysqldump.html"
+ title="4.5.4&nbsp;mysqldump β€” A Database Backup Program"><span
+ class="command"><strong>mysqldump</strong></span></a> (which
+ includes the GTIDs of all the transactions on the server, even
+ though the dump is partial), use the first method of replacing
+ the value of <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a>. If
+ you are restoring a backup that is disjoint from the
+ transactions that are already on the server, for example
+ provisioning a multi-source replication slave using dumps from
+ two different servers, use the second method of adding to the
+ value of <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a>.
+ </p>
+ <div class="itemizedlist">
+ <ul class="itemizedlist" style="list-style-type: circle; ">
+ <li class="listitem">
+ <p>
+ To replace the value of
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a> with your
+ specified GTID set, use the following statement:
+ </p>
+ <div class="copytoclipboard-wrapper" style="position: relative;">
+ <pre
+ class="programlisting line-numbers one-line language-sql"><div class="docs-select-all right" id="sa5949024"><div class="copy-help left">Press CTRL+C to copy</div> <div class="right"><button class="clipboard-btn" title="Copy to Clipboard"><span class="icon-clipboard"></span></button></div></div><code class=" language-sql"><span class="token keyword">SET</span> <span class="token variable">@@GLOBAL.gtid_purged</span> <span class="token operator">=</span> <span class="token string">'gtid_set'</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>
+ </div>
+ <p>
+ <code class="literal">gtid_set</code> must be a superset of the
+ current value of
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a>, and must not
+ intersect with
+ <code class="literal">gtid_subtract(gtid_executed,gtid_purged)</code>.
+ In other words, the new GTID set
+ <span class="bold"><strong>must</strong></span> include any GTIDs
+ that were already in
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a>, and
+ <span class="bold"><strong>must not</strong></span> include any
+ GTIDs in <a class="link" href="replication-options-gtids.html#sysvar_gtid_executed"><code
+ class="literal">gtid_executed</code></a>
+ that have not yet been purged. <code class="literal">gtid_set</code>
+ also cannot include any GTIDs that are in
+ <code class="literal">@@global.gtid_owned</code>, that is, the GTIDs
+ for transactions that are currently being processed on the
+ server.
+ </p>
+ <p>
+ The result is that the global value of
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a> is set equal
+ to <code class="literal">gtid_set</code>, and the value of
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_executed"><code
+ class="literal">gtid_executed</code></a> becomes the
+ union of <code class="literal">gtid_set</code> and the previous
+ value of <a class="link" href="replication-options-gtids.html#sysvar_gtid_executed"><code
+ class="literal">gtid_executed</code></a>.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ To append your specified GTID set to
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a>, use the
+ following statement with a plus sign (+) before the GTID
+ set:
+ </p>
+ <div class="copytoclipboard-wrapper" style="position: relative;">
+ <pre
+ class="programlisting line-numbers one-line language-sql"><div class="docs-select-all right" id="sa42319597"><div class="copy-help left">Press CTRL+C to copy</div> <div class="right"><button class="clipboard-btn" title="Copy to Clipboard"><span class="icon-clipboard"></span></button></div></div><code class=" language-sql"><span class="token keyword">SET</span> <span class="token variable">@@GLOBAL.gtid_purged</span> <span class="token operator">=</span> <span class="token string">'+gtid_set'</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>
+ </div>
+ <p>
+ <code class="literal">gtid_set</code> <span class="bold"><strong>must
+ not</strong></span> intersect with the current value of
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_executed"><code
+ class="literal">gtid_executed</code></a>. In other
+ words, the new GTID set must not include any GTIDs in
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_executed"><code
+ class="literal">gtid_executed</code></a>, including
+ transactions that are already also in
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a>.
+ <code class="literal">gtid_set</code> also cannot include any GTIDs
+ that are in <code class="literal">@@global.gtid_owned</code>, that
+ is, the GTIDs for transactions that are currently being
+ processed on the server.
+ </p>
+ <p>
+ The result is that <code class="literal">gtid_set</code> is added to
+ both <a class="link" href="replication-options-gtids.html#sysvar_gtid_executed"><code
+ class="literal">gtid_executed</code></a> and
+ <a class="link" href="replication-options-gtids.html#sysvar_gtid_purged"><code
+ class="literal">gtid_purged</code></a>.
+ </p>
+ </li>
+ </ul>
+ </div>
+ </li>
+ </ul>
+</div>
+
+</html>
diff --git a/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/data/mysql_test_case_3.html b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/data/mysql_test_case_3.html
new file mode 100644
index 0000000..8e48a2b
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/data/mysql_test_case_3.html
@@ -0,0 +1,339 @@
+<html>
+<div class="itemizedlist">
+ <ul class="itemizedlist" style="list-style-type: disc; ">
+ <li class="listitem"><a name="sysvar_ndb_join_pushdown"></a><a class="indexterm"
+ name="idm139716306421824"></a><a class="indexterm" name="idm139716306420752"></a><a class="indexterm"
+ name="idm139716306419680"></a>
+ <p>
+ <a class="link" href="mysql-cluster-options-variables.html#sysvar_ndb_join_pushdown"><code
+ class="literal">ndb_join_pushdown</code></a>
+ </p>
+ <div class="table">
+ <a name="ndb_join_pushdown-detailtable"></a>
+ <p class="title"><b>Table&nbsp;21.249
+ Type and value information for ndb_join_pushdown</b></p>
+ <div class="table-contents">
+ <table>
+ <colgroup>
+ <col width="35%">
+ <col width="65%">
+ </colgroup>
+ <thead>
+ <tr>
+ <th scope="col">Property</th>
+ <th scope="col">Value</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td scope="row">Name</td>
+ <td><code
+ class="literal"><a class="link" href="mysql-cluster-options-variables.html#sysvar_ndb_join_pushdown">ndb_join_pushdown</a></code>
+ </td>
+ </tr>
+ <tr>
+ <td scope="row">Command Line</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td scope="row">System Variable</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td scope="row">Status Variable</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td scope="row">Option File</td>
+ <td>No</td>
+ </tr>
+ <tr>
+ <td scope="row">Scope</td>
+ <td>Both</td>
+ </tr>
+ <tr>
+ <td scope="row">Dynamic</td>
+ <td>Yes</td>
+ </tr>
+ <tr>
+ <td scope="row">Type</td>
+ <td></td>
+ </tr>
+ <tr>
+ <td scope="row">Default, Range</td>
+ <td>TRUE (Version: 5.1.51-ndb-7.2.0)</td>
+ </tr>
+ <tr>
+ <td scope="row">Notes</td>
+ <td>
+ <p>
+ DESCRIPTION: Enables pushing down of joins to data
+ nodes
+ </p>
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ <div class="table-contents">
+ <table cellpadding="0" cellspacing="0"
+ style="position: fixed; top: 0px; display: none; left: 431px; width: 594px;">
+ <thead>
+ <tr>
+ <th scope="col" style="width: 208px;">Property</th>
+ <th scope="col" style="width: 385px;">Value</th>
+ </tr>
+ </thead>
+ </table>
+ </div>
+
+ </div>
+ <br class="table-break">
+ <p>
+ This variable controls whether joins on
+ <a class="link" href="mysql-cluster.html"
+ title="Chapter&nbsp;21&nbsp;MySQL NDB Cluster 7.5 and NDB Cluster 7.6"><code
+ class="literal">NDB</code></a> tables are pushed down to
+ the NDB kernel (data nodes). Previously, a join was
+ handled using multiple accesses of
+ <a class="link" href="mysql-cluster.html"
+ title="Chapter&nbsp;21&nbsp;MySQL NDB Cluster 7.5 and NDB Cluster 7.6"><code
+ class="literal">NDB</code></a> by the SQL node; however,
+ when <a class="link" href="mysql-cluster-options-variables.html#sysvar_ndb_join_pushdown"><code
+ class="literal">ndb_join_pushdown</code></a> is
+ enabled, a pushable join is sent in its entirety to the
+ data nodes, where it can be distributed among the data
+ nodes and executed in parallel on multiple copies of the
+ data, with a single, merged result being returned to
+ <a class="link" href="mysqld.html" title="4.3.1&nbsp;mysqld β€” The MySQL Server"><span
+ class="command"><strong>mysqld</strong></span></a>. This can reduce greatly the
+ number of round trips between an SQL node and the data
+ nodes required to handle such a join.
+ </p>
+ <p>
+ By default,
+ <a class="link" href="mysql-cluster-options-variables.html#sysvar_ndb_join_pushdown"><code
+ class="literal">ndb_join_pushdown</code></a> is
+ enabled.
+ </p>
+ <p><a name="ndb_join_pushdown-conditions"></a><b>Conditions for NDB pushdown joins.&nbsp;</b>
+ In order for a join to be pushable, it must meet the
+ following conditions:
+ </p>
+ <div class="orderedlist">
+ <ol class="orderedlist" type="1">
+ <li class="listitem">
+ <p>
+ Only columns can be compared, and all columns to be
+ joined must use <span class="emphasis"><em>exactly</em></span> the same
+ data type.
+ </p>
+ <p>
+ This means that expressions such as <code class="literal">t1.a =
+ t2.a + <em class="replaceable"><code>constant</code></em></code>
+ cannot be pushed down, and that (for example) a join
+ on an <a class="link" href="integer-types.html"
+ title="11.2.1&nbsp;Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT"><code
+ class="literal">INT</code></a> column and a
+ <a class="link" href="integer-types.html"
+ title="11.2.1&nbsp;Integer Types (Exact Value) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT"><code
+ class="literal">BIGINT</code></a> column also
+ cannot be pushed down.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ Queries referencing
+ <a class="link" href="blob.html" title="11.4.3&nbsp;The BLOB and TEXT Types"><code
+ class="literal">BLOB</code></a> or
+ <a class="link" href="blob.html" title="11.4.3&nbsp;The BLOB and TEXT Types"><code
+ class="literal">TEXT</code></a> columns are not
+ supported.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ Explicit locking is not supported; however, the
+ <a class="link" href="mysql-cluster.html"
+ title="Chapter&nbsp;21&nbsp;MySQL NDB Cluster 7.5 and NDB Cluster 7.6"><code
+ class="literal">NDB</code></a> storage engine's
+ characteristic implicit row-based locking is enforced.
+ </p>
+ <p>
+ This means that a join using <code class="literal">FOR
+ UPDATE</code> cannot be pushed down.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ In order for a join to be pushed down, child tables in
+ the join must be accessed using one of the
+ <a class="link" href="explain-output.html#jointype_ref"><code
+ class="literal">ref</code></a>,
+ <a class="link" href="explain-output.html#jointype_eq_ref"><code
+ class="literal">eq_ref</code></a>,&nbsp;or&nbsp;
+ <a class="link" href="explain-output.html#jointype_const"><code
+ class="literal">const</code></a>&nbsp;access&nbsp;methods,
+ or some combination of these methods.
+ </p>
+ <p>
+ Outer joined child tables can only be pushed using
+ <a class="link" href="explain-output.html#jointype_eq_ref"><code
+ class="literal">eq_ref</code></a>.
+ </p>
+ <p>
+ If the root of the pushed join is an
+ <a class="link" href="explain-output.html#jointype_eq_ref"><code
+ class="literal">eq_ref</code></a> or
+ <a class="link" href="explain-output.html#jointype_const"><code
+ class="literal">const</code></a>, only child
+ tables joined by
+ <a class="link" href="explain-output.html#jointype_eq_ref"><code
+ class="literal">eq_ref</code></a> can be
+ appended. (A table joined by
+ <a class="link" href="explain-output.html#jointype_ref"><code class="literal">ref</code></a>
+ is likely to
+ become the root of another pushed join.)
+ </p>
+ <p>
+ If the query optimizer decides on <code class="literal">Using join
+ cache</code> for a candidate child table, that
+ table cannot be pushed as a child. However, it may be
+ the root of another set of pushed tables.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ Joins referencing tables explicitly partitioned by
+ <code class="literal">[LINEAR] HASH</code>,
+ <code class="literal">LIST</code>, or <code class="literal">RANGE</code>
+ currently cannot be pushed down.
+ </p>
+ </li>
+ </ol>
+ </div>
+ <p>
+ You can see whether a given join can be pushed down by
+ checking it with <a class="link" href="explain.html" title="13.8.2&nbsp;EXPLAIN Syntax"><code
+ class="literal">EXPLAIN</code></a>;
+ when the join can be pushed down, you can see references
+ to the <code class="literal">pushed join</code> in the
+ <code class="literal">Extra</code> column of the output, as shown in
+ this example:
+ </p>
+ <div class="copytoclipboard-wrapper" style="position: relative;">
+ <pre
+ class="programlisting line-numbers language-sql"><div class="docs-select-all right" id="sa30355511"><div class="copy-help left">Press CTRL+C to copy</div> <div class="right"><button class="clipboard-btn" title="Copy to Clipboard"><span class="icon-clipboard"></span></button></div></div><code class=" language-sql"><span class="token prompt">mysql&gt;</span> <span class="token keyword">EXPLAIN</span>
+ <span class="token prompt"> -&gt;</span> <span class="token keyword">SELECT</span> e<span class="token punctuation">.</span>first_name<span class="token punctuation">,</span> e<span class="token punctuation">.</span>last_name<span class="token punctuation">,</span> t<span class="token punctuation">.</span>title<span class="token punctuation">,</span> d<span class="token punctuation">.</span>dept_name
+ <span class="token prompt"> -&gt;</span> <span class="token keyword">FROM</span> employees e
+ <span class="token prompt"> -&gt;</span> <span class="token keyword">JOIN</span> dept_emp de <span class="token keyword">ON</span> e<span class="token punctuation">.</span>emp_no<span class="token operator">=</span>de<span class="token punctuation">.</span>emp_no
+ <span class="token prompt"> -&gt;</span> <span class="token keyword">JOIN</span> departments d <span class="token keyword">ON</span> d<span class="token punctuation">.</span>dept_no<span class="token operator">=</span>de<span class="token punctuation">.</span>dept_no
+ <span class="token prompt"> -&gt;</span> <span class="token keyword">JOIN</span> titles t <span class="token keyword">ON</span> e<span class="token punctuation">.</span>emp_no<span class="token operator">=</span>t<span class="token punctuation">.</span>emp_no\G
+ <span class="token output"><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span> 1. row <span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span>
+ id<span class="token punctuation">:</span> 1
+ select_type<span class="token punctuation">:</span> SIMPLE
+ table<span class="token punctuation">:</span> d
+ type<span class="token punctuation">:</span> ALL
+ possible_keys<span class="token punctuation">:</span> PRIMARY
+ key<span class="token punctuation">:</span> NULL
+ key_len<span class="token punctuation">:</span> NULL
+ ref<span class="token punctuation">:</span> NULL
+ rows<span class="token punctuation">:</span> 9
+ Extra<span class="token punctuation">:</span> Parent of 4 pushed join@1
+ <span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span> 2. row <span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span>
+ id<span class="token punctuation">:</span> 1
+ select_type<span class="token punctuation">:</span> SIMPLE
+ table<span class="token punctuation">:</span> de
+ type<span class="token punctuation">:</span> ref
+ possible_keys<span class="token punctuation">:</span> PRIMARY,emp_no,dept_no
+ key<span class="token punctuation">:</span> dept_no
+ key_len<span class="token punctuation">:</span> 4
+ ref<span class="token punctuation">:</span> employees.d.dept_no
+ rows<span class="token punctuation">:</span> 5305
+ Extra<span class="token punctuation">:</span> Child of 'd' in pushed join@1
+ <span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span> 3. row <span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span>
+ id<span class="token punctuation">:</span> 1
+ select_type<span class="token punctuation">:</span> SIMPLE
+ table<span class="token punctuation">:</span> e
+ type<span class="token punctuation">:</span> eq_ref
+ possible_keys<span class="token punctuation">:</span> PRIMARY
+ key<span class="token punctuation">:</span> PRIMARY
+ key_len<span class="token punctuation">:</span> 4
+ ref<span class="token punctuation">:</span> employees.de.emp_no
+ rows<span class="token punctuation">:</span> 1
+ Extra<span class="token punctuation">:</span> Child of 'de' in pushed join@1
+ <span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span> 4. row <span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span><span class="token punctuation">*</span>
+ id<span class="token punctuation">:</span> 1
+ select_type<span class="token punctuation">:</span> SIMPLE
+ table<span class="token punctuation">:</span> t
+ type<span class="token punctuation">:</span> ref
+ possible_keys<span class="token punctuation">:</span> PRIMARY,emp_no
+ key<span class="token punctuation">:</span> emp_no
+ key_len<span class="token punctuation">:</span> 4
+ ref<span class="token punctuation">:</span> employees.de.emp_no
+ rows<span class="token punctuation">:</span> 19
+ Extra<span class="token punctuation">:</span> Child of 'e' in pushed join@1
+ </span><span class="token output">4 rows in set (0.00 sec)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>
+ </div>
+ <div class="note" style="margin-left: 0.5in; margin-right: 0.5in;">
+
+ <div class="admon-title">
+ Note
+ </div>
+ <p>
+ If inner joined child tables are joined by
+ <a class="link" href="explain-output.html#jointype_ref"><code class="literal">ref</code></a>,
+ <span class="emphasis"><em>and</em></span> the result is ordered or
+ grouped by a sorted index, this index cannot provide
+ sorted rows, which forces writing to a sorted tempfile.
+ </p>
+ </div>
+ <p>
+ Two additional sources of information about pushed join
+ performance are available:
+ </p>
+ <div class="orderedlist">
+ <ol class="orderedlist" type="1">
+ <li class="listitem">
+ <p>
+ The status variables
+ <a class="link"
+ href="mysql-cluster-options-variables.html#statvar_Ndb_pushed_queries_defined"><code
+ class="literal">Ndb_pushed_queries_defined</code></a>,
+ <a class="link"
+ href="mysql-cluster-options-variables.html#statvar_Ndb_pushed_queries_dropped"><code
+ class="literal">Ndb_pushed_queries_dropped</code></a>,
+ <a class="link"
+ href="mysql-cluster-options-variables.html#statvar_Ndb_pushed_queries_executed"><code
+ class="literal">Ndb_pushed_queries_executed</code></a>,
+ and
+ <a class="link" href="mysql-cluster-options-variables.html#statvar_Ndb_pushed_reads"><code
+ class="literal">Ndb_pushed_reads</code></a>.
+ </p>
+ </li>
+ <li class="listitem">
+ <p>
+ The counters in the
+ <a class="link" href="mysql-cluster-ndbinfo-counters.html"
+ title="21.5.10.10&nbsp;The ndbinfo counters Table"><code
+ class="literal">ndbinfo.counters</code></a>
+ table that belong to the <code class="literal">DBSPJ</code>
+ kernel block. See
+ <a class="xref" href="mysql-cluster-ndbinfo-counters.html"
+ title="21.5.10.10&nbsp;The ndbinfo counters Table">Section&nbsp;21.5.10.10, β€œThe ndbinfo
+ counters Table”</a>, for
+ information about these counters. See also
+ <a class="ulink"
+ href="https://dev.mysql.com/doc/ndb-internals/en/ndb-internals-kernel-blocks-dbspj.html"
+ target="_top">The DBSPJ Block</a>,
+ in the <em class="citetitle">NDB Cluster API Developer
+ Guide</em>.
+ </p>
+ </li>
+ </ol>
+ </div>
+ </li>
+ </ul>
+</div>
+
+</html>
diff --git a/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/data/ultraSlimDataTestWithVariables.json b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/data/ultraSlimDataTestWithVariables.json
new file mode 100644
index 0000000..1294c9e
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/data/ultraSlimDataTestWithVariables.json
@@ -0,0 +1,51 @@
+{
+ "vars": {
+ "Test_var": {
+ "d": true,
+ "t": 2
+ },
+ "another-variable": {
+ "d": false,
+ "t": 1
+ },
+ "doc-variable_ok": {
+ "d": true,
+ "t": 3,
+ "a": [
+ {
+ "t": 1,
+ "u": 0
+ },
+ {
+ "t": 2,
+ "u": 1
+ },
+ {
+ "a": "anchorname",
+ "t": 2,
+ "u": 1
+ }
+ ]
+ }
+ },
+ "version": 1,
+ "types": {
+ "1": "MYSQL",
+ "2": "MARIADB"
+ },
+ "varTypes": {
+ "1": "string",
+ "2": "boolean",
+ "3": "integer",
+ "4": "numeric",
+ "5": "enumeration",
+ "6": "set",
+ "7": "directory name",
+ "8": "file name",
+ "9": "byte"
+ },
+ "urls": [
+ "https://dev.mysql.com/",
+ "https://mariadb.com/"
+ ]
+} \ No newline at end of file
diff --git a/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/index.js b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/index.js
new file mode 100644
index 0000000..b5294d6
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/index.js
@@ -0,0 +1,12 @@
+'use strict';
+
+process.env.TZ = 'UTC';
+const templates = require(__dirname + '/templates');
+const cleaner = require(__dirname + '/cleaner');
+const parser = require(__dirname + '/parser');
+
+suite('MariaDB MySQL KBS', function() {
+ templates();
+ cleaner();
+ parser();
+});
diff --git a/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/parser.js b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/parser.js
new file mode 100644
index 0000000..14b6596
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/parser.js
@@ -0,0 +1,129 @@
+'use strict';
+
+const expect = require('chai').expect;
+const MySQL = require(__dirname + '/../src/MySQL');
+const cheerio = require('cheerio');
+const fs = require('fs');
+
+module.exports = function() {
+ suite('parser', function() {
+ test('test case 1', function(done) {
+ const $ = cheerio.load(fs.readFileSync(__dirname + '/data/mysql_test_case_1.html'));
+ MySQL.parsePage($, function(resultData) {
+ expect(resultData).to.deep.equal([
+ {
+ cli: '--ndbcluster',
+ default: 'FALSE (Version: NDB 7.5-7.6)',
+ dynamic: false,
+ id: 'option_mysqld_ndbcluster',
+ name: 'ndbcluster',
+ },
+ {
+ cli: '--ndb-allow-copying-alter-table=[ON|OFF]',
+ default: 'ON (Version: NDB 7.5-7.6)',
+ dynamic: true,
+ id: 'option_mysqld_ndb-allow-copying-alter-table',
+ name: 'ndb-allow-copying-alter-table',
+ scope: ['global', 'session'],
+ },
+ ]);
+ done();
+ });
+ });
+ test('test case 2', function(done) {
+ const $ = cheerio.load(fs.readFileSync(__dirname + '/data/mysql_test_case_2.html'));
+ MySQL.parsePage($, function(resultData) {
+ expect(resultData).to.deep.equal([
+ {
+ cli: '--binlog-gtid-simple-recovery[={OFF|ON}]',
+ default: 'ON',
+ dynamic: false,
+ id: 'sysvar_binlog_gtid_simple_recovery',
+ name: 'binlog_gtid_simple_recovery',
+ scope: ['global'],
+ type: 'boolean',
+ },
+ {
+ cli: '--enforce-gtid-consistency[=value]',
+ default: 'OFF',
+ dynamic: true,
+ id: 'sysvar_enforce_gtid_consistency',
+ name: 'enforce_gtid_consistency',
+ scope: ['global'],
+ type: 'enumeration',
+ validValues: ['OFF', 'ON', 'WARN'],
+ },
+ {
+ dynamic: false,
+ id: 'sysvar_gtid_executed',
+ name: 'gtid_executed',
+ scope: ['global', 'session'],
+ type: 'string',
+ },
+ {
+ cli: '--gtid-executed-compression-period=#',
+ default: '1000',
+ dynamic: true,
+ id: 'sysvar_gtid_executed_compression_period',
+ name: 'gtid_executed_compression_period',
+ range: {
+ from: 0,
+ to: 4294967295,
+ },
+ scope: ['global'],
+ type: 'integer',
+ },
+ {
+ cli: '--gtid-mode=MODE',
+ default: 'OFF',
+ dynamic: true,
+ id: 'sysvar_gtid_mode',
+ name: 'gtid_mode',
+ scope: ['global'],
+ type: 'enumeration',
+ validValues: ['OFF', 'OFF_PERMISSIVE', 'ON_PERMISSIVE', 'ON'],
+ },
+ {
+ default: 'AUTOMATIC',
+ dynamic: true,
+ id: 'sysvar_gtid_next',
+ name: 'gtid_next',
+ scope: ['session'],
+ type: 'enumeration',
+ validValues: ['AUTOMATIC', 'ANONYMOUS', 'UUID:NUMBER'],
+ },
+ {
+ dynamic: false,
+ id: 'sysvar_gtid_owned',
+ name: 'gtid_owned',
+ scope: ['global', 'session'],
+ type: 'string',
+ },
+ {
+ dynamic: true,
+ id: 'sysvar_gtid_purged',
+ name: 'gtid_purged',
+ scope: ['global'],
+ type: 'string',
+ },
+ ]);
+ done();
+ });
+ });
+ test('test case 3', function(done) {
+ const $ = cheerio.load(fs.readFileSync(__dirname + '/data/mysql_test_case_3.html'));
+ MySQL.parsePage($, function(resultData) {
+ expect(resultData).to.deep.equal([
+ {
+ default: 'TRUE (Version: 5.1.51-ndb-7.2.0)',
+ dynamic: true,
+ id: 'sysvar_ndb_join_pushdown',
+ name: 'ndb_join_pushdown',
+ scope: ['global', 'session'],
+ },
+ ]);
+ done();
+ });
+ });
+ });
+};
diff --git a/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/phpunit.xml b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/phpunit.xml
new file mode 100644
index 0000000..a04a13b
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/phpunit.xml
@@ -0,0 +1,27 @@
+<phpunit
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/5.4/phpunit.xsd"
+ colors="true"
+ backupGlobals="false"
+ bootstrap="../vendor/autoload.php"
+ stderr="true"
+>
+
+ <filter>
+ <whitelist>
+ <directory>../src</directory>
+ </whitelist>
+ </filter>
+
+ <logging>
+ <log type="coverage-html" target="../build/coverage/html/"/>
+ <log type="coverage-clover" target="../build/logs/clover.xml"/>
+ </logging>
+
+ <testsuites>
+ <testsuite name="Unit tests">
+ <directory suffix=".php">../test/</directory>
+ </testsuite>
+ </testsuites>
+
+</phpunit>
diff --git a/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/templates.js b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/templates.js
new file mode 100644
index 0000000..94119c2
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/williamdes/mariadb-mysql-kbs/test/templates.js
@@ -0,0 +1,218 @@
+'use strict';
+
+const expect = require('chai').expect;
+const templates = require(__dirname + '/../scripts/sudo-bot/template.js');
+
+module.exports = function() {
+ suite('pr message', function() {
+ test('prMessage for lambda files', function(done) {
+ const commmitMsg = templates.prMessage(['a.json', 'ab/cd/ef.json', 'README.md']);
+ expect(commmitMsg).to.equal('πŸ€– Some updates to review πŸ€–');
+ done();
+ });
+ test('prMessage for MariaDB files', function(done) {
+ const commmitMsg = templates.prMessage(['data/mariadb-aria-server-status-variables.json']);
+ expect(commmitMsg).to.equal('πŸ€– [MariaDB] updates');
+ done();
+ });
+ test('prMessage for MariaDB files and merged', function(done) {
+ const commmitMsg = templates.prMessage([
+ 'dist/merged-raw.json',
+ 'dist/merged-raw.md',
+ 'dist/merged-slim.json',
+ 'dist/merged-ultraslim.json',
+ 'dist/merged-ultraslim.php',
+ 'data/mariadb-aria-server-status-variables.json',
+ ]);
+ expect(commmitMsg).to.equal('πŸ€– [MariaDB] updates');
+ done();
+ });
+ test('prMessage for MariaDB files and others', function(done) {
+ const commmitMsg = templates.prMessage([
+ 'a.json',
+ 'ab/cd/ef.json',
+ 'README.md',
+ 'data/mariadb-aria-server-status-variables.json',
+ ]);
+ expect(commmitMsg).to.equal('πŸ€– [MariaDB] updates 🚨🚨');
+ done();
+ });
+ test('prMessage for MariaDB files and others and merged', function(done) {
+ const commmitMsg = templates.prMessage([
+ 'dist/merged-raw.json',
+ 'dist/merged-raw.md',
+ 'dist/merged-slim.json',
+ 'dist/merged-ultraslim.json',
+ 'dist/merged-ultraslim.php',
+ 'a.json',
+ 'ab/cd/ef.json',
+ 'README.md',
+ 'data/mariadb-aria-server-status-variables.json',
+ ]);
+ expect(commmitMsg).to.equal('πŸ€– [MariaDB] updates 🚨🚨');
+ done();
+ });
+ test('prMessage for MySQL files', function(done) {
+ const commmitMsg = templates.prMessage(['data/mysql-server-options.json']);
+ expect(commmitMsg).to.equal('πŸ€– [MySQL] updates');
+ done();
+ });
+ test('prMessage for MySQL files and merged', function(done) {
+ const commmitMsg = templates.prMessage([
+ 'dist/merged-raw.json',
+ 'dist/merged-raw.md',
+ 'dist/merged-slim.json',
+ 'dist/merged-ultraslim.json',
+ 'dist/merged-ultraslim.php',
+ 'data/mysql-server-options.json',
+ ]);
+ expect(commmitMsg).to.equal('πŸ€– [MySQL] updates');
+ done();
+ });
+ test('prMessage for MySQL files and others', function(done) {
+ const commmitMsg = templates.prMessage([
+ 'a.json',
+ 'ab/cd/ef.json',
+ 'README.md',
+ 'data/mysql-server-options.json',
+ ]);
+ expect(commmitMsg).to.equal('πŸ€– [MySQL] updates 🚨🚨');
+ done();
+ });
+ test('prMessage for MySQL files and others and merged', function(done) {
+ const commmitMsg = templates.prMessage([
+ 'dist/merged-raw.json',
+ 'dist/merged-raw.md',
+ 'dist/merged-slim.json',
+ 'dist/merged-ultraslim.json',
+ 'dist/merged-ultraslim.php',
+ 'a.json',
+ 'ab/cd/ef.json',
+ 'README.md',
+ 'data/mysql-server-options.json',
+ ]);
+ expect(commmitMsg).to.equal('πŸ€– [MySQL] updates 🚨🚨');
+ done();
+ });
+ test('prMessage for MySQL and MariaDB files', function(done) {
+ const commmitMsg = templates.prMessage([
+ 'data/mariadb-aria-server-status-variables.json',
+ 'data/mysql-server-options.json',
+ ]);
+ expect(commmitMsg).to.equal('πŸ€– [MariaDB] && [MySQL] updates');
+ done();
+ });
+ test('prMessage for MySQL and MariaDB files and merged', function(done) {
+ const commmitMsg = templates.prMessage([
+ 'dist/merged-raw.json',
+ 'dist/merged-raw.md',
+ 'dist/merged-slim.json',
+ 'dist/merged-ultraslim.json',
+ 'dist/merged-ultraslim.php',
+ 'data/mariadb-aria-server-status-variables.json',
+ 'data/mysql-server-options.json',
+ ]);
+ expect(commmitMsg).to.equal('πŸ€– [MariaDB] && [MySQL] updates');
+ done();
+ });
+ test('prMessage for MySQL and MariaDB files and others', function(done) {
+ const commmitMsg = templates.prMessage([
+ 'a.json',
+ 'ab/cd/ef.json',
+ 'README.md',
+ 'data/mariadb-aria-server-status-variables.json',
+ 'data/mysql-server-options.json',
+ ]);
+ expect(commmitMsg).to.equal('πŸ€– [MariaDB] && [MySQL] updates 🚨🚨');
+ done();
+ });
+ });
+ suite('commit message', function() {
+ test('commitMessage for lambda files', function(done) {
+ const commmitMsg = templates.commitMessage(['a.json', 'ab/cd/ef.json', 'README.md']);
+ expect(commmitMsg).to.equal('update: πŸ€– Some updates πŸ€–');
+ done();
+ });
+ test('commitMessage for MariaDB files', function(done) {
+ const commmitMsg = templates.commitMessage(['data/mariadb-aria-server-status-variables.json']);
+ expect(commmitMsg).to.equal('update: [MariaDB] updates');
+ done();
+ });
+ test('commitMessage for MariaDB files and others', function(done) {
+ const commmitMsg = templates.commitMessage([
+ 'a.json',
+ 'ab/cd/ef.json',
+ 'README.md',
+ 'data/mariadb-aria-server-status-variables.json',
+ ]);
+ expect(commmitMsg).to.equal('update: [MariaDB] updates and other changes');
+ done();
+ });
+ test('commitMessage for MySQL files', function(done) {
+ const commmitMsg = templates.commitMessage(['data/mysql-server-options.json']);
+ expect(commmitMsg).to.equal('update: [MySQL] updates');
+ done();
+ });
+ test('commitMessage for MySQL files and others', function(done) {
+ const commmitMsg = templates.commitMessage([
+ 'a.json',
+ 'ab/cd/ef.json',
+ 'README.md',
+ 'data/mysql-server-options.json',
+ ]);
+ expect(commmitMsg).to.equal('update: [MySQL] updates and other changes');
+ done();
+ });
+ test('commitMessage for MySQL and MariaDB files', function(done) {
+ const commmitMsg = templates.commitMessage([
+ 'data/mariadb-aria-server-status-variables.json',
+ 'data/mysql-server-options.json',
+ ]);
+ expect(commmitMsg).to.equal('update: [MariaDB] && [MySQL] updates');
+ done();
+ });
+ test('commitMessage for MySQL and MariaDB files and others', function(done) {
+ const commmitMsg = templates.commitMessage([
+ 'a.json',
+ 'ab/cd/ef.json',
+ 'README.md',
+ 'data/mariadb-aria-server-status-variables.json',
+ 'data/mysql-server-options.json',
+ ]);
+ expect(commmitMsg).to.equal('update: [MariaDB] && [MySQL] updates and other changes');
+ done();
+ });
+ });
+ suite('pr', function() {
+ test('prContent', function(done) {
+ const prContent = templates.prContent([
+ 'a.json',
+ 'ab/cd/ef.json',
+ 'data/mariadb-aria-server-status-variables.json',
+ 'dist/merged-raw.json',
+ 'dist/merged-raw.md',
+ 'dist/merged-slim.json',
+ 'dist/merged-ultraslim.json',
+ 'dist/merged-ultraslim.php',
+ 'data/mysql-server-options.json',
+ 'README.md',
+ ]);
+ expect(prContent).to.equal(
+ 'Dear human 🌻, after running my task the following files where updated:\n- `a.json` πŸ‘½\n- `ab/cd/ef.json` πŸ‘½\n- `data/mariadb-aria-server-status-variables.json` 🐳\n- `dist/merged-raw.json` πŸ“¦\n- `dist/merged-raw.md` πŸ“¦\n- `dist/merged-slim.json` πŸ“¦\n- `dist/merged-ultraslim.json` πŸ“¦\n- `dist/merged-ultraslim.php` πŸ“¦\n- `data/mysql-server-options.json` 🐬\n- `README.md` πŸ‘½\n'
+ );
+ done();
+ });
+ test('prContent one file', function(done) {
+ const prContent = templates.prContent(['README.md']);
+ expect(prContent).to.equal(
+ 'Dear human 🌻, after running my task the following file was updated:\n- `README.md` πŸ‘½\n'
+ );
+ done();
+ });
+ test('prBranch', function(done) {
+ const prBranch = templates.prBranch([]);
+ expect(prBranch).to.match(/^refs\/heads\/update\/[0-9]{13}$/);
+ done();
+ });
+ });
+};