From 529da170464af7de64715715ba64586aeb09e9c3 Mon Sep 17 00:00:00 2001 From: Danny Houtworm Date: Mon, 14 Aug 2023 01:11:26 +0000 Subject: [PATCH] bla --- Readme.md | 7 +- srcs/requirements/ftp/srcs/pure-ftpd.conf | 466 ----- srcs/requirements/mariadb/srcs/maria.sql | 1839 ------------------ srcs/requirements/mariadb/srcs/wordpress.sql | 610 ------ srcs/requirements/nginx/srcs/start.sh | 2 - 5 files changed, 3 insertions(+), 2921 deletions(-) delete mode 100644 srcs/requirements/ftp/srcs/pure-ftpd.conf delete mode 100644 srcs/requirements/mariadb/srcs/maria.sql delete mode 100644 srcs/requirements/mariadb/srcs/wordpress.sql delete mode 100644 srcs/requirements/nginx/srcs/start.sh diff --git a/Readme.md b/Readme.md index 408a534..d95ac5e 100644 --- a/Readme.md +++ b/Readme.md @@ -1,7 +1,5 @@ -# Redis for wordpress -create dockerfile - # extra service +fail2ban Nextcloud? Dozzle? Grafana @@ -9,5 +7,6 @@ Grafana # Cleanup Replace Latest tag with the second to last double check PID1 +check that everything restarts after crash remove unused files like start.sh scripts -check there are no passwords in dockerfiles +check there are no passwords anywhere diff --git a/srcs/requirements/ftp/srcs/pure-ftpd.conf b/srcs/requirements/ftp/srcs/pure-ftpd.conf deleted file mode 100644 index 2f38917..0000000 --- a/srcs/requirements/ftp/srcs/pure-ftpd.conf +++ /dev/null @@ -1,466 +0,0 @@ -############################################################ -# # -# Configuration file for pure-ftpd # -# # -############################################################ - -# If you want to run Pure-FTPd with this configuration -# instead of command-line options, please run the -# following command : -# -# ${exec_prefix}/sbin/sbin/pure-ftpd /etc/pure-ftpd.conf -# -# Online documentation: -# https://www.pureftpd.org/project/pure-ftpd/doc - - -# Restrict users to their home directory - -ChrootEveryone yes - - - -# If the previous option is set to "no", members of the following group -# won't be restricted. Others will be. If you don't want chroot()ing anyone, -# just comment out ChrootEveryone and TrustedGID. - -# TrustedGID 100 - - - -# Turn on compatibility hacks for broken clients - -BrokenClientsCompatibility no - - - -# Maximum number of simultaneous users - -MaxClientsNumber 50 - - - -# Run as a background process - -Daemonize yes - - - -# Maximum number of simultaneous clients with the same IP address - -MaxClientsPerIP 8 - - - -# If you want to log all client commands, set this to "yes". -# This directive can be specified twice to also log server responses. - -VerboseLog no - - - -# List dot-files even when the client doesn't send "-a". - -DisplayDotFiles yes - - - -# Disallow authenticated users - Act only as a public FTP server. - -AnonymousOnly no - - - -# Disallow anonymous connections. Only accept authenticated users. - -NoAnonymous no - - - -# Syslog facility (auth, authpriv, daemon, ftp, security, user, local*) -# The default facility is "ftp". "none" disables logging. - -SyslogFacility ftp - - - -# Display fortune cookies - -# FortunesFile /usr/share/fortune/zippy - - - -# Don't resolve host names in log files. Recommended unless you trust -# reverse host names, and don't care about DNS resolution being possibly slow. - -DontResolve yes - - - -# Maximum idle time in minutes (default = 15 minutes) - -MaxIdleTime 15 - - - -# LDAP configuration file (see README.LDAP) - -# LDAPConfigFile /etc/pureftpd-ldap.conf - - - -# MySQL configuration file (see README.MySQL) - -# MySQLConfigFile /etc/pureftpd-mysql.conf - - -# PostgreSQL configuration file (see README.PGSQL) - -# PGSQLConfigFile /etc/pureftpd-pgsql.conf - - -# PureDB user database (see README.Virtual-Users) - -# PureDB /etc/pureftpd.pdb - - -# Path to pure-authd socket (see README.Authentication-Modules) - -# ExtAuth /var/run/ftpd.sock - - - -# If you want to enable PAM authentication, uncomment the following line - -# PAMAuthentication yes - - - -# If you want simple Unix (/etc/passwd) authentication, uncomment this - -# UnixAuthentication yes - - - -# Please note that LDAPConfigFile, MySQLConfigFile, PAMAuthentication and -# UnixAuthentication can be used specified once, but can be combined -# together. For instance, if you use MySQLConfigFile, then UnixAuthentication, -# the SQL server will be used first. If the SQL authentication fails because the -# user wasn't found, a new attempt will be done using system authentication. -# If the SQL authentication fails because the password didn't match, the -# authentication chain stops here. Authentication methods are chained in -# the order they are given. - - - -# 'ls' recursion limits. The first argument is the maximum number of -# files to be displayed. The second one is the max subdirectories depth. - -LimitRecursion 10000 8 - - - -# Are anonymous users allowed to create new directories? - -AnonymousCanCreateDirs no - - - -# If the system load is greater than the given value, anonymous users -# aren't allowed to download. - -MaxLoad 4 - - - -# Port range for passive connections - keep it as broad as possible. - -# PassivePortRange 21000 21000 - - - -# Force an IP address in PASV/EPSV replies. - for NAT. -# Symbolic host names are also accepted for gateways with dynamic IP -# addresses. - -# ForcePassiveIP 192.168.0.1 - - - -# Upload/download ratio for anonymous users. - -# AnonymousRatio 1 10 - - - -# Upload/download ratio for all users. -# This directive supersedes the previous one. - -# UserRatio 1 10 - - - -# Disallow downloads of files owned by the "ftp" system user; -# files that were uploaded but not validated by a local admin. - -AntiWarez yes - - - -# IP address/port to listen to (default=all IP addresses, port 21). - -# Bind 127.0.0.1,21 - - - -# Maximum bandwidth for anonymous users in KB/s - -# AnonymousBandwidth 8 - - - -# Maximum bandwidth for *all* users (including anonymous) in KB/s -# Use AnonymousBandwidth *or* UserBandwidth, not both. - -# UserBandwidth 8 - - - -# File creation mask. : . -# 177:077 if you feel paranoid. - -Umask 133:022 - - - -# Minimum UID for an authenticated user to log in. -# For example, a value of 100 prevents all users whose user id is below -# 100 from logging in. If you want "root" to be able to log in, use 0. - -MinUID 100 - - - -# Allow FXP transfers for authenticated users. - -AllowUserFXP no - - - -# Allow anonymous FXP for anonymous and non-anonymous users. - -AllowAnonymousFXP no - - - -# Users can't delete/write files starting with a dot ('.') -# even if they own them. But if TrustedGID is enabled, that group -# will exceptionally have access to dot-files. - -ProhibitDotFilesWrite no - - - -# Prohibit *reading* of files starting with a dot (.history, .ssh...) - -ProhibitDotFilesRead no - - - -# Don't overwrite files. When a file whose name already exist is uploaded, -# it gets automatically renamed to file.1, file.2, file.3, ... - -AutoRename no - - - -# Prevent anonymous users from uploading new files (no = upload is allowed) - -AnonymousCantUpload no - - - -# Only connections to this specific IP address are allowed to be -# non-anonymous. You can use this directive to open several public IPs for -# anonymous FTP, and keep a private firewalled IP for remote administration. -# You can also only allow a non-routable local IP (such as 10.x.x.x) for -# authenticated users, and run a public anon-only FTP server on another IP. - -# TrustedIP 10.1.1.1 - - - -# To add the PID to log entries, uncomment the following line. - -# LogPID yes - - - -# Create an additional log file with transfers logged in a Apache-like format : -# fw.c9x.org - jedi [13/Apr/2017:19:36:39] "GET /ftp/linux.tar.bz2" 200 21809338 -# This log file can then be processed by common HTTP traffic analyzers. - -# AltLog clf:/var/log/pureftpd.log - - - -# Create an additional log file with transfers logged in a format optimized -# for statistic reports. - -# AltLog stats:/var/log/pureftpd.log - - - -# Create an additional log file with transfers logged in the standard W3C -# format (compatible with many HTTP log analyzers) - -# AltLog w3c:/var/log/pureftpd.log - - - -# Disallow the CHMOD command. Users cannot change perms of their own files. - -# NoChmod yes - - - -# Allow users to resume/upload files, but *NOT* to delete them. - -# KeepAllFiles yes - - - -# Automatically create home directories if they are missing - -# CreateHomeDir yes - - - -# Enable virtual quotas. The first value is the max number of files. -# The second value is the maximum size, in megabytes. -# So 1000:10 limits every user to 1000 files and 10 MB. - -# Quota 1000:10 - - - -# If your pure-ftpd has been compiled with standalone support, you can change -# the location of the pid file. The default is /var/run/pure-ftpd.pid - -# PIDFile /var/run/pure-ftpd.pid - - - -# If your pure-ftpd has been compiled with pure-uploadscript support, -# this will make pure-ftpd write info about new uploads to -# /var/run/pure-ftpd.upload.pipe so pure-uploadscript can read it and -# spawn a script to handle the upload. -# Don't enable this option if you don't actually use pure-uploadscript. - -# CallUploadScript yes - - - -# This option is useful on servers where anonymous upload is -# allowed. When the partition is more that percententage full, -# new uploads are disallowed. - -MaxDiskUsage 99 - - - -# Set to 'yes' to prevent users from renaming files. - -# NoRename yes - - - -# Be 'customer proof': forbids common customer mistakes such as -# 'chmod 0 public_html', that are valid, but can cause customers to -# unintentionally shoot themselves in the foot. - -CustomerProof yes - - - -# Per-user concurrency limits. Will only work if the FTP server has -# been compiled with --with-peruserlimits. -# Format is: : -# For example, 3:20 means that an authenticated user can have up to 3 active -# sessions, and that up to 20 anonymous sessions are allowed. - -# PerUserLimits 3:20 - - - -# When a file is uploaded and there was already a previous version of the file -# with the same name, the old file will neither get removed nor truncated. -# The file will be stored under a temporary name and once the upload is -# complete, it will be atomically renamed. For example, when a large PHP -# script is being uploaded, the web server will keep serving the old version and -# later switch to the new one as soon as the full file will have been -# transferred. This option is incompatible with virtual quotas. - -# NoTruncate yes - - - -# This option accepts three values: -# 0: disable SSL/TLS encryption layer (default). -# 1: accept both cleartext and encrypted sessions. -# 2: refuse connections that don't use the TLS security mechanism, -# including anonymous sessions. -# Do _not_ uncomment this blindly. Double check that: -# 1) The server has been compiled with TLS support (--with-tls), -# 2) A valid certificate is in place, -# 3) Only compatible clients will log in. - -# TLS 1 - - -# Cipher suite for TLS sessions. -# The default suite is secure and setting this property is usually -# only required to *lower* the security to cope with legacy clients. -# Prefix with -C: in order to require valid client certificates. -# If -C: is used, make sure that clients' public keys are present on -# the server. - -# TLSCipherSuite HIGH - - - -# Certificate file, for TLS -# The certificate itself and the keys can be bundled into the same -# file or split into two files. -# CertFile is for a cert+key bundle, CertFileAndKey for separate files. -# Use only one of these. - -# CertFile /etc/ssl/private/pure-ftpd.pem -# CertFileAndKey "/etc/pure-ftpd.pem" "/etc/pure-ftpd.key" - - - -# Unix socket of the external certificate handler, for TLS - -# ExtCert /var/run/ftpd-certs.sock - - -# Listen only to IPv4 addresses in standalone mode (ie. disable IPv6) -# By default, both IPv4 and IPv6 are enabled. - -# IPV4Only yes - - - -# Listen only to IPv6 addresses in standalone mode (i.e. disable IPv4) -# By default, both IPv4 and IPv6 are enabled. - -# IPV6Only yes - - - -# Append the content of another file, if the file exists. -# If the file doesn't exist, the directive is ignored. -# More files can be recursively included. - -# Include additional_configuration.conf diff --git a/srcs/requirements/mariadb/srcs/maria.sql b/srcs/requirements/mariadb/srcs/maria.sql deleted file mode 100644 index 7127583..0000000 --- a/srcs/requirements/mariadb/srcs/maria.sql +++ /dev/null @@ -1,1839 +0,0 @@ --- MariaDB dump 10.19 Distrib 10.5.12-MariaDB, for Linux (x86_64) --- --- Host: localhost Database: --- ------------------------------------------------------ --- Server version 10.5.12-MariaDB - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8mb4 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Current Database: `mysql` --- - -CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysql` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; - -USE `mysql`; - --- --- Table structure for table `column_stats` --- - -DROP TABLE IF EXISTS `column_stats`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `column_stats` ( - `db_name` varchar(64) COLLATE utf8_bin NOT NULL, - `table_name` varchar(64) COLLATE utf8_bin NOT NULL, - `column_name` varchar(64) COLLATE utf8_bin NOT NULL, - `min_value` varbinary(255) DEFAULT NULL, - `max_value` varbinary(255) DEFAULT NULL, - `nulls_ratio` decimal(12,4) DEFAULT NULL, - `avg_length` decimal(12,4) DEFAULT NULL, - `avg_frequency` decimal(12,4) DEFAULT NULL, - `hist_size` tinyint(3) unsigned DEFAULT NULL, - `hist_type` enum('SINGLE_PREC_HB','DOUBLE_PREC_HB') COLLATE utf8_bin DEFAULT NULL, - `histogram` varbinary(255) DEFAULT NULL, - PRIMARY KEY (`db_name`,`table_name`,`column_name`) -) ENGINE=Aria DEFAULT CHARSET=utf8 COLLATE=utf8_bin PAGE_CHECKSUM=1 TRANSACTIONAL=0 COMMENT='Statistics on Columns'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `column_stats` --- - -LOCK TABLES `column_stats` WRITE; -/*!40000 ALTER TABLE `column_stats` DISABLE KEYS */; -/*!40000 ALTER TABLE `column_stats` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `columns_priv` --- - -DROP TABLE IF EXISTS `columns_priv`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `columns_priv` ( - `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '', - `Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `User` char(80) COLLATE utf8_bin NOT NULL DEFAULT '', - `Table_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `Column_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `Timestamp` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), - `Column_priv` set('Select','Insert','Update','References') CHARACTER SET utf8 NOT NULL DEFAULT '', - PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`,`Column_name`) -) ENGINE=Aria DEFAULT CHARSET=utf8 COLLATE=utf8_bin PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='Column privileges'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `columns_priv` --- - -LOCK TABLES `columns_priv` WRITE; -/*!40000 ALTER TABLE `columns_priv` DISABLE KEYS */; -/*!40000 ALTER TABLE `columns_priv` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `db` --- - -DROP TABLE IF EXISTS `db`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `db` ( - `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '', - `Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `User` char(80) COLLATE utf8_bin NOT NULL DEFAULT '', - `Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', - `Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', - `Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', - `Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', - `Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', - `Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', - `Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', - `References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', - `Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', - `Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', - `Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', - `Lock_tables_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', - `Create_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', - `Show_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', - `Create_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', - `Alter_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', - `Execute_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', - `Event_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', - `Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', - `Delete_history_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', - PRIMARY KEY (`Host`,`Db`,`User`), - KEY `User` (`User`) -) ENGINE=Aria DEFAULT CHARSET=utf8 COLLATE=utf8_bin PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='Database privileges'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `db` --- - -LOCK TABLES `db` WRITE; -/*!40000 ALTER TABLE `db` DISABLE KEYS */; -INSERT INTO `db` VALUES ('%','test','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y','Y','Y','Y','N','N','Y','Y','Y'),('%','test\\_%','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y','Y','Y','Y','N','N','Y','Y','Y'),('%','wordpress','wordpress','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); -/*!40000 ALTER TABLE `db` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `event` --- - -DROP TABLE IF EXISTS `event`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `event` ( - `db` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', - `name` char(64) NOT NULL DEFAULT '', - `body` longblob NOT NULL, - `definer` char(141) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', - `execute_at` datetime DEFAULT NULL, - `interval_value` int(11) DEFAULT NULL, - `interval_field` enum('YEAR','QUARTER','MONTH','DAY','HOUR','MINUTE','WEEK','SECOND','MICROSECOND','YEAR_MONTH','DAY_HOUR','DAY_MINUTE','DAY_SECOND','HOUR_MINUTE','HOUR_SECOND','MINUTE_SECOND','DAY_MICROSECOND','HOUR_MICROSECOND','MINUTE_MICROSECOND','SECOND_MICROSECOND') DEFAULT NULL, - `created` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), - `modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', - `last_executed` datetime DEFAULT NULL, - `starts` datetime DEFAULT NULL, - `ends` datetime DEFAULT NULL, - `status` enum('ENABLED','DISABLED','SLAVESIDE_DISABLED') NOT NULL DEFAULT 'ENABLED', - `on_completion` enum('DROP','PRESERVE') NOT NULL DEFAULT 'DROP', - `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH','EMPTY_STRING_IS_NULL','SIMULTANEOUS_ASSIGNMENT','TIME_ROUND_FRACTIONAL') NOT NULL DEFAULT '', - `comment` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', - `originator` int(10) unsigned NOT NULL, - `time_zone` char(64) CHARACTER SET latin1 NOT NULL DEFAULT 'SYSTEM', - `character_set_client` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `collation_connection` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `db_collation` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `body_utf8` longblob DEFAULT NULL, - PRIMARY KEY (`db`,`name`) -) ENGINE=Aria DEFAULT CHARSET=utf8 PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='Events'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `func` --- - -DROP TABLE IF EXISTS `func`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `func` ( - `name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `ret` tinyint(1) NOT NULL DEFAULT 0, - `dl` char(128) COLLATE utf8_bin NOT NULL DEFAULT '', - `type` enum('function','aggregate') CHARACTER SET utf8 NOT NULL, - PRIMARY KEY (`name`) -) ENGINE=Aria DEFAULT CHARSET=utf8 COLLATE=utf8_bin PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='User defined functions'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `func` --- - -LOCK TABLES `func` WRITE; -/*!40000 ALTER TABLE `func` DISABLE KEYS */; -/*!40000 ALTER TABLE `func` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `global_priv` --- - -DROP TABLE IF EXISTS `global_priv`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `global_priv` ( - `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '', - `User` char(80) COLLATE utf8_bin NOT NULL DEFAULT '', - `Priv` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '{}' CHECK (json_valid(`Priv`)), - PRIMARY KEY (`Host`,`User`) -) ENGINE=Aria DEFAULT CHARSET=utf8 COLLATE=utf8_bin PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='Users and global privileges'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `global_priv` --- - -LOCK TABLES `global_priv` WRITE; -/*!40000 ALTER TABLE `global_priv` DISABLE KEYS */; -INSERT INTO `global_priv` VALUES ('localhost','mariadb.sys','{\"access\":0,\"plugin\":\"mysql_native_password\",\"authentication_string\":\"\",\"account_locked\":true,\"password_last_changed\":0}'),('localhost','root','{\"access\":18446744073709551615,\"plugin\":\"mysql_native_password\",\"authentication_string\":\"invalid\",\"auth_or\":[{},{\"plugin\":\"unix_socket\"}]}'),('localhost','mysql','{\"access\":18446744073709551615,\"plugin\":\"mysql_native_password\",\"authentication_string\":\"invalid\",\"auth_or\":[{},{\"plugin\":\"unix_socket\"}]}'),('localhost','','{}'),('mariadb-0','','{}'),('%','djonker','{\"access\":549755812863,\"version_id\":100511,\"plugin\":\"mysql_native_password\",\"authentication_string\":\"*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19\",\"password_last_changed\":1628405043}'),('%','wordpress','{\"access\":0,\"version_id\":100511,\"plugin\":\"mysql_native_password\",\"authentication_string\":\"*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19\",\"password_last_changed\":1628405043}'),('%','admin','{\"access\":549755812863,\"version_id\":100512,\"plugin\":\"mysql_native_password\",\"authentication_string\":\"*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19\",\"password_last_changed\":1628499163}'); -/*!40000 ALTER TABLE `global_priv` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `gtid_slave_pos` --- - -DROP TABLE IF EXISTS `gtid_slave_pos`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `gtid_slave_pos` ( - `domain_id` int(10) unsigned NOT NULL, - `sub_id` bigint(20) unsigned NOT NULL, - `server_id` int(10) unsigned NOT NULL, - `seq_no` bigint(20) unsigned NOT NULL, - PRIMARY KEY (`domain_id`,`sub_id`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Replication slave GTID position'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `gtid_slave_pos` --- - -LOCK TABLES `gtid_slave_pos` WRITE; -/*!40000 ALTER TABLE `gtid_slave_pos` DISABLE KEYS */; -/*!40000 ALTER TABLE `gtid_slave_pos` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `help_category` --- - -DROP TABLE IF EXISTS `help_category`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `help_category` ( - `help_category_id` smallint(5) unsigned NOT NULL, - `name` char(64) NOT NULL, - `parent_category_id` smallint(5) unsigned DEFAULT NULL, - `url` text NOT NULL, - PRIMARY KEY (`help_category_id`), - UNIQUE KEY `name` (`name`) -) ENGINE=Aria DEFAULT CHARSET=utf8 PAGE_CHECKSUM=1 TRANSACTIONAL=0 COMMENT='help categories'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `help_category` --- - -LOCK TABLES `help_category` WRITE; -/*!40000 ALTER TABLE `help_category` DISABLE KEYS */; -INSERT INTO `help_category` VALUES (1,'Geographic',0,''),(2,'Polygon Properties',34,''),(3,'WKT',34,''),(4,'Numeric Functions',38,''),(5,'Plugins',35,''),(6,'MBR',34,''),(7,'Control Flow Functions',38,''),(8,'Transactions',35,''),(9,'Help Metadata',35,''),(10,'Account Management',35,''),(11,'Point Properties',34,''),(12,'Encryption Functions',38,''),(13,'LineString Properties',34,''),(14,'Miscellaneous Functions',38,''),(15,'Logical Operators',38,''),(16,'Functions and Modifiers for Use with GROUP BY',35,''),(17,'Information Functions',38,''),(18,'Comparison Operators',38,''),(19,'Bit Functions',38,''),(20,'Table Maintenance',35,''),(21,'User-Defined Functions',35,''),(22,'Data Types',35,''),(23,'Compound Statements',35,''),(24,'Geometry Constructors',34,''),(25,'GeometryCollection Properties',1,''),(26,'Administration',35,''),(27,'Data Manipulation',35,''),(28,'Utility',35,''),(29,'Language Structure',35,''),(30,'Geometry Relations',34,''),(31,'Date and Time Functions',38,''),(32,'WKB',34,''),(33,'Procedures',35,''),(34,'Geographic Features',35,''),(35,'Contents',0,''),(36,'Geometry Properties',34,''),(37,'String Functions',38,''),(38,'Functions',35,''),(39,'Data Definition',35,''),(40,'Sequences',35,''),(41,'JSON Functions',38,''),(42,'Window Functions',38,''),(43,'Spider Functions',38,''),(44,'Dynamic Column Functions',38,''); -/*!40000 ALTER TABLE `help_category` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `help_keyword` --- - -DROP TABLE IF EXISTS `help_keyword`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `help_keyword` ( - `help_keyword_id` int(10) unsigned NOT NULL, - `name` char(64) NOT NULL, - PRIMARY KEY (`help_keyword_id`), - UNIQUE KEY `name` (`name`) -) ENGINE=Aria DEFAULT CHARSET=utf8 PAGE_CHECKSUM=1 TRANSACTIONAL=0 COMMENT='help keywords'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `help_keyword` --- - -LOCK TABLES `help_keyword` WRITE; -/*!40000 ALTER TABLE `help_keyword` DISABLE KEYS */; -INSERT INTO `help_keyword` VALUES (1,'master_ssl_verify_cert'),(2,'drop prepare'),(3,'work'),(4,'drop'),(5,'returns'),(6,'value'),(7,'nchar'),(8,'repeat'),(9,'columns'),(10,'sql_big_result'),(11,'escape'),(12,'mode'),(13,'schedule'),(14,'starts'),(15,'host'),(16,'row_format'); -/*!40000 ALTER TABLE `help_keyword` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `help_relation` --- - -DROP TABLE IF EXISTS `help_relation`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `help_relation` ( - `help_topic_id` int(10) unsigned NOT NULL, - `help_keyword_id` int(10) unsigned NOT NULL, - PRIMARY KEY (`help_keyword_id`,`help_topic_id`), - KEY `help_topic_id` (`help_topic_id`) -) ENGINE=Aria DEFAULT CHARSET=utf8 PAGE_CHECKSUM=1 TRANSACTIONAL=0 COMMENT='keyword-topic relation'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `help_relation` --- - -LOCK TABLES `help_relation` WRITE; -/*!40000 ALTER TABLE `help_relation` DISABLE KEYS */; -INSERT INTO `help_relation` VALUES (95,1),(97,2),(110,3),(120,4),(128,4),(259,4),(647,4),(664,4),(665,4),(666,4),(667,4),(668,4),(669,4),(670,4),(671,4),(672,4),(673,4),(675,4),(676,4),(258,5),(264,6),(317,6),(320,6),(417,6),(433,6),(271,7),(316,8),(621,8),(355,9),(434,10),(603,11),(610,12),(642,13),(652,14),(659,15),(660,16); -/*!40000 ALTER TABLE `help_relation` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `help_topic` --- - -DROP TABLE IF EXISTS `help_topic`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `help_topic` ( - `help_topic_id` int(10) unsigned NOT NULL, - `name` char(64) NOT NULL, - `help_category_id` smallint(5) unsigned NOT NULL, - `description` text NOT NULL, - `example` text NOT NULL, - `url` text NOT NULL, - PRIMARY KEY (`help_topic_id`), - UNIQUE KEY `name` (`name`) -) ENGINE=Aria DEFAULT CHARSET=utf8 PAGE_CHECKSUM=1 TRANSACTIONAL=0 COMMENT='help topics'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `help_topic` --- - -LOCK TABLES `help_topic` WRITE; -/*!40000 ALTER TABLE `help_topic` DISABLE KEYS */; -INSERT INTO `help_topic` VALUES (1,'HELP_DATE',9,'This help information was generated from the MariaDB Knowledge Base\non 22 July 2019.','',''),(2,'AREA',2,'A synonym for ST_AREA.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/polygon-properties-area/','','https://mariadb.com/kb/en/library/polygon-properties-area/'),(3,'CENTROID',2,'A synonym for ST_CENTROID.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/centroid/','','https://mariadb.com/kb/en/library/centroid/'),(4,'ExteriorRing',2,'A synonym for ST_ExteriorRing.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/polygon-properties-exteriorring/','','https://mariadb.com/kb/en/library/polygon-properties-exteriorring/'),(5,'InteriorRingN',2,'A synonym for ST_InteriorRingN.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/polygon-properties-interiorringn/','','https://mariadb.com/kb/en/library/polygon-properties-interiorringn/'),(6,'NumInteriorRings',2,'A synonym for ST_NumInteriorRings.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/polygon-properties-numinteriorrings/','','https://mariadb.com/kb/en/library/polygon-properties-numinteriorrings/'),(7,'ST_AREA',2,'Syntax\n------ \nST_Area(poly)\nArea(poly)\n \nDescription\n----------- \nReturns as a double-precision number the area of the Polygon\nvalue poly, as measured in its spatial reference system.\n \nST_Area() and Area() are synonyms.\n \nExamples\n-------- \nSET @poly = \'Polygon((0 0,0 3,3 0,0 0),(1 1,1 2,2 1,1\n1))\';\n \nSELECT Area(GeomFromText(@poly));\n+---------------------------+\n| Area(GeomFromText(@poly)) |\n+---------------------------+\n| 4 |\n+---------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_area/','','https://mariadb.com/kb/en/library/st_area/'),(8,'ST_CENTROID',2,'Syntax\n------ \nST_Centroid(mpoly)\nCentroid(mpoly)\n \nDescription\n----------- \nReturns a point reflecting the mathematical centroid\n(geometric center) for the MultiPolygon mpoly. The resulting\npoint will not necessarily be on the MultiPolygon. \n \nST_Centroid() and Centroid() are synonyms.\n \nExamples\n-------- \nSET @poly = ST_GeomFromText(\'POLYGON((0 0,20 0,20 20,0 20,0\n0))\');\nSELECT ST_AsText(ST_Centroid(@poly)) AS center;\n \n+--------------+\n| center |\n+--------------+\n| POINT(10 10) |\n+--------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_centroid/','','https://mariadb.com/kb/en/library/st_centroid/'),(9,'ST_ExteriorRing',2,'Syntax\n------ \nST_ExteriorRing(poly)\nExteriorRing(poly)\n \nDescription\n----------- \nReturns the exterior ring of the Polygon value poly as a\nLineString.\n \nST_ExteriorRing() and ExteriorRing() are synonyms.\n \nExamples\n-------- \nSET @poly = \'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2\n1,1 1))\';\n \nSELECT AsText(ExteriorRing(GeomFromText(@poly)));\n+-------------------------------------------+\n| AsText(ExteriorRing(GeomFromText(@poly))) |\n+-------------------------------------------+\n| LINESTRING(0 0,0 3,3 3,3 0,0 0) |\n+-------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_exteriorring/','','https://mariadb.com/kb/en/library/st_exteriorring/'),(10,'ST_InteriorRingN',2,'Syntax\n------ \nST_InteriorRingN(poly,N)\nInteriorRingN(poly,N)\n \nDescription\n----------- \nReturns the N-th interior ring for the Polygon value poly as\na LineString. Rings are numbered beginning with 1.\n \nST_InteriorRingN() and InteriorRingN() are synonyms.\n \nExamples\n-------- \nSET @poly = \'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2\n1,1 1))\';\n \nSELECT AsText(InteriorRingN(GeomFromText(@poly),1));\n+----------------------------------------------+\n| AsText(InteriorRingN(GeomFromText(@poly),1)) |\n+----------------------------------------------+\n| LINESTRING(1 1,1 2,2 2,2 1,1 1) |\n+----------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_interiorringn/','','https://mariadb.com/kb/en/library/st_interiorringn/'),(11,'ST_NumInteriorRings',2,'Syntax\n------ \nST_NumInteriorRings(poly)\nNumInteriorRings(poly)\n \nDescription\n----------- \nReturns an integer containing the number of interior rings\nin the Polygon value poly.\n \nNote that according the the OpenGIS standard, a POLYGON\nshould have exactly one ExteriorRing and all other rings\nshould lie within that ExteriorRing and thus be the\nInteriorRings. Practically, however, some systems, including\nMariaDB\'s, permit polygons to have several\n\'ExteriorRings\'. In the case of there being multiple,\nnon-overlapping exterior rings ST_NumInteriorRings() will\nreturn 1.\n \nST_NumInteriorRings() and NumInteriorRings() are synonyms.\n \nExamples\n-------- \nSET @poly = \'Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2\n1,1 1))\';\n \nSELECT NumInteriorRings(GeomFromText(@poly));\n+---------------------------------------+\n| NumInteriorRings(GeomFromText(@poly)) |\n+---------------------------------------+\n| 1 |\n+---------------------------------------+\n \nNon-overlapping \'polygon\':\n \nSELECT ST_NumInteriorRings(ST_PolyFromText(\'POLYGON((0 0,10\n0,10 10,0 10,0 0),\n (-1 -1,-5 -1,-5 -5,-1 -5,-1 -1))\')) AS NumInteriorRings;\n \n+------------------+\n| NumInteriorRings |\n+------------------+\n| 1 |\n+------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_numinteriorrings/','','https://mariadb.com/kb/en/library/st_numinteriorrings/'),(12,'WKT Definition',3,'Description\n----------- \nThe Well-Known Text (WKT) representation of Geometry is\ndesigned to exchange geometry data in ASCII form. Examples\nof the basic geometry types include:\n \nGeometry Types | \n \nPOINT | \n \nLINESTRING | \n \nPOLYGON | \n \nMULTIPOINT | \n \nMULTILINESTRING | \n \nMULTIPOLYGON | \n \nGEOMETRYCOLLECTION | \n \nGEOMETRY | \n \n\n\nURL: https://mariadb.com/kb/en/library/wkt-definition/','','https://mariadb.com/kb/en/library/wkt-definition/'),(13,'AsText',3,'A synonym for ST_AsText().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/wkt-astext/','','https://mariadb.com/kb/en/library/wkt-astext/'),(14,'AsWKT',3,'A synonym for ST_AsText().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/wkt-aswkt/','','https://mariadb.com/kb/en/library/wkt-aswkt/'),(15,'GeomCollFromText',3,'A synonym for ST_GeomCollFromText.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/wkt-geomcollfromtext/','','https://mariadb.com/kb/en/library/wkt-geomcollfromtext/'),(16,'GeometryCollectionFromText',3,'A synonym for ST_GeomCollFromText.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/geometrycollectionfromtext/','','https://mariadb.com/kb/en/library/geometrycollectionfromtext/'),(17,'GeometryFromText',3,'A synonym for ST_GeomFromText.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/geometryfromtext/','','https://mariadb.com/kb/en/library/geometryfromtext/'),(18,'GeomFromText',3,'A synonym for ST_GeomFromText.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/wkt-geomfromtext/','','https://mariadb.com/kb/en/library/wkt-geomfromtext/'),(19,'LineFromText',3,'A synonym for ST_LineFromText.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/wkt-linefromtext/','','https://mariadb.com/kb/en/library/wkt-linefromtext/'),(20,'LineStringFromText',3,'A synonym for ST_LineFromText.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/linestringfromtext/','','https://mariadb.com/kb/en/library/linestringfromtext/'),(21,'MLineFromText',3,'Syntax\n------ \nMLineFromText(wkt[,srid])\nMultiLineStringFromText(wkt[,srid])\n \nDescription\n----------- \nConstructs a MULTILINESTRING value using its WKT\nrepresentation and SRID.\n \nMLineFromText() and MultiLineStringFromText() are synonyms.\n \nExamples\n-------- \nCREATE TABLE gis_multi_line (g MULTILINESTRING);\nSHOW FIELDS FROM gis_multi_line;\n \nINSERT INTO gis_multi_line VALUES\n (MultiLineStringFromText(\'MULTILINESTRING((10 48,10 21,10\n0),(16 0,16 23,16 48))\')),\n (MLineFromText(\'MULTILINESTRING((10 48,10 21,10 0))\')),\n (MLineFromWKB(AsWKB(MultiLineString(LineString(Point(1, 2),\nPoint(3, 5)), LineString(Point(2, 5), Point(5, 8), Point(21,\n7))))));\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/mlinefromtext/','','https://mariadb.com/kb/en/library/mlinefromtext/'),(22,'MPointFromText',3,'Syntax\n------ \nMPointFromText(wkt[,srid])\nMultiPointFromText(wkt[,srid])\n \nDescription\n----------- \nConstructs a MULTIPOINT value using its WKT representation\nand SRID.\n \nMPointFromText() and MultiPointFromText() are synonyms.\n \nExamples\n-------- \nCREATE TABLE gis_multi_point (g MULTIPOINT);\nSHOW FIELDS FROM gis_multi_point;\n \nINSERT INTO gis_multi_point VALUES\n (MultiPointFromText(\'MULTIPOINT(0 0,10 10,10 20,20\n20)\')),\n (MPointFromText(\'MULTIPOINT(1 1,11 11,11 21,21 21)\')),\n (MPointFromWKB(AsWKB(MultiPoint(Point(3, 6), Point(4,\n10)))));\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/mpointfromtext/','','https://mariadb.com/kb/en/library/mpointfromtext/'),(23,'MPolyFromText',3,'Syntax\n------ \nMPolyFromText(wkt[,srid])\nMultiPolygonFromText(wkt[,srid])\n \nDescription\n----------- \nConstructs a MULTIPOLYGON value using its WKT representation\nand SRID.\n \nMPolyFromText() and MultiPolygonFromText() are synonyms.\n \nExamples\n-------- \nCREATE TABLE gis_multi_polygon (g MULTIPOLYGON);\nSHOW FIELDS FROM gis_multi_polygon;\n \nINSERT INTO gis_multi_polygon VALUES\n (MultiPolygonFromText(\'MULTIPOLYGON(((28 26,28 0,84 0,84\n42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67\n13,59 13,59 18)))\')),\n (MPolyFromText(\'MULTIPOLYGON(((28 26,28 0,84 0,84 42,28\n26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59\n13,59 18)))\')),\n (MPolyFromWKB(AsWKB(MultiPolygon(Polygon(LineString(Point(0,\n3), Point(3, 3), Point(3, 0), Point(0, 3)))))));\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/mpolyfromtext/','','https://mariadb.com/kb/en/library/mpolyfromtext/'),(24,'MultiLineStringFromText',3,'A synonym for MLineFromText.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/multilinestringfromtext/','','https://mariadb.com/kb/en/library/multilinestringfromtext/'),(25,'MultiPointFromText',3,'A synonym for MPointFromText.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/multipointfromtext/','','https://mariadb.com/kb/en/library/multipointfromtext/'),(26,'MultiPolygonFromText',3,'A synonym for MPolyFromText.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/multipolygonfromtext/','','https://mariadb.com/kb/en/library/multipolygonfromtext/'),(27,'PointFromText',3,'A synonym for ST_PointFromText.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/wkt-pointfromtext/','','https://mariadb.com/kb/en/library/wkt-pointfromtext/'),(28,'PolyFromText',3,'A synonym for ST_PolyFromText.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/wkt-polyfromtext/','','https://mariadb.com/kb/en/library/wkt-polyfromtext/'),(29,'PolygonFromText',3,'A synonym for ST_PolyFromText.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/polygonfromtext/','','https://mariadb.com/kb/en/library/polygonfromtext/'),(30,'ST_AsText',3,'Syntax\n------ \nST_AsText(g)\nAsText(g)\nST_AsWKT(g)\nAsWKT(g)\n \nDescription\n----------- \nConverts a value in internal geometry format to its WKT\nrepresentation and returns the string result.\n \nST_AsText(), AsText(), ST_AsWKT() and AsWKT() are all\nsynonyms.\n \nExamples\n-------- \nSET @g = \'LineString(1 1,4 4,6 6)\';\n \nSELECT ST_AsText(ST_GeomFromText(@g));\n+--------------------------------+\n| ST_AsText(ST_GeomFromText(@g)) |\n+--------------------------------+\n| LINESTRING(1 1,4 4,6 6) |\n+--------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_astext/','','https://mariadb.com/kb/en/library/st_astext/'),(31,'ST_ASWKT',3,'A synonym for ST_ASTEXT().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_aswkt/','','https://mariadb.com/kb/en/library/st_aswkt/'),(32,'ST_GeomCollFromText',3,'Syntax\n------ \nST_GeomCollFromText(wkt[,srid])\nST_GeometryCollectionFromText(wkt[,srid])\nGeomCollFromText(wkt[,srid])\nGeometryCollectionFromText(wkt[,srid])\n \nDescription\n----------- \nConstructs a GEOMETRYCOLLECTION value using its WKT \nrepresentation and SRID.\n \nST_GeomCollFromText(), ST_GeometryCollectionFromText(),\nGeomCollFromText() and GeometryCollectionFromText() are all\nsynonyms.\n \nExample\n \nCREATE TABLE gis_geometrycollection (g GEOMETRYCOLLECTION);\nSHOW FIELDS FROM gis_geometrycollection;\n \nINSERT INTO gis_geometrycollection VALUES\n (GeomCollFromText(\'GEOMETRYCOLLECTION(POINT(0 0),\nLINESTRING(0 0,10 10))\')),\n (GeometryFromWKB(AsWKB(GeometryCollection(Point(44, 6),\nLineString(Point(3, 6), Point(7, 9)))))),\n (GeomFromText(\'GeometryCollection()\')),\n (GeomFromText(\'GeometryCollection EMPTY\'));\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_geomcollfromtext/','','https://mariadb.com/kb/en/library/st_geomcollfromtext/'),(33,'ST_GeometryCollectionFromText',3,'A synonym for ST_GeomCollFromText.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/st_geometrycollectionfromtext/','','https://mariadb.com/kb/en/library/st_geometrycollectionfromtext/'),(34,'ST_GeometryFromText',3,'A synonym for ST_GeomFromText.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_geometryfromtext/','','https://mariadb.com/kb/en/library/st_geometryfromtext/'),(35,'ST_GeomFromText',3,'Syntax\n------ \nST_GeomFromText(wkt[,srid])\nST_GeometryFromText(wkt[,srid])\nGeomFromText(wkt[,srid])\nGeometryFromText(wkt[,srid])\n \nDescription\n----------- \nConstructs a geometry value of any type using its WKT\nrepresentation and SRID.\n \nGeomFromText(), GeometryFromText(), ST_GeomFromText() and\nST_GeometryFromText() are all synonyms.\n \nExample\n \nSET @g = ST_GEOMFROMTEXT(\'POLYGON((1 1,1 5,4 9,6 9,9 3,7\n2,1 1))\');\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_geomfromtext/','','https://mariadb.com/kb/en/library/st_geomfromtext/'),(36,'ST_LineFromText',3,'Syntax\n------ \nST_LineFromText(wkt[,srid])\nST_LineStringFromText(wkt[,srid])\nLineFromText(wkt[,srid])\nLineStringFromText(wkt[,srid])\n \nDescription\n----------- \nConstructs a LINESTRING value using its WKT representation\nand SRID.\n \nST_LineFromText(), ST_LineStringFromText(),\nST_LineFromText() and ST_LineStringFromText() are all\nsynonyms.\n \nExamples\n-------- \nCREATE TABLE gis_line (g LINESTRING);\nSHOW FIELDS FROM gis_line;\n \nINSERT INTO gis_line VALUES\n (LineFromText(\'LINESTRING(0 0,0 10,10 0)\')),\n (LineStringFromText(\'LINESTRING(10 10,20 10,20 20,10 20,10\n10)\')),\n (LineStringFromWKB(AsWKB(LineString(Point(10, 10),\nPoint(40, 10)))));\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_linefromtext/','','https://mariadb.com/kb/en/library/st_linefromtext/'),(37,'ST_LineStringFromText',3,'A synonym for ST_LineFromText.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/st_linestringfromtext/','','https://mariadb.com/kb/en/library/st_linestringfromtext/'),(38,'ST_PointFromText',3,'Syntax\n------ \nST_PointFromText(wkt[,srid])\nPointFromText(wkt[,srid])\n \nDescription\n----------- \nConstructs a POINT value using its WKT representation and\nSRID.\n \nST_PointFromText() and PointFromText() are synonyms.\n \nExamples\n-------- \nCREATE TABLE gis_point (g POINT);\nSHOW FIELDS FROM gis_point;\n \nINSERT INTO gis_point VALUES\n (PointFromText(\'POINT(10 10)\')),\n (PointFromText(\'POINT(20 10)\')),\n (PointFromText(\'POINT(20 20)\')),\n (PointFromWKB(AsWKB(PointFromText(\'POINT(10 20)\'))));\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_pointfromtext/','','https://mariadb.com/kb/en/library/st_pointfromtext/'),(39,'ST_PolyFromText',3,'Syntax\n------ \nST_PolyFromText(wkt[,srid])\nST_PolygonFromText(wkt[,srid])\nPolyFromText(wkt[,srid])\nPolygonFromText(wkt[,srid])\n \nDescription\n----------- \nConstructs a POLYGON value using its WKT representation and\nSRID.\n \nST_PolyFromText(), ST_PolygonFromText(), PolyFromText() and\nST_PolygonFromText() are all synonyms.\n \nExamples\n-------- \nCREATE TABLE gis_polygon (g POLYGON);\nINSERT INTO gis_polygon VALUES\n (PolygonFromText(\'POLYGON((10 10,20 10,20 20,10 20,10\n10))\')),\n (PolyFromText(\'POLYGON((0 0,50 0,50 50,0 50,0 0), (10\n10,20 10,20 20,10 20,10 10))\'));\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_polyfromtext/','','https://mariadb.com/kb/en/library/st_polyfromtext/'),(40,'ST_PolygonFromText',3,'A synonym for ST_PolyFromText.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_polygonfromtext/','','https://mariadb.com/kb/en/library/st_polygonfromtext/'),(41,'Addition Operator (+)',4,'Syntax\n------ \n+\n \nDescription\n----------- \nAddition.\n \nIf both operands are integers, the result is calculated with\nBIGINT precision. If either integer is unsigned, the result\nis also an unsigned integer.\n \nFor real or string operands, the operand with the highest\nprecision determines the result precision.\n \nExamples\n-------- \nSELECT 3+5;\n \n+-----+\n| 3+5 |\n+-----+\n| 8 |\n+-----+\n \n\n\nURL: https://mariadb.com/kb/en/library/addition-operator/','','https://mariadb.com/kb/en/library/addition-operator/'),(42,'Subtraction Operator (-)',4,'Syntax\n------ \n-\n \nDescription\n----------- \nSubtraction. The operator is also used as the unary minus\nfor changing sign.\n \nIf both operands are integers, the result is calculated with\nBIGINT precision. If either integer is unsigned, the result\nis also an unsigned integer, unless the\nNO_UNSIGNED_SUBTRACTION SQL_MODE is enabled, in which case\nthe result is always signed.\n \nFor real or string operands, the operand with the highest\nprecision determines the result precision.\n \nExamples\n-------- \nSELECT 96-9;\n \n+------+\n| 96-9 |\n+------+\n| 87 |\n+------+\n \nSELECT 15-17;\n \n+-------+\n| 15-17 |\n+-------+\n| -2 |\n+-------+\n \nSELECT 3.66 + 1.333;\n \n+--------------+\n| 3.66 + 1.333 |\n+--------------+\n| 4.993 |\n+--------------+\n \nUnary minus:\n \n SELECT - (3+5);\n+---------+\n| - (3+5) |\n+---------+\n| -8 |\n+---------+\n \n\n\nURL:\nhttps://mariadb.com/kb/en/library/subtraction-operator-/','','https://mariadb.com/kb/en/library/subtraction-operator-/'),(43,'Division Operator (/)',4,'Syntax\n------ \n/\n \nDescription\n----------- \nDivision operator. Dividing by zero will return NULL. By\ndefault, returns four digits after the decimal. This is\ndetermined by the server system variable\ndiv_precision_increment which by default is four. It can be\nset from 0 to 30.\n \nDividing by zero returns NULL. If the\nERROR_ON_DIVISION_BY_ZERO SQL_MODE is used (the default\nsince MariaDB 10.2.4), a division by zero also produces a\nwarning.\n \nExamples\n-------- \nSELECT 4/5;\n \n+--------+\n| 4/5 |\n+--------+\n| 0.8000 |\n+--------+\n \nSELECT 300/(2-2);\n+-----------+\n| 300/(2-2) |\n+-----------+\n| NULL |\n+-----------+\n \nSELECT 300/7;\n \n+---------+\n| 300/7 |\n+---------+\n| 42.8571 |\n+---------+\n \nChanging div_precision_increment for the session from the\ndefault of four to six:\n \nSET div_precision_increment = 6;\n \nSELECT 300/7;\n \n+-----------+\n| 300/7 |\n+-----------+\n| 42.857143 |\n+-----------+\n \nSELECT 300/7;\n \n+-----------+\n| 300/7 |\n+-----------+\n| 42.857143 |\n+-----------+\n \n\n\nURL: https://mariadb.com/kb/en/library/division-operator/','','https://mariadb.com/kb/en/library/division-operator/'),(44,'Multiplication Operator (*)',4,'Syntax\n------ \n*\n \nDescription\n----------- \nMultiplication operator.\n \nExamples\n-------- \nSELECT 7*6;\n \n+-----+\n| 7*6 |\n+-----+\n| 42 |\n+-----+\n \nSELECT 1234567890*9876543210;\n \n+-----------------------+\n| 1234567890*9876543210 |\n+-----------------------+\n| -6253480962446024716 |\n+-----------------------+\n \nSELECT 18014398509481984*18014398509481984.0;\n \n+---------------------------------------+\n| 18014398509481984*18014398509481984.0 |\n+---------------------------------------+\n| 324518553658426726783156020576256.0 |\n+---------------------------------------+\n \nSELECT 18014398509481984*18014398509481984;\n \n+-------------------------------------+\n| 18014398509481984*18014398509481984 |\n+-------------------------------------+\n| 0 |\n+-------------------------------------+\n \n\n\nURL:\nhttps://mariadb.com/kb/en/library/multiplication-operator/','','https://mariadb.com/kb/en/library/multiplication-operator/'),(45,'Modulo Operator (%)',4,'Syntax\n------ \nN % M\n \nDescription\n----------- \nModulo operator. Returns the remainder of N divided by M.\nSee also MOD.\n \nExamples\n-------- \nSELECT 1042 % 50;\n \n+-----------+\n| 1042 % 50 |\n+-----------+\n| 42 |\n+-----------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/modulo-operator/','','https://mariadb.com/kb/en/library/modulo-operator/'),(46,'DIV',4,'Syntax\n------ \nDIV\n \nDescription\n----------- \nInteger division. Similar to FLOOR(), but is safe with\nBIGINT values.\nIncorrect results may occur for non-integer operands that\nexceed BIGINT range.\n \nIf the ERROR_ON_DIVISION_BY_ZERO SQL_MODE is used, a\ndivision by zero produces an error. Otherwise, it returns\nNULL.\n \nThe remainder of a division can be obtained using the MOD\noperator.\n \nExamples\n-------- \nSELECT 300 DIV 7;\n \n+-----------+\n| 300 DIV 7 |\n+-----------+\n| 42 |\n+-----------+\n \nSELECT 300 DIV 0;\n \n+-----------+\n| 300 DIV 0 |\n+-----------+\n| NULL |\n+-----------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/div/','','https://mariadb.com/kb/en/library/div/'),(47,'ABS',4,'Syntax\n------ \nABS(X)\n \nDescription\n----------- \nReturns the absolute (non-negative) value of X. If X is not\na number, it is converted to a numeric type.\n \nExamples\n-------- \nSELECT ABS(42);\n+---------+\n| ABS(42) |\n+---------+\n| 42 |\n+---------+\n \nSELECT ABS(-42);\n+----------+\n| ABS(-42) |\n+----------+\n| 42 |\n+----------+\n \nSELECT ABS(DATE \'1994-01-01\');\n+------------------------+\n| ABS(DATE \'1994-01-01\') |\n+------------------------+\n| 19940101 |\n+------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/abs/','','https://mariadb.com/kb/en/library/abs/'),(48,'ACOS',4,'Syntax\n------ \nACOS(X)\n \nDescription\n----------- \nReturns the arc cosine of X, that is, the value whose cosine\nis X.\nReturns NULL if X is not in the range -1 to 1.\n \nExamples\n-------- \nSELECT ACOS(1);\n+---------+\n| ACOS(1) |\n+---------+\n| 0 |\n+---------+\n \nSELECT ACOS(1.0001);\n+--------------+\n| ACOS(1.0001) |\n+--------------+\n| NULL |\n+--------------+\n \nSELECT ACOS(0);\n+-----------------+\n| ACOS(0) |\n+-----------------+\n| 1.5707963267949 |\n+-----------------+\n \nSELECT ACOS(0.234);\n+------------------+\n| ACOS(0.234) |\n+------------------+\n| 1.33460644244679 |\n+------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/acos/','','https://mariadb.com/kb/en/library/acos/'),(49,'ASIN',4,'Syntax\n------ \nASIN(X)\n \nDescription\n----------- \nReturns the arc sine of X, that is, the value whose sine is\nX. Returns\nNULL if X is not in the range -1 to 1.\n \nExamples\n-------- \nSELECT ASIN(0.2);\n+--------------------+\n| ASIN(0.2) |\n+--------------------+\n| 0.2013579207903308 |\n+--------------------+\n \nSELECT ASIN(\'foo\');\n+-------------+\n| ASIN(\'foo\') |\n+-------------+\n| 0 |\n+-------------+\n \nSHOW WARNINGS;\n \n+---------+------+-----------------------------------------+\n| Level | Code | Message |\n+---------+------+-----------------------------------------+\n| Warning | 1292 | Truncated incorrect DOUBLE value: \'foo\'\n|\n+---------+------+-----------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/asin/','','https://mariadb.com/kb/en/library/asin/'),(50,'ATAN',4,'Syntax\n------ \nATAN(X)\n \nDescription\n----------- \nReturns the arc tangent of X, that is, the value whose\ntangent is X.\n \nExamples\n-------- \nSELECT ATAN(2);\n+--------------------+\n| ATAN(2) |\n+--------------------+\n| 1.1071487177940904 |\n+--------------------+\n \nSELECT ATAN(-2);\n+---------------------+\n| ATAN(-2) |\n+---------------------+\n| -1.1071487177940904 |\n+---------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/atan/','','https://mariadb.com/kb/en/library/atan/'),(51,'ATAN2',4,'Syntax\n------ \nATAN(Y,X), ATAN2(Y,X)\n \nDescription\n----------- \nReturns the arc tangent of the two variables X and Y. It is\nsimilar to\ncalculating the arc tangent of Y / X, except that the signs\nof both\narguments are used to determine the quadrant of the result.\n \nExamples\n-------- \nSELECT ATAN(-2,2);\n+---------------------+\n| ATAN(-2,2) |\n+---------------------+\n| -0.7853981633974483 |\n+---------------------+\n \nSELECT ATAN2(PI(),0);\n+--------------------+\n| ATAN2(PI(),0) |\n+--------------------+\n| 1.5707963267948966 |\n+--------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/atan2/','','https://mariadb.com/kb/en/library/atan2/'),(52,'CEIL',4,'Syntax\n------ \nCEIL(X)\n \nDescription\n----------- \nCEIL() is a synonym for CEILING().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/ceil/','','https://mariadb.com/kb/en/library/ceil/'),(53,'CEILING',4,'Syntax\n------ \nCEILING(X)\n \nDescription\n----------- \nReturns the smallest integer value not less than X.\n \nExamples\n-------- \nSELECT CEILING(1.23);\n+---------------+\n| CEILING(1.23) |\n+---------------+\n| 2 |\n+---------------+\n \nSELECT CEILING(-1.23);\n+----------------+\n| CEILING(-1.23) |\n+----------------+\n| -1 |\n+----------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/ceiling/','','https://mariadb.com/kb/en/library/ceiling/'),(54,'CONV',4,'Syntax\n------ \nCONV(N,from_base,to_base)\n \nDescription\n----------- \nConverts numbers between different number bases. Returns a\nstring\nrepresentation of the number N, converted from base\nfrom_base\nto base to_base.\n \nReturns NULL if any argument is NULL, or if the second or\nthird argument are not in the allowed range.\n \nThe argument N is interpreted as an integer, but may be\nspecified as an\ninteger or a string. The minimum base is 2 and the maximum\nbase is 36. If\nto_base is a negative number, N is regarded as a signed\nnumber.\nOtherwise, N is treated as unsigned. CONV() works with\n64-bit\nprecision.\n \nSome shortcuts for this function are also available: BIN(),\nOCT(), HEX(), UNHEX(). Also, MariaDB allows binary literal\nvalues and hexadecimal literal values.\n \nExamples\n-------- \nSELECT CONV(\'a\',16,2);\n+----------------+\n| CONV(\'a\',16,2) |\n+----------------+\n| 1010 |\n+----------------+\n \nSELECT CONV(\'6E\',18,8);\n+-----------------+\n| CONV(\'6E\',18,8) |\n+-----------------+\n| 172 |\n+-----------------+\n \nSELECT CONV(-17,10,-18);\n+------------------+\n| CONV(-17,10,-18) |\n+------------------+\n| -H |\n+------------------+\n \nSELECT CONV(12+\'10\'+\'10\'+0xa,10,10);\n+------------------------------+\n| CONV(12+\'10\'+\'10\'+0xa,10,10) |\n+------------------------------+\n| 42 |\n+------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/conv/','','https://mariadb.com/kb/en/library/conv/'),(55,'COS',4,'Syntax\n------ \nCOS(X)\n \nDescription\n----------- \nReturns the cosine of X, where X is given in radians.\n \nExamples\n-------- \nSELECT COS(PI());\n+-----------+\n| COS(PI()) |\n+-----------+\n| -1 |\n+-----------\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/cos/','','https://mariadb.com/kb/en/library/cos/'),(56,'COT',4,'Syntax\n------ \nCOT(X)\n \nDescription\n----------- \nReturns the cotangent of X.\n \nExamples\n-------- \nSELECT COT(42);\n+--------------------+\n| COT(42) |\n+--------------------+\n| 0.4364167060752729 |\n+--------------------+\n \nSELECT COT(12);\n+---------------------+\n| COT(12) |\n+---------------------+\n| -1.5726734063976893 |\n+---------------------+\n \nSELECT COT(0);\nERROR 1690 (22003): DOUBLE value is out of range in\n\'cot(0)\'\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/cot/','','https://mariadb.com/kb/en/library/cot/'),(57,'CRC32',4,'Syntax\n------ \nCRC32(expr)\n \nDescription\n----------- \nComputes a cyclic redundancy check value and returns a\n32-bit unsigned\nvalue. The result is NULL if the argument is NULL. The\nargument is\nexpected to be a string and (if possible) is treated as one\nif it is\nnot.\n \nExamples\n-------- \nSELECT CRC32(\'MariaDB\');\n+------------------+\n| CRC32(\'MariaDB\') |\n+------------------+\n| 4227209140 |\n+------------------+\n \nSELECT CRC32(\'mariadb\');\n+------------------+\n| CRC32(\'mariadb\') |\n+------------------+\n| 2594253378 |\n+------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/crc32/','','https://mariadb.com/kb/en/library/crc32/'),(58,'DEGREES',4,'Syntax\n------ \nDEGREES(X)\n \nDescription\n----------- \nReturns the argument X, converted from radians to degrees.\n \nThis is the converse of the RADIANS() function.\n \nExamples\n-------- \nSELECT DEGREES(PI());\n+---------------+\n| DEGREES(PI()) |\n+---------------+\n| 180 |\n+---------------+\n \nSELECT DEGREES(PI() / 2);\n+-------------------+\n| DEGREES(PI() / 2) |\n+-------------------+\n| 90 |\n+-------------------+\n \nSELECT DEGREES(45);\n+-----------------+\n| DEGREES(45) |\n+-----------------+\n| 2578.3100780887 |\n+-----------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/degrees/','','https://mariadb.com/kb/en/library/degrees/'),(59,'EXP',4,'Syntax\n------ \nEXP(X)\n \nDescription\n----------- \nReturns the value of e (the base of natural logarithms)\nraised to the\npower of X. The inverse of this function is LOG() (using a\nsingle\nargument only) or LN().\n \nIf X is NULL, this function returns NULL.\n \nExamples\n-------- \nSELECT EXP(2);\n+------------------+\n| EXP(2) |\n+------------------+\n| 7.38905609893065 |\n+------------------+\n \nSELECT EXP(-2);\n+--------------------+\n| EXP(-2) |\n+--------------------+\n| 0.1353352832366127 |\n+--------------------+\n \nSELECT EXP(0);\n+--------+\n| EXP(0) |\n+--------+\n| 1 |\n+--------+\n \nSELECT EXP(NULL);\n+-----------+\n| EXP(NULL) |\n+-----------+\n| NULL |\n+-----------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/exp/','','https://mariadb.com/kb/en/library/exp/'),(60,'FLOOR',4,'Syntax\n------ \nFLOOR(X)\n \nDescription\n----------- \nReturns the largest integer value not greater than X.\n \nExamples\n-------- \nSELECT FLOOR(1.23);\n+-------------+\n| FLOOR(1.23) |\n+-------------+\n| 1 |\n+-------------+\n \nSELECT FLOOR(-1.23);\n+--------------+\n| FLOOR(-1.23) |\n+--------------+\n| -2 |\n+--------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/floor/','','https://mariadb.com/kb/en/library/floor/'),(61,'LN',4,'Syntax\n------ \nLN(X)\n \nDescription\n----------- \nReturns the natural logarithm of X; that is, the base-e\nlogarithm of X.\nIf X is less than or equal to 0, or NULL, then NULL is\nreturned.\n \nThe inverse of this function is EXP().\n \nExamples\n-------- \nSELECT LN(2);\n+-------------------+\n| LN(2) |\n+-------------------+\n| 0.693147180559945 |\n+-------------------+\n \nSELECT LN(-2);\n+--------+\n| LN(-2) |\n+--------+\n| NULL |\n+--------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/ln/','','https://mariadb.com/kb/en/library/ln/'),(62,'LOG',4,'Syntax\n------ \nLOG(X), LOG(B,X)\n \nDescription\n----------- \nIf called with one parameter, this function returns the\nnatural\nlogarithm of X. If X is less than or equal to 0, then NULL\nis\nreturned.\n \nIf called with two parameters, it returns the logarithm of X\nto the base B. If B is \n\nURL: https://mariadb.com/kb/en/library/log/','','https://mariadb.com/kb/en/library/log/'),(63,'LOG10',4,'Syntax\n------ \nLOG10(X)\n \nDescription\n----------- \nReturns the base-10 logarithm of X.\n \nExamples\n-------- \nSELECT LOG10(2);\n+-------------------+\n| LOG10(2) |\n+-------------------+\n| 0.301029995663981 |\n+-------------------+\n \nSELECT LOG10(100);\n+------------+\n| LOG10(100) |\n+------------+\n| 2 |\n+------------+\n \nSELECT LOG10(-100);\n+-------------+\n| LOG10(-100) |\n+-------------+\n| NULL |\n+-------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/log10/','','https://mariadb.com/kb/en/library/log10/'),(64,'LOG2',4,'Syntax\n------ \nLOG2(X)\n \nDescription\n----------- \nReturns the base-2 logarithm of X.\n \nExamples\n-------- \nSELECT LOG2(4398046511104);\n+---------------------+\n| LOG2(4398046511104) |\n+---------------------+\n| 42 |\n+---------------------+\n \nSELECT LOG2(65536);\n+-------------+\n| LOG2(65536) |\n+-------------+\n| 16 |\n+-------------+\n \nSELECT LOG2(-100);\n+------------+\n| LOG2(-100) |\n+------------+\n| NULL |\n+------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/log2/','','https://mariadb.com/kb/en/library/log2/'),(65,'MOD',4,'Syntax\n------ \nMOD(N,M), N % M, N MOD M\n \nDescription\n----------- \nModulo operation. Returns the remainder of N divided by M.\nSee also Modulo Operator.\n \nIf the ERROR_ON_DIVISION_BY_ZERO SQL_MODE is used, any\nnumber modulus zero produces an error. Otherwise, it returns\nNULL.\n \nThe integer part of a division can be obtained using DIV.\n \nExamples\n-------- \nSELECT 1042 % 50;\n \n+-----------+\n| 1042 % 50 |\n+-----------+\n| 42 |\n+-----------+\n \nSELECT MOD(234, 10);\n+--------------+\n| MOD(234, 10) |\n+--------------+\n| 4 |\n+--------------+\n \nSELECT 253 % 7;\n \n+---------+\n| 253 % 7 |\n+---------+\n| 1 |\n+---------+\n \nSELECT MOD(29,9);\n+-----------+\n| MOD(29,9) |\n+-----------+\n| 2 |\n+-----------+\n \nSELECT 29 MOD 9;\n \n+----------+\n| 29 MOD 9 |\n+----------+\n| 2 |\n+----------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/mod/','','https://mariadb.com/kb/en/library/mod/'),(66,'OCT',4,'Syntax\n------ \nOCT(N)\n \nDescription\n----------- \nReturns a string representation of the octal value of N,\nwhere N is a longlong (BIGINT) number. This is equivalent to\nCONV(N,10,8). Returns NULL if N is NULL.\n \nExamples\n-------- \nSELECT OCT(34);\n+---------+\n| OCT(34) |\n+---------+\n| 42 |\n+---------+\n \nSELECT OCT(12);\n+---------+\n| OCT(12) |\n+---------+\n| 14 |\n+---------+\n \n\n\nURL: https://mariadb.com/kb/en/library/oct/','','https://mariadb.com/kb/en/library/oct/'),(67,'PI',4,'Syntax\n------ \nPI()\n \nDescription\n----------- \nReturns the value of π (pi). The default number of decimal\nplaces\ndisplayed is six, but MariaDB uses the full double-precision\nvalue\ninternally.\n \nExamples\n-------- \nSELECT PI();\n+----------+\n| PI() |\n+----------+\n| 3.141593 |\n+----------+\n \nSELECT PI()+0.0000000000000000000000;\n \n+-------------------------------+\n| PI()+0.0000000000000000000000 |\n+-------------------------------+\n| 3.1415926535897931159980 |\n+-------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/pi/','','https://mariadb.com/kb/en/library/pi/'),(68,'POW',4,'Syntax\n------ \nPOW(X,Y)\n \nDescription\n----------- \nReturns the value of X raised to the power of Y.\n \nPOWER() is a synonym.\n \nExamples\n-------- \nSELECT POW(2,3);\n+----------+\n| POW(2,3) |\n+----------+\n| 8 |\n+----------+\n \nSELECT POW(2,-2);\n+-----------+\n| POW(2,-2) |\n+-----------+\n| 0.25 |\n+-----------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/pow/','','https://mariadb.com/kb/en/library/pow/'),(69,'POWER',4,'Syntax\n------ \nPOWER(X,Y)\n \nDescription\n----------- \nThis is a synonym for POW(), which returns the value of X\nraised to the power of Y.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/power/','','https://mariadb.com/kb/en/library/power/'),(70,'RADIANS',4,'Syntax\n------ \nRADIANS(X)\n \nDescription\n----------- \nReturns the argument X, converted from degrees to radians.\nNote that\nπ radians equals 180 degrees. \n \nThis is the converse of the DEGREES() function.\n \nExamples\n-------- \nSELECT RADIANS(45);\n+-------------------+\n| RADIANS(45) |\n+-------------------+\n| 0.785398163397448 |\n+-------------------+\n \nSELECT RADIANS(90);\n+-----------------+\n| RADIANS(90) |\n+-----------------+\n| 1.5707963267949 |\n+-----------------+\n \nSELECT RADIANS(PI());\n+--------------------+\n| RADIANS(PI()) |\n+--------------------+\n| 0.0548311355616075 |\n+--------------------+\n \nSELECT RADIANS(180);\n+------------------+\n| RADIANS(180) |\n+------------------+\n| 3.14159265358979 |\n+------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/radians/','','https://mariadb.com/kb/en/library/radians/'),(71,'RAND',4,'Syntax\n------ \nRAND(), RAND(N)\n \nDescription\n----------- \nReturns a random DOUBLE precision floating point value v in\nthe range 0 \n\nURL: https://mariadb.com/kb/en/library/rand/','','https://mariadb.com/kb/en/library/rand/'),(72,'ROUND',4,'Syntax\n------ \nROUND(X), ROUND(X,D)\n \nDescription\n----------- \nRounds the argument X to D decimal places. The rounding\nalgorithm\ndepends on the data type of X. D defaults to 0 if not\nspecified.\nD can be negative to cause D digits left of the decimal\npoint of the\nvalue X to become zero.\n \nExamples\n-------- \nSELECT ROUND(-1.23);\n+--------------+\n| ROUND(-1.23) |\n+--------------+\n| -1 |\n+--------------+\n \nSELECT ROUND(-1.58);\n+--------------+\n| ROUND(-1.58) |\n+--------------+\n| -2 |\n+--------------+\n \nSELECT ROUND(1.58); \n+-------------+\n| ROUND(1.58) |\n+-------------+\n| 2 |\n+-------------+\n \nSELECT ROUND(1.298, 1);\n+-----------------+\n| ROUND(1.298, 1) |\n+-----------------+\n| 1.3 |\n+-----------------+\n \nSELECT ROUND(1.298, 0);\n+-----------------+\n| ROUND(1.298, 0) |\n+-----------------+\n| 1 |\n+-----------------+\n \nSELECT ROUND(23.298, -1);\n+-------------------+\n| ROUND(23.298, -1) |\n+-------------------+\n| 20 |\n+-------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/round/','','https://mariadb.com/kb/en/library/round/'),(73,'SIGN',4,'Syntax\n------ \nSIGN(X)\n \nDescription\n----------- \nReturns the sign of the argument as -1, 0, or 1, depending\non whether\nX is negative, zero, or positive.\n \nExamples\n-------- \nSELECT SIGN(-32);\n+-----------+\n| SIGN(-32) |\n+-----------+\n| -1 |\n+-----------+\n \nSELECT SIGN(0);\n+---------+\n| SIGN(0) |\n+---------+\n| 0 |\n+---------+\n \nSELECT SIGN(234);\n+-----------+\n| SIGN(234) |\n+-----------+\n| 1 |\n+-----------+\n \n\n\nURL: https://mariadb.com/kb/en/library/sign/','','https://mariadb.com/kb/en/library/sign/'),(74,'SIN',4,'Syntax\n------ \nSIN(X)\n \nDescription\n----------- \nReturns the sine of X, where X is given in radians.\n \nExamples\n-------- \nSELECT SIN(1.5707963267948966);\n+-------------------------+\n| SIN(1.5707963267948966) |\n+-------------------------+\n| 1 |\n+-------------------------+\n \nSELECT SIN(PI());\n+----------------------+\n| SIN(PI()) |\n+----------------------+\n| 1.22460635382238e-16 |\n+----------------------+\n \nSELECT ROUND(SIN(PI()));\n+------------------+\n| ROUND(SIN(PI())) |\n+------------------+\n| 0 |\n+------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/sin/','','https://mariadb.com/kb/en/library/sin/'),(75,'SQRT',4,'Syntax\n------ \nSQRT(X)\n \nDescription\n----------- \nReturns the square root of X. If X is negative, NULL is\nreturned.\n \nExamples\n-------- \nSELECT SQRT(4);\n+---------+\n| SQRT(4) |\n+---------+\n| 2 |\n+---------+\n \nSELECT SQRT(20);\n+------------------+\n| SQRT(20) |\n+------------------+\n| 4.47213595499958 |\n+------------------+\n \nSELECT SQRT(-16);\n+-----------+\n| SQRT(-16) |\n+-----------+\n| NULL |\n+-----------+\n \nSELECT SQRT(1764);\n+------------+\n| SQRT(1764) |\n+------------+\n| 42 |\n+------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/sqrt/','','https://mariadb.com/kb/en/library/sqrt/'),(76,'TAN',4,'Syntax\n------ \nTAN(X)\n \nDescription\n----------- \nReturns the tangent of X, where X is given in radians.\n \nExamples\n-------- \nSELECT TAN(0.7853981633974483);\n+-------------------------+\n| TAN(0.7853981633974483) |\n+-------------------------+\n| 0.9999999999999999 |\n+-------------------------+\n \nSELECT TAN(PI());\n+-----------------------+\n| TAN(PI()) |\n+-----------------------+\n| -1.22460635382238e-16 |\n+-----------------------+\n \nSELECT TAN(PI()+1);\n+-----------------+\n| TAN(PI()+1) |\n+-----------------+\n| 1.5574077246549 |\n+-----------------+\n \nSELECT TAN(RADIANS(PI()));\n+--------------------+\n| TAN(RADIANS(PI())) |\n+--------------------+\n| 0.0548861508080033 |\n+--------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/tan/','','https://mariadb.com/kb/en/library/tan/'),(77,'TRUNCATE',4,'This page documents the TRUNCATE function. See TRUNCATE\nTABLE for the DDL statement.\n \nSyntax\n------ \nTRUNCATE(X,D)\n \nDescription\n----------- \nReturns the number X, truncated to D decimal places. If D is\n0, the\nresult has no decimal point or fractional part. D can be\nnegative to\ncause D digits left of the decimal point of the value X to\nbecome\nzero.\n \nExamples\n-------- \nSELECT TRUNCATE(1.223,1);\n+-------------------+\n| TRUNCATE(1.223,1) |\n+-------------------+\n| 1.2 |\n+-------------------+\n \nSELECT TRUNCATE(1.999,1);\n+-------------------+\n| TRUNCATE(1.999,1) |\n+-------------------+\n| 1.9 |\n+-------------------+\n \nSELECT TRUNCATE(1.999,0); \n+-------------------+\n| TRUNCATE(1.999,0) |\n+-------------------+\n| 1 |\n+-------------------+\n \nSELECT TRUNCATE(-1.999,1);\n+--------------------+\n| TRUNCATE(-1.999,1) |\n+--------------------+\n| -1.9 |\n+--------------------+\n \nSELECT TRUNCATE(122,-2);\n+------------------+\n| TRUNCATE(122,-2) |\n+------------------+\n| 100 |\n+------------------+\n \nSELECT TRUNCATE(10.28*100,0);\n+-----------------------+\n| TRUNCATE(10.28*100,0) |\n+-----------------------+\n| 1028 |\n+-----------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/truncate/','','https://mariadb.com/kb/en/library/truncate/'),(78,'Plugin Overview',5,'Plugins are server components that enhance MariaDB in some\nway. These can be anything from new storage engines, plugins\nfor enhancing full-text parsing, or even small enhancements,\nsuch as a plugin to get a timestamp as an integer.\n \nQuerying Plugin Information\n \nThere are a number of ways to see which plugins are\ncurrently active.\n \nA server almost always has a large number of active plugins,\nbecause the server contains a large number of built-in\nplugins, which are active by default and cannot be\nuninstalled.\n \nQuerying Plugin Information with SHOW PLUGINS\n \nThe SHOW PLUGINS statement can be used to query information\nabout all active plugins.\n \nFor example:\n \nSHOW PLUGINS;\n \n+----------------------------+----------+--------------------+---------+---------+\n| Name | Status | Type | Library | License |\n+----------------------------+----------+--------------------+---------+---------+\n...\n| mysql_native_password | ACTIVE | AUTHENTICATION | NULL |\nGPL |\n| mysql_old_password | ACTIVE | AUTHENTICATION | NULL | GPL\n|\n| MRG_MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |\n...\n+----------------------------+----------+--------------------+---------+---------+\n \nIf a plugin\'s Library column has the NULL value, then the\nplugin is built-in, and it cannot be uninstalled.\n \nQuerying Plugin Information with information_schema.PLUGINS\n \nThe information_schema.PLUGINS table can be queried to get\nmore detailed information about plugins.\n \nFor example:\n \nSELECT * FROM information_schema.PLUGINS\\G\n...\n*************************** 6. row\n***************************\n PLUGIN_NAME: CSV\n PLUGIN_VERSION: 1.0\n PLUGIN_STATUS: ACTIVE\n PLUGIN_TYPE: STORAGE ENGINE\n PLUGIN_TYPE_VERSION: 100003.0\n PLUGIN_LIBRARY: NULL\nPLUGIN_LIBRARY_VERSION: NULL\n PLUGIN_AUTHOR: Brian Aker, MySQL AB\n PLUGIN_DESCRIPTION: CSV storage engine\n PLUGIN_LICENSE: GPL\n LOAD_OPTION: FORCE\n PLUGIN_MATURITY: Stable\n PLUGIN_AUTH_VERSION: 1.0\n*************************** 7. row\n***************************\n PLUGIN_NAME: MEMORY\n PLUGIN_VERSION: 1.0\n PLUGIN_STATUS: ACTIVE\n PLUGIN_TYPE: STORAGE ENGINE\n PLUGIN_TYPE_VERSION: 100003.0\n PLUGIN_LIBRARY: NULL\nPLUGIN_LIBRARY_VERSION: NULL\n PLUGIN_AUTHOR: MySQL AB\n PLUGIN_DESCRIPTION: Hash based, stored in memory, useful\nfor temporary tables\n PLUGIN_LICENSE: GPL\n LOAD_OPTION: FORCE\n PLUGIN_MATURITY: Stable\n PLUGIN_AUTH_VERSION: 1.0\n...\n \nIf a plugin\'s PLUGIN_LIBRARY column has the NULL value,\nthen the plugin is built-in, and it cannot be uninstalled.\n \nQuerying Plugin Information with mysql.plugin\n \nThe mysql.plugin table can be queried to get information\nabout installed plugins.\n \nThis table only contains information about plugins that have\nbeen installed via the following methods:\nThe INSTALL SONAME statement.\nThe INSTALL PLUGIN statement.\nThe mysql_plugin utility.\n \nThis table does not contain information about:\nBuilt-in plugins.\nPlugins loaded with the --plugin-load-add option.\nPlugins loaded with the --plugin-load option.\n \nThis table only contains enough information to reload the\nplugin when the server is restarted, which means it only\ncontains the plugin name and the plugin library.\n \nFor example:\n \nSELECT * FROM mysql.plugin;\n \n+------+------------+\n| name | dl |\n+------+------------+\n| PBXT | libpbxt.so |\n+------+------------+\n \nInstalling a Plugin\n \nThere are three primary ways to install a plugin:\nA plugin can be installed dynamically with an SQL statement.\nA plugin can be installed with a mysqld option, but it\nrequires a server restart.\nA plugin can be installed with the mysql_plugin utility,\nwhile the server is completely offline.\n \nWhen you are installing a plugin, you also have to ensure\nthat:\nThe server\'s plugin directory is properly configured, and\nthe plugin\'s library is in the plugin directory.\nThe server\'s minimum plugin maturity is properly\nconfigured, and the plugin is mature enough to be installed.\n \nInstalling a Plugin Dynamically\n \nA plugin can be installed dynamically by executing either\nthe INSTALL SONAME or the INSTALL PLUGIN statement.\n \nIf a plugin is installed with one of these statements, then\na record will be added to the mysql.plugins table for the\nplugin. This means that the plugin will automatically be\nloaded every time the server restarts, unless specifically\nuninstalled or deactivated.\n \nInstalling a Plugin with INSTALL SONAME\n \nYou can install a plugin dynamically by executing the\nINSTALL SONAME statement. INSTALL SONAME installs all\nplugins from the given plugin library. This could be\nrequired for some plugin libraries.\n \nFor example, to install all plugins in the server_audit\nplugin library (which is currently only the server_audit\naudit plugin), you could execute the following:\n \nINSTALL SONAME \'server_audit\';\n \nInstalling a Plugin with INSTALL PLUGIN\n \nYou can install a plugin dynamically by executing the\nINSTALL PLUGIN statement. INSTALL PLUGIN installs a single\nplugin from the given plugin library.\n \nFor example, to install the server_audit audit plugin from\nthe server_audit plugin library, you could execute the\nfollowing:\n \nINSTALL PLUGIN server_audit SONAME \'server_audit\';\n \nInstalling a Plugin with Plugin Load Options\n \nA plugin can be installed with a mysqld option by providing\neither the --plugin-load-add or the --plugin-load option.\n \nIf a plugin is installed with one of these options, then a\nrecord will not be added to the mysql.plugins table for the\nplugin. This means that if the server is restarted without\nthe same option set, then the plugin will not automatically\nbe loaded.\n \nInstalling a Plugin with --plugin-load-add\n \nYou can install a plugin with the --plugin-load-add option\nby specifying the option as a command-line argument to\nmysqld or by specifying the option in a relevant server\noption group in an option file.\n \nThe --plugin-load-add option uses the following format:\nPlugins can be specified in the format name=library, where\nname is the plugin name and library is the plugin library.\nThis format installs a single plugin from the given plugin\nlibrary.\nPlugins can also be specified in the format library, where\nlibrary is the plugin library. This format installs all\nplugins from the given plugin library.\nMultiple plugins can be specified by separating them with\nsemicolons.\n \nFor example, to install all plugins in the server_audit\nplugin library (which is currently only the server_audit\naudit plugin) and also the ed25519 authentication plugin\nfrom the auth_ed25519 plugin library, you could set the\noption to the following values on the command-line:\n \n$ mysqld --user=mysql --plugin-load-add=\'server_audit\'\n--plugin-load-add=\'ed25519=auth_ed25519\'\n \nYou could also set the option to the same values in an\noption file:\n \n[mariadb]\n...\nplugin_load_add = server_audit\nplugin_load_add = ed25519=auth_ed25519\n \nSpecial care must be taken when specifying both the\n--plugin-load option and the --plugin-load-add option\ntogether. The --plugin-load option resets the plugin load\nlist, and this can cause unexpected problems if you are not\naware. The --plugin-load-add option does not reset the\nplugin load list, so it is much safer to use. See Specifying\nMultiple Plugin Load Options for more information.\n \nInstalling a Plugin with --plugin-load\n \nYou can install a plugin with the --plugin-load option by\nspecifying the option as a command-line argument to mysqld\nor by specifying the option in a relevant server option\ngroup in an option file.\n \nThe --plugin-load option uses the following format:\nPlugins can be specified in the format name=library, where\nname is the plugin name and library is the plugin library.\nThis format installs a single plugin from the given plugin\nlibrary.\nPlugins can also be specified in the format library, where\nlibrary is the plugin library. This format installs all\nplugins from the given plugin library.\nMultiple plugins can be specified by separating them with\nsemicolons.\n \nFor example, to install all plugins in the server_audit\nplugin library (which is currently only the server_audit\naudit plugin) and also the ed25519 authentication plugin\nfrom the auth_ed25519 plugin library, you could set the\noption to the following values on the command-line:\n \n$ mysqld --user=mysql\n--plugin-load=\'server_audit;ed25519=auth_ed25519\'\n \nYou could also set the option to the same values in an\noption file:\n \n[mariadb]\n...\nplugin_load = server_audit;ed25519=auth_ed25519\n \nSpecial care must be taken when specifying the --plugin-load\noption multiple times, or when specifying both the\n--plugin-load option and the --plugin-load-add option\ntogether. The --plugin-load option resets the plugin load\nlist, and this can cause unexpected problems if you are not\naware. The --plugin-load-add option does not reset the\nplugin load list, so it is much safer to use. See Specifying\nMultiple Plugin Load Options for more information.\n \nSpecifying Multiple Plugin Load Options\n \nSpecial care must be taken when specifying the --plugin-load\noption multiple times, or when specifying both the\n--plugin-load option and the --plugin-load-add option. The\n--plugin-load option resets the plugin load list, and this\ncan cause unexpected problems if you are not aware. The\n--plugin-load-add option does not reset the plugin load\nlist, so it is much safer to use.\n \nThis can have the following consequences:\nIf the --plugin-load option is specified multiple times,\nthen only the last instance will have any effect. For\nexample, in the following case, the first instance of the\noption is reset:\n \n[mariadb]\n...\nplugin_load = server_audit\nplugin_load = ed25519=auth_ed25519\nIf the --plugin-load option is specified after the\n--plugin-load-add option, then it will also reset the\nchanges made by that option. For example, in the following\ncase, the --plugin-load-add option does not do anything,\nbecause the subsequent --plugin-load option resets the\nplugin load list:\n \n[mariadb]\n...\nplugin_load_add = server_audit\nplugin_load = ed25519=auth_ed25519\nIn contrast, if the --plugin-load option is specified before\nthe --plugin-load-add option, then it will work fine,\nbecause the --plugin-load-add option does not reset the\nplugin load list. For example, in the following case, both\nplugins are properly loaded:\n \n[mariadb]\n...\nplugin_load = server_audit\nplugin_load_add = ed25519=auth_ed25519\n \nInstalling a Plugin with mysql_plugin\n \nA plugin can be installed with the mysql_plugin utility if\nthe server is completely offline. \n \nThe syntax is:\n \nmysql_plugin [options] \n ENABLE|DISABLE\n \nFor example, to install the server_audit audit plugin, you\ncould execute the following:\n \nmysql_plugin server_audit ENABLE\n \nIf a plugin is installed with this utility, then a record\nwill be added to the mysql.plugins table for the plugin.\nThis means that the plugin will automatically be loaded\nevery time the server restarts, unless specifically\nuninstalled or deactivated.\n \nConfiguring the Plugin Directory\n \nWhen a plugin is being installed, the server looks for the\nplugin\'s library in the server\'s plugin directory. This\ndirectory is configured by the plugin_dir system variable.\nThis can be specified as a command-line argument to mysqld\nor it can be specified in a relevant server option group in\nan option file. For example:\n \n[mariadb]\n...\nplugin_dir = /usr/lib64/mysql/plugin\n \nConfiguring the Minimum Plugin Maturity\n \nWhen a plugin is being installed, the server compares the\nplugin\'s maturity level against the server\'s minimum\nallowed plugin maturity. This can help prevent users from\nusing unstable plugins on production servers. This minimum\nplugin maturity is configured by the plugin_maturity system\nvariable. This can be specified as a command-line argument\nto mysqld or it can be specified in a relevant server option\ngroup in an option file. For example:\n \n[mariadb]\n...\nplugin_maturity = stable\n \nConfiguring Plugin Activation at Server Startup\n \nA plugin will be loaded by default when the server starts\nif:\nThe plugin was installed with the INSTALL SONAME statement.\nThe plugin was installed with the INSTALL PLUGIN statement.\nThe plugin was installed with the mysql_plugin utility.\nThe server is configured to load the plugin with the\n--plugin-load-add option.\nThe server is configured to load the plugin with the\n--plugin-load option.\n \nThis behavior can be changed with special options that take\nthe form --plugin-name. For example, for the server_audit\naudit plugin, the special option is called --server-audit.\n \nThe possible values for these special options are:\n \nOption Value | Description | \n \nOFF | Disables the plugin without removing it from the\nmysql.plugins table. | \n \nON | Enables the plugin. If the plugin cannot be\ninitialized, then the server will still continue starting\nup, but the plugin will be disabled. | \n \nFORCE | Enables the plugin. If the plugin cannot be\ninitialized, then the server will fail to start with an\nerror. | \n \nFORCE_PLUS_PERMANENT | Enables the plugin. If the plugin\ncannot be initialized, then the server will fail to start\nwith an error. In addition, the plugin cannot be uninstalled\nwith UNINSTALL SONAME or UNINSTALL PLUGIN while the server\nis running. | \n \nA plugin\'s status can be found by looking at the\nPLUGIN_STATUS column of the information_schema.PLUGINS\ntable.\n \nUninstalling Plugins\n \nPlugins that are found in the mysql.plugin table, that is\nthose that were installed with INSTALL SONAME, INSTALL\nPLUGIN or mysql_plugin can be uninstalled in one of two\nways:\nThe UNINSTALL SONAME or the UNINSTALL PLUGIN statement while\nthe server is running\nWith mysql_plugin while the server is offline.\n \nPlugins that were enabled as a --plugin-load option do not\nneed to be uninstalled. If --plugin-load is omitted the next\ntime the server starts, or the plugin is not listed as one\nof the --plugin-load entries, the plugin will not be loaded.\n \nUNINSTALL PLUGIN uninstalls a single installed plugin, while\nUNINSTALL SONAME uninstalls all plugins belonging to a given\nlibrary.\n \n\n\nURL: https://mariadb.com/kb/en/library/plugin-overview/','','https://mariadb.com/kb/en/library/plugin-overview/'),(79,'INSTALL PLUGIN',5,'Syntax\n------ \nINSTALL PLUGIN [IF NOT EXISTS] plugin_name SONAME\n\'plugin_library\'\n \nDescription\n----------- \nThis statement installs an individual plugin from the\nspecified library. To install the whole library (which could\nbe required), use INSTALL SONAME.\n \nplugin_name is the name of the plugin as defined in the\nplugin declaration structure contained in the library file.\nPlugin names are\nnot case sensitive. For maximal compatibility, plugin names\nshould be limited\nto ASCII letters, digits, and underscore, because they are\nused in C source\nfiles, shell command lines, M4 and Bourne shell scripts, and\nSQL environments.\n \nplugin_library is the name of the shared library that\ncontains the plugin code. Before MariaDB 5.5.21, the name\nshould include the file name extension (for\nexample, libmyplugin.so or libmyplugin.dll). Starting from\nMariaDB 5.5.21, the file name extension can be omitted\n(which makes the statement look the same on all\narchitectures).\n \nThe shared library must be located in the plugin directory\n(that is,\nthe directory named by the plugin_dir system variable). The\nlibrary must be in the plugin directory itself, not in a\nsubdirectory. By\ndefault, plugin_dir is plugin directory under the directory\nnamed by\nthe pkglibdir configuration variable, but it can be changed\nby setting\nthe value of plugin_dir at server startup. For example, set\nits value in a my.cnf file:\n \n[mysqld]\nplugin_dir=/path/to/plugin/directory\nIf the value of plugin_dir is a relative path name, it is\ntaken to be relative to the MySQL base directory (the value\nof the basedir\nsystem variable).\n \nINSTALL PLUGIN adds a line to the mysql.plugin table that\ndescribes the plugin. This table contains the plugin name\nand library file\nname.\n \nINSTALL PLUGIN causes the server to read\noption (my.cnf) files just as during server startup. This\nenables the plugin to\npick up any relevant options from those files. It is\npossible to add plugin\noptions to an option file even before loading a plugin (if\nthe loose prefix is\nused). It is also possible to uninstall a plugin, edit\nmy.cnf, and install the\nplugin again. Restarting the plugin this way enables it to\nthe new option\nvalues without a server restart.\n \nBefore MySQL 5.1.33, a plugin was started with each option\nset to its\ndefault value.\n \nINSTALL PLUGIN also loads and initializes the plugin code to\nmake the plugin available for use. A plugin is initialized\nby executing its\ninitialization function, which handles any setup that the\nplugin must perform\nbefore it can be used.\n \nTo use INSTALL PLUGIN, you must have the\nINSERT privilege for the mysql.plugin table.\n \nAt server startup, the server loads and initializes any\nplugin that is\nlisted in the mysql.plugin table. This means that a plugin\nis installed\nwith INSTALL PLUGIN only once, not every time the server\nstarts. Plugin loading at startup does not occur if the\nserver is started with\nthe --skip-grant-tables option.\n \nWhen the server shuts down, it executes the deinitialization\nfunction\nfor each plugin that is loaded so that the plugin has a\nchance to\nperform any final cleanup.\n \nIf you need to load plugins for a single server startup when\nthe\n--skip-grant-tables option is given (which tells the server\nnot to read system tables), use the \n--plugin-load mysqld option.\n \nIF NOT EXISTS\n \nWhen the IF NOT EXISTS clause is used, MariaDB will return a\nnote instead of an error if the specified plugin already\nexists. See SHOW WARNINGS.\n \nExamples\n-------- \nINSTALL PLUGIN sphinx SONAME \'ha_sphinx.so\';\n \nStarting from MariaDB 5.5.21, the extension can be omitted:\n \nINSTALL PLUGIN innodb SONAME \'ha_xtradb\';\n \nFrom MariaDB 10.4.0:\n \nINSTALL PLUGIN IF NOT EXISTS example SONAME \'ha_example\';\n \nQuery OK, 0 rows affected (0.104 sec)\n \nINSTALL PLUGIN IF NOT EXISTS example SONAME \'ha_example\';\n \nQuery OK, 0 rows affected, 1 warning (0.000 sec)\n \nSHOW WARNINGS;\n \n+-------+------+------------------------------------+\n| Level | Code | Message |\n+-------+------+------------------------------------+\n| Note | 1968 | Plugin \'example\' already installed |\n+-------+------+------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/install-plugin/','','https://mariadb.com/kb/en/library/install-plugin/'),(83,'MBR Definition',6,'Description\n----------- \nThe MBR (Minimum Bounding Rectangle), or Envelope is the\nbounding\ngeometry, formed by the minimum and maximum (X,Y)\ncoordinates:\n \nExamples\n-------- \n((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/mbr-definition/','','https://mariadb.com/kb/en/library/mbr-definition/'),(84,'MBRContains',6,'Syntax\n------ \nMBRContains(g1,g2)\n \nDescription\n----------- \nReturns 1 or 0 to indicate whether the Minimum Bounding\nRectangle of\ng1 contains the Minimum Bounding Rectangle of g2. This tests\nthe\nopposite relationship as MBRWithin().\n \nExamples\n-------- \nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\n \nSET @g2 = GeomFromText(\'Point(1 1)\');\n \nSELECT MBRContains(@g1,@g2), MBRContains(@g2,@g1);\n+----------------------+----------------------+\n| MBRContains(@g1,@g2) | MBRContains(@g2,@g1) |\n+----------------------+----------------------+\n| 1 | 0 |\n+----------------------+----------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/mbrcontains/','','https://mariadb.com/kb/en/library/mbrcontains/'),(86,'MBREqual',6,'Syntax\n------ \nMBREqual(g1,g2)\n \nDescription\n----------- \nReturns 1 or 0 to indicate whether the Minimum Bounding\nRectangles of\nthe two geometries g1 and g2 are the same.\n \nExamples\n-------- \nSET @g1=GEOMFROMTEXT(\'LINESTRING(0 0, 1 2)\');\nSET @g2=GEOMFROMTEXT(\'POLYGON((0 0, 0 2, 1 2, 1 0, 0\n0))\');\nSELECT MbrEqual(@g1,@g2);\n+-------------------+\n| MbrEqual(@g1,@g2) |\n+-------------------+\n| 1 |\n+-------------------+\n \nSET @g1=GEOMFROMTEXT(\'LINESTRING(0 0, 1 3)\');\nSET @g2=GEOMFROMTEXT(\'POLYGON((0 0, 0 2, 1 4, 1 0, 0\n0))\');\nSELECT MbrEqual(@g1,@g2);\n+-------------------+\n| MbrEqual(@g1,@g2) |\n+-------------------+\n| 0 |\n+-------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/mbrequal/','','https://mariadb.com/kb/en/library/mbrequal/'),(80,'UNINSTALL PLUGIN',5,'Syntax\n------ \nUNINSTALL PLUGIN [IF EXISTS] plugin_name\n \nDescription\n----------- \nThis statement removes a single installed plugin. To\nuninstall the whole library which contains the plugin, use\nUNINSTALL SONAME. You cannot uninstall a plugin if any table\nthat uses it is open.\n \nplugin_name must be the name of some plugin that is listed\nin the mysql.plugin table. The server executes the plugin\'s\ndeinitialization\nfunction and removes the row for the plugin from the\nmysql.plugin\ntable, so that subsequent server restarts will not load and\ninitialize\nthe plugin. UNINSTALL PLUGIN does not remove the plugin\'s\nshared library file.\n \nTo use UNINSTALL PLUGIN, you must have the\nDELETE privilege for the mysql.plugin table.\n \nIF EXISTS\n \nIf the IF EXISTS clause is used, MariaDB will return a note\ninstead of an error if the plugin does not exist. See SHOW\nWARNINGS.\n \nExamples\n-------- \nUNINSTALL PLUGIN example;\n \nFrom MariaDB 10.4.0:\n \nUNINSTALL PLUGIN IF EXISTS example;\n \nQuery OK, 0 rows affected (0.099 sec)\n \nUNINSTALL PLUGIN IF EXISTS example;\n \nQuery OK, 0 rows affected, 1 warning (0.000 sec)\n \nSHOW WARNINGS;\n \n+-------+------+-------------------------------+\n| Level | Code | Message |\n+-------+------+-------------------------------+\n| Note | 1305 | PLUGIN example does not exist |\n+-------+------+-------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/uninstall-plugin/','','https://mariadb.com/kb/en/library/uninstall-plugin/'),(81,'INSTALL SONAME',5,'INSTALL SONAME has been supported since MariaDB 5.5.21.\n \nSyntax\n------ \nINSTALL SONAME \'plugin_library\'\n \nDescription\n----------- \nThis statement is a variant of INSTALL PLUGIN. It installs\nall plugins from a given plugin_library. See INSTALL PLUGIN\nfor details.\n \nplugin_library is the name of the shared library that\ncontains the plugin code. The file name extension (for\nexample, libmyplugin.so or libmyplugin.dll) can be omitted\n(which makes the statement look the same on all\narchitectures).\n \nThe shared library must be located in the plugin directory\n(that is,\nthe directory named by the plugin_dir system variable). The\nlibrary must be in the plugin directory itself, not in a\nsubdirectory. By\ndefault, plugin_dir is plugin directory under the directory\nnamed by\nthe pkglibdir configuration variable, but it can be changed\nby setting\nthe value of plugin_dir at server startup. For example, set\nits value in a my.cnf file:\n \n[mysqld]\nplugin_dir=/path/to/plugin/directory\nIf the value of plugin_dir is a relative path name, it is\ntaken to be relative to the MySQL base directory (the value\nof the basedir\nsystem variable).\n \nINSTALL SONAME adds one or more lines to the mysql.plugin\ntable that\ndescribes the plugin. This table contains the plugin name\nand library file\nname.\n \nINSTALL SONAME causes the server to read\noption (my.cnf) files just as during server startup. This\nenables the plugin to\npick up any relevant options from those files. It is\npossible to add plugin\noptions to an option file even before loading a plugin (if\nthe loose prefix is\nused). It is also possible to uninstall a plugin, edit\nmy.cnf, and install the\nplugin again. Restarting the plugin this way enables it to\nthe new option\nvalues without a server restart.\n \nINSTALL SONAME also loads and initializes the plugin code to\nmake the plugin available for use. A plugin is initialized\nby executing its\ninitialization function, which handles any setup that the\nplugin must perform\nbefore it can be used.\n \nTo use INSTALL SONAME, you must have the\nINSERT privilege for the mysql.plugin table.\n \nAt server startup, the server loads and initializes any\nplugin that is\nlisted in the mysql.plugin table. This means that a plugin\nis installed\nwith INSTALL SONAME only once, not every time the server\nstarts. Plugin loading at startup does not occur if the\nserver is started with\nthe --skip-grant-tables option.\n \nWhen the server shuts down, it executes the deinitialization\nfunction\nfor each plugin that is loaded so that the plugin has a\nchance to\nperform any final cleanup.\n \nIf you need to load plugins for a single server startup when\nthe\n--skip-grant-tables option is given (which tells the server\nnot to read system tables), use the \n--plugin-load mysqld option.\n \nIf you need to install only one plugin from a library, use\nthe INSTALL PLUGIN statement.\n \nExamples\n-------- \nTo load the XtraDB storage engine and all of its\ninformation_schema tables with one statement, use\n \nINSTALL SONAME \'ha_xtradb\';\n \nThis statement can be used instead of INSTALL PLUGIN even\nwhen the library contains only one plugin:\n \nINSTALL SONAME \'ha_sequence\';\n \n\n\nURL: https://mariadb.com/kb/en/library/install-soname/','','https://mariadb.com/kb/en/library/install-soname/'),(82,'UNINSTALL SONAME',5,'UNINSTALL SONAMEhas been supported since MariaDB 5.5.21.\n \nSyntax\n------ \nUNINSTALL SONAME [IF EXISTS] \'plugin_library\'\n \nDescription\n----------- \nThis statement is a variant of UNINSTALL PLUGIN statement,\nthat removes all plugins belonging to a specified\nplugin_library. See UNINSTALL PLUGIN for details.\n \nplugin_library is the name of the shared library that\ncontains the plugin code. The file name extension (for\nexample, libmyplugin.so or libmyplugin.dll) can be omitted\n(which makes the statement look the same on all\narchitectures).\n \nTo use UNINSTALL SONAME, you must have the\nDELETE privilege for the mysql.plugin table.\n \nIF EXISTS\n \nIf the IF EXISTS clause is used, MariaDB will return a note\ninstead of an error if the plugin library does not exist.\nSee SHOW WARNINGS.\n \nExamples\n-------- \nTo uninstall the XtraDB plugin and all of its\ninformation_schema tables with one statement, use\n \nUNINSTALL SONAME \'ha_xtradb\';\n \nFrom MariaDB 10.4.0:\n \nUNINSTALL SONAME IF EXISTS \'ha_example\';\n \nQuery OK, 0 rows affected (0.099 sec)\n \nUNINSTALL SONAME IF EXISTS \'ha_example\';\n \nQuery OK, 0 rows affected, 1 warning (0.000 sec)\n \nSHOW WARNINGS;\n \n+-------+------+-------------------------------------+\n| Level | Code | Message |\n+-------+------+-------------------------------------+\n| Note | 1305 | SONAME ha_example.so does not exist |\n+-------+------+-------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/uninstall-soname/','','https://mariadb.com/kb/en/library/uninstall-soname/'),(90,'MBRWithin',6,'Syntax\n------ \nMBRWithin(g1,g2)\n \nDescription\n----------- \nReturns 1 or 0 to indicate whether the Minimum Bounding\nRectangle of\ng1 is within the Minimum Bounding Rectangle of g2. This\ntests the\nopposite relationship as MBRContains().\n \nExamples\n-------- \nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((0 0,0 5,5 5,5 0,0 0))\');\nSELECT MBRWithin(@g1,@g2), MBRWithin(@g2,@g1);\n+--------------------+--------------------+\n| MBRWithin(@g1,@g2) | MBRWithin(@g2,@g1) |\n+--------------------+--------------------+\n| 1 | 0 |\n+--------------------+--------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/mbrwithin/','','https://mariadb.com/kb/en/library/mbrwithin/'),(92,'IF Function',7,'Syntax\n------ \nIF(expr1,expr2,expr3)\n \nDescription\n----------- \nIf expr1 is TRUE (expr1 0 and expr1 NULL) then IF()\nreturns expr2; otherwise it returns expr3. IF() returns a\nnumeric\nor string value, depending on the context in which it is\nused.\n \nNote: There is also an IF statement which differs from the\nIF() function described here.\n \nExamples\n-------- \nSELECT IF(1>2,2,3);\n+-------------+\n| IF(1>2,2,3) |\n+-------------+\n| 3 |\n+-------------+\n \nSELECT IF(1\n\nURL: https://mariadb.com/kb/en/library/if-function/','','https://mariadb.com/kb/en/library/if-function/'),(85,'MBRDisjoint',6,'Syntax\n------ \nMBRDisjoint(g1,g2)\n \nDescription\n----------- \nReturns 1 or 0 to indicate whether the Minimum Bounding\nRectangles of the two geometries g1 and g2 are disjoint. Two\ngeometries are disjoint if they do not intersect, that is\ntouch or overlap.\n \nExamples\n-------- \nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((4 4,4 7,7 7,7 4,4 4))\');\nSELECTmbrdisjoint(@g1,@g2);\n+----------------------+\n| mbrdisjoint(@g1,@g2) |\n+----------------------+\n| 1 |\n+----------------------+\n \nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((3 3,3 6,6 6,6 3,3 3))\');\nSELECT mbrdisjoint(@g1,@g2);\n+----------------------+\n| mbrdisjoint(@g1,@g2) |\n+----------------------+\n| 0 |\n+----------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/mbrdisjoint/','','https://mariadb.com/kb/en/library/mbrdisjoint/'),(87,'MBRIntersects',6,'Syntax\n------ \nMBRIntersects(g1,g2)\n \nDescription\n----------- \nReturns 1 or 0 to indicate whether the Minimum Bounding\nRectangles of the two geometries g1 and g2 intersect.\n \nExamples\n-------- \nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((3 3,3 6,6 6,6 3,3 3))\');\nSELECT mbrintersects(@g1,@g2);\n+------------------------+\n| mbrintersects(@g1,@g2) |\n+------------------------+\n| 1 |\n+------------------------+\n \nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((4 4,4 7,7 7,7 4,4 4))\');\nSELECT mbrintersects(@g1,@g2);\n+------------------------+\n| mbrintersects(@g1,@g2) |\n+------------------------+\n| 0 |\n+------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/mbrintersects/','','https://mariadb.com/kb/en/library/mbrintersects/'),(88,'MBROverlaps',6,'Syntax\n------ \nMBROverlaps(g1,g2)\n \nDescription\n----------- \nReturns 1 or 0 to indicate whether the Minimum Bounding\nRectangles of\nthe two geometries g1 and g2 overlap. The term spatially\noverlaps is\nused if two geometries intersect and their intersection\nresults in a\ngeometry of the same dimension but not equal to either of\nthe given\ngeometries.\n \nExamples\n-------- \nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((4 4,4 7,7 7,7 4,4 4))\');\nSELECT mbroverlaps(@g1,@g2);\n+----------------------+\n| mbroverlaps(@g1,@g2) |\n+----------------------+\n| 0 |\n+----------------------+\n \nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((3 3,3 6,6 6,6 3,3 3))\');\nSELECT mbroverlaps(@g1,@g2);\n+----------------------+\n| mbroverlaps(@g1,@g2) |\n+----------------------+\n| 0 |\n+----------------------+\n \nSET @g1 = GeomFromText(\'Polygon((0 0,0 4,4 4,4 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((3 3,3 6,6 6,6 3,3 3))\');\nSELECT mbroverlaps(@g1,@g2);\n+----------------------+\n| mbroverlaps(@g1,@g2) |\n+----------------------+\n| 1 |\n+----------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/mbroverlaps/','','https://mariadb.com/kb/en/library/mbroverlaps/'),(89,'MBRTouches',6,'Syntax\n------ \nMBRTouches(g1,g2)\n \nDescription\n----------- \nReturns 1 or 0 to indicate whether the Minimum Bounding\nRectangles of\nthe two geometries g1 and g2 touch. Two geometries spatially\ntouch if\nthe interiors of the geometries do not intersect, but the\nboundary of\none of the geometries intersects either the boundary or the\ninterior\nof the other.\n \nExamples\n-------- \nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((4 4,4 7,7 7,7 4,4 4))\');\nSELECT mbrtouches(@g1,@g2);\n+---------------------+\n| mbrtouches(@g1,@g2) |\n+---------------------+\n| 0 |\n+---------------------+\n \nSET @g1 = GeomFromText(\'Polygon((0 0,0 3,3 3,3 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((3 3,3 6,6 6,6 3,3 3))\');\nSELECT mbrtouches(@g1,@g2);\n+---------------------+\n| mbrtouches(@g1,@g2) |\n+---------------------+\n| 1 |\n+---------------------+\n \nSET @g1 = GeomFromText(\'Polygon((0 0,0 4,4 4,4 0,0 0))\');\nSET @g2 = GeomFromText(\'Polygon((3 3,3 6,6 6,6 3,3 3))\');\nSELECT mbrtouches(@g1,@g2);\n+---------------------+\n| mbrtouches(@g1,@g2) |\n+---------------------+\n| 0 |\n+---------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/mbrtouches/','','https://mariadb.com/kb/en/library/mbrtouches/'),(91,'CASE OPERATOR',7,'Syntax\n------ \nCASE value WHEN [compare_value] THEN result [WHEN\n[compare_value] THEN\nresult ...] [ELSE result] END\n \nCASE WHEN [condition] THEN result [WHEN [condition] THEN\nresult ...]\n[ELSE result] END\n \nDescription\n----------- \nThe first version returns the result where\nvalue=compare_value. The\nsecond version returns the result for the first condition\nthat is\ntrue. If there was no matching result value, the result\nafter ELSE is\nreturned, or NULL if there is no ELSE part.\n \nThere is also a CASE statement, which differs from the CASE\noperator described here.\n \nExamples\n-------- \nSELECT CASE 1 WHEN 1 THEN \'one\' WHEN 2 THEN \'two\' ELSE\n\'more\' END;\n \n+------------------------------------------------------------+\n| CASE 1 WHEN 1 THEN \'one\' WHEN 2 THEN \'two\' ELSE\n\'more\' END |\n+------------------------------------------------------------+\n| one |\n+------------------------------------------------------------+\n \nSELECT CASE WHEN 1>0 THEN \'true\' ELSE \'false\' END;\n \n+--------------------------------------------+\n| CASE WHEN 1>0 THEN \'true\' ELSE \'false\' END |\n+--------------------------------------------+\n| true |\n+--------------------------------------------+\n \nSELECT CASE BINARY \'B\' WHEN \'a\' THEN 1 WHEN \'b\' THEN 2\nEND;\n \n+-----------------------------------------------------+\n| CASE BINARY \'B\' WHEN \'a\' THEN 1 WHEN \'b\' THEN 2 END\n|\n+-----------------------------------------------------+\n| NULL |\n+-----------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/case-operator/','','https://mariadb.com/kb/en/library/case-operator/'),(93,'IFNULL',7,'Syntax\n------ \nIFNULL(expr1,expr2)\n \nDescription\n----------- \nIf expr1 is not NULL, IFNULL() returns expr1; otherwise it\nreturns\nexpr2. IFNULL() returns a numeric or string value, depending\non the\ncontext in which it is used.\n \nExamples\n-------- \nSELECT IFNULL(1,0); \n+-------------+\n| IFNULL(1,0) |\n+-------------+\n| 1 |\n+-------------+\n \nSELECT IFNULL(NULL,10);\n+-----------------+\n| IFNULL(NULL,10) |\n+-----------------+\n| 10 |\n+-----------------+\n \nSELECT IFNULL(1/0,10);\n+----------------+\n| IFNULL(1/0,10) |\n+----------------+\n| 10.0000 |\n+----------------+\n \nSELECT IFNULL(1/0,\'yes\');\n+-------------------+\n| IFNULL(1/0,\'yes\') |\n+-------------------+\n| yes |\n+-------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/ifnull/','','https://mariadb.com/kb/en/library/ifnull/'),(94,'NULLIF',7,'Syntax\n------ \nNULLIF(expr1,expr2)\n \nDescription\n----------- \nReturns NULL if expr1 = expr2 is true, otherwise returns\nexpr1. This is\nthe same as CASE WHEN expr1 = expr2 THEN NULL ELSE expr1\nEND.\n \nExamples\n-------- \nSELECT NULLIF(1,1);\n+-------------+\n| NULLIF(1,1) |\n+-------------+\n| NULL |\n+-------------+\n \nSELECT NULLIF(1,2);\n+-------------+\n| NULLIF(1,2) |\n+-------------+\n| 1 |\n+-------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/nullif/','','https://mariadb.com/kb/en/library/nullif/'),(95,'CHANGE MASTER TO',8,'Syntax\n------ \nCHANGE MASTER [\'connection_name\'] TO master_def [,\nmaster_def] ...\n \nmaster_def:\n MASTER_BIND = \'interface_name\'\n | MASTER_HOST = \'host_name\'[\n | MASTER_USER = \'user_name\'\n | MASTER_PASSWORD = \'password\'\n | MASTER_PORT = port_num\n | MASTER_CONNECT_RETRY = interval\n | MASTER_HEARTBEAT_PERIOD = interval\n | MASTER_LOG_FILE = \'master_log_name\'\n | MASTER_LOG_POS = master_log_pos\n | RELAY_LOG_FILE = \'relay_log_name\'\n | RELAY_LOG_POS = relay_log_pos\n | MASTER_DELAY = interval\n | MASTER_SSL = {0|1}\n | MASTER_SSL_CA = \'ca_file_name\'\n | MASTER_SSL_CAPATH = \'ca_directory_name\'\n | MASTER_SSL_CERT = \'cert_file_name\'\n | MASTER_SSL_CRL = \'crl_file_name\'\n | MASTER_SSL_CRLPATH = \'crl_directory_name\'\n | MASTER_SSL_KEY = \'key_file_name\'\n | MASTER_SSL_CIPHER = \'cipher_list\'\n | MASTER_SSL_VERIFY_SERVER_CERT = {0|1}\n | MASTER_USE_GTID = {current_pos|slave_pos|no}\n | IGNORE_SERVER_IDS = (server_id_list)\n | DO_DOMAIN_IDS = ([N,..])\n | IGNORE_DOMAIN_IDS = ([N,..])\n \nDescription\n----------- \nThe CHANGE MASTER statement sets the options that a\nreplication slave uses to connect to and replicate from a\nreplication master. \n \nMariaDB until 10.0.7\n \nIn MariaDB 10.0.7 and before, the relay_log_purge system\nvariable was silently set to 0 when CHANGE MASTER was\nexecuted.\n \nMulti-Source Replication\n \nMulti-source replication was added in MariaDB 10.0.1.\n \nIf you are using multi-source replication, then you need to\nspecify a connection name when you execute CHANGE MASTER.\nThere are two ways to do this:\nSetting the default_master_connection system variable prior\nto executing CHANGE MASTER.\nSetting the connection_name parameter when executing CHANGE\nMASTER.\n \ndefault_master_connection\n \nSET default_master_connection = \'gandalf\';\n \nSTOP SLAVE;\n \nCHANGE MASTER TO \n MASTER_PASSWORD=\'new3cret\';\n \nSTART SLAVE;\n \nconnection_name\n \nSTOP SLAVE \'gandalf\';\n \nCHANGE MASTER \'gandalf\' TO \n MASTER_PASSWORD=\'new3cret\';\n \nSTART SLAVE \'gandalf\';\n \nOptions\n \nConnection Options\n \nMASTER_USER\n \nThe MASTER_USER option for CHANGE MASTER defines the user\naccount that the replication slave will use to connect to\nthe replication master.\n \nThis user account will need the REPLICATION SLAVE privilege\non the master.\n \nFor example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO\n MASTER_USER=\'repl\',\n MASTER_PASSWORD=\'new3cret\';\n \nSTART SLAVE;\n \nMASTER_PASSWORD\n \nThe MASTER_USER option for CHANGE MASTER defines the\npassword that the replication slave will use to connect to\nthe replication master as the user account defined by the\nMASTER_USER option.\n \nFor example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO \n MASTER_PASSWORD=\'new3cret\';\n \nSTART SLAVE;\n \nMASTER_HOST\n \nThe MASTER_HOST option for CHANGE MASTER defines the\nhostname or IP address of the replication master.\n \nIf you set the value of the MASTER_HOST option to the empty\nstring, then that is not the same as not setting the\noption\'s value at all. In MariaDB 5.5 and later, if you set\nthe value of the MASTER_HOST option to the empty string,\nthen the CHANGE MASTER command will fail with an error. In\nMariaDB 5.3 and before, if you set the value of the\nMASTER_HOST option to the empty string, then the CHANGE\nMASTER command would succeed, but the subsequent START SLAVE\ncommand would fail.\n \nFor example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO\n MASTER_HOST=\'dbserver1.example.com\',\n MASTER_USER=\'repl\',\n MASTER_PASSWORD=\'new3cret\',\n MASTER_USE_GTID=slave_pos;\n \nSTART SLAVE;\n \nIf you set the value of the MASTER_HOST option in a CHANGE\nMASTER command, then the slave assumes that the master is\ndifferent from before, even if you set the value of this\noption to the same value it had previously. In this\nscenario, the slave will consider the old values for the\nmaster\'s binary\nlog file name and position to be invalid for the new master.\nAs a side effect, if you do not explicitly set the values of\nthe MASTER_LOG_FILE and MASTER_LOG_POS options in the\nstatement, then the statement will be implicitly appended\nwith MASTER_LOG_FILE=\'\' and MASTER_LOG_POS=4. However, if\nyou enable GTID mode for replication by setting the\nMASTER_USE_GTID option to some value other than no in the\nstatement, then these values will effectively be ignored\nanyway.\n \nReplication slaves cannot connect to replication masters\nusing Unix socket files or Windows named pipes. The\nreplication slave must connect to the replication master\nusing TCP/IP.\n \nMASTER_PORT\n \nThe MASTER_PORT option for CHANGE MASTER defines the TCP/IP\nport of the replication master.\n \nFor example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO\n MASTER_HOST=\'dbserver1.example.com\',\n MASTER_PORT=3307,\n MASTER_USER=\'repl\',\n MASTER_PASSWORD=\'new3cret\',\n MASTER_USE_GTID=slave_pos;\n \nSTART SLAVE;\n \nIf you set the value of the MASTER_PORT option in a CHANGE\nMASTER command, then the slave assumes that the master is\ndifferent from before, even if you set the value of this\noption to the same value it had previously. In this\nscenario, the slave will consider the old values for the\nmaster\'s binary\nlog file name and position to be invalid for the new master.\nAs a side effect, if you do not explicitly set the values of\nthe MASTER_LOG_FILE and MASTER_LOG_POS options in the\nstatement, then the statement will be implicitly appended\nwith MASTER_LOG_FILE=\'\' and MASTER_LOG_POS=4. However, if\nyou enable GTID mode for replication by setting the\nMASTER_USE_GTID option to some value other than no in the\nstatement, then these values will effectively be ignored\nanyway.\n \nReplication slaves cannot connect to replication masters\nusing Unix socket files or Windows named pipes. The\nreplication slave must connect to the replication master\nusing TCP/IP.\n \nMASTER_CONNECT_RETRY\n \nThe MASTER_CONNECT_RETRY option for CHANGE MASTER defines\nhow many seconds that the slave will wait between connection\nretries. The default is 60.\n \nSTOP SLAVE;\n \nCHANGE MASTER TO \n MASTER_CONNECT_RETRY=20;\n \nSTART SLAVE;\n \nThe number of connection attempts is limited by the\nmaster_retry_count option. It can be set either on the\ncommand-line or in a server option group in an option file\nprior to starting up the server. For example:\n \n[mariadb]\n...\nmaster_retry_count=4294967295\n \nMASTER_BIND\n \nThe MASTER_BIND option for CHANGE MASTER is only supported\nby MySQL 5.6.2 and later and by MySQL NDB Cluster 7.3.1 and\nlater. This option is not yet supported by MariaDB. See\nMDEV-19248 for more information.\n \nThe MASTER_BIND option for CHANGE MASTER can be used on\nreplication slaves that have multiple network interfaces to\nchoose which network interface the slave will use to connect\nto the master.\n \nMASTER_HEARTBEAT_PERIOD\n \nThe MASTER_HEARTBEAT_PERIOD option for CHANGE MASTER can be\nused to set the interval in seconds between replication\nheartbeats. Whenever the master\'s binary log is updated\nwith an event, the waiting period for the next heartbeat is\nreset.\n \nThis option\'s interval argument has the following\ncharacteristics:\nIt is a decimal value with a range of 0 to 4294967 seconds.\nIt has a resolution of hundredths of a second.\nIts smallest valid non-zero value is 0.001.\nIts default value is the value of the slave_net_timeout\nsystem variable divided by 2.\nIf it\'s set to 0, then heartbeats are disabled.\n \nHeartbeats are sent by the master only if there are no\nunsent events in the binary log file for a period longer\nthan the interval.\n \nIf the RESET SLAVE statement is executed, then the heartbeat\ninterval is reset to the default.\n \nIf the slave_net_timeout system variable is set to a value\nthat is lower than the current heartbeat interval, then a\nwarning will be issued.\n \nTLS Options\n \nThe TLS options are used for providing information about\nTLS. The options can be set even on slaves that are compiled\nwithout TLS support. The TLS options are saved to either the\ndefault master.info file or the file that is configured by\nthe master_info_file option, but these TLS options are\nignored unless the slave supports TLS.\n \nSee Replication with Secure Connections for more\ninformation.\n \nMASTER_SSL\n \nThe MASTER_SSL option for CHANGE MASTER tells the slave\nwhether to force TLS for the connection. The valid values\nare 0 or 1.\n \nFor example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO\n MASTER_SSL=1;\n \nSTART SLAVE;\n \nMASTER_SSL_CA\n \nThe MASTER_SSL_CA option for CHANGE MASTER defines a path to\na PEM file that should contain one or more X509 certificates\nfor trusted Certificate Authorities (CAs) to use for TLS.\nThis option requires that you use the absolute path, not a\nrelative path. This option implies the MASTER_SSL option.\n \nFor example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CA=\'/etc/my.cnf.d/certificates/ca.pem\',\n MASTER_SSL_VERIFY_SERVER_CERT=1;\n \nSTART SLAVE;\n \nSee Secure Connections Overview: Certificate Authorities\n(CAs) for more information.\n \nMASTER_SSL_CAPATH\n \nThe MASTER_SSL_CAPATH option for CHANGE MASTER defines a\npath to a directory that contains one or more PEM files that\nshould each contain one X509 certificate for a trusted\nCertificate Authority (CA) to use for TLS. This option\nrequires that you use the absolute path, not a relative\npath. The directory specified by this option needs to be run\nthrough the openssl rehash command. This option implies the\nMASTER_SSL option.\n \nFor example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CAPATH=\'/etc/my.cnf.d/certificates/ca/\',\n MASTER_SSL_VERIFY_SERVER_CERT=1;\n \nSTART SLAVE;\n \nSee Secure Connections Overview: Certificate Authorities\n(CAs) for more information.\n \nMASTER_SSL_CERT\n \nThe MASTER_SSL_CERT option for CHANGE MASTER defines a path\nto the X509 certificate file to use for TLS. This option\nrequires that you use the absolute path, not a relative\npath. This option implies the MASTER_SSL option.\n \nFor example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CA=\'/etc/my.cnf.d/certificates/ca.pem\',\n MASTER_SSL_VERIFY_SERVER_CERT=1;\n \nSTART SLAVE;\n \nMASTER_SSL_CRL\n \nThe MASTER_SSL_CRL option for CHANGE MASTER defines a path\nto a PEM file that should contain one or more revoked X509\ncertificates to use for TLS. This option requires that you\nuse the absolute path, not a relative path.\n \nThis option is only supported if the server was built with\nOpenSSL. If the server was built with yaSSL, then this\noption is not supported. See TLS and Cryptography Libraries\nUsed by MariaDB for more information about which libraries\nare used on which platforms.\n \nFor example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CA=\'/etc/my.cnf.d/certificates/ca.pem\',\n MASTER_SSL_VERIFY_SERVER_CERT=1,\n MASTER_SSL_CRL=\'/etc/my.cnf.d/certificates/crl.pem\';\n \nSTART SLAVE;\n \nSee Secure Connections Overview: Certificate Revocation\nLists (CRLs) for more information.\n \nMASTER_SSL_CRLPATH\n \nThe MASTER_SSL_CRLPATH option for CHANGE MASTER defines a\npath to a directory that contains one or more PEM files that\nshould each contain one revoked X509 certificate to use for\nTLS. This option requires that you use the absolute path,\nnot a relative path. The directory specified by this\nvariable needs to be run through the openssl rehash command.\n \nThis option is only supported if the server was built with\nOpenSSL. If the server was built with yaSSL, then this\noption is not supported. See TLS and Cryptography Libraries\nUsed by MariaDB for more information about which libraries\nare used on which platforms.\n \nFor example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CA=\'/etc/my.cnf.d/certificates/ca.pem\',\n MASTER_SSL_VERIFY_SERVER_CERT=1,\n MASTER_SSL_CRLPATH=\'/etc/my.cnf.d/certificates/crl/\';\n \nSTART SLAVE;\n \nSee Secure Connections Overview: Certificate Revocation\nLists (CRLs) for more information.\n \nMASTER_SSL_KEY\n \nThe MASTER_SSL_KEY option for CHANGE MASTER defines a path\nto a private key file to use for TLS. This option requires\nthat you use the absolute path, not a relative path. This\noption implies the MASTER_SSL option.\n \nFor example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CA=\'/etc/my.cnf.d/certificates/ca.pem\',\n MASTER_SSL_VERIFY_SERVER_CERT=1;\n \nSTART SLAVE;\n \nMASTER_SSL_CIPHER\n \nThe MASTER_SSL_CIPHER option for CHANGE MASTER defines the\nlist of permitted ciphers or cipher suites to use for TLS.\nBesides cipher names, if MariaDB was compiled with OpenSSL,\nthis option could be set to \"SSLv3\" or \"TLSv1.2\" to\nallow all SSLv3 or all TLSv1.2 ciphers. Note that the\nTLSv1.3 ciphers cannot be excluded when using OpenSSL, even\nby using this option. See Using TLSv1.3 for details. This\noption implies the MASTER_SSL option.\n \nFor example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CA=\'/etc/my.cnf.d/certificates/ca.pem\',\n MASTER_SSL_VERIFY_SERVER_CERT=1,\n MASTER_SSL_CIPHER=\'TLSv1.2\';\n \nSTART SLAVE;\n \nMASTER_SSL_VERIFY_SERVER_CERT\n \nThe MASTER_SSL_VERIFY_SERVER_CERT option for CHANGE MASTER\nenables server certificate verification. This option is\ndisabled by default.\n \nFor example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO\n MASTER_SSL_CERT=\'/etc/my.cnf.d/certificates/server-cert.pem\',\n MASTER_SSL_KEY=\'/etc/my.cnf.d/certificates/server-key.pem\',\n MASTER_SSL_CA=\'/etc/my.cnf.d/certificates/ca.pem\',\n MASTER_SSL_VERIFY_SERVER_CERT=1;\n \nSTART SLAVE;\n \nSee Secure Connections Overview: Server Certificate\nVerification for more information.\n \nBinary Log Options\n \nThese options are related to the binary log position on the\nmaster.\n \nMASTER_LOG_FILE\n \nThe MASTER_LOG_FILE option for CHANGE MASTER can be used\nalong with MASTER_LOG_POS to specify the coordinates at\nwhich the slave\'s I/O thread should begin reading from the\nmaster\'s binary logs the next time the thread starts.\n \nFor example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO\n MASTER_LOG_FILE=\'master2-bin.001\',\n MASTER_LOG_POS=4;\n \nSTART SLAVE;\n \nThe MASTER_LOG_FILE and MASTER_LOG_POS options cannot be\nspecified if the RELAY_LOG_FILE and RELAY_LOG_POS options\nwere also specified.\n \nThe MASTER_LOG_FILE and MASTER_LOG_POS options are\neffectively ignored if you enable GTID mode for replication\nby setting the MASTER_USE_GTID option to some value other\nthan no in the statement.\n \nMASTER_LOG_POS\n \nThe MASTER_LOG_POS option for CHANGE MASTER can be used\nalong with MASTER_LOG_FILE to specify the coordinates at\nwhich the slave\'s I/O thread should begin reading from the\nmaster\'s binary logs the next time the thread starts.\n \nFor example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO\n MASTER_LOG_FILE=\'master2-bin.001\',\n MASTER_LOG_POS=4;\n \nSTART SLAVE;\n \nThe MASTER_LOG_FILE and MASTER_LOG_POS options cannot be\nspecified if the RELAY_LOG_FILE and RELAY_LOG_POS options\nwere also specified.\n \nThe MASTER_LOG_FILE and MASTER_LOG_POS options are\neffectively ignored if you enable GTID mode for replication\nby setting the MASTER_USE_GTID option to some value other\nthan no in the statement.\n \nRelay Log Options\n \nThese options are related to the relay log position on the\nslave.\n \nRELAY_LOG_FILE\n \nThe RELAY_LOG_FILE option for CHANGE MASTER can be used\nalong with the RELAY_LOG_POS option to specify the\ncoordinates at which the slave\'s SQL thread should begin\nreading from the relay log the next time the thread starts.\n \nThe CHANGE MASTER statement usually deletes all relay log\nfiles. However, if the RELAY_LOG_FILE and/or RELAY_LOG_POS\noptions are specified, then existing relay log files are\nkept.\n \nWhen you want to change the relay log position, you only\nneed to stop the slave\'s SQL thread. The slave\'s I/O\nthread can continue running. The STOP SLAVE and START SLAVE\nstatements support the SQL_THREAD option for this scenario.\nFor example:\n \nSTOP SLAVE SQL_THREAD;\n \nCHANGE MASTER TO\n RELAY_LOG_FILE=\'slave-relay-bin.006\',\n RELAY_LOG_POS=4025;\n \nSTART SLAVE SQL_THREAD;\n \nWhen the value of this option is changed, the metadata about\nthe slave\'s SQL thread\'s position in the relay logs will\nalso be changed in the relay-log.info file or the file that\nis configured by the relay_log_info_file system variable.\n \nThe RELAY_LOG_FILE and RELAY_LOG_POS options cannot be\nspecified if the MASTER_LOG_FILE and MASTER_LOG_POS options\nwere also specified.\n \nRELAY_LOG_POS\n \nThe RELAY_LOG_POS option for CHANGE MASTER can be used along\nwith the RELAY_LOG_FILE option to specify the coordinates at\nwhich the slave\'s SQL thread should begin reading from the\nrelay log the next time the thread starts.\n \nThe CHANGE MASTER statement usually deletes all relay log\nfiles. However, if the RELAY_LOG_FILE and/or RELAY_LOG_POS\noptions are specified, then existing relay log files are\nkept.\n \nWhen you want to change the relay log position, you only\nneed to stop the slave\'s SQL thread. The slave\'s I/O\nthread can continue running. The STOP SLAVE and START SLAVE\nstatements support the SQL_THREAD option for this scenario.\nFor example:\n \nSTOP SLAVE SQL_THREAD;\n \nCHANGE MASTER TO\n RELAY_LOG_FILE=\'slave-relay-bin.006\',\n RELAY_LOG_POS=4025;\n \nSTART SLAVE SQL_THREAD;\n \nWhen the value of this option is changed, the metadata about\nthe slave\'s SQL thread\'s position in the relay logs will\nalso be changed in the relay-log.info file or the file that\nis configured by the relay_log_info_file system variable.\n \nThe RELAY_LOG_FILE and RELAY_LOG_POS options cannot be\nspecified if the MASTER_LOG_FILE and MASTER_LOG_POS options\nwere also specified.\n \nGTID Options\n \nMASTER_USE_GTID\n \nThe MASTER_USE_GTID option for CHANGE MASTER was first added\nin MariaDB 10.0.2 to enable replication with Global\nTransaction IDs (GTIDs).\n \nThe MASTER_USE_GTID option for CHANGE MASTER can be used to\nconfigure the slave to use the global transaction ID (GTID)\nwhen connecting to a master. The possible values are:\ncurrent_pos - Replicate in GTID mode and use\ngtid_current_pos as the position to start downloading\ntransactions from the master.\nslave_pos - Replicate in GTID mode and use gtid_slave_pos as\nthe position to start downloading transactions from the\nmaster.\nno - Don\'t replicate in GTID mode.\n \nFor example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO\n MASTER_USE_GTID = current_pos;\n \nSTART SLAVE;\n \nOr:\n \nSTOP SLAVE;\n \nSET GLOBAL gtid_slave_pos=\'0-1-153\';\n \nCHANGE MASTER TO\n MASTER_USE_GTID = slave_pos;\n \nSTART SLAVE;\n \nReplication Filter Options\n \nIGNORE_SERVER_IDS\n \nThe IGNORE_SERVER_IDS option for CHANGE MASTER can be used\nto configure a replication slave to ignore binary log events\nthat originated from certain servers. Filtered binary log\nevents will not get logged to the slave’s relay log, and\nthey will not be applied by the slave.\n \nThe option\'s value can be specified by providing a\ncomma-separated list of server_id values. For example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO \n IGNORE_SERVER_IDS = (3,5);\nSTART SLAVE;\n \nIf you would like to clear a previously set list, then you\ncan set the value to an empty list. For example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO \n IGNORE_SERVER_IDS = ();\nSTART SLAVE;\n \nDO_DOMAIN_IDS\n \nThe DO_DOMAIN_IDS option for CHANGE MASTER was first added\nin MariaDB 10.1.2.\n \nThe DO_DOMAIN_IDS option for CHANGE MASTER can be used to\nconfigure a replication slave to only apply binary log\nevents if the transaction\'s GTID is in a specific\ngtid_domain_id value. Filtered binary log events will not\nget logged to the slave’s relay log, and they will not be\napplied by the slave.\n \nThe option\'s value can be specified by providing a\ncomma-separated list of gtid_domain_id values. Duplicate\nvalues are automatically ignored. For example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO \n DO_DOMAIN_IDS = (1,2);\nSTART SLAVE;\n \nIf you would like to clear a previously set list, then you\ncan set the value to an empty list. For example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO \n DO_DOMAIN_IDS = ();\nSTART SLAVE;\n \nThe DO_DOMAIN_IDS option and the IGNORE_DOMAIN_IDS option\ncannot both be set to non-empty values at the same time. If\nyou want to set the DO_DOMAIN_IDS option, and the\nIGNORE_DOMAIN_IDS option was previously set, then you need\nto clear the value of the IGNORE_DOMAIN_IDS option. For\nexample:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO \n IGNORE_DOMAIN_IDS = (), \n DO_DOMAIN_IDS = (1,2);\nSTART SLAVE;\n \nThe DO_DOMAIN_IDS option can only be specified if the slave\nis replicating in GTID mode. Therefore, the MASTER_USE_GTID\noption must also be set to some value other than no in order\nto use this option.\n \nIGNORE_DOMAIN_IDS\n \nThe IGNORE_DOMAIN_IDS option for CHANGE MASTER was first\nadded in MariaDB 10.1.2.\n \nThe IGNORE_DOMAIN_IDS option for CHANGE MASTER can be used\nto configure a replication slave to ignore binary log events\nif the transaction\'s GTID is in a specific gtid_domain_id\nvalue. Filtered binary log events will not get logged to the\nslave’s relay log, and they will not be applied by the\nslave.\n \nThe option\'s value can be specified by providing a\ncomma-separated list of gtid_domain_id values. Duplicate\nvalues are automatically ignored. For example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO \n IGNORE_DOMAIN_IDS = (1,2);\nSTART SLAVE;\n \nIf you would like to clear a previously set list, then you\ncan set the value to an empty list. For example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO \n IGNORE_DOMAIN_IDS = ();\nSTART SLAVE;\n \nThe DO_DOMAIN_IDS option and the IGNORE_DOMAIN_IDS option\ncannot both be set to non-empty values at the same time. If\nyou want to set the IGNORE_DOMAIN_IDS option, and the\nDO_DOMAIN_IDS option was previously set, then you need to\nclear the value of the DO_DOMAIN_IDS option. For example:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO \n DO_DOMAIN_IDS = (), \n IGNORE_DOMAIN_IDS = (1,2);\nSTART SLAVE;\n \nThe IGNORE_DOMAIN_IDS option can only be specified if the\nslave is replicating in GTID mode. Therefore, the\nMASTER_USE_GTID option must also be set to some value other\nthan no in order to use this option.\n \nDelayed Replication Options\n \nMASTER_DELAY\n \nThe MASTER_DELAY option for CHANGE MASTER was first added in\nMariaDB 10.2.3 to enable delayed replication.\n \nThe MASTER_DELAY option for CHANGE MASTER can be used to\nenable delayed replication. This option specifies the time\nin seconds (at least) that a replication slave should lag\nbehind the master. Before executing an event, the slave will\nfirst wait, if necessary, until the given time has passed\nsince the event was created on the master. The result is\nthat the slave will reflect the state of the master some\ntime back in the past. The default is zero, no delay.\n \nSTOP SLAVE;\n \nCHANGE MASTER TO \n MASTER_DELAY=3600;\n \nSTART SLAVE;\n \nChanging Option Values\n \nIf you don\'t specify a given option when executing the\nCHANGE MASTER statement, then the option keeps its old value\nin most cases. Most of the time, there is no need to specify\nthe options that do not need to change. For example, if the\npassword for the user account that the slave uses to connect\nto its master has changed, but no other options need to\nchange, then you can just change the MASTER_PASSWORD option\nby executing the following commands:\n \nSTOP SLAVE;\n \nCHANGE MASTER TO \n MASTER_PASSWORD=\'new3cret\';\n \nSTART SLAVE;\n \nThere are some cases where options are implicitly reset,\nsuch as when the MASTER_HOST and MASTER_PORT options are\nchanged.\n \nOption Persistence\n \nThe values of the MASTER_LOG_FILE and MASTER_LOG_POS options\n(i.e. the binary log position on the master) and most other\noptions are written to either the default master.info file\nor the file that is configured by the master_info_file\noption. The slave\'s I/O thread keeps this binary log\nposition updated as it downloads events only when\nMASTER_USE_GTID option\n is set to NO. Otherwise the file is not updated on a per\nevent basis.\n \nThe master_info_file option can be set either on the\ncommand-line or in a server option group in an option file\nprior to starting up the server. For example:\n \n[mariadb]\n...\nmaster_info_file=/mariadb/myserver1-master.info\n \nThe values of the RELAY_LOG_FILE and RELAY_LOG_POS options\n(i.e. the relay log position) are written to either the\ndefault relay-log.info file or the file that is configured\nby the relay_log_info_file system variable. The slave\'s SQL\nthread keeps this relay log position updated as it applies\nevents.\n \nThe relay_log_info_file system variable can be set either on\nthe command-line or in a server option group in an option\nfile prior to starting up the server. For example:\n \n[mariadb]\n...\nrelay_log_info_file=/mariadb/myserver1-relay-log.info\n \nGTID Persistence\n \nIf the slave is replicating binary log events that contain\nGTIDs, then the slave\'s SQL thread will write every GTID\nthat it applies to the mysql.gtid_slave_pos table. This GTID\ncan be inspected and modified through the gtid_slave_pos\nsystem variable.\n \nIf the slave has the log_slave_updates system variable\nenabled and if the slave has the binary log enabled, then\nevery write by the slave\'s SQL thread will also go into the\nslave\'s binary log. This means that GTIDs of replicated\ntransactions would be reflected in the value of the\ngtid_binlog_pos system variable.\n \nCreating a Slave from a Backup\n \nThe CHANGE MASTER statement is useful for setting up a slave\nwhen you have a backup of the master and you also have the\nbinary log position or GTID position corresponding to the\nbackup.\n \nAfter restoring the backup on the slave, you could execute\nsomething like this to use the binary log position:\n \nCHANGE MASTER TO\n MASTER_LOG_FILE=\'master2-bin.001\',\n MASTER_LOG_POS=4;\n \nSTART SLAVE;\n \nOr you could execute something like this to use the GTID\nposition:\n \nSET GLOBAL gtid_slave_pos=\'0-1-153\';\n \nCHANGE MASTER TO\n MASTER_USE_GTID=slave_pos;\n \nSTART SLAVE;\n \nSee Setting up a Replication Slave with Mariabackup for more\ninformation on how to do this with Mariabackup.\n \nExample\n \nThe following example changes the master and master\'s\nbinary log coordinates.\nThis is used when you want to set up the slave to replicate\nthe master:\n \nCHANGE MASTER TO\n MASTER_HOST=\'master2.mycompany.com\',\n MASTER_USER=\'replication\',\n MASTER_PASSWORD=\'bigs3cret\',\n MASTER_PORT=3306,\n MASTER_LOG_FILE=\'master2-bin.001\',\n MASTER_LOG_POS=4,\n MASTER_CONNECT_RETRY=10;\n \nSTART SLAVE;\n \n\n\nURL: https://mariadb.com/kb/en/library/change-master-to/','','https://mariadb.com/kb/en/library/change-master-to/'),(106,'RESET MASTER',8,'RESET MASTER [TO #]\n \nDeletes all binary log files listed in the index file,\nresets the\nbinary log index file to be empty, and creates a new binary\nlog file with a suffix of .000001.\n \nIf TO # is given, then the first new binary log file will\nstart from number #.\n \nThis statement is for use only when the master is started\nfor the first time, and should never be used if any slaves\nare actively replicating from the binary log.\n \n\n\nURL: https://mariadb.com/kb/en/library/reset-master/','','https://mariadb.com/kb/en/library/reset-master/'),(96,'COMMIT',8,'The COMMIT statement ends a transaction, saving any changes\nto the data so that they become visible to subsequent\ntransactions. Also, unlocks metadata changed by current\ntransaction. If autocommit is set to 1, an implicit commit\nis performed after each statement. Otherwise, all\ntransactions which don\'t end with an explicit COMMIT are\nimplicitly rollbacked and the changes are lost. The ROLLBACK\nstatement can be used to do this explicitly.\n \nThe required syntax for the COMMIT statement is as follows:\n \nCOMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]\n \nCOMMIT is the more important transaction terminator, as well\nas the more interesting one. The basic form of the COMMIT\nstatement is simply the keyword COMMIT (the keyword WORK is\nsimply noise and can be omitted without changing the\neffect).\n \nThe optional AND CHAIN clause is a convenience for\ninitiating a new transaction as soon as the old transaction\nterminates. If AND CHAIN is specified, then there is\neffectively nothing between the old and new transactions,\nalthough they remain separate. The characteristics of the\nnew transaction will be the same as the characteristics of\nthe old one — that is, the new transaction will have the\nsame access mode, isolation level and diagnostics area size\n(we\'ll discuss all of these shortly) as the transaction\njust terminated. \n \nRELEASE tells the server to disconnect the client\nimmediately after the current transaction.\n \nThere are NO RELEASE and AND NO CHAIN options. By default,\ncommits do not RELEASE or CHAIN, but it\'s possible to\nchange this default behavior with the completion_type server\nsystem variable. In this case, the AND NO CHAIN and NO\nRELEASE options override the server default.\n \n\n\nURL: https://mariadb.com/kb/en/library/commit/','','https://mariadb.com/kb/en/library/commit/'),(97,'DEALLOCATE / DROP PREPARE',8,'Syntax\n------ \n{DEALLOCATE | DROP} PREPARE stmt_name\n \nDescription\n----------- \nTo deallocate a prepared statement produced with PREPARE,\nuse a\nDEALLOCATE PREPARE statement that refers to the prepared\nstatement\nname.\n \nA prepared statement is implicitly deallocated when a new\nPREPARE command is issued. In that case, there is no need to\nuse DEALLOCATE.\n \nAttempting to execute a prepared statement after\ndeallocating it\nresults in an error, as if it was not prepared at all:\n \nERROR 1243 (HY000): Unknown prepared statement handler\n(stmt_name) given to EXECUTE\n \nIf the specified statement has not been PREPAREd, an error\nsimilar to the following will be produced:\n \nERROR 1243 (HY000): Unknown prepared statement handler\n(stmt_name) given to DEALLOCATE PREPARE\n \nExample\n \nSee example in PREPARE.\n \n\n\nURL:\nhttps://mariadb.com/kb/en/library/deallocate-drop-prepared-statement/','','https://mariadb.com/kb/en/library/deallocate-drop-prepared-statement/'),(98,'EXECUTE Statement',8,'Syntax\n------ \nEXECUTE stmt_name\n [USING expression[, expression] ...]\n \nEXECUTE with expression as parameters was introduced in\nMariaDB 10.2.3. Before that one could only use variables\n(@var_name) as parameters.\n \nDescription\n----------- \nAfter preparing a statement with PREPARE, you execute it\nwith an\nEXECUTE statement that refers to the prepared statement\nname. If the\nprepared statement contains any parameter markers, you must\nsupply a\nUSING clause that lists user variables containing the values\nto be\nbound to the parameters. Parameter values can be supplied\nonly by user\nvariables, and the USING clause must name exactly as many\nvariables as\nthe number of parameter markers in the statement.\n \nYou can execute a given prepared statement multiple times,\npassing\ndifferent variables to it or setting the variables to\ndifferent values\nbefore each execution.\n \nIf the specified statement has not been PREPAREd, an error\nsimilar to the following is produced:\n \nERROR 1243 (HY000): Unknown prepared statement handler\n(stmt_name) given to EXECUTE\n \nExample\n \nSee example in PREPARE.\n \n\n\nURL: https://mariadb.com/kb/en/library/execute-statement/','','https://mariadb.com/kb/en/library/execute-statement/'),(102,'SAVEPOINT',8,'Syntax\n------ \nSAVEPOINT identifier\nROLLBACK [WORK] TO [SAVEPOINT] identifier\nRELEASE SAVEPOINT identifier\n \nDescription\n----------- \nInnoDB supports the SQL statements SAVEPOINT,\nROLLBACK TO SAVEPOINT, RELEASE SAVEPOINT\nand the optional WORK keyword for\nROLLBACK.\n \nEach savepoint must have a legal MariaDB identifier. A\nsavepoint is a named sub-transaction.\n \nNormally ROLLBACK undoes the changes performed by the whole\ntransaction. When used with the TO clause, it undoes the\nchanges performed after the specified savepoint, and erases\nall subsequent savepoints. However, all locks that have been\nacquired after the save point will survive. RELEASE\nSAVEPOINT does not rollback or commit any changes, but\nremoves the specified savepoint.\n \nWhen the execution of a trigger or a stored function begins,\nit is not possible to use statements which reference a\nsavepoint which was defined from out of that stored program.\n \nWhen a COMMIT (including implicit commits) or a ROLLBACK\nstatement (with no TO clause) is performed, they act on the\nwhole transaction, and all savepoints are removed.\n \nErrors\n \nIf COMMIT or ROLLBACK is issued and no transaction was\nstarted, no error is reported.\n \nIf SAVEPOINT is issued and no transaction was started, no\nerror is reported but no savepoint is created. When ROLLBACK\nTO SAVEPOINT or RELEASE SAVEPOINT is called for a savepoint\nthat does not exist, an error like this is issued:\n \nERROR 1305 (42000): SAVEPOINT svp_name does not exist\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/savepoint/','','https://mariadb.com/kb/en/library/savepoint/'),(113,'UNLOCK TABLES',8,'Syntax\n------ \nUNLOCK TABLES\n \nDescription\n----------- \nUNLOCK TABLES explicitly releases any table locks held by\nthe\ncurrent session. See LOCK TABLES for more information.\n \nIn addition to releasing table locks acquired by the LOCK\nTABLES statement, the UNLOCK TABLES statement also releases\nthe global read lock acquired by the FLUSH TABLES WITH READ\nLOCK statement. The FLUSH TABLES WITH READ LOCK statement is\nvery useful for performing backups. See FLUSH for more\ninformation about FLUSH TABLES WITH READ LOCK.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/transactions-unlock-tables/','','https://mariadb.com/kb/en/library/transactions-unlock-tables/'),(115,'XA Transactions',8,'Overview\n \nThe MariaDB XA implementation is based on the X/Open CAE\ndocument Distributed Transaction Processing: The XA\nSpecification. This document is published by The Open Group\nand available at\nhttp://www.opengroup.org/public/pubs/catalog/c193.htm.\n \nXA transactions are designed to allow distributed\ntransactions, where a transaction manager (the application)\ncontrols a transaction which involves multiple resources.\nSuch resources are usually DBMSs, but could be resources of\nany type. The whole set of required transactional operations\nis called a global transaction. Each subset of operations\nwhich involve a single resource is called a local\ntransaction. XA used a 2-phases commit (2PC). With the first\ncommit, the transaction manager tells each resource to\nprepare an effective commit, and waits for a confirm\nmessage. The changes are not still made effective at this\npoint. If any of the resources encountered an error, the\ntransaction manager will rollback the global transaction. If\nall resources communicate that the first commit is\nsuccessful, the transaction manager can require a second\ncommit, which makes the changes effective.\n \nIn MariaDB, XA transactions can only be used with storage\nengines that support them. At least InnoDB, TokuDB, SPIDER\nand MyRocks support them. For InnoDB, XA transactions can be\ndisabled by setting the innodb_support_xa server system\nvariable to 0. \n \nLike regular transactions, XA transactions create metadata\nlocks on accessed tables.\n \nXA transactions require REPEATABLE READ as a minimum\nisolation level. However, distributed transactions should\nalways use SERIALIZABLE.\n \nTrying to start more than one XA transaction at the same\ntime produces a 1400 error (SQLSTATE \'XAE09\'). The same\nerror is produced when attempting to start an XA transaction\nwhile a regular transaction is in effect. Trying to start a\nregular transaction while an XA transaction is in effect\nproduces a 1399 error (SQLSTATE \'XAE07\').\n \nThe statements that cause an implicit COMMIT for regular\ntransactions produce a 1400 error (SQLSTATE \'XAE09\') if a\nXA transaction is in effect.\n \nInternal XA vs External XA\n \nXA transactions are an overloaded term in MariaDB. If a\nstorage engine is XA-capable, it can mean one or both of\nthese:\nIt supports MariaDB\'s internal two-phase commit API. This\nis transparent to the user. Sometimes this is called\n\"internal XA\", since MariaDB\'s internal transaction\ncoordinator log can handle coordinating these transactions.\n \nIt supports XA transactions, with the XA START, XA PREPARE,\nXA COMMIT, etc. statements. Sometimes this is called\n\"external XA\", since it requires the use of an external\ntransaction coordinator to use this feature properly.\n \nTransaction Coordinator Log\n \nIf you have two or more XA-capable storage engines enabled,\nthen a transaction coordinator log must be available.\n \nThere are currently two implementations of the transaction\ncoordinator log:\nBinary log-based transaction coordinator log\nMemory-mapped file-based transaction coordinator log\n \nIf the binary log is enabled on a server, then the server\nwill use the binary log-based transaction coordinator log.\nOtherwise, it will use the memory-mapped file-based\ntransaction coordinator log.\n \nSee Transaction Coordinator Log for more information.\n \nSyntax\n------ \nXA {START|BEGIN} xid [JOIN|RESUME]\n \nXA END xid [SUSPEND [FOR MIGRATE]]\n \nXA PREPARE xid\n \nXA COMMIT xid [ONE PHASE]\n \nXA ROLLBACK xid\n \nXA RECOVER [FORMAT=[\'RAW\'|\'SQL\']]\n \nxid: gtrid [, bqual [, formatID ]]\n \nThe interface to XA transactions is a set of SQL statements\nstarting with XA. Each statement changes a transaction\'s\nstate, determining which actions it can perform. A\ntransaction which does not exist is in the NON-EXISTING\nstate.\n \nXA START (or BEGIN) starts a transaction and defines its xid\n(a transaction identifier). The JOIN or RESUME keywords have\nno effect. The new transaction will be in ACTIVE state.\n \nThe xid can have 3 components, though only the first one is\nmandatory. gtrid is a quoted string representing a global\ntransaction identifier. bqual is a quoted string\nrepresenting a local transaction identifier. formatID is an\nunsigned integer indicating the format used for the first\ntwo components; if not specified, defaults to 1. MariaDB\ndoes not interpret in any way these components, and only\nuses them to identify a transaction. xids of transactions in\neffect must be unique.\n \nXA END declares that the specified ACTIVE transaction is\nfinished and it changes its state to IDLE. SUSPEND [FOR\nMIGRATE] has no effect.\n \nXA PREPARE prepares an IDLE transaction for commit, changing\nits state to PREPARED. This is the first commit.\n \nXA COMMIT definitely commits and terminates a transaction\nwhich has already been PREPARED. If the ONE PHASE clause is\nspecified, this statements performs a 1-phase commit on an\nIDLE transaction.\n \nXA ROLLBACK rolls back and terminates an IDLE or PREPARED\ntransaction.\n \nXA RECOVER shows information about all PREPARED\ntransactions.\n \nWhen trying to execute an operation which is not allowed for\nthe transaction\'s current state, an error is produced:\n \nXA COMMIT \'test\' ONE PHASE;\n \nERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be\nexecuted when global transaction is in the ACTIVE state\n \nXA COMMIT \'test2\';\n \nERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be\nexecuted when global transaction is in the NON-EXISTING\nstate\n \nXA RECOVER\n \nThe XA RECOVER statement shows information about all\ntransactions which are in the PREPARED state. It does not\nmatter which connection created the transaction: if it has\nbeen PREPARED, it appears. But this does not mean that a\nconnection can commit or rollback a transaction which was\nstarted by another connection. Note that transactions using\na 1-phase commit are never in the PREPARED state, so they\ncannot be shown by XA RECOVER.\n \nXA RECOVER produces four columns:\n \nXA RECOVER;\n \n+----------+--------------+--------------+------+\n| formatID | gtrid_length | bqual_length | data |\n+----------+--------------+--------------+------+\n| 1 | 4 | 0 | test |\n+----------+--------------+--------------+------+\n \nYou can use XA RECOVER FORMAT=\'SQL\' to get the data in a\nhuman readable\nform that can be directly copy-pasted into XA COMMIT or XA\nROLLBACK. This is particularly useful for binary xid\ngenerated by some transaction coordinators.\n \nformatID is the formatID part of xid.\n \ndata are the gtrid and bqual parts of xid, concatenated.\n \ngtrid_length and bqual_length are the lengths of gtrid and\nbqual, respectevely.\n \nExamples\n-------- \n2-phases commit:\n \nXA START \'test\';\n \nINSERT INTO t VALUES (1,2);\n \nXA END \'test\';\n \nXA PREPARE \'test\';\n \nXA COMMIT \'test\';\n \n1-phase commit:\n \nXA START \'test\';\n \nINSERT INTO t VALUES (1,2);\n \nXA END \'test\';\n \nXA COMMIT \'test\' ONE PHASE;\n \nHuman-readable:\n \nxa start \'12\\r34\\t67\\v78\', \'abc\\ndef\', 3;\n \ninsert t1 values (40);\n \nxa end \'12\\r34\\t67\\v78\', \'abc\\ndef\', 3;\n \nxa prepare \'12\\r34\\t67\\v78\', \'abc\\ndef\', 3;\n \nxa recover format=\'RAW\';\n \n+----------+--------------+--------------+--------------------+\n| formatID | gtrid_length | bqual_length | data |\n+----------+--------------+--------------+--------------------+\n34 67v78abc 11 | 7 | 12\ndef |\n+----------+--------------+--------------+--------------------+\n \nxa recover format=\'SQL\';\n \n+----------+--------------+--------------+-----------------------------------------------+\n| formatID | gtrid_length | bqual_length | data |\n+----------+--------------+--------------+-----------------------------------------------+\n| 3 | 11 | 7 |\nX\'31320d3334093637763738\',X\'6162630a646566\',3 |\n+----------+--------------+--------------+-----------------------------------------------+\n \nxa rollback\nX\'31320d3334093637763738\',X\'6162630a646566\',3;\n \nKnown Issues\n \nMariaDB Galera Cluster\n \nMariaDB Galera Cluster does not support XA transactions. See\nMDEV-10532 for more information on that. The request to\nimplement that feature is being tracked at MDEV-17099.\n \nHowever, MariaDB Galera Cluster builds include a built-in\nplugin called wsrep. Prior to MariaDB 10.4.3, this plugin\nwas internally considered an XA-capable storage engine.\nConsequently, these MariaDB Galera Cluster builds have\nmultiple XA-capable storage engines by default, even if the\nonly \"real\" storage engine that supports external XA\ntransactions enabled on these builds by default is InnoDB.\nTherefore, when using one these builds MariaDB would be\nforced to use a transaction coordinator log by default,\nwhich could have performance implications.\n \nSee Transaction Coordinator Log Overview: MariaDB Galera\nCluster for more information.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/xa-transactions/','','https://mariadb.com/kb/en/library/xa-transactions/'),(117,'Authentication from MariaDB 10.4',10,'MariaDB 10.4 introduces a number of changes to the\nauthentication process, intended to make things easier and\nmore intuitive.\n \nOverview\n \nThere are four main changes relating to authentication:\nIt is possible to use more than one authentication plugin\nfor each user account. For example, this can be useful to\nslowly migrate users to the more secure ed25519\nauthentication plugin over time, while allowing the old\nmysql_native_password authentication plugin as an\nalternative for the transitional period.\nThe root@localhost user account created by mysql_install_db\nis created with the ability to use two authentication\nplugins.\nFirst, it is configured to try to use the unix_socket\nauthentication plugin. This allows the the root@localhost\nuser to login without a password via the local Unix socket\nfile defined by the socket system variable, as long as the\nlogin is attempted from a process owned by the operating\nsystem root user account.\nSecond, if authentication fails with the unix_socket\nauthentication plugin, then it is configured to try to use\nthe mysql_native_password authentication plugin. However, an\ninvalid password is initially set, so in order to\nauthenticate this way, a password must be set with SET\nPASSWORD.\nHowever, just using the unix_socket authentication plugin\nmay be fine for many users, and it is very secure. You may\nwant to try going without password authentication to see how\nwell it works for you. Remember, the best way to keep your\npassword safe is not to have one!\n \nAll user accounts, passwords, and global privileges are now\nstored in the mysql.global_priv table. The mysql.user table\nstill exists and has exactly the same set of columns as\nbefore, but it’s now a view that references the\nmysql.global_priv table. Tools that analyze the mysql.user\ntable should continue to workas before.\nMariaDB 10.4 supports User Password Expiry, which is not\nactive by default.\n \nDescription\n----------- \nAs a result of the above changes, the open-for-everyone\nall-powerful root account is finally gone. And installation\nscripts will no longer demand that you “PLEASE REMEMBER TO\nSET A PASSWORD FOR THE MariaDB root USER !”, because the\nroot account is securely created automatically.\n \nTwo all-powerful accounts are created by default — root\nand the OS user that owns the data directory, typically\nmysql. They are created as:\n \nCREATE USER root@localhost IDENTIFIED VIA unix_socket OR\nmysql_native_password USING \'invalid\'\nCREATE USER mysql@localhost IDENTIFIED VIA unix_socket OR\nmysql_native_password USING \'invalid\'\n \nUsing unix_socket means that if you are the system root\nuser, you can login as root@locahost without a password.\nThis technique was pioneered by Otto Kekäläinen in Debian\nMariaDB packages and has been successfully used in Debian\nsince as early as MariaDB 10.0. \n \nIt is based on a simple fact that asking the system root for\na password adds no extra security — root has full access\nto all the data files and all process memory anyway. But not\nasking for a password means, there is no root password to\nforget (no need for the numerous tutorials on “how to\nreset MariaDB root password”). And if you want to script\nsome tedious database work, there is no need to store the\nroot password in plain text for the scipt to use (no need\nfor debian-sys-maint user).\n \nStill, some users may wish to log in as MariaDB root without\nusing sudo. Hence the old authentication method —\nconventional MariaDB password — is still available. By\ndefault it is disabled (“invalid” is not a valid\npassword hash), but one can set the password with a usual\nSET PASSWORD statement. And still retain the password-less\naccess via sudo.\n \nIf you install MariaDB locally (say from a tarball, you\nwould not want to use sudo to be able to login. This is why\nMariaDB creates a second all-powerful user with the same\nname as a system user that owns the data directory. In local\n(not system-wide) installations, this will be the user who\ninstalled MariaDB — they automatically get convenient\npassword-less root-like access, because they can access all\nthe data files anyway.\n \nEven if MariaDB is installed system-wide, you may not want\nto run your database maintenance scripts as system root —\nnow you can run them as system mysql user. And you will know\nthat they will never destroy your entire system, even if you\nmake a typo in a shell script.\n \nHowever, seasoned MariaDB DBAs who are used to the old ways\ndo need to makes some changes. See the examples below for\ncommon tasks. \n \nCookbook\n \nAfter installing MariaDB system-wide the first thing\nyou’ve got used to doing is logging in into the\nunprotected root account and protecting it, that is, setting\nthe root password:\n \n$ sudo dnf install MariaDB-server\n$ mysql -uroot\n...\nMariaDB> set password = password(\"XH4VmT3_jt\");\n \nThis is not only unnecessary now, it will simply not work\n— there is no unprotected root account. To login as root\nuse\n \n$ sudo dnf install MariaDB-server\n$ sudo mysql\n \nNote that it implies you are connecting via the unix socket,\nnot tcp. If you happen to have protocol=tcp in a system-wide\n/etc/my.cnf file, use sudo mysql --protocol=socket.\n \nAfter installing MariaDB locally you’ve also used to\nconnect to the unprotected root account using mysql -uroot.\nThis will not work either, simply use mysql without\nspecifying a username.\n \nIf you\'ve forgotten your root password, no problem — you\ncan still connect using sudo and change the password. And if\nyou\'ve also removed unix_socket authentication, to restore\naccess do as follows:\nrestart MariaDB with --skip-grant-tables\nlogin into the unprotected server\nrun FLUSH PRIVILEGES (note, before 10.4 this would’ve been\nthe last step, not anymore). This disables\n--skip-grant-tables and allows you to change the stored\nauthentication method.\nrun SET PASSWORD FOR root@localhost to change the root\npassword\n \nTo view inside privilege tables, the old mysql.user table\nstill exists. You can select from it as before, although you\ncannot update it anymore. It doesn’t show alternative\nauthentication plugins and this was one of the reasons for\nswitching to the mysql.global_priv table — complex\nauthentication rules did not fit into rigid structure of a\nrelational table. You can select from the new table, for\nexample: \n \nselect concat(user, \'@\', host, \' => \',\njson_detailed(priv)) from mysql.global_priv;\n \nReverting to the Previous Authentication Method for\nroot@localhost\n \nIf you don\'t want the root@localhost user account created\nby mysql_install_db to use unix_socket authentication by\ndefault, then there are a few ways to revert to the previous\nmysql_native_password authentication method for this user\naccount.\n \nConfiguring mysql_install_db to Revert to the Previous\nAuthentication Method\n \nOne way to revert to the previous mysql_native_password\nauthentication method for the root@localhost user account is\nto execute mysql_install_db with a special option. If\nmysql_install_db is executed while\n--auth-root-authentication-method=normal is specified, then\nit will create the default user accounts using the default\nbehavior of MariaDB 10.3 and before.\n \nThis means that the root@localhost user account will use\nmysql_native_password authentication by default. There are\nsome other differences as well. See mysql_install_db: User\nAccounts Created by Default for more information.\n \nFor example, the option can be set on the command-line while\nrunning mysql_install_db:\n \nmysql_install_db --user=mysql --datadir=/var/lib/mysql\n--auth-root-authentication-method=normal\n \nThe option can also be set in an option file in an option\ngroup supported by mysql_install_db. For example:\n \n[mysql_install_db]\nauth_root_authentication_method=normal\n \nIf the option is set in an option file and if\nmysql_install_db is executed, then mysql_install_db will\nread this option from the option file, and it will\nautomatically set this option.\n \nAltering the User Account to Revert to the Previous\nAuthentication Method\n \nIf you have already installed MariaDB, and if the\nroot@localhost user account is already using unix_socket\nauthentication, then you can revert to the old\nmysql_native_password authentication method for the user\naccount by executing the following:\n \nALTER USER root@localhost IDENTIFIED VIA\nmysql_native_password USING PASSWORD(\"verysecret\")\n \n\n\nURL:\nhttps://mariadb.com/kb/en/library/authentication-from-mariadb-104/','','https://mariadb.com/kb/en/library/authentication-from-mariadb-104/'),(118,'CREATE USER',10,'Syntax\n------ \nCREATE [OR REPLACE] USER [IF NOT EXISTS] \n user_specification [,user_specification ...] \n [REQUIRE {NONE | tls_option [[AND] tls_option ...] }]\n [WITH resource_option [resource_option ...] ]\n [password_option | lock_option] \n \nuser_specification:\n username [authentication_option]\n \nauthentication_option:\n IDENTIFIED BY \'password\' \n | IDENTIFIED BY PASSWORD \'password_hash\'\n | IDENTIFIED {VIA|WITH} authentication_rule [OR\nauthentication_rule ...]\n \nauthentication_rule:\n authentication_plugin\n | authentication_plugin {USING|AS}\n\'authentication_string\'\n | authentication_plugin {USING|AS} PASSWORD(\'password\')\n \ntls_option:\n SSL \n | X509\n | CIPHER \'cipher\'\n | ISSUER \'issuer\'\n | SUBJECT \'subject\'\n \nresource_option:\n MAX_QUERIES_PER_HOUR count\n | MAX_UPDATES_PER_HOUR count\n | MAX_CONNECTIONS_PER_HOUR count\n | MAX_USER_CONNECTIONS count\n | MAX_STATEMENT_TIME time\n \npassword_option:\n PASSWORD EXPIRE\n | PASSWORD EXPIRE DEFAULT\n | PASSWORD EXPIRE NEVER\n | PASSWORD EXPIRE INTERVAL N DAY\n \nlock_option:\n ACCOUNT LOCK\n | ACCOUNT UNLOCK\n}\n \nDescription\n----------- \nThe CREATE USER statement creates new MariaDB accounts. To\nuse it, you must have the global CREATE USER privilege or\nthe INSERT privilege for the mysql database. For each\naccount, CREATE USER creates a new row in\nthe mysql.user table that has no privileges.\n \nIf any of the specified accounts, or any permissions for the\nspecified accounts, already exist, then the server returns\nERROR 1396 (HY000). If an error occurs, CREATE USER will\nstill create the accounts that do not result in an error.\nOnly one error is produced for all users which have not been\ncreated:\n \nERROR 1396 (HY000): \n Operation CREATE USER failed for \'u1\'@\'%\',\'u2\'@\'%\'\n \nCREATE USER, DROP USER, CREATE ROLE, and DROP ROLE all\nproduce the\nsame error code when they fail.\n \nSee Account Names below for details on how account names are\nspecified. \n \nOR REPLACE\n \nIf the optional OR REPLACE clause is used, it is basically a\nshortcut for:\n \nDROP USER IF EXISTS name;\n \nCREATE USER name ...;\n \nFor example:\n \nCREATE USER foo2@test IDENTIFIED BY \'password\';\n \nERROR 1396 (HY000): Operation CREATE USER failed for\n\'foo2\'@\'test\'\n \nCREATE OR REPLACE USER foo2@test IDENTIFIED BY \'password\';\n \nQuery OK, 0 rows affected (0.00 sec)\n \nIF NOT EXISTS\n \nWhen the IF NOT EXISTS clause is used, MariaDB will return a\nwarning instead of an error if the specified user already\nexists.\n \nFor example:\n \nCREATE USER foo2@test IDENTIFIED BY \'password\';\n \nERROR 1396 (HY000): Operation CREATE USER failed for\n\'foo2\'@\'test\'\n \nCREATE USER IF NOT EXISTS foo2@test IDENTIFIED BY\n\'password\';\n \nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n \nSHOW WARNINGS;\n \n+-------+------+----------------------------------------------------+\n| Level | Code | Message |\n+-------+------+----------------------------------------------------+\n| Note | 1973 | Can\'t create user \'foo2\'@\'test\';\n it already exists |\n+-------+------+----------------------------------------------------+\n1 row in set (0.00 sec\n \nAuthentication Options\n \nIDENTIFIED BY \'password\'\n \nThe optional IDENTIFIED BY clause can be used to provide an\naccount with a password. The password should be specified in\nplain text. It will be hashed by the PASSWORD function prior\nto being stored to the mysql.user table.\n \nFor example, if our password is mariadb, then we can create\nthe user with:\n \nCREATE USER foo2@test IDENTIFIED BY \'mariadb\';\n \nIf you do not specify a password with the IDENTIFIED BY\nclause, the user\nwill be able to connect without a password. A blank password\nis not a wildcard\nto match any password. The user must connect without\nproviding a password if no\npassword is set.\n \nThe only authentication plugins that this clause supports\nare mysql_native_password and mysql_old_password.\n \nIDENTIFIED BY PASSWORD \'password_hash\'\n \nThe optional IDENTIFIED BY PASSWORD clause can be used to\nprovide an account with a password that has already been\nhashed. The password should be specified as a hash that was\nprovided by the PASSWORD function. It will be stored to the\nmysql.user table as-is.\n \nFor example, if our password is mariadb, then we can find\nthe hash with:\n \nSELECT PASSWORD(\'mariadb\');\n+-------------------------------------------+\n| PASSWORD(\'mariadb\') |\n+-------------------------------------------+\n| *54958E764CE10E50764C2EECBB71D01F08549980 |\n+-------------------------------------------+\n1 row in set (0.00 sec)\n \nAnd then we can create a user with the hash:\n \nCREATE USER foo2@test IDENTIFIED BY PASSWORD\n\'*54958E764CE10E50764C2EECBB71D01F08549980\';\n \nIf you do not specify a password with the IDENTIFIED BY\nclause, the user\nwill be able to connect without a password. A blank password\nis not a wildcard\nto match any password. The user must connect without\nproviding a password if no\npassword is set.\n \nThe only authentication plugins that this clause supports\nare mysql_native_password and mysql_old_password.\n \nIDENTIFIED {VIA|WITH} authentication_plugin\n \nThe optional IDENTIFIED VIA authentication_plugin allows you\nto specify that the account should be authenticated by a\nspecific authentication plugin. The plugin name must be an\nactive authentication plugin as per SHOW PLUGINS. If it\ndoesn\'t show up in that output, then you will need to\ninstall it with INSTALL PLUGIN or INSTALL SONAME.\n \nFor example, this could be used with the PAM authentication\nplugin:\n \nCREATE USER foo2@test IDENTIFIED VIA pam;\n \nSome authentication plugins allow additional arguments to be\nspecified after a USING or AS keyword. For example, the PAM\nauthentication plugin accepts a service name:\n \nCREATE USER foo2@test IDENTIFIED VIA pam USING \'mariadb\';\n \nThe exact meaning of the additional argument would depend on\nthe specific authentication plugin.\n \nThe USING or AS keyword can also be used to provide a\nplain-text password to a plugin if it\'s provided as an\nargument to the PASSWORD() function. This is only valid for\nauthentication plugins that have implemented a hook for the\nPASSWORD() function. For example, the ed25519 authentication\nplugin supports this:\n \nCREATE USER safe@\'%\' IDENTIFIED VIA ed25519 USING\nPASSWORD(\'secret\');\n \nOne can specify many authentication plugins, they all works\nas alternatives ways of authenticating a user:\n \nCREATE USER safe@\'%\' IDENTIFIED VIA ed25519 USING\nPASSWORD(\'secret\') OR unix_socket;\n \nTLS Options\n \nBy default, MariaDB transmits data between the server and\nclients without encrypting it. This is generally acceptable\nwhen the server and client run on the same host or in\nnetworks where security is guaranteed through other means.\nHowever, in cases where the server and client exist on\nseparate networks or they are in a high-risk network, the\nlack of encryption does introduce security concerns as a\nmalicious actor could potentially eavesdrop on the traffic\nas it is sent over the network between them.\n \nTo mitigate this concern, MariaDB allows you to encrypt data\nin transit between the server and clients using the\nTransport Layer Security (TLS) protocol. TLS was formerly\nknown as Secure Socket Layer (SSL), but strictly speaking\nthe SSL protocol is a predecessor to TLS and, that version\nof the protocol is now considered insecure. The\ndocumentation still uses the term SSL often and for\ncompatibility reasons TLS-related server system and status\nvariables still use the prefix ssl_, but internally, MariaDB\nonly supports its secure successors.\n \nSee Secure Connections Overview for more information about\nhow to determine whether your MariaDB server has TLS\nsupport.\n \nYou can set certain TLS-related restrictions for specific\nuser accounts. For instance, you might use this with user\naccounts that require access to sensitive data while sending\nit across networks that you do not control. These\nrestrictions can be enabled for a user account with the\nCREATE USER, ALTER USER, or GRANT statements. The following\noptions are available:\n \nOption | Description | \n \nREQUIRE NONE | TLS is not required for this account, but can\nstill be used. | \n \nREQUIRE SSL | The account must use TLS, but no valid X509\ncertificate is required. This option cannot be combined with\nother TLS options. | \n \nREQUIRE X509 | The account must use TLS and must have a\nvalid X509 certificate. This option implies REQUIRE SSL.\nThis option cannot be combined with other TLS options. | \n \nREQUIRE ISSUER \'issuer\' | The account must use TLS and\nmust have a valid X509 certificate. Also, the Certificate\nAuthority must be the one specified via the string issuer.\nThis option implies REQUIRE X509. This option can be\ncombined with the SUBJECT, and CIPHER options in any order.\n| \n \nREQUIRE SUBJECT \'subject\' | The account must use TLS and\nmust have a valid X509 certificate. Also, the certificate\'s\nSubject must be the one specified via the string subject.\nThis option implies REQUIRE X509. This option can be\ncombined with the ISSUER, and CIPHER options in any order. |\n\n \nREQUIRE CIPHER \'cipher\' | The account must use TLS, but no\nvalid X509 certificate is required. Also, the encryption\nused for the connection must use one of the methods\nspecified in the string cipher. This option implies REQUIRE\nSSL. This option can be combined with the ISSUER, and\nSUBJECT options in any order. | \n \nThe REQUIRE keyword must be used only once for all specified\noptions, and the AND keyword can be used to separate\nindividual options, but it is not required.\n \nFor example, you can create a user account that requires\nthese TLS options with the following:\n \nCREATE USER \'alice\'@\'%\'\n REQUIRE SUBJECT \'/CN=alice/O=My Dom,\nInc./C=US/ST=Oregon/L=Portland\'\n AND ISSUER \'/C=FI/ST=Somewhere/L=City/ O=Some\nCompany/CN=Peter Parker/emailAddress=p.parker@marvel.com\'\n AND CIPHER \'TLSv1.2\';\n \nIf any of these options are set for a specific user account,\nthen any client who tries to connect with that user account\nwill have to be configured to connect with TLS.\n \nSee Securing Connections for Client and Server for\ninformation on how to enable TLS on the client and server.\n \nResource Limit Options\n \nMariaDB 10.2.0 introduced a number of resource limit\noptions.\n \nIt is possible to set per-account limits for certain server\nresources. The following table shows the values that can be\nset per account:\n \nLimit Type | Decription | \n \nMAX_QUERIES_PER_HOUR | Number of statements that the account\ncan issue per hour (including updates) | \n \nMAX_UPDATES_PER_HOUR | Number of updates (not queries) that\nthe account can issue per hour | \n \nMAX_CONNECTIONS_PER_HOUR | Number of connections that the\naccount can start per hour | \n \nMAX_USER_CONNECTIONS | Number of simultaneous connections\nthat can be accepted from the same account; if it is 0,\nmax_connections will be used instead; if max_connections is\n0, there is no limit for this account\'s simultaneous\nconnections. | \n \nMAX_STATEMENT_TIME | Timeout, in seconds, for statements\nexecuted by the user. See also Aborting Statements that\nExceed a Certain Time to Execute. | \n \nIf any of these limits are set to 0, then there is no limit\nfor that resource for that user.\n \nHere is an example showing how to create a user with\nresource limits:\n \nCREATE USER \'someone\'@\'localhost\' WITH\n MAX_USER_CONNECTIONS 10\n MAX_QUERIES_PER_HOUR 200;\n \nThe resources are tracked per account, which means\n\'user\'@\'server\'; not per user name or per connection.\n \nThe count can be reset for all users using FLUSH\nUSER_RESOURCES, FLUSH PRIVILEGES or mysqladmin reload.\n \nPer account resource limits are stored in the user table, in\nthe mysql database. Columns used for resources limits are\nnamed max_questions, max_updates, max_connections (for\nMAX_CONNECTIONS_PER_HOUR), and max_user_connections (for\nMAX_USER_CONNECTIONS).\n \nAccount Names\n \nAccount names have both a user name component and a host\nname component, and are specified as\n\'user_name\'@\'host_name\'.\n \nThe user name and host name may be unquoted, quoted as\nstrings using double quotes (\") or\nsingle quotes (\'), or quoted as identifiers using backticks\n(`). You must use quotes\nwhen using special characters (such as a hyphen) or wildcard\ncharacters. If you quote, you \nmust quote the user name and host name separately (for\nexample \'user_name\'@\'host_name\').\n \nHost Name Component\n \nIf the host name is not provided, it is assumed to be \'%\'.\n \nHost names may contain the wildcard characters % and _. They\nare matched as if by\nthe LIKE clause. If you need to use a wildcard character\nliterally (for example, to\nmatch a domain name with an underscore), prefix the\ncharacter with a backslash. See LIKE\nfor more information on escaping wildcard characters.\n \nHost name matches are case-insensitive. Host names can match\neither domain names or IP\naddresses. Use \'localhost\' as the host name to allow only\nlocal client connections.\n \nYou can use a netmask to match a range of IP addresses using\n\'base_ip/netmask\' as the\nhost name. A user with an IP address ip_addr will be allowed\nto connect if the following\ncondition is true:\n \nip_addr & netmask = base_ip\n \nYou can only use netmasks that specify a multiple of 8 bits\nof the address to match. That is,\nonly the following netmasks are allowed:\n \n255.0.0.0\n255.255.0.0\n255.255.255.0\n255.255.255.255\n \nUsing 255.255.255.255 is equivalent to not using a netmask\nat all.\n \nUser Name Component\n \nUser names must match exactly, including case. A user name\nthat is empty is known as an anonymous account and is\nallowed to match a login attempt with any user name\ncomponent. These are described more in the next section.\n \nFor valid identifiers to use as user names, see Identifier\nNames.\n \nIt is possible for more than one account to match when a\nuser connects. MariaDB selects\nthe first matching account after sorting according to the\nfollowing criteria:\nAccounts with an exact host name are sorted before accounts\nusing a wildcard in the\nhost name. Host names using a netmask are considered to be\nexact for sorting.\nAccounts with a wildcard in the host name are sorted\naccording to the position of\nthe first wildcard character. Those with a wildcard\ncharacter later in the host name\nsort before those with a wildcard character earlier in the\nhost name.\nAccounts with a non-empty user name sort before accounts\nwith an empty user name.\nAccounts with an empty user name are sorted last. As\nmentioned previously, these are known as anonymous accounts.\nThese are described more in the next section.\n \nThe following table shows a list of example account as\nsorted by these criteria:\n \n+---------+-------------+\n| User | Host |\n+---------+-------------+\n| joffrey | 192.168.0.3 |\n| | 192.168.0.% |\n| joffrey | 192.168.% |\n| | 192.168.% |\n+---------+-------------+\n \nOnce connected, you only have the privileges granted to the\naccount that matched,\nnot all accounts that could have matched. For example,\nconsider the following\ncommands:\n \nCREATE USER \'joffrey\'@\'192.168.0.3\';\n \nCREATE USER \'joffrey\'@\'%\';\n \nGRANT SELECT ON test.t1 to \'joffrey\'@\'192.168.0.3\';\n \nGRANT SELECT ON test.t2 to \'joffrey\'@\'%\';\n \nIf you connect as joffrey from 192.168.0.3, you will have\nthe SELECT\nprivilege on the table test.t1, but not on the table\ntest.t2. If you connect as joffrey from any other IP\naddress, you will have the SELECT privilege on the table\ntest.t2, but not\non the table test.t1.\n \nBeginning with MariaDB 5.5.31, usernames can be up to 80\ncharacters long. From MariaDB 10.0 the system tables are all\nby default this length. However, in order to enable this\nfeature in MariaDB 5.5, the following schema changes must be\nmade:\n \nALTER TABLE mysql.user MODIFY User CHAR(80) BINARY NOT NULL\nDEFAULT \'\';\n \nALTER TABLE mysql.db MODIFY User CHAR(80) BINARY NOT NULL\nDEFAULT \'\';\n \nALTER TABLE mysql.tables_priv MODIFY User CHAR(80) BINARY\nNOT NULL DEFAULT \'\';\n \nALTER TABLE mysql.columns_priv MODIFY User CHAR(80) BINARY\nNOT NULL DEFAULT \'\';\n \nALTER TABLE mysql.procs_priv MODIFY User CHAR(80) BINARY NOT\nNULL DEFAULT \'\';\n \nALTER TABLE mysql.proc MODIFY definer CHAR(141) COLLATE\nutf8_bin NOT NULL DEFAULT \'\';\n \nALTER TABLE mysql.event MODIFY definer CHAR(141) COLLATE\nutf8_bin NOT NULL DEFAULT \'\';\n \nALTER TABLE mysql.proxies_priv MODIFY User CHAR(80) COLLATE\nutf8_bin NOT NULL DEFAULT \'\';\n \nALTER TABLE mysql.proxies_priv MODIFY Proxied_user CHAR(80)\nCOLLATE utf8_bin NOT NULL DEFAULT \'\';\n \nALTER TABLE mysql.proxies_priv MODIFY Grantor CHAR(141)\nCOLLATE utf8_bin NOT NULL DEFAULT \'\';\n \nALTER TABLE mysql.servers MODIFY Username CHAR(80) NOT NULL\nDEFAULT \'\';\n \nALTER TABLE mysql.procs_priv MODIFY Grantor CHAR(141)\nCOLLATE utf8_bin NOT NULL DEFAULT \'\';\n \nALTER TABLE mysql.tables_priv MODIFY Grantor CHAR(141)\nCOLLATE utf8_bin NOT NULL DEFAULT \'\';\n \nFLUSH PRIVILEGES;\n \nAnonymous Accounts\n \nAnonymous accounts are accounts where the user name portion\nof the account name is empty. These accounts act as special\ncatch-all accounts. If a user attempts to log into the\nsystem from a host, and an anonymous account exists with a\nhost name portion that matches the user\'s host, then the\nuser will log in as the anonymous account if there is no\nmore specific account match for the user name that the user\nentered.\n \nFor example, here are some anonymous accounts:\n \nCREATE USER \'\'@\'localhost\';\n \nCREATE USER \'\'@\'192.168.0.3\';\n \nFixing a Legacy Default Anonymous Account\n \nOn some systems, the mysql.db table has some entries for the\n\'\'@\'%\' anonymous account by default. Unfortunately,\nthere is no matching entry in the mysql.user table, which\nmeans that this anonymous account doesn\'t exactly exist,\nbut it does have privileges--usually on the default test\ndatabase created by mysql_install_db. These account-less\nprivileges are a legacy that is leftover from a time when\nMySQL\'s privilege system was less advanced.\n \nThis situation means that you will run into errors if you\ntry to create a \'\'@\'%\' account. For example:\n \nCREATE USER \'\'@\'%\';\n \nERROR 1396 (HY000): Operation CREATE USER failed for\n\'\'@\'%\'\n \nThe fix is to DELETE the row in the mysql.db table and then\nexecute FLUSH PRIVILEGES:\n \nDELETE FROM mysql.db WHERE User=\'\' AND Host=\'%\';\n \nFLUSH PRIVILEGES;\n \nAnd then the account can be created:\n \nCREATE USER \'\'@\'%\';\n \nQuery OK, 0 rows affected (0.01 sec)\n \nSee MDEV-13486 for more information.\n \nPassword Expiry\n \nBesides automatic password expiry, as determined by\ndefault_password_lifetime, password expiry times can be set\non an individual user basis, overriding the global setting,\nfor example:\n \nCREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL\n120 DAY;\n \nSee User Password Expiry for more details.\n \nAccount Locking\n \nAccount locking permits privileged administrators to\nlock/unlock user accounts. No new client connections will be\npermitted if an account is locked (existing connections are\nnot affected). For example:\n \nCREATE USER \'marijn\'@\'localhost\' ACCOUNT LOCK;\n \nSee Account Locking for more details.\n \n\n\nURL: https://mariadb.com/kb/en/library/create-user/','','https://mariadb.com/kb/en/library/create-user/'),(119,'ALTER USER',10,'The ALTER USER statement was introduced in MariaDB 10.2.0.\n \nSyntax\n------ \nALTER USER [IF EXISTS] \n user_specification [,user_specification] ...\n [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]\n [WITH resource_option [resource_option] ...]\n [password_option | lock_option] \n \nuser_specification:\n username [authentication_option]\n \nauthentication_option:\n IDENTIFIED BY \'password\' \n | IDENTIFIED BY PASSWORD \'password_hash\'\n | IDENTIFIED {VIA|WITH} authentication_plugin\n | IDENTIFIED {VIA|WITH} authentication_plugin {USING|AS}\n\'authentication_string\'\n | IDENTIFIED {VIA|WITH} authentication_plugin {USING|AS}\nPASSWORD(\'password\')\n \ntls_option\n SSL \n | X509\n | CIPHER \'cipher\'\n | ISSUER \'issuer\'\n | SUBJECT \'subject\'\n \nresource_option\n MAX_QUERIES_PER_HOUR count\n | MAX_UPDATES_PER_HOUR count\n | MAX_CONNECTIONS_PER_HOUR count\n | MAX_USER_CONNECTIONS count\n | MAX_STATEMENT_TIME time\n \npassword_option:\n PASSWORD EXPIRE\n | PASSWORD EXPIRE DEFAULT\n | PASSWORD EXPIRE NEVER\n | PASSWORD EXPIRE INTERVAL N DAY\n \nlock_option:\n ACCOUNT LOCK\n | ACCOUNT UNLOCK\n}\n \nDescription\n----------- \nThe ALTER USER statement modifies existing MariaDB accounts.\nTo use it, you must have the global CREATE USER privilege or\nthe UPDATE privilege for the mysql database. The global\nSUPER privilege is also required if the read_only system\nvariable is enabled.\n \nIf any of the specified user accounts do not yet exist, an\nerror results. If an error occurs, ALTER USER will still\nmodify the accounts that do not result in an error. Only one\nerror is produced for all users which have not been\nmodified.\n \nIF EXISTS\n \nWhen the IF EXISTS clause is used, MariaDB will return a\nwarning instead of an error for each specified user that\ndoes not exist.\n \nAccount Names\n \nFor ALTER USER statements, account names are specified as\nthe username argument in the same way as they are for CREATE\nUSER statements. See account names from the CREATE USER page\nfor details on how account names are specified.\n \nCURRENT_USER or CURRENT_USER() can also be used to alter the\naccount logged into the current session. For example, to\nchange the current user\'s password to mariadb:\n \nALTER USER CURRENT_USER() IDENTIFIED BY \'mariadb\';\n \nAuthentication Options\n \nIDENTIFIED BY \'password\'\n \nThe optional IDENTIFIED BY clause can be used to provide an\naccount with a password. The password should be specified in\nplain text. It will be hashed by the PASSWORD function prior\nto being stored to the mysql.user table.\n \nFor example, if our password is mariadb, then we can set the\naccount\'s password with:\n \nALTER USER foo2@test IDENTIFIED BY \'mariadb\';\n \nIf you do not specify a password with the IDENTIFIED BY\nclause, the user\nwill be able to connect without a password. A blank password\nis not a wildcard\nto match any password. The user must connect without\nproviding a password if no\npassword is set.\n \nThe only authentication plugins that this clause supports\nare mysql_native_password and mysql_old_password.\n \nIDENTIFIED BY PASSWORD \'password_hash\'\n \nThe optional IDENTIFIED BY PASSWORD clause can be used to\nprovide an account with a password that has already been\nhashed. The password should be specified as a hash that was\nprovided by the PASSWORD function. It will be stored to the\nmysql.user table as-is.\n \nFor example, if our password is mariadb, then we can find\nthe hash with:\n \nSELECT PASSWORD(\'mariadb\');\n+-------------------------------------------+\n| PASSWORD(\'mariadb\') |\n+-------------------------------------------+\n| *54958E764CE10E50764C2EECBB71D01F08549980 |\n+-------------------------------------------+\n1 row in set (0.00 sec)\n \nAnd then we can set an account\'s password with the hash:\n \nALTER USER foo2@test IDENTIFIED BY PASSWORD\n\'*54958E764CE10E50764C2EECBB71D01F08549980\';\n \nIf you do not specify a password with the IDENTIFIED BY\nclause, the user\nwill be able to connect without a password. A blank password\nis not a wildcard\nto match any password. The user must connect without\nproviding a password if no\npassword is set.\n \nThe only authentication plugins that this clause supports\nare mysql_native_password and mysql_old_password.\n \nIDENTIFIED {VIA|WITH} authentication_plugin\n \nThe optional IDENTIFIED VIA authentication_plugin allows you\nto specify that the account should be authenticated by a\nspecific authentication plugin. The plugin name must be an\nactive authentication plugin as per SHOW PLUGINS. If it\ndoesn\'t show up in that output, then you will need to\ninstall it with INSTALL PLUGIN or INSTALL SONAME.\n \nFor example, this could be used with the PAM authentication\nplugin:\n \nALTER USER foo2@test IDENTIFIED VIA pam;\n \nSome authentication plugins allow additional arguments to be\nspecified after a USING or AS keyword. For example, the PAM\nauthentication plugin accepts a service name:\n \nALTER USER foo2@test IDENTIFIED VIA pam USING \'mariadb\';\n \nThe exact meaning of the additional argument would depend on\nthe specific authentication plugin.\n \nIn MariaDB 10.4 and later, the USING or AS keyword can also\nbe used to provide a plain-text password to a plugin if\nit\'s provided as an argument to the PASSWORD() function.\nThis is only valid for authentication plugins that have\nimplemented a hook for the PASSWORD() function. For example,\nthe ed25519 authentication plugin supports this:\n \nALTER USER safe@\'%\' IDENTIFIED VIA ed25519 USING\nPASSWORD(\'secret\');\n \nTLS Options\n \nBy default, MariaDB transmits data between the server and\nclients without encrypting it. This is generally acceptable\nwhen the server and client run on the same host or in\nnetworks where security is guaranteed through other means.\nHowever, in cases where the server and client exist on\nseparate networks or they are in a high-risk network, the\nlack of encryption does introduce security concerns as a\nmalicious actor could potentially eavesdrop on the traffic\nas it is sent over the network between them.\n \nTo mitigate this concern, MariaDB allows you to encrypt data\nin transit between the server and clients using the\nTransport Layer Security (TLS) protocol. TLS was formerly\nknown as Secure Socket Layer (SSL), but strictly speaking\nthe SSL protocol is a predecessor to TLS and, that version\nof the protocol is now considered insecure. The\ndocumentation still uses the term SSL often and for\ncompatibility reasons TLS-related server system and status\nvariables still use the prefix ssl_, but internally, MariaDB\nonly supports its secure successors.\n \nSee Secure Connections Overview for more information about\nhow to determine whether your MariaDB server has TLS\nsupport.\n \nYou can set certain TLS-related restrictions for specific\nuser accounts. For instance, you might use this with user\naccounts that require access to sensitive data while sending\nit across networks that you do not control. These\nrestrictions can be enabled for a user account with the\nCREATE USER, ALTER USER, or GRANT statements. The following\noptions are available:\n \nOption | Description | \n \nREQUIRE NONE | TLS is not required for this account, but can\nstill be used. | \n \nREQUIRE SSL | The account must use TLS, but no valid X509\ncertificate is required. This option cannot be combined with\nother TLS options. | \n \nREQUIRE X509 | The account must use TLS and must have a\nvalid X509 certificate. This option implies REQUIRE SSL.\nThis option cannot be combined with other TLS options. | \n \nREQUIRE ISSUER \'issuer\' | The account must use TLS and\nmust have a valid X509 certificate. Also, the Certificate\nAuthority must be the one specified via the string issuer.\nThis option implies REQUIRE X509. This option can be\ncombined with the SUBJECT, and CIPHER options in any order.\n| \n \nREQUIRE SUBJECT \'subject\' | The account must use TLS and\nmust have a valid X509 certificate. Also, the certificate\'s\nSubject must be the one specified via the string subject.\nThis option implies REQUIRE X509. This option can be\ncombined with the ISSUER, and CIPHER options in any order. |\n\n \nREQUIRE CIPHER \'cipher\' | The account must use TLS, but no\nvalid X509 certificate is required. Also, the encryption\nused for the connection must use one of the methods\nspecified in the string cipher. This option implies REQUIRE\nSSL. This option can be combined with the ISSUER, and\nSUBJECT options in any order. | \n \nThe REQUIRE keyword must be used only once for all specified\noptions, and the AND keyword can be used to separate\nindividual options, but it is not required.\n \nFor example, you can alter a user account to require these\nTLS options with the following:\n \nALTER USER \'alice\'@\'%\'\n REQUIRE SUBJECT \'/CN=alice/O=My Dom,\nInc./C=US/ST=Oregon/L=Portland\'\n AND ISSUER \'/C=FI/ST=Somewhere/L=City/ O=Some\nCompany/CN=Peter Parker/emailAddress=p.parker@marvel.com\'\n AND CIPHER \'TLSv1.2\';\n \nIf any of these options are set for a specific user account,\nthen any client who tries to connect with that user account\nwill have to be configured to connect with TLS.\n \nSee Securing Connections for Client and Server for\ninformation on how to enable TLS on the client and server.\n \nResource Limit Options\n \nMariaDB 10.2.0 introduced a number of resource limit\noptions.\n \nIt is possible to set per-account limits for certain server\nresources. The following table shows the values that can be\nset per account:\n \nLimit Type | Decription | \n \nMAX_QUERIES_PER_HOUR | Number of statements that the account\ncan issue per hour (including updates) | \n \nMAX_UPDATES_PER_HOUR | Number of updates (not queries) that\nthe account can issue per hour | \n \nMAX_CONNECTIONS_PER_HOUR | Number of connections that the\naccount can start per hour | \n \nMAX_USER_CONNECTIONS | Number of simultaneous connections\nthat can be accepted from the same account; if it is 0,\nmax_connections will be used instead; if max_connections is\n0, there is no limit for this account\'s simultaneous\nconnections. | \n \nMAX_STATEMENT_TIME | Timeout, in seconds, for statements\nexecuted by the user. See also Aborting Statements that\nExceed a Certain Time to Execute. | \n \nIf any of these limits are set to 0, then there is no limit\nfor that resource for that user.\n \nHere is an example showing how to set an account\'s resource\nlimits:\n \nALTER USER \'someone\'@\'localhost\' WITH\n MAX_USER_CONNECTIONS 10\n MAX_QUERIES_PER_HOUR 200;\n \nThe resources are tracked per account, which means\n\'user\'@\'server\'; not per user name or per connection.\n \nThe count can be reset for all users using FLUSH\nUSER_RESOURCES, FLUSH PRIVILEGES or mysqladmin reload.\n \nPer account resource limits are stored in the user table, in\nthe mysql database. Columns used for resources limits are\nnamed max_questions, max_updates, max_connections (for\nMAX_CONNECTIONS_PER_HOUR), and max_user_connections (for\nMAX_USER_CONNECTIONS).\n \nPassword Expiry\n \nBesides automatic password expiry, as determined by\ndefault_password_lifetime, password expiry times can be set\non an individual user basis, overriding the global setting,\nfor example:\n \nALTER USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL\n120 DAY;\n \nALTER USER \'monty\'@\'localhost\' PASSWORD EXPIRE NEVER;\n \nALTER USER \'monty\'@\'localhost\' PASSWORD EXPIRE DEFAULT;\n \nSee User Password Expiry for more details.\n \nAccount Locking\n \nAccount locking permits privileged administrators to\nlock/unlock user accounts. No new client connections will be\npermitted if an account is locked (existing connections are\nnot affected). For example:\n \nALTER USER \'marijn\'@\'localhost\' ACCOUNT LOCK;\n \nSee Account Locking for more details.\n \n\n\nURL: https://mariadb.com/kb/en/library/alter-user/','','https://mariadb.com/kb/en/library/alter-user/'),(121,'GRANT',10,'Syntax\n------ \nGRANT\n priv_type [(column_list)]\n [, priv_type [(column_list)]] ...\n ON [object_type] priv_level\n TO user_specification [ user_options ...]\n \nuser_specification:\n username [authentication_option]\n \nauthentication_option:\n IDENTIFIED BY \'password\' \n | IDENTIFIED BY PASSWORD \'password_hash\'\n | IDENTIFIED {VIA|WITH} authentication_rule [OR\nauthentication_rule ...]\n \nauthentication_rule:\n authentication_plugin\n | authentication_plugin {USING|AS}\n\'authentication_string\'\n | authentication_plugin {USING|AS} PASSWORD(\'password\')\n \nGRANT PROXY ON username\n TO username [, username] ...\n [WITH GRANT OPTION]\n \nuser_options:\n [REQUIRE {NONE | tls_option [[AND] tls_option] ...}]\n [WITH with_option [with_option] ...]\n \nobject_type:\n TABLE\n | FUNCTION\n | PROCEDURE\n \npriv_level:\n *\n | *.*\n | db_name.*\n | db_name.tbl_name\n | tbl_name\n | db_name.routine_name\n \nwith_option:\n GRANT OPTION\n | resource_option\n \nresource_option:\n MAX_QUERIES_PER_HOUR count\n | MAX_UPDATES_PER_HOUR count\n | MAX_CONNECTIONS_PER_HOUR count\n | MAX_USER_CONNECTIONS count\n | MAX_STATEMENT_TIME time\n \ntls_option:\n SSL \n | X509\n | CIPHER \'cipher\'\n | ISSUER \'issuer\'\n | SUBJECT \'subject\'\n \nDescription\n----------- \nThe GRANT statement allows you to grant privileges or roles\nto accounts. To use GRANT, you must have the GRANT OPTION\nprivilege, and you must have the privileges that you are\ngranting.\n \nUse the REVOKE statement to revoke privileges granted with\nthe GRANT statement.\n \nUse the SHOW GRANTS statement to determine what privileges\nan account has.\n \nAccount Names\n \nFor GRANT statements, account names are specified as the\nusername argument in the same way as they are for CREATE\nUSER statements. See account names from the CREATE USER page\nfor details on how account names are specified.\n \nImplicit Account Creation\n \nThe GRANT statement also allows you to implicitly create\naccounts in some cases.\n \nIf the account does not yet exist, then GRANT can implicitly\ncreate it. To implicitly create an account with GRANT, a\nuser is required to have the same privileges that would be\nrequired to explicitly create the account with the CREATE\nUSER statement.\n \nIf the NO_AUTO_CREATE_USER SQL_MODE is set, then accounts\ncan only be created if authentication information is\nspecified, or with a CREATE USER statement. If no\nauthentication information is provided, GRANT will produce\nan error when the specified account does not exist, for\nexample:\n \nshow variables like \'%sql_mode%\' ;\n+---------------+--------------------------------------------+\n| Variable_name | Value |\n+---------------+--------------------------------------------+\n| sql_mode | NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |\n+---------------+--------------------------------------------+\n \nGRANT USAGE ON *.* TO \'user123\'@\'%\' IDENTIFIED BY \'\';\nERROR 1133 (28000): Can\'t find any matching row in the user\ntable\n \nGRANT USAGE ON *.* TO \'user123\'@\'%\' IDENTIFIED VIA PAM\nusing \'mariadb\' require ssl ;\nQuery OK, 0 rows affected (0.00 sec)\n \nselect host, user from mysql.user where user=\'user123\' ;\n \n+------+----------+\n| host | user |\n+------+----------+\n| % | user123 |\n+------+----------+\n \nPrivilege Levels\n \nPrivileges can be set globally, for an entire database, for\na table or routine,\nor for individual columns in a table. Certain privileges can\nonly be set at\ncertain levels.\nGlobal privileges are granted using *.* for\npriv_level. Global privileges include privileges to\nadminister the database\nand manage user accounts, as well as privileges for all\ntables, functions, and\nprocedures. Global privileges are stored in the mysql.user\ntable.\nDatabase privileges are granted using db_name.*\nfor priv_level, or using just * to use default database.\nDatabase\nprivileges include privileges to create tables and\nfunctions, as well as\nprivileges for all tables, functions, and procedures in the\ndatabase. Database privileges are stored in the mysql.db\ntable.\nTable privileges are granted using db_name.tbl_name\nfor priv_level, or using just tbl_name to specify a table in\nthe default\ndatabase. The TABLE keyword is optional. Table privileges\ninclude the\nability to select and change data in the table. Certain\ntable privileges can\nbe granted for individual columns.\nColumn privileges are granted by specifying a table for\npriv_level and providing a column list after the privilege\ntype. They allow\nyou to control exactly which columns in a table users can\nselect and change.\nFunction privileges are granted using FUNCTION\ndb_name.routine_name\nfor priv_level, or using just FUNCTION routine_name to\nspecify a function\nin the default database.\nProcedure privileges are granted using PROCEDURE\ndb_name.routine_name\nfor priv_level, or using just PROCEDURE routine_name to\nspecify a procedure\nin the default database.\n \nThe USAGE Privilege\n \nThe USAGE privilege grants no real privileges. The SHOW\nGRANTS\nstatement will show a global USAGE privilege for a\nnewly-created user. You\ncan use USAGE with the GRANT statement to change options\nlike GRANT OPTION\nand MAX_USER_CONNECTIONS without changing any account\nprivileges.\n \nThe ALL PRIVILEGES Privilege\n \nThe ALL PRIVILEGES privilege grants all available\nprivileges. Granting all\nprivileges only affects the given privilege level. For\nexample, granting all\nprivileges on a table does not grant any privileges on the\ndatabase or globally.\n \nUsing ALL PRIVILEGES does not grant the special GRANT OPTION\nprivilege.\n \nYou can use ALL instead of ALL PRIVILEGES.\n \nThe GRANT OPTION Privilege\n \nUse the WITH GRANT OPTION clause to give users the ability\nto grant privileges\nto other users at the given privilege level. Users with the\nGRANT OPTION privilege can\nonly grant privileges they have. They cannot grant\nprivileges at a higher privilege level than\nthey have the GRANT OPTION privilege.\n \nThe GRANT OPTION privilege cannot be set for individual\ncolumns.\nIf you use WITH GRANT OPTION when specifying column\nprivileges,\nthe GRANT OPTION privilege will be granted for the entire\ntable.\n \nUsing the WITH GRANT OPTION clause is equivalent to listing\nGRANT OPTION\nas a privilege.\n \nGlobal Privileges\n \nThe following table lists the privileges that can be granted\nglobally. You can\nalso grant all database, table, and function privileges\nglobally. When granted\nglobally, these privileges apply to all databases, tables,\nor functions,\nincluding those created later.\n \nTo set a global privilege, use *.* for priv_level.\n \nPrivilege | Description | \n \nCREATE USER | Create a user using the CREATE USER statement,\nor implicitly create a user with the GRANT statement. | \n \nFILE | Read and write files on the server, using statements\nlike LOAD DATA INFILE or functions like LOAD_FILE(). Also\nneeded to create CONNECT outward tables. MariaDB server must\nhave the permissions to access those files. | \n \nGRANT OPTION | Grant global privileges. You can only grant\nprivileges that you have. | \n \nPROCESS | Show information about the active processes, via\nSHOW PROCESSLIST or mysqladmin processlist. | \n \nRELOAD | Execute FLUSH statements or equivalent mysqladmin\ncommands. | \n \nREPLICATION CLIENT | Execute SHOW MASTER STATUS and SHOW\nSLAVE STATUS informative statements. | \n \nREPLICATION SLAVE | Accounts used by slave servers on the\nmaster need this privilege. This is needed to get the\nupdates made on the master. | \n \nSHOW DATABASES | List all databases using the SHOW DATABASES\nstatement. Without the SHOW DATABASES privilege, you can\nstill issue the SHOW DATABASES statement, but it will only\nlist databases containing tables on which you have\nprivileges. | \n \nSHUTDOWN | Shut down the server using SHUTDOWN or the\nmysqladmin shutdown command. | \n \nSUPER | Execute superuser statements: CHANGE MASTER TO, KILL\n(users who do not have this privilege can only KILL their\nown threads), PURGE LOGS, SET global system variables, or\nthe mysqladmin debug command. Also, this permission allows\nthe user to write data even if the read_only startup option\nis set, enable or disable logging, enable or disable\nreplication on slaves, specify a DEFINER for statements that\nsupport that clause, connect once after reaching the\nMAX_CONNECTIONS. If a statement has been specified for the\ninit-connect mysqld option, that command will not be\nexecuted when a user with SUPER privileges connects to the\nserver. | \n \nDatabase Privileges\n \nThe following table lists the privileges that can be granted\nat the database\nlevel. You can also grant all table and function privileges\nat the database\nlevel. Table and function privileges on a database apply to\nall tables or\nfunctions in that database, including those created later.\n \nTo set a privilege for a database, specify the database\nusing\ndb_name.* for priv_level, or just use *\nto specify the default database.\n \nPrivilege | Description | \n \nCREATE | Create a database using the CREATE DATABASE\nstatement, when the privilege is granted for a database. You\ncan grant the CREATE privilege on databases that do not yet\nexist. This also grants the CREATE privilege on all tables\nin the database. | \n \nCREATE ROUTINE | Create Stored Programs using the CREATE\nPROCEDURE and CREATE FUNCTION statements. | \n \nCREATE TEMPORARY TABLES | Create temporary tables with the\nCREATE TEMPORARY TABLE statement. This privilege enable\nwriting and dropping those temporary tables | \n \nDROP | Drop a database using the DROP DATABASE statement,\nwhen the privilege is granted for a database. This also\ngrants the DROP privilege on all tables in the database. | \n \nEVENT | Create, drop and alter EVENTs. Added in MySQL 5.1.6.\n| \n \nGRANT OPTION | Grant database privileges. You can only grant\nprivileges that you have. | \n \nLOCK TABLES | Acquire explicit locks using the LOCK TABLES\nstatement; you also need to have the SELECT privilege on a\ntable, in order to lock it. | \n \nTable Privileges\n \nPrivilege | Description | \n \nALTER | Change the structure of an existing table using the\nALTER TABLE statement. | \n \nCREATE | Create a table using the CREATE TABLE statement.\nYou can grant the CREATE privilege on tables that do not yet\nexist. | \n \nCREATE VIEW | Create a view using the CREATE_VIEW statement.\n| \n \nDELETE | Remove rows from a table using the DELETE\nstatement. | \n \nDELETE HISTORY | Remove historical rows from a table using\nthe DELETE HISTORY statement. Displays as DELETE VERSIONING\nROWS when running SHOW GRANTS (MDEV-17655). From MariaDB\n10.3.4. From MariaDB 10.3.5, if a user has the SUPER\nprivilege but not this privilege, running mysql_upgrade will\ngrant this privilege as well. | \n \nDROP | Drop a table using the DROP TABLE statement or a view\nusing the DROP VIEW statement. Also required to execute the\nTRUNCATE TABLE statement. | \n \nGRANT OPTION | Grant table privileges. You can only grant\nprivileges that you have. | \n \nINDEX | Create an index on a table using the CREATE INDEX\nstatement. Without the INDEX privilege, you can still create\nindexes when creating a table using the CREATE TABLE\nstatement if the you have the CREATE privilege, and you can\ncreate indexes using the ALTER TABLE statement if you have\nthe ALTER privilege. | \n \nINSERT | Add rows to a table using the INSERT statement. The\nINSERT privilege can also be set on individual columns; see\nColumn Privileges below for details. | \n \nREFERENCES | Unused. | \n \nSELECT | Read data from a table using the SELECT statement.\nThe SELECT privilege can also be set on individual columns;\nsee Column Privileges below for details. | \n \nSHOW VIEW | Show the CREATE VIEW statement to create a view\nusing the SHOW CREATE VIEW statement. | \n \nTRIGGER | Execute triggers associated to tables you update,\nexecute the CREATE TRIGGER and DROP TRIGGER statements. You\nwill still be able to see triggers. | \n \nUPDATE | Update existing rows in a table using the UPDATE\nstatement. UPDATE statements usually include a WHERE clause\nto update only certain rows. You must have SELECT privileges\non the table or the appropriate columns for the WHERE\nclause. The UPDATE privilege can also be set on individual\ncolumns; see Column Privileges below for details. | \n \nColumn Privileges\n \nSome table privileges can be set for individual columns of a\ntable. To use\ncolumn privileges, specify the table explicitly and provide\na list of column\nnames after the privilege type. For example, the following\nstatement would allow\nthe user to read the names and positions of employees, but\nnot other information\nfrom the same table, such as salaries.\n \nGRANT SELECT (name, position) on Employee to\n\'jeffrey\'@\'localhost\';\n \nPrivilege | Description | \n \nINSERT (column_list) | Add rows specifying values in columns\nusing the INSERT statement. If you only have column-level\nINSERT privileges, you must specify the columns you are\nsetting in the INSERT statement. All other columns will be\nset to their default values, or NULL. | \n \nREFERENCES (column_list) | Unused. | \n \nSELECT (column_list) | Read values in columns using the\nSELECT statement. You cannot access or query any columns for\nwhich you do not have SELECT privileges, including in WHERE,\nON, GROUP BY, and ORDER BY clauses. | \n \nUPDATE (column_list) | Update values in columns of existing\nrows using the UPDATE statement. UPDATE statements usually\ninclude a WHERE clause to update only certain rows. You must\nhave SELECT privileges on the table or the appropriate\ncolumns for the WHERE clause. | \n \nFunction Privileges\n \nPrivilege | Description | \n \nALTER ROUTINE | Change the characteristics of a stored\nfunction using the ALTER FUNCTION statement. | \n \nEXECUTE | Use a stored function. You need SELECT privileges\nfor any tables or columns accessed by the function. | \n \nGRANT OPTION | Grant function privileges. You can only grant\nprivileges that you have. | \n \nProcedure Privileges\n \nPrivilege | Description | \n \nALTER ROUTINE | Change the characteristics of a stored\nprocedure using the ALTER PROCEDURE statement. | \n \nEXECUTE | Execute a stored procedure using the CALL\nstatement. The privilege to call a procedure may allow you\nto perform actions you wouldn\'t otherwise be able to do,\nsuch as insert rows into a table. | \n \nGRANT OPTION | Grant procedure privileges. You can only\ngrant privileges that you have. | \n \nProxy Privileges\n \nPrivilege | Description | \n \nPROXY | Permits one user to be a proxy for another. | \n \nThe PROXY privilege allows one user to proxy as another\nuser, which means their privileges change to that of the\nproxy user, and the CURRENT_USER() function returns the user\nname of the proxy user.\n \nThe PROXY privilege only works with authentication plugins\nthat support it. The default mysql_native_password\nauthentication plugin does not support proxy users.\n \nThe pam authentication plugin is the only plugin included\nwith MariaDB that currently supports proxy users. The PROXY\nprivilege is commonly used with the pam authentication\nplugin to enable user and group mapping with PAM.\n \nFor example, to grant the PROXY privilege to an anonymous\naccount that authenticates with the pam authentication\nplugin, you could execute the following:\n \nCREATE USER \'dba\'@\'%\' IDENTIFIED BY \'strongpassword\';\n \nGRANT ALL PRIVILEGES ON *.* TO \'dba\'@\'%\' ;\n \nCREATE USER \'\'@\'%\' IDENTIFIED VIA pam USING \'mariadb\';\n \nGRANT PROXY ON \'dba\'@\'%\' TO \'\'@\'%\';\n \nA user account can only grant the PROXY privilege for a\nspecific user account if the granter also has the PROXY\nprivilege for that specific user account, and if that\nprivilege is defined WITH GRANT OPTION. For example, the\nfollowing example fails because the granter does not have\nthe PROXY privilege for that specific user account at all:\n \nSELECT USER(), CURRENT_USER();\n+-----------------+-----------------+\n| USER() | CURRENT_USER() |\n+-----------------+-----------------+\n| alice@localhost | alice@localhost |\n+-----------------+-----------------+\n \nSHOW GRANTS;\n \n+-----------------------------------------------------------------------------------------------------------------------+\n| Grants for alice@localhost |\n+-----------------------------------------------------------------------------------------------------------------------+\n| GRANT ALL PRIVILEGES ON *.* TO \'alice\'@\'localhost\'\nIDENTIFIED BY PASSWORD\n\'*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19\' |\n+-----------------------------------------------------------------------------------------------------------------------+\n \nGRANT PROXY ON \'dba\'@\'localhost\' TO\n\'bob\'@\'localhost\';\n \nERROR 1698 (28000): Access denied for user\n\'alice\'@\'localhost\'\n \nAnd the following example fails because the granter does\nhave the PROXY privilege for that specific user account, but\nit is not defined WITH GRANT OPTION:\n \nSELECT USER(), CURRENT_USER();\n+-----------------+-----------------+\n| USER() | CURRENT_USER() |\n+-----------------+-----------------+\n| alice@localhost | alice@localhost |\n+-----------------+-----------------+\n \nSHOW GRANTS;\n \n+-----------------------------------------------------------------------------------------------------------------------+\n| Grants for alice@localhost |\n+-----------------------------------------------------------------------------------------------------------------------+\n| GRANT ALL PRIVILEGES ON *.* TO \'alice\'@\'localhost\'\nIDENTIFIED BY PASSWORD\n\'*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19\' |\n| GRANT PROXY ON \'dba\'@\'localhost\' TO\n\'alice\'@\'localhost\' |\n+-----------------------------------------------------------------------------------------------------------------------+\n \nMariaDB [(none)]> GRANT PROXY ON \'dba\'@\'localhost\' TO\n\'bob\'@\'localhost\';\n \nERROR 1698 (28000): Access denied for user\n\'alice\'@\'localhost\'\n \nBut the following example succeeds because the granter does\nhave the PROXY privilege for that specific user account, and\nit is defined WITH GRANT OPTION:\n \nSELECT USER(), CURRENT_USER();\n+-----------------+-----------------+\n| USER() | CURRENT_USER() |\n+-----------------+-----------------+\n| alice@localhost | alice@localhost |\n+-----------------+-----------------+\n \nSHOW GRANTS;\n \n+-----------------------------------------------------------------------------------------------------------------------------------------+\n| Grants for alice@localhost |\n+-----------------------------------------------------------------------------------------------------------------------------------------+\n| GRANT ALL PRIVILEGES ON *.* TO \'alice\'@\'localhost\'\nIDENTIFIED BY PASSWORD\n\'*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19\' WITH GRANT\nOPTION |\n| GRANT PROXY ON \'dba\'@\'localhost\' TO\n\'alice\'@\'localhost\' WITH GRANT OPTION |\n+-----------------------------------------------------------------------------------------------------------------------------------------+\n \nGRANT PROXY ON \'dba\'@\'localhost\' TO\n\'bob\'@\'localhost\';\n \nQuery OK, 0 rows affected (0.004 sec)\n \nA user account can grant the PROXY privilege for any other\nuser account if the granter has the PROXY privilege for the\n\'\'@\'%\' anonymous user account, like this:\n \nGRANT PROXY ON \'\'@\'%\' TO \'dba\'@\'localhost\' WITH\nGRANT OPTION;\n \nFor example, the following example succeeds because the user\ncan grant the PROXY privilege for any other user account:\n \nSELECT USER(), CURRENT_USER();\n+-----------------+-----------------+\n| USER() | CURRENT_USER() |\n+-----------------+-----------------+\n| alice@localhost | alice@localhost |\n+-----------------+-----------------+\n \nSHOW GRANTS;\n \n+-----------------------------------------------------------------------------------------------------------------------------------------+\n| Grants for alice@localhost |\n+-----------------------------------------------------------------------------------------------------------------------------------------+\n| GRANT ALL PRIVILEGES ON *.* TO \'alice\'@\'localhost\'\nIDENTIFIED BY PASSWORD\n\'*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19\' WITH GRANT\nOPTION |\n| GRANT PROXY ON \'\'@\'%\' TO \'alice\'@\'localhost\' WITH\nGRANT OPTION |\n+-----------------------------------------------------------------------------------------------------------------------------------------+\n \nGRANT PROXY ON \'app1_dba\'@\'localhost\' TO\n\'bob\'@\'localhost\';\n \nQuery OK, 0 rows affected (0.004 sec)\n \nGRANT PROXY ON \'app2_dba\'@\'localhost\' TO\n\'carol\'@\'localhost\';\n \nQuery OK, 0 rows affected (0.004 sec)\n \nThe default root user accounts created by mysql_install_db\nhave this privilege. For example:\n \nGRANT ALL PRIVILEGES ON *.* TO \'root\'@\'localhost\' WITH\nGRANT OPTION;\n \nGRANT PROXY ON \'\'@\'%\' TO \'root\'@\'localhost\' WITH\nGRANT OPTION;\n \nThis allows the default root user accounts to grant the\nPROXY privilege for any other user account, and it also\nallows the default root user accounts to grant others the\nprivilege to do the same.\n \nAuthentication Options\n \nThe authentication options for the GRANT statement are the\nsame as those for the CREATE USER statement.\n \nIDENTIFIED BY \'password\'\n \nThe optional IDENTIFIED BY clause can be used to provide an\naccount with a password. The password should be specified in\nplain text. It will be hashed by the PASSWORD function prior\nto being stored to the mysql.user table.\n \nFor example, if our password is mariadb, then we can create\nthe user with:\n \nGRANT USAGE ON *.* TO foo2@test IDENTIFIED BY \'mariadb\';\n \nIf you do not specify a password with the IDENTIFIED BY\nclause, the user\nwill be able to connect without a password. A blank password\nis not a wildcard\nto match any password. The user must connect without\nproviding a password if no\npassword is set.\n \nIf the user account already exists and if you provide the\nIDENTIFIED BY clause, then the user\'s password will be\nchanged. You must have the privileges needed for the SET\nPASSWORD\nstatement to change a user\'s password with GRANT.\n \nThe only authentication plugins that this clause supports\nare mysql_native_password and mysql_old_password.\n \nIDENTIFIED BY PASSWORD \'password_hash\'\n \nThe optional IDENTIFIED BY PASSWORD clause can be used to\nprovide an account with a password that has already been\nhashed. The password should be specified as a hash that was\nprovided by the PASSWORD function. It will be stored to the\nmysql.user table as-is.\n \nFor example, if our password is mariadb, then we can find\nthe hash with:\n \nSELECT PASSWORD(\'mariadb\');\n+-------------------------------------------+\n| PASSWORD(\'mariadb\') |\n+-------------------------------------------+\n| *54958E764CE10E50764C2EECBB71D01F08549980 |\n+-------------------------------------------+\n1 row in set (0.00 sec)\n \nAnd then we can create a user with the hash:\n \nGRANT USAGE ON *.* TO foo2@test IDENTIFIED BY PASSWORD\n\'*54958E764CE10E50764C2EECBB71D01F08549980\';\n \nIf you do not specify a password with the IDENTIFIED BY\nclause, the user\nwill be able to connect without a password. A blank password\nis not a wildcard\nto match any password. The user must connect without\nproviding a password if no\npassword is set.\n \nIf the user account already exists and if you provide the\nIDENTIFIED BY clause, then the user\'s password will be\nchanged. You must have the privileges needed for the SET\nPASSWORD\nstatement to change a user\'s password with GRANT.\n \nThe only authentication plugins that this clause supports\nare mysql_native_password and mysql_old_password.\n \nIDENTIFIED {VIA|WITH} authentication_plugin\n \nThe optional IDENTIFIED VIA authentication_plugin allows you\nto specify that the account should be authenticated by a\nspecific authentication plugin. The plugin name must be an\nactive authentication plugin as per SHOW PLUGINS. If it\ndoesn\'t show up in that output, then you will need to\ninstall it with INSTALL PLUGIN or INSTALL SONAME.\n \nFor example, this could be used with the PAM authentication\nplugin:\n \nGRANT USAGE ON *.* TO foo2@test IDENTIFIED VIA pam;\n \nSome authentication plugins allow additional arguments to be\nspecified after a USING or AS keyword. For example, the PAM\nauthentication plugin accepts a service name:\n \nGRANT USAGE ON *.* TO foo2@test IDENTIFIED VIA pam USING\n\'mariadb\';\n \nThe exact meaning of the additional argument would depend on\nthe specific authentication plugin.\n \nThe USING or AS keyword can also be used to provide a\nplain-text password to a plugin if it\'s provided as an\nargument to the PASSWORD() function. This is only valid for\nauthentication plugins that have implemented a hook for the\nPASSWORD() function. For example, the ed25519 authentication\nplugin supports this:\n \nCREATE USER safe@\'%\' IDENTIFIED VIA ed25519 USING\nPASSWORD(\'secret\');\n \nOne can specify many authentication plugins, they all works\nas alternatives ways of authenticating a user:\n \nCREATE USER safe@\'%\' IDENTIFIED VIA ed25519 USING\nPASSWORD(\'secret\') OR unix_socket;\n \nResource Limit Options\n \nMariaDB 10.2.0 introduced a number of resource limit\noptions.\n \nIt is possible to set per-account limits for certain server\nresources. The following table shows the values that can be\nset per account:\n \nLimit Type | Decription | \n \nMAX_QUERIES_PER_HOUR | Number of statements that the account\ncan issue per hour (including updates) | \n \nMAX_UPDATES_PER_HOUR | Number of updates (not queries) that\nthe account can issue per hour | \n \nMAX_CONNECTIONS_PER_HOUR | Number of connections that the\naccount can start per hour | \n \nMAX_USER_CONNECTIONS | Number of simultaneous connections\nthat can be accepted from the same account; if it is 0,\nmax_connections will be used instead; if max_connections is\n0, there is no limit for this account\'s simultaneous\nconnections. | \n \nMAX_STATEMENT_TIME | Timeout, in seconds, for statements\nexecuted by the user. See also Aborting Statements that\nExceed a Certain Time to Execute. | \n \nIf any of these limits are set to 0, then there is no limit\nfor that resource for that user.\n \nTo set resource limits for an account, if you do not want to\nchange that account\'s privileges, you can issue a GRANT\nstatement with the USAGE privilege, which has no meaning.\nThe statement can name some or all limit types, in any\norder.\n \nHere is an example showing how to set resource limits:\n \nGRANT USAGE ON *.* TO \'someone\'@\'localhost\' WITH\n MAX_USER_CONNECTIONS 0\n MAX_QUERIES_PER_HOUR 200;\n \nThe resources are tracked per account, which means\n\'user\'@\'server\'; not per user name or per connection.\n \nThe count can be reset for all users using FLUSH\nUSER_RESOURCES, FLUSH PRIVILEGES or mysqladmin reload.\n \nPer account resource limits are stored in the user table, in\nthe mysql database. Columns used for resources limits are\nnamed max_questions, max_updates, max_connections (for\nMAX_CONNECTIONS_PER_HOUR), and max_user_connections (for\nMAX_USER_CONNECTIONS).\n \nTLS Options\n \nBy default, MariaDB transmits data between the server and\nclients without encrypting it. This is generally acceptable\nwhen the server and client run on the same host or in\nnetworks where security is guaranteed through other means.\nHowever, in cases where the server and client exist on\nseparate networks or they are in a high-risk network, the\nlack of encryption does introduce security concerns as a\nmalicious actor could potentially eavesdrop on the traffic\nas it is sent over the network between them.\n \nTo mitigate this concern, MariaDB allows you to encrypt data\nin transit between the server and clients using the\nTransport Layer Security (TLS) protocol. TLS was formerly\nknown as Secure Socket Layer (SSL), but strictly speaking\nthe SSL protocol is a predecessor to TLS and, that version\nof the protocol is now considered insecure. The\ndocumentation still uses the term SSL often and for\ncompatibility reasons TLS-related server system and status\nvariables still use the prefix ssl_, but internally, MariaDB\nonly supports its secure successors.\n \nSee Secure Connections Overview for more information about\nhow to determine whether your MariaDB server has TLS\nsupport.\n \nYou can set certain TLS-related restrictions for specific\nuser accounts. For instance, you might use this with user\naccounts that require access to sensitive data while sending\nit across networks that you do not control. These\nrestrictions can be enabled for a user account with the\nCREATE USER, ALTER USER, or GRANT statements. The following\noptions are available:\n \nOption | Description | \n \nREQUIRE NONE | TLS is not required for this account, but can\nstill be used. | \n \nREQUIRE SSL | The account must use TLS, but no valid X509\ncertificate is required. This option cannot be combined with\nother TLS options. | \n \nREQUIRE X509 | The account must use TLS and must have a\nvalid X509 certificate. This option implies REQUIRE SSL.\nThis option cannot be combined with other TLS options. | \n \nREQUIRE ISSUER \'issuer\' | The account must use TLS and\nmust have a valid X509 certificate. Also, the Certificate\nAuthority must be the one specified via the string issuer.\nThis option implies REQUIRE X509. This option can be\ncombined with the SUBJECT, and CIPHER options in any order.\n| \n \nREQUIRE SUBJECT \'subject\' | The account must use TLS and\nmust have a valid X509 certificate. Also, the certificate\'s\nSubject must be the one specified via the string subject.\nThis option implies REQUIRE X509. This option can be\ncombined with the ISSUER, and CIPHER options in any order. |\n\n \nREQUIRE CIPHER \'cipher\' | The account must use TLS, but no\nvalid X509 certificate is required. Also, the encryption\nused for the connection must use one of the methods\nspecified in the string cipher. This option implies REQUIRE\nSSL. This option can be combined with the ISSUER, and\nSUBJECT options in any order. | \n \nThe REQUIRE keyword must be used only once for all specified\noptions, and the AND keyword can be used to separate\nindividual options, but it is not required.\n \nFor example, you can create a user account that requires\nthese TLS options with the following:\n \nGRANT USAGE ON *.* TO \'alice\'@\'%\'\n REQUIRE SUBJECT \'/CN=alice/O=My Dom,\nInc./C=US/ST=Oregon/L=Portland\'\n AND ISSUER \'/C=FI/ST=Somewhere/L=City/ O=Some\nCompany/CN=Peter Parker/emailAddress=p.parker@marvel.com\'\n AND CIPHER \'TLSv1.2\';\n \nIf any of these options are set for a specific user account,\nthen any client who tries to connect with that user account\nwill have to be configured to connect with TLS.\n \nSee Securing Connections for Client and Server for\ninformation on how to enable TLS on the client and server.\n \nRoles\n \nRoles were introduced in MariaDB 10.0.5.\n \nSyntax\n------ \nGRANT role TO grantee [, grantee2 ... ]\n[ WITH ADMIN OPTION ]\n \nThe GRANT statement is also used to grant the use a role to\none or more users or other roles. In order to be able to\ngrant a role, the grantor doing so must have permission to\ndo so (see WITH ADMIN in the CREATE ROLE article).\n \nSpecifying the WITH ADMIN OPTION permits the grantee to in\nturn grant the role to another.\n \nFor example, the following commands show how to grant the\nsame role to a couple different users.\n \nGRANT journalist TO hulda;\n \nGRANT journalist TO berengar WITH ADMIN OPTION;\n \nIf a user has been granted a role, they do not automatically\nobtain all permissions associated with that role. These\npermissions are only in use when the user activates the role\nwith the SET ROLE statement.\n \nGrant Examples\n \nGranting Root-like Privileges\n \nYou can create a user that has privileges similar to the\ndefault root accounts by executing the following:\n \nCREATE USER \'alexander\'@\'localhost\';\n \nGRANT ALL PRIVILEGES ON *.* to \'alexander\'@\'localhost\'\nWITH GRANT OPTION;\n \n\n\nURL: https://mariadb.com/kb/en/library/grant/','','https://mariadb.com/kb/en/library/grant/'),(131,'ST_X',11,'Syntax\n------ \nST_X(p)\nX(p)\n \nDescription\n----------- \nReturns the X-coordinate value for the point p as a\ndouble-precision number.\n \nST_X() and X() are synonyms.\n \nExamples\n-------- \nSET @pt = \'Point(56.7 53.34)\';\n \nSELECT X(GeomFromText(@pt));\n+----------------------+\n| X(GeomFromText(@pt)) |\n+----------------------+\n| 56.7 |\n+----------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_x/','','https://mariadb.com/kb/en/library/st_x/'),(132,'ST_Y',11,'Syntax\n------ \nST_Y(p)\nY(p)\n \nDescription\n----------- \nReturns the Y-coordinate value for the point p as a\ndouble-precision number.\n \nST_Y() and Y() are synonyms.\n \nExamples\n-------- \nSET @pt = \'Point(56.7 53.34)\';\n \nSELECT Y(GeomFromText(@pt));\n+----------------------+\n| Y(GeomFromText(@pt)) |\n+----------------------+\n| 53.34 |\n+----------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_y/','','https://mariadb.com/kb/en/library/st_y/'),(99,'EXECUTE IMMEDIATE',8,'EXECUTE IMMEDIATE was introduced in MariaDB 10.2.3.\n \nSyntax\n------ \nEXECUTE IMMEDIATE statement\n \nDescription\n----------- \nEXECUTE IMMEDIATE executes a dynamic SQL statement created\non the fly, which can reduce performance overhead.\n \nFor example:\n \nEXECUTE IMMEDIATE \'SELECT 1\' \n \nwhich is shorthand for:\n \nprepare stmt from \"select 1\";\n \nexecute stmt;\n \ndeallocate prepare stmt;\n \nEXECUTE IMMEDIATE supports complex expressions as prepare\nsource and parameters:\n \nEXECUTE IMMEDIATE CONCAT(\'SELECT COUNT(*) FROM \', \'t1\',\n\' WHERE a=?\') USING 5+5;\n \nLimitations: subselects and stored function calls are not\nsupported as a prepare source.\n \nThe following examples return an error:\n \nCREATE OR REPLACE FUNCTION f1() RETURNS VARCHAR(64) RETURN\n\'SELECT * FROM t1\';\nEXECUTE IMMEDIATE f1();\nERROR 1970 (42000): EXECUTE IMMEDIATE does not support\nsubqueries or stored functions\n \nEXECUTE IMMEDIATE (SELECT \'SELECT * FROM t1\');\nERROR 1064 (42000): You have an error in your SQL syntax;\ncheck the manual that \n corresponds to your MariaDB server version for the right\nsyntax to use near \n \'SELECT \'SELECT * FROM t1\')\' at line 1\n \nCREATE OR REPLACE FUNCTION f1() RETURNS INT RETURN 10;\nEXECUTE IMMEDIATE \'SELECT * FROM t1 WHERE a=?\' USING f1();\nERROR 1970 (42000): EXECUTE..USING does not support\nsubqueries or stored functions\n \nEXECUTE IMMEDIATE \'SELECT * FROM t1 WHERE a=?\' USING\n(SELECT 10);\nERROR 1064 (42000): You have an error in your SQL syntax;\ncheck the manual that \n corresponds to your MariaDB server version for the right\nsyntax to use near \n \'SELECT 10)\' at line 1\n \nOne can use a user or an SP variable as a workaround:\n \nCREATE OR REPLACE FUNCTION f1() RETURNS VARCHAR(64) RETURN\n\'SELECT * FROM t1\';\nSET @stmt=f1();\nEXECUTE IMMEDIATE @stmt;\n \nSET @stmt=(SELECT \'SELECT 1\');\nEXECUTE IMMEDIATE @stmt;\n \nCREATE OR REPLACE FUNCTION f1() RETURNS INT RETURN 10;\nSET @param=f1();\nEXECUTE IMMEDIATE \'SELECT * FROM t1 WHERE a=?\' USING\n@param;\n \nSET @param=(SELECT 10);\nEXECUTE IMMEDIATE \'SELECT * FROM t1 WHERE a=?\' USING\n@param;\n \nEXECUTE IMMEDIATE supports user variables and SP variables\nas OUT parameters\n \nDELIMITER $$\nCREATE OR REPLACE PROCEDURE p1(OUT a INT)\nBEGIN\n SET a:= 10;\nEND;\n$$\nDELIMITER ;\nSET @a=2;\nEXECUTE IMMEDIATE \'CALL p1(?)\' USING @a;\nSELECT @a;\n+------+\n| @a |\n+------+\n| 10 |\n+------+\n \nSimilar to PREPARE, EXECUTE IMMEDIATE is allowed in stored\nprocedures but is not allowed in stored functions.\n \nThis example uses EXECUTE IMMEDIATE inside a stored\nprocedure:\n \nDELIMITER $$\nCREATE OR REPLACE PROCEDURE p1()\nBEGIN\n EXECUTE IMMEDIATE \'SELECT 1\';\nEND;\n$$\nDELIMITER ;\nCALL p1;\n+---+\n| 1 |\n+---+\n| 1 |\n+---+\n \nThis script returns an error:\n \nDELIMITER $$\nCREATE FUNCTION f1() RETURNS INT\nBEGIN\n EXECUTE IMMEDIATE \'DO 1\';\n RETURN 1;\nEND;\n$$\nERROR 1336 (0A000): Dynamic SQL is not allowed in stored\nfunction or trigger\n \nEXECUTE IMMEDIATE can use DEFAULT and IGNORE indicators as\nbind parameters:\n \nCREATE OR REPLACE TABLE t1 (a INT DEFAULT 10);\nEXECUTE IMMEDIATE \'INSERT INTO t1 VALUES (?)\' USING\nDEFAULT;\nSELECT * FROM t1;\n+------+\n| a |\n+------+\n| 10 |\n+------+\n \nEXECUTE IMMEDIATE increments the Com_execute_immediate\nstatus variable, as well as the Com_stmt_prepare,\nCom_stmt_execute and Com_stmt_close status variables.\n \nNote, EXECUTE IMMEDIATE does not increment the\nCom_execute_sql status variable. Com_execute_sql is used\nonly for PREPARE..EXECUTE.\n \nThis session screenshot demonstrates how EXECUTE IMMEDIATE\naffects status variables:\n \nSELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE\nVARIABLE_NAME RLIKE \n (\'COM_(EXECUTE|STMT_PREPARE|STMT_EXECUTE|STMT_CLOSE)\');\n \n+-----------------------+----------------+\n| VARIABLE_NAME | VARIABLE_VALUE |\n+-----------------------+----------------+\n| COM_EXECUTE_IMMEDIATE | 0 |\n| COM_EXECUTE_SQL | 0 |\n| COM_STMT_CLOSE | 0 |\n| COM_STMT_EXECUTE | 0 |\n| COM_STMT_PREPARE | 0 |\n+-----------------------+----------------+\n \nEXECUTE IMMEDIATE \'SELECT 1\';\n+---+\n| 1 |\n+---+\n| 1 |\n+---+\n \nSELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE\nVARIABLE_NAME RLIKE \n (\'COM_(EXECUTE|STMT_PREPARE|STMT_EXECUTE|STMT_CLOSE)\');\n+-----------------------+----------------+\n| VARIABLE_NAME | VARIABLE_VALUE |\n+-----------------------+----------------+\n| COM_EXECUTE_IMMEDIATE | 1 |\n| COM_EXECUTE_SQL | 0 |\n| COM_STMT_CLOSE | 1 |\n| COM_STMT_EXECUTE | 1 |\n| COM_STMT_PREPARE | 1 |\n+-----------------------+----------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/execute-immediate/','','https://mariadb.com/kb/en/library/execute-immediate/'),(103,'Metadata Locking',8,'Metadata locking has been supported since MariaDB 5.5. This\nmeans that when a transaction (including XA transactions)\nuses a table, it locks its metadata until the end of\ntransaction. Non-transactional tables are also locked, as\nwell as views and objects which are related to locked\ntables/views (stored functions, triggers, etc). When a\nconnection tries to use a DDL statement (like an ALTER\nTABLE) which modifies a table that is locked, that\nconnection is queued, and has to wait until it\'s unlocked.\nUsing savepoints and performing a partial rollback does not\nrelease metadata locks.\n \nLOCK TABLES ... WRITE are also queued. Some wrong statements\nwhich produce an error may not need to wait for the lock to\nbe freed.\n \nMetadata lock\'s timeout is determined by the value of the\nlock_wait_timeout server system variable (in seconds).\nHowever, note that its default value is 31536000 (1 year).\nIf this timeout exceeds, the following error is returned:\n \nERROR 1205 (HY000): Lock wait timeout exceeded;\n try restarting transaction\n \nIf the metadata_lock_info plugin is installed, the\nInformation Schema metadata_lock_info table stores\ninformation about existing metadata locks.\n \nExample\n \nLet\'s use the following MEMORY (non-transactional) table:\n \nCREATE TABLE t (a INT) ENGINE = MEMORY;\n \nConnection 1 starts a transaction, and INSERTs a row into t:\n \nSTART TRANSACTION;\n \nINSERT INTO t SET a=1;\n \nt\'s metadata is now locked by connection 1. Connection 2\ntries to alter t, but has to wait:\n \nALTER TABLE t ADD COLUMN b INT;\n \nConnection 2\'s prompt is blocked now.\n \nNow connection 1 ends the transaction:\n \nCOMMIT;\n \n...and connection 2 finally gets the output of its command:\n \nQuery OK, 1 row affected (35.23 sec)\nRecords: 1 Duplicates: 0 Warnings: 0\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/metadata-locking/','','https://mariadb.com/kb/en/library/metadata-locking/'),(133,'X',11,'A synonym for ST_X.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/point-properties-x/','','https://mariadb.com/kb/en/library/point-properties-x/'),(134,'Y',11,'A synonym for ST_Y.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/point-properties-y/','','https://mariadb.com/kb/en/library/point-properties-y/'),(135,'AES_DECRYPT',12,'Syntax\n------ \nAES_DECRYPT(crypt_str,key_str)\n \nDescription\n----------- \nThis function allows decryption of data using the official\nAES\n(Advanced Encryption Standard) algorithm. For more\ninformation, see\nthe description of AES_ENCRYPT().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/aes_decrypt/','','https://mariadb.com/kb/en/library/aes_decrypt/'),(138,'DECODE',12,'Syntax\n------ \nDECODE(crypt_str,pass_str)\n \nDescription\n----------- \nDecrypts the encrypted string crypt_str using pass_str as\nthe\npassword. crypt_str should be a string returned from\nENCODE(). The resulting string will be the original string\nonly if pass_str is the same.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/decode/','','https://mariadb.com/kb/en/library/decode/'),(100,'LOCK TABLES',8,'Syntax\n------ \nLOCK TABLE[S]\n tbl_name [[AS] alias] lock_type\n [, tbl_name [[AS] alias] lock_type] ...\n [WAIT n|NOWAIT]\n \nlock_type:\n READ [LOCAL]\n | [LOW_PRIORITY] WRITE\n | WRITE CONCURRENT\n \nUNLOCK TABLES\n \nDescription\n----------- \nThe lock_type can be one of:\n \nOption | Description | \n \nREAD | Read lock, no writes allowed | \n \nREAD LOCAL | Read lock, but allow concurrent inserts | \n \nWRITE | Exclusive write lock. No other connections can read\nor write to this table | \n \nLOW_PRIORITY WRITE | Exclusive write lock, but allow new\nread locks on the table until we get the write lock. | \n \nWRITE CONCURRENT | Exclusive write lock, but allow READ\nLOCAL locks to the table. | \n \nMariaDB enables client sessions to acquire table locks\nexplicitly for the\npurpose of cooperating with other sessions for access to\ntables, or to\nprevent other sessions from modifying tables during periods\nwhen a\nsession requires exclusive access to them. A session can\nacquire or\nrelease locks only for itself. One session cannot acquire\nlocks for\nanother session or release locks held by another session.\n \nLocks may be used to emulate transactions or to get more\nspeed when\nupdating tables.\n \nLOCK TABLES explicitly acquires table locks for the current\nclient session.\nTable locks can be acquired for base tables or views. To use\nLOCK TABLES,\nyou must have the LOCK TABLES privilege, and the SELECT\nprivilege for\neach object to be locked. See GRANT\n \nFor view locking, LOCK TABLES adds all base tables used in\nthe view to the\nset of tables to be locked and locks them automatically. If\nyou lock a table\nexplicitly with LOCK TABLES, any tables used in triggers are\nalso locked\nimplicitly, as described in Triggers and Implicit Locks.\n \nUNLOCK TABLES explicitly releases any table locks held by\nthe\ncurrent session.\n \nWAIT/NOWAIT\n \nSet the lock wait timeout. See WAIT and NOWAIT.\n \nLimitations\n \nLOCK TABLES doesn\'t work when using Galera cluster. You may\nexperience crashes or locks when used with Galera.\n \nLOCK TABLES works on XtraDB/InnoDB tables only if the\ninnodb_table_locks system variable is set to 1 (the default)\nand autocommit is set to 0 (1 is default). Please note that\nno error message will be returned on LOCK TABLES with\ninnodb_table_locks = 0.\n \nLOCK TABLES implicitly commits the active transaction, if\nany. Also, starting a transaction always releases all table\nlocks acquired with LOCK TABLES. This means that there is no\nway to have table locks and an active transaction at the\nsame time. The only exceptions are the transactions in\nautocommit mode. To preserve the data integrity between\ntransactional and non-transactional tables, the GET_LOCK()\nfunction can be used.\n \nWhile a connection holds an explicit read lock on a table,\nit cannot modify it. If you try, the following error will be\nproduced:\n \nERROR 1099 (HY000): Table \'tab_name\' was locked with a\nREAD lock and can\'t be updated\n \nWhile a connection holds an explicit lock on a table, it\ncannot access a non-locked table. If you try, the following\nerror will be produced:\n \nERROR 1100 (HY000): Table \'tab_name\' was not locked with\nLOCK TABLES\n \nWhile a connection holds an explicit lock on a table, it\ncannot issue the following: INSERT DELAYED, CREATE TABLE,\nCREATE TABLE ... LIKE, and DDL statements involving stored\nprograms and views (except for triggers). If you try, the\nfollowing error will be produced:\n \nERROR 1192 (HY000): Can\'t execute the given command because\nyou have active locked tables or an active transaction\n \nLOCK TABLES can not be used in stored routines - if you try,\nthe following error will be produced on creation:\n \nERROR 1314 (0A000): LOCK is not allowed in stored procedures\n \n\n\nURL: https://mariadb.com/kb/en/library/lock-tables/','','https://mariadb.com/kb/en/library/lock-tables/'),(105,'PURGE BINARY LOGS',8,'Syntax\n------ \nPURGE { BINARY | MASTER } LOGS\n { TO \'log_name\' | BEFORE datetime_expr }\n \nDescription\n----------- \nThe PURGE BINARY LOGS statement deletes all the binary log\nfiles listed in the log index file prior to the specified\nlog file name or\ndate. BINARY and MASTER are synonyms.\nDeleted log files also are removed from the list recorded in\nthe index file, so\nthat the given log file becomes the first in the list.\n \nThe datetime expression is in the format \'YYYY-MM-DD\nhh:mm:ss\'. \n \nIf a slave is active but has yet to read from a binary log\nfile you attempt to delete, the statement will fail with an\nerror. However, if the slave is not connected and has yet to\nread from a log file you delete, the file will be deleted,\nbut the slave will be unable to continue replicating once it\nconnects again.\n \nThis statement has no effect if the server was not started\nwith the\n--log-bin option to enable binary logging.\n \nTo list the binary log files on the server, use SHOW BINARY\nLOGS. To see which files they are reading, use SHOW SLAVE\nSTATUS. You can only delete the files that are older than\nthe oldest file that is used by the slaves.\n \nTo delete all binary log files, use RESET MASTER.\nTo move to a new log file (for example if you want to remove\nthe current log file), use FLUSH LOGS before you execute\nPURGE LOGS.\n \nIf the expire_logs_days server system variable is not set to\n0, the server automatically deletes binary log files after\nthe given number of days.\n \nExamples\n-------- \nPURGE BINARY LOGS TO \'mariadb-bin.000063\';\n \nPURGE BINARY LOGS BEFORE \'2013-04-21\';\n \nPURGE BINARY LOGS BEFORE \'2013-04-22 09:55:22\';\n \n\n\nURL: https://mariadb.com/kb/en/library/purge-binary-logs/','','https://mariadb.com/kb/en/library/purge-binary-logs/'),(143,'MD5',12,'Syntax\n------ \nMD5(str)\n \nDescription\n----------- \nCalculates an MD5 128-bit checksum for the string. \n \nThe return value is a 32-hex digit string, and as of MariaDB\n5.5, is a nonbinary string in the connection character set\nand collation, determined by the values of the\ncharacter_set_connection and collation_connection system\nvariables. Before 5.5, the return value was a binary string.\n \nNULL is returned if the argument was NULL. \n \nExamples\n-------- \nSELECT MD5(\'testing\');\n+----------------------------------+\n| MD5(\'testing\') |\n+----------------------------------+\n| ae2b1fca515949e5d54fb22b8ed95575 |\n+----------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/md5/','','https://mariadb.com/kb/en/library/md5/'),(145,'PASSWORD',12,'Syntax\n------ \nPASSWORD(str)\n \nDescription\n----------- \nThe PASSWORD() function is used for hashing passwords for\nuse in authentication by the MariaDB server. It is not\nintended for use in other applications.\n \nCalculates and returns a hashed password string from the\nplaintext password str. Returns an empty string (>= MariaDB\n10.0.4) or NULL (\n\nURL: https://mariadb.com/kb/en/library/password/','','https://mariadb.com/kb/en/library/password/'),(150,'ENDPOINT',13,'A synonym for ST_ENDPOINT.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/linestring-properties-endpoint/','','https://mariadb.com/kb/en/library/linestring-properties-endpoint/'),(151,'GLENGTH',13,'Syntax\n------ \nGLength(ls)\n \nDescription\n----------- \nReturns as a double-precision number the length of the\nLineString value ls in its associated spatial reference.\n \nExamples\n-------- \nSET @ls = \'LineString(1 1,2 2,3 3)\';\n \nSELECT GLength(GeomFromText(@ls));\n+----------------------------+\n| GLength(GeomFromText(@ls)) |\n+----------------------------+\n| 2.82842712474619 |\n+----------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/glength/','','https://mariadb.com/kb/en/library/glength/'),(101,'ROLLBACK',8,'The ROLLBACK statement rolls back (ends) a transaction,\ndestroying any changes to SQL-data so that they never become\nvisible to subsequent transactions. The required syntax for\nthe ROLLBACK statement is as follows. \n \nROLLBACK [ WORK ] [ AND [ NO ] CHAIN ] \n[ TO [ SAVEPOINT ] { | } ]\n \nThe ROLLBACK statement will either end a transaction,\ndestroying all data changes that happened during any of the\ntransaction, or it will just destroy any data changes that\nhappened since you established a savepoint. The basic form\nof the ROLLBACK statement is just the keyword ROLLBACK (the\nkeyword WORK is simply noise and can be omitted without\nchanging the effect). \n \nThe optional AND CHAIN clause is a convenience for\ninitiating a new transaction as soon as the old transaction\nterminates. If AND CHAIN is specified, then there is\neffectively nothing between the old and new transactions,\nalthough they remain separate. The characteristics of the\nnew transaction will be the same as the characteristics of\nthe old one — that is, the new transaction will have the\nsame access mode, isolation level and diagnostics area size\n(we\'ll discuss all of these shortly) as the transaction\njust terminated. The AND NO CHAIN option just tells your\nDBMS to end the transaction — that is, these four SQL\nstatements are equivalent: \n \nROLLBACK;\n \nROLLBACK WORK;\n \nROLLBACK AND NO CHAIN;\n \nROLLBACK WORK AND NO CHAIN;\n \nAll of them end a transaction without saving any transaction\ncharacteristics. The only other options, the equivalent\nstatements: \n \nROLLBACK AND CHAIN;\n \nROLLBACK WORK AND CHAIN;\n \nboth tell your DBMS to end a transaction, but to save that\ntransaction\'s characteristics for the next transaction. \n \nROLLBACK is much simpler than COMMIT: it may involve no more\nthan a few deletions (of Cursors, locks, prepared SQL\nstatements and log-file entries). It\'s usually assumed that\nROLLBACK can\'t fail, although such a thing is conceivable\n(for example, an encompassing transaction might reject an\nattempt to ROLLBACK because it\'s lining up for a COMMIT). \n \nROLLBACK cancels all effects of a transaction. It does not\ncancel effects on objects outside the DBMS\'s control (for\nexample the values in host program variables or the settings\nmade by some SQL/CLI function calls). But in general, it is\na convenient statement for those situations when you say\n\"oops, this isn\'t working\" or when you simply don\'t care\nwhether your temporary work becomes permanent or not.\n \nHere is a moot question. If all you\'ve been doing is\nSELECTs, so that there have been no data changes, should you\nend the transaction with ROLLBACK or COMMIT? It shouldn\'t\nreally matter because both ROLLBACK and COMMIT do the same\ntransaction-terminating job. However, the popular conception\nis that ROLLBACK implies failure, so after a successful\nseries of SELECT statements the convention is to end the\ntransaction with COMMIT rather than ROLLBACK.\n \nMariaDB (and most other DBMSs) supports rollback of SQL-data\nchange statements, but not of SQL-Schema statements. This\nmeans that if you use any of CREATE, ALTER, DROP, GRANT,\nREVOKE, you are implicitly committing at execution time.\n \nINSERT INTO Table_2 VALUES(5); \nDROP TABLE Table_3 CASCADE;\n \nROLLBACK;\n \nThe result will be that both the INSERT and the DROP will go\nthrough as separate transactions so the ROLLBACK will have\nno effect. \n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/rollback/','','https://mariadb.com/kb/en/library/rollback/'),(107,'RESET SLAVE',8,'RESET SLAVE [\"connection_name\"] [ALL] \n \nRESET SLAVE makes the slave forget its replication position\nin the\nmaster\'s binary log. This statement is meant to be used for\na clean\nstart. It deletes the master.info and relay-log.info files,\nall the\nrelay log files, and starts a new relay log file. To use\nRESET SLAVE,\nthe slave replication threads must be stopped (use STOP\nSLAVE if\nnecessary).\n \nNote: All relay log files are deleted, even if they have not\nbeen\ncompletely executed by the slave SQL thread. (This is a\ncondition\nlikely to exist on a replication slave if you have issued a\nSTOP SLAVE\nstatement or if the slave is highly loaded.)\n \nConnection information stored in the master.info file is\nimmediately\nreset using any values specified in the corresponding\nstartup options.\nThis information includes values such as master host, master\nport,\nmaster user, and master password. If the slave SQL thread\nwas in the\nmiddle of replicating temporary tables when it was stopped,\nand RESET\nSLAVE is issued, these replicated temporary tables are\ndeleted on the\nslave.\n \nThe ALL also resets the PORT, HOST, USER and PASSWORD\nparameters for the slave. If you are using a connection\nname, it will permanently delete it and it will not show up\nanymore in SHOW ALL SLAVES STATUS.\n \nconnection_name\n \nThe connection_name option was added as part of multi-source\nreplication added in MariaDB 10.0\n \nIf there is only one nameless master, or the default master\n(as specified by the default_master_connection system\nvariable) is intended, connection_name can be omitted. If\nprovided, the RESET SLAVE statement will apply to the\nspecified master. connection_name is case-insensitive.\n \n\n\nURL:\nhttps://mariadb.com/kb/en/library/reset-slave-connection_name/','','https://mariadb.com/kb/en/library/reset-slave-connection_name/'),(152,'NumPoints',13,'A synonym for ST_NumPoints.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/linestring-properties-numpoints/','','https://mariadb.com/kb/en/library/linestring-properties-numpoints/'),(153,'PointN',13,'A synonym for ST_PointN.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/linestring-properties-pointn/','','https://mariadb.com/kb/en/library/linestring-properties-pointn/'),(154,'STARTPOINT',13,'A synonym for ST_STARTPOINT.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/linestring-properties-startpoint/','','https://mariadb.com/kb/en/library/linestring-properties-startpoint/'),(155,'ST_ENDPOINT',13,'Syntax\n------ \nST_EndPoint(ls)\nEndPoint(ls)\n \nDescription\n----------- \nReturns the Point that is the endpoint of the\nLineString value ls.\n \nST_EndPoint() and EndPoint() are synonyms.\n \nExamples\n-------- \nSET @ls = \'LineString(1 1,2 2,3 3)\';\n \nSELECT AsText(EndPoint(GeomFromText(@ls)));\n+-------------------------------------+\n| AsText(EndPoint(GeomFromText(@ls))) |\n+-------------------------------------+\n| POINT(3 3) |\n+-------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_endpoint/','','https://mariadb.com/kb/en/library/st_endpoint/'),(156,'ST_NUMPOINTS',13,'Syntax\n------ \nST_NumPoints(ls)\nNumPoints(ls)\n \nDescription\n----------- \nReturns the number of Point objects in the LineString\nvalue ls.\n \nST_NumPoints() and NumPoints() are synonyms.\n \nExamples\n-------- \nSET @ls = \'LineString(1 1,2 2,3 3)\';\n \nSELECT NumPoints(GeomFromText(@ls));\n+------------------------------+\n| NumPoints(GeomFromText(@ls)) |\n+------------------------------+\n| 3 |\n+------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_numpoints/','','https://mariadb.com/kb/en/library/st_numpoints/'),(157,'ST_POINTN',13,'Syntax\n------ \nST_PointN(ls,N)\nPointN(ls,N)\n \nDescription\n----------- \nReturns the N-th Point in the LineString value ls.\nPoints are numbered beginning with 1.\n \nST_PointN() and PointN() are synonyms.\n \nExamples\n-------- \nSET @ls = \'LineString(1 1,2 2,3 3)\';\n \nSELECT AsText(PointN(GeomFromText(@ls),2));\n+-------------------------------------+\n| AsText(PointN(GeomFromText(@ls),2)) |\n+-------------------------------------+\n| POINT(2 2) |\n+-------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_pointn/','','https://mariadb.com/kb/en/library/st_pointn/'),(104,'PREPARE Statement',8,'Syntax\n------ \nPREPARE stmt_name FROM preparable_stmt\n \nDescription\n----------- \nThe PREPARE statement prepares a statement and assigns it a\nname,\nstmt_name, by which to refer to the statement later.\nStatement names\nare not case sensitive. preparable_stmt is either a string\nliteral or a user variable (not a local variable, an SQL\nexpression or a subquery) that contains the text of the\nstatement. The text must \nrepresent a single SQL statement, not multiple statements.\nWithin the\nstatement, \"?\" characters can be used as parameter markers\nto indicate\nwhere data values are to be bound to the query later when\nyou execute\nit. The \"?\" characters should not be enclosed within\nquotes, even if\nyou intend to bind them to string values. Parameter markers\ncan be used\nonly where data values should appear, not for SQL keywords,\nidentifiers, and so forth.\n \nThe scope of a prepared statement is the session within\nwhich it is\ncreated. Other sessions cannot see it.\n \nIf a prepared statement with the given name already exists,\nit is\ndeallocated implicitly before the new statement is prepared.\nThis means\nthat if the new statement contains an error and cannot be\nprepared, an\nerror is returned and no statement with the given name\nexists.\n \nPrepared statements can be PREPAREd and EXECUTEd in a stored\nprocedure, but not in a stored function or trigger. Also,\neven if the statement is PREPAREd in a procedure, it will\nnot be deallocated when the procedure execution ends.\n \nA prepared statement can access user-defined variables, but\nnot local variables or procedure\'s parameters.\n \nIf the prepared statement contains a syntax error, PREPARE\nwill fail. As a side effect, stored procedures can use it to\ncheck if a statement is valid. For example:\n \nCREATE PROCEDURE `test_stmt`(IN sql_text TEXT)\nBEGIN\n DECLARE EXIT HANDLER FOR SQLEXCEPTION\n BEGIN\n SELECT CONCAT(sql_text, \' is not valid\');\n END;\n SET @SQL := sql_text;\n PREPARE stmt FROM @SQL;\n DEALLOCATE PREPARE stmt;\nEND;\n \nThe FOUND_ROWS() and ROW_COUNT() functions, if called\nimmediatly after EXECUTE, return the number of rows read or\naffected by the prepared statements; however, if they are\ncalled after DEALLOCATE PREPARE, they provide information\nabout this statement. If the prepared statement produces\nerrors or warnings, GET DIAGNOSTICS return information about\nthem. DEALLOCATE PREPARE shouldn\'t clear the diagnostics\narea, unless it produces an error.\n \nA prepared statement is executed with EXECUTE and released \nwith DEALLOCATE PREPARE.\n \nThe max_prepared_stmt_count server system variable\ndetermines the number of allowed prepared statements that\ncan be prepared on the server. If it is set to 0, prepared\nstatements are not allowed. If the limit is reached, an\nerror similar to the following will be produced:\n \nERROR 1461 (42000): Can\'t create more than\nmax_prepared_stmt_count statements \n (current value: 0)\n \nOracle Mode\n \nIn Oracle mode from MariaDB 10.3, PREPARE stmt FROM \'SELECT\n:1, :2\' is used, instead of ?.\n \nPermitted Statements\n \nNot all statements can be prepared. Only the following SQL\ncommands are permitted:\nALTER TABLE\nANALYZE TABLE\nBINLOG\nCACHE INDEX\nCALL\nCHANGE MASTER\nCHECKSUM {TABLE | TABLES}\nCOMMIT\n{CREATE | DROP} DATABASE\n{CREATE | DROP} INDEX\n{CREATE | RENAME | DROP} TABLE\n{CREATE | RENAME | DROP} USER\n{CREATE | DROP} VIEW\nDELETE\nDESCRIBE\nDO\nEXPLAIN\nFLUSH {TABLE | TABLES | TABLES WITH READ LOCK | HOSTS |\nPRIVILEGES | LOGS | STATUS | \n MASTER | SLAVE | DES_KEY_FILE | USER_RESOURCES | QUERY\nCACHE | TABLE_STATISTICS | \n INDEX_STATISTICS | USER_STATISTICS | CLIENT_STATISTICS}\nGRANT\nINSERT\nINSTALL {PLUGIN | SONAME}\nHANDLER READ\nKILL\nLOAD INDEX INTO CACHE\nOPTIMIZE TABLE\nREPAIR TABLE\nREPLACE\nRESET {MASTER | SLAVE | QUERY CACHE}\nREVOKE\nROLLBACK\nSELECT\nSET\nSET GLOBAL SQL_SLAVE_SKIP_COUNTER\nSET ROLE\nSET SQL_LOG_BIN\nSET TRANSACTION ISOLATION LEVEL\nSHOW EXPLAIN\nSHOW {DATABASES | TABLES | OPEN TABLES | TABLE STATUS |\nCOLUMNS | INDEX | TRIGGERS | \n EVENTS | GRANTS | CHARACTER SET | COLLATION | ENGINES |\nPLUGINS [SONAME] | PRIVILEGES | \n PROCESSLIST | PROFILE | PROFILES | VARIABLES | STATUS |\nWARNINGS | ERRORS | \n TABLE_STATISTICS | INDEX_STATISTICS | USER_STATISTICS |\nCLIENT_STATISTICS | AUTHORS | \n CONTRIBUTORS}\nSHOW CREATE {DATABASE | TABLE | VIEW | PROCEDURE | FUNCTION\n| TRIGGER | EVENT}\nSHOW {FUNCTION | PROCEDURE} CODE\nSHOW BINLOG EVENTS\nSHOW SLAVE HOSTS\nSHOW {MASTER | BINARY} LOGS\nSHOW {MASTER | SLAVE | TABLES | INNODB | FUNCTION |\nPROCEDURE} STATUS\nSLAVE {START | STOP}\nTRUNCATE TABLE\nSHUTDOWN\nUNINSTALL {PLUGIN | SONAME}\nUPDATE\n \nSynonyms are not listed here, but can be used. For example,\nDESC can be used instead of DESCRIBE.\n \nCompound statements can be prepared too.\n \nNote that if a statement can be run in a stored routine, it\nwill work even if it is called by a prepared statement. For\nexample, SIGNAL can\'t be directly prepared. However, it is\nallowed in stored routines. If the x() procedure contains\nSIGNAL, you can still prepare and execute the \'CALL x();\'\nprepared statement.\n \nPREPARE now supports most kinds of expressions as well, for\nexample:\n \nPREPARE stmt FROM CONCAT(\'SELECT * FROM \', table_name);\n \nWhen PREPARE is used with a statement which is not\nsupported, the following error is produced:\n \nERROR 1295 (HY000): This command is not supported in the\nprepared statement protocol yet\n \nExample\n \ncreate table t1 (a int,b char(10));\ninsert into t1 values (1,\"one\"),(2,\n\"two\"),(3,\"three\");\nprepare test from \"select * from t1 where a=?\";\nset @param=2;\nexecute test using @param;\n+------+------+\n| a | b |\n+------+------+\n| 2 | two |\n+------+------+\nset @param=3;\nexecute test using @param;\n+------+-------+\n| a | b |\n+------+-------+\n| 3 | three |\n+------+-------+\ndeallocate prepare test;\n \nSince identifiers are not permitted as prepared statements\nparameters, sometimes it is necessary to dynamically compose\nan SQL statement. This technique is called dynamic SQL). The\nfollowing example shows how to use dynamic SQL:\n \nCREATE PROCEDURE test.stmt_test(IN tab_name VARCHAR(64))\nBEGIN\n SET @sql = CONCAT(\'SELECT COUNT(*) FROM \', tab_name);\n PREPARE stmt FROM @sql;\n EXECUTE stmt;\n DEALLOCATE PREPARE stmt;\nEND;\n \nCALL test.stmt_test(\'mysql.user\');\n+----------+\n| COUNT(*) |\n+----------+\n| 4 |\n+----------+\n \nUse of variables in prepared statements:\n \nPREPARE stmt FROM \'SELECT @x;\';\n \nSET @x = 1;\n \nEXECUTE stmt;\n+------+\n| @x |\n+------+\n| 1 |\n+------+\n \nSET @x = 0;\n \nEXECUTE stmt;\n+------+\n| @x |\n+------+\n| 0 |\n+------+\n \nDEALLOCATE PREPARE stmt;\n \n\n\nURL: https://mariadb.com/kb/en/library/prepare-statement/','','https://mariadb.com/kb/en/library/prepare-statement/'),(161,'INET_ATON',14,'Syntax\n------ \nINET_ATON(expr)\n \nDescription\n----------- \nGiven the dotted-quad representation of an IPv4 network\naddress as a string,\nreturns an integer that represents the numeric value of the\naddress.\nAddresses may be 4- or 8-byte addresses.\n \nReturns NULL if the argument is not understood.\n \nExamples\n-------- \nSELECT INET_ATON(\'192.168.1.1\');\n+--------------------------+\n| INET_ATON(\'192.168.1.1\') |\n+--------------------------+\n| 3232235777 |\n+--------------------------+\n \nThis is calculated as follows: 192 x 2563 + 168 x 256 2 + 1\nx 256 + 1\n \n\n\nURL: https://mariadb.com/kb/en/library/inet_aton/','','https://mariadb.com/kb/en/library/inet_aton/'),(162,'INET_NTOA',14,'Syntax\n------ \nINET_NTOA(expr)\n \nDescription\n----------- \nGiven a numeric IPv4 network address in network byte order\n(4 or 8 byte),\nreturns the dotted-quad representation of the address as a\nstring.\n \nExamples\n-------- \nSELECT INET_NTOA(3232235777);\n+-----------------------+\n| INET_NTOA(3232235777) |\n+-----------------------+\n| 192.168.1.1 |\n+-----------------------+\n \n192.168.1.1 corresponds to 3232235777 since 192 x 2563 + 168\nx 256 2 + 1 x 256 + 1 = 3232235777\n \n\n\nURL: https://mariadb.com/kb/en/library/inet_ntoa/','','https://mariadb.com/kb/en/library/inet_ntoa/'),(108,'SET TRANSACTION',8,'Syntax\n------ \nSET [GLOBAL | SESSION] TRANSACTION\n transaction_property [, transaction_property] ...\n \ntransaction_property:\n ISOLATION LEVEL level\n | READ WRITE\n | READ ONLY\n \nlevel:\n REPEATABLE READ\n | READ COMMITTED\n | READ UNCOMMITTED\n | SERIALIZABLE\n \nDescription\n----------- \nThis statement sets the transaction isolation level or the\ntransaction access mode globally, for the current session,\nor for the next transaction:\nWith the GLOBAL keyword, the statement sets the default\n transaction level globally for all subsequent sessions.\nExisting sessions are\n unaffected.\nWith the SESSION keyword, the statement sets the default\n transaction level for all subsequent transactions performed\nwithin the\n current session.\nWithout any SESSION or GLOBAL keyword,\n the statement sets the isolation level for the next (not\nstarted) transaction\n performed within the current session.\n \nA change to the global default isolation level requires the \nSUPER privilege. Any session is free to change its\nsession isolation level (even in the middle of a\ntransaction), or the isolation\nlevel for its next transaction.\n \nIsolation Level\n \nTo set the global default isolation level at server startup,\nuse the\n--transaction-isolation=level option on the command line or\nin an option file. Values of level for this option use\ndashes\nrather than spaces, so the allowable values are\nREAD-UNCOMMITTED,\nREAD-COMMITTED, REPEATABLE-READ, or\nSERIALIZABLE. For example, to set the default isolation\nlevel to REPEATABLE READ, use these lines in the [mysqld]\nsection of an option file:\n \n[mysqld]\ntransaction-isolation = REPEATABLE-READ\nTo determine the global and session transaction isolation\nlevels at\nruntime, check the value of the tx_isolation system\nvariable:\n \nSELECT @@GLOBAL.tx_isolation, @@tx_isolation;\n \nInnoDB supports each of the translation isolation levels\ndescribed here\nusing different locking strategies. The default level is \nREPEATABLE READ. For additional information about InnoDB\nrecord-level locks and how it uses them to execute various\ntypes of statements,\nsee XtraDB/InnoDB Lock Modes,\nand\nhttp://dev.mysql.com/doc/refman/en/innodb-locks-set.html.\n \nIsolation Levels\n \nThe following sections describe how MariaDB supports the\ndifferent transaction levels.\n \nREAD UNCOMMITTED\n \nSELECT statements are performed in a non-locking fashion,\nbut a possible earlier version of a row might be used. Thus,\nusing this\nisolation level, such reads are not consistent. This is also\ncalled a \"dirty\nread.\" Otherwise, this isolation level works like \nREAD COMMITTED.\n \nREAD COMMITTED\n \nA somewhat Oracle-like isolation level with respect to\nconsistent\n(non-locking) reads: Each consistent read, even within the\nsame\ntransaction, sets and reads its own fresh snapshot. See\nhttp://dev.mysql.com/doc/refman/en/innodb-consistent-read.html.\n \nFor locking reads (SELECT with FOR UPDATE\nor LOCK IN SHARE MODE), InnoDB locks only index records, not\nthe gaps before them, and thus allows the free insertion of\nnew records next to\nlocked records. For UPDATE and DELETE\nstatements, locking depends on whether the statement uses a\nunique index with a\nunique search condition (such as WHERE id = 100), or a\nrange-type search condition (such as WHERE id > 100). For a\nunique index with a unique search condition, InnoDB locks\nonly the index record\nfound, not the gap before it. For range-type searches,\nInnoDB locks the index\nrange scanned, using gap locks or next-key (gap plus\nindex-record) locks to\nblock insertions by other sessions into the gaps covered by\nthe range. This is\nnecessary because \"phantom rows\" must be blocked for MySQL\nreplication and\nrecovery to work.\n \nNote: Since MariaDB 5.1, if the READ COMMITTED isolation\nlevel is used or the innodb_locks_unsafe_for_binlog system\nvariable is enabled,\nthere is no InnoDB gap locking except for foreign-key\nconstraint checking and\nduplicate-key checking. Also, record locks for non-matching\nrows are released\nafter MariaDB has evaluated the WHERE condition. As of\nMariaDB/MySQL\n5.1, if you use READ COMMITTED or enable\ninnodb_locks_unsafe_for_binlog, you must use row-based\nbinary logging.\n \nREPEATABLE READ\n \nThis is the default isolation level for InnoDB. For\nconsistent reads,\nthere is an important difference from the READ COMMITTED\nisolation level: All consistent reads within the same\ntransaction read the\nsnapshot established by the first read. This convention\nmeans that if you issue\nseveral plain (non-locking) SELECT statements within the\nsame transaction, these SELECT statements are consistent\nalso with respect to each other. See\nhttp://dev.mysql.com/doc/refman/en/innodb-consistent-read.html.\n \nFor locking reads (SELECT with FOR UPDATE or LOCK IN SHARE\nMODE),\nUPDATE, and DELETE statements, locking depends on whether\nthe\nstatement uses a unique index with a unique search\ncondition, or a\nrange-type search condition. For a unique index with a\nunique search\ncondition, InnoDB locks only the index record found, not the\ngap\nbefore it. For other search conditions, InnoDB locks the\nindex range\nscanned, using gap locks or next-key (gap plus index-record)\nlocks to\nblock insertions by other sessions into the gaps covered by\nthe range.\n \nThis is the minimum isolation level for non-distributed XA\ntransactions.\n \nSERIALIZABLE\n \nThis level is like REPEATABLE READ, but InnoDB implicitly\nconverts all\nplain SELECT statements to SELECT ... LOCK IN SHARE MODE if\nautocommit\nis disabled. If autocommit is enabled, the SELECT is its own\ntransaction. It therefore is known to be read only and can\nbe\nserialized if performed as a consistent (non-locking) read\nand need\nnot block for other transactions. (This means that to force\na plain\nSELECT to block if other transactions have modified the\nselected rows,\nyou should disable autocommit.)\n \nDistributed XA transactions should always use this isolation\nlevel.\n \nAccess Mode\n \nThese clauses appeared in MariaDB 10.0.\n \nThe access mode specifies whether the transaction is allowed\nto write data or not. By default, transactions are in READ\nWRITE mode (see the tx_read_only system variable). READ ONLY\nmode allows the storage engine to apply optimizations that\ncannot be used for transactions which write data. The only\nexception to this rule is that read only transactions can\nperform DDL statements on temporary tables.\n \nIt is not permitted to specify both READ WRITE and READ ONLY\nin the same statement.\n \nREAD WRITE and READ ONLY can also be specified in the START\nTRANSACTION statement, in which case the specified mode is\nonly valid for one transaction.\n \nExamples\n-------- \nSET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;\n \nAttempting to set the isolation level within an existing\ntransaction without specifying GLOBAL or SESSION.\n \nSTART TRANSACTION;\n \nSET TRANSACTION ISOLATION LEVEL SERIALIZABLE;\nERROR 1568 (25001): Transaction characteristics can\'t be\nchanged while a transaction is in progress\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/set-transaction/','','https://mariadb.com/kb/en/library/set-transaction/'),(163,'IS_FREE_LOCK',14,'Syntax\n------ \nIS_FREE_LOCK(str)\n \nDescription\n----------- \nChecks whether the lock named str is free to use (that is,\nnot locked).\nReturns 1 if the lock is free (no one is using the lock),\n 0 if the lock is in use, and NULL if an\nerror occurs (such as an incorrect argument, like an empty\nstring or NULL). str is case insensitive.\n \nIf the metadata_lock_info plugin is installed, the\nInformation Schema metadata_lock_info table contains\ninformation about locks of this kind (as well as metadata\nlocks).\n \nStatements using the IS_FREE_LOCK() function are not safe\nfor replication.\n \n\n\nURL: https://mariadb.com/kb/en/library/is_free_lock/','','https://mariadb.com/kb/en/library/is_free_lock/'),(109,'START SLAVE',8,'Syntax\n------ \nSTART SLAVE [\"connection_name\"] [thread_type [,\nthread_type] ... ]\nSTART SLAVE [\"connection_name\"] [SQL_THREAD] UNTIL \n MASTER_LOG_FILE = \'log_name\', MASTER_LOG_POS = log_pos\nSTART SLAVE [\"connection_name\"] [SQL_THREAD] UNTIL\n RELAY_LOG_FILE = \'log_name\', RELAY_LOG_POS = log_pos\nSTART SLAVE [\"connection_name\"] [SQL_THREAD] UNTIL\n MASTER_GTID_POS = \nSTART ALL SLAVES [thread_type [, thread_type]]\nthread_type: IO_THREAD | SQL_THREAD\n \nDescription\n----------- \nSTART SLAVE with no thread_type options starts both of the\nslave\nthreads (see replication). The I/O thread reads events from\nthe master server and stores\nthem in the relay log. The SQL thread reads events from the\nrelay log\nand executes them. START SLAVE requires the SUPER privilege.\n \nIf START SLAVE succeeds in starting the slave threads, it\nreturns\nwithout any error. However, even in that case, it might be\nthat the\nslave threads start and then later stop (for example,\nbecause they do\nnot manage to connect to the master or read its binary log,\nor some\nother problem). START SLAVE does not warn you about this.\nYou must\ncheck the slave\'s error log for error messages generated by\nthe slave\nthreads, or check that they are running satisfactorily with\nSHOW SLAVE\nSTATUS.\n \nSTART SLAVE UNTIL\n \nSTART SLAVE UNTIL refers to the SQL_THREAD slave position at\nwhich the SQL_THREAD replication will halt. If SQL_THREAD\nisn\'t specified both threads are started.\n \nSince version 10.0.2, START SLAVE UNTIL master_gtid_pos=xxx\nhas also been supported. See Global Transaction ID/START\nSLAVE UNTIL master_gtid_pos=xxx for more details.\n \nconnection_name\n \nThe connection_name option was added as part of multi-source\nreplication added in MariaDB 10.0\n \nIf there is only one nameless master, or the default master\n(as specified by the default_master_connection system\nvariable) is intended, connection_name can be omitted. If\nprovided, the START SLAVE statement will apply to the\nspecified master. connection_name is case-insensitive.\n \nSTART ALL SLAVES\n \nSTART ALL SLAVES starts all configured slaves (slaves with\nmaster_host not empty) that were not started before. It will\ngive a note for all started connections. You can check the\nnotes with SHOW WARNINGS.\n \n\n\nURL: https://mariadb.com/kb/en/library/start-slave/','','https://mariadb.com/kb/en/library/start-slave/'),(110,'START TRANSACTION',8,'Syntax\n------ \nSTART TRANSACTION [transaction_property [,\ntransaction_property] ...] | BEGIN [WORK]\nCOMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]\nROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]\nSET autocommit = {0 | 1}\n \ntransaction_property:\n WITH CONSISTENT SNAPSHOT\n | READ WRITE\n | READ ONLY\n \nDescription\n----------- \nThe START TRANSACTION or BEGIN statement\nbegins a new transaction. COMMIT commits the current\ntransaction, making its changes permanent. ROLLBACK rolls\nback the current transaction, canceling its changes. The SET\nautocommit statement disables or enables the default\nautocommit mode for the current session.\n \nSTART TRANSACTION and SET autocommit = 1 implicitly commit\nthe current transaction, if any.\n \nThe optional WORK keyword is supported for\nCOMMIT and ROLLBACK, as are the\nCHAIN and RELEASE clauses.\nCHAIN and RELEASE can be used for\nadditional control over transaction completion. The value of\nthe\ncompletion_type system variable determines the default\ncompletion behavior.\n \nThe AND CHAIN clause causes a new transaction to begin as\nsoon as the current one ends, and the new transaction has\nthe same isolation\nlevel as the just-terminated transaction. The RELEASE clause\ncauses the server to disconnect the current client session\nafter terminating\nthe current transaction. Including the NO keyword suppresses\nCHAIN or RELEASE completion, which can be\nuseful if the completion_type system variable is set to\ncause chaining or release completion by default.\n \nAccess Mode\n \nThese clauses appeared in MariaDB 10.0.\n \nThe access mode specifies whether the transaction is allowed\nto write data or not. By default, transactions are in READ\nWRITE mode (see the tx_read_only system variable). READ ONLY\nmode allows the storage engine to apply optimizations that\ncannot be used for transactions which write data. The only\nexception to this rule is that read only transactions can\nperform DDL statements on temporary tables.\n \nIt is not permitted to specify both READ WRITE and READ ONLY\nin the same statement.\n \nREAD WRITE and READ ONLY can also be specified in the SET\nTRANSACTION statement, in which case the specified mode is\nvalid for all sessions, or for all subsequent transaction\nused by the current session.\n \nautocommit\n \nBy default, MariaDB runs with autocommit mode enabled. This\nmeans that as soon as you execute a statement that updates\n(modifies) a table, MariaDB stores the update on disk to\nmake it permanent. To disable autocommit mode, use the\nfollowing statement:\n \nSET autocommit=0;\n \nAfter disabling autocommit mode by setting the autocommit\nvariable to zero, changes to transaction-safe tables (such\nas those for InnoDB or\nNDBCLUSTER) are not made permanent immediately. You must use\nCOMMIT to store your changes to disk or ROLLBACK to ignore\nthe changes.\n \nTo disable autocommit mode for a single series of\nstatements, use the START TRANSACTION statement.\n \nDDL Statements\n \nDDL statements (CREATE, ALTER, DROP) and administrative\nstatements (FLUSH, RESET, OPTIMIZE, ANALYZE, CHECK, REPAIR,\nCACHE INDEX), and LOAD DATA INFILE, cause an implicit COMMIT\nand start a new transaction. An exception to this rule are\nthe DDL that operate on temporary tables: you can CREATE,\nALTER and DROP them without causing any COMMIT, but those\nactions cannot be rolled back. This means that if you call\nROLLBACK, the temporary tables you created in the\ntransaction will remain, while the rest of the transaction\nwill be rolled back.\n \nTransactions cannot be used in Stored Functions or Triggers.\nIn Stored Procedures and Events BEGIN is not allowed, so you\nshould use START TRANSACTION instead.\n \nA transaction acquires a metadata lock on every table it\naccesses to prevent other connections from altering their\nstructure. The lock is released at the end of the\ntransaction. This happens even with non-transactional\nstorage engines (like MEMORY or CONNECT), so it makes sense\nto use transactions with non-transactional tables.\n \nin_transaction\n \nThe in_transaction system variable appeared in MariaDB 5.3.\n \nIt is a session-only, read-only variable that returns 1\ninside a transaction, and 0 if not in a transaction.\n \nWITH CONSISTENT SNAPSHOT\n \nThe WITH CONSISTENT SNAPSHOT option starts a consistent read\nfor storage engines such as XtraDB and InnoDB that can do\nso, the same as if a START TRANSACTION followed by a SELECT\nfrom any InnoDB table was issued. \n \nMariaDB 5.3 introduced enhancements to this feature. See\nEnhancements for START TRANSACTION WITH CONSISTENT SNAPSHOT.\n \nExamples\n-------- \nSTART TRANSACTION;\n \nSELECT @A:=SUM(salary) FROM table1 WHERE type=1;\n \nUPDATE table2 SET summary=@A WHERE type=1;\n \nCOMMIT;\n \n\n\nURL: https://mariadb.com/kb/en/library/start-transaction/','','https://mariadb.com/kb/en/library/start-transaction/'),(167,'IS_IPV6',14,'IS_IPV6() has been available since MariaDB 10.0.12.\n \nSyntax\n------ \nIS_IPV6(expr)\n \nDescription\n----------- \nReturns 1 if the expression is a valid IPv6 address\nspecified as a string, otherwise returns 0. Does not\nconsider IPv4 addresses to be valid IPv6 addresses.\n \nExamples\n-------- \n SELECT IS_IPV6(\'48f3::d432:1431:ba23:846f\');\n+--------------------------------------+\n| IS_IPV6(\'48f3::d432:1431:ba23:846f\') |\n+--------------------------------------+\n| 1 |\n+--------------------------------------+\n1 row in set (0.02 sec)\n \nSELECT IS_IPV6(\'10.0.1.1\');\n+---------------------+\n| IS_IPV6(\'10.0.1.1\') |\n+---------------------+\n| 0 |\n+---------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/is_ipv6/','','https://mariadb.com/kb/en/library/is_ipv6/'),(111,'STOP SLAVE',8,'Syntax\n------ \nSTOP SLAVE [\"connection_name\"] [thread_type [,\nthread_type] ... ]\n \nSTOP ALL SLAVES [thread_type [, thread_type]]\n \nthread_type: IO_THREAD | SQL_THREAD\n \nDescription\n----------- \nStops the slave threads. STOP SLAVE requires the SUPER\nprivilege.\n \nLike START SLAVE, this statement may be used with the\nIO_THREAD and\nSQL_THREAD options to name the thread or threads to be\nstopped. In almost all cases, one never need to use the\nthread_type options.\n \nSTOP SLAVE waits until any current replication event group\naffecting\none or more non-transactional tables has finished executing\n(if there\nis any such replication group), or until the user issues a\nKILL QUERY or KILL CONNECTION statement.\n \nNote that STOP SLAVE doesn\'t delete the connection\npermanently. Next time you execute START SLAVE or the\nMariaDB server restarts, the slave connection is restored\nwith it\'s original arguments. If you want to delete a\nconnection, you should execute RESET SLAVE.\n \nSTOP ALL SLAVES\n \nSTOP ALL SLAVES stops all your running slaves. It will give\nyou a note for every stopped connection. You can check the\nnotes with SHOW WARNINGS.\n \nconnection_name\n \nThe connection_name option was added as part of multi-source\nreplication added in MariaDB 10.0\n \nIf there is only one nameless master, or the default master\n(as specified by the default_master_connection system\nvariable) is intended, connection_name can be omitted. If\nprovided, the STOP SLAVE statement will apply to the\nspecified master. connection_name is case-insensitive.\n \n\n\nURL: https://mariadb.com/kb/en/library/stop-slave/','','https://mariadb.com/kb/en/library/stop-slave/'),(112,'Transaction Timeouts',8,'MariaDB has always had the wait_timeout and\ninteractive_timeout settings, which close connections after\na certain period of inactivity.\n \nHowever, these are by default set to a long wait period. In\nsituations where transactions may be started, but not\ncommitted or rolled back, more granular control and a\nshorter timeout may be desirable so as to avoid locks being\nheld for too long.\n \nMariaDB 10.3 introduced three new variables to handle this\nsituation.\nidle_transaction_timeout (all transactions)\nidle_write_transaction_timeout (write transactions - called\nidle_readwrite_transaction_timeout until MariaDB 10.3.2)\nidle_readonly_transaction_timeout (read transactions)\n \nThese accept a time in seconds to time out, by closing the\nconnection, transactions that are idle for longer than this\nperiod. By default all are set to zero, or no timeout.\n \nidle_transaction_timeout affects all transactions,\nidle_write_transaction_timeout affects write transactions\nonly and idle_readonly_transaction_timeout affects read\ntransactions only. The latter two variables work\nindependently. However, if either is set along with\nidle_transaction_timeout, the settings for\nidle_write_transaction_timeout or\nidle_readonly_transaction_timeout will take precedence.\n \nExamples\n-------- \nSET SESSION idle_transaction_timeout=2;\n \nBEGIN;\n \nSELECT * FROM t;\n \nEmpty set (0.000 sec)\n## wait 3 seconds\nSELECT * FROM t;\n \nERROR 2006 (HY000): MySQL server has gone away\n \nSET SESSION idle_write_transaction_timeout=2;\n \nBEGIN;\n \nSELECT * FROM t;\n \nEmpty set (0.000 sec)\n## wait 3 seconds\nSELECT * FROM t;\n \nEmpty set (0.000 sec)\nINSERT INTO t VALUES(1);\n## wait 3 seconds\nSELECT * FROM t;\n \nERROR 2006 (HY000): MySQL server has gone away\n \nSET SESSION idle_transaction_timeout=2, SESSION\nidle_readonly_transaction_timeout=10;\n \nBEGIN;\n \nSELECT * FROM t;\n \nEmpty set (0.000 sec)\n ## wait 3 seconds\nSELECT * FROM t;\n \nEmpty set (0.000 sec)\n## wait 11 seconds\nSELECT * FROM t;\n \nERROR 2006 (HY000): MySQL server has gone away\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/transaction-timeouts/','','https://mariadb.com/kb/en/library/transaction-timeouts/'),(114,'WAIT and NOWAIT',8,'MariaDB 10.3.0 introduced extended syntax so that it is\npossible to set innodb_lock_wait_timeout and\nlock_wait_timeout for the following statements:\n \nSyntax\n------ \nALTER TABLE tbl_name [WAIT n|NOWAIT] ...\nCREATE ... INDEX ON tbl_name (index_col_name, ...) [WAIT\nn|NOWAIT] ...\nDROP INDEX ... [WAIT n|NOWAIT]\nDROP TABLE tbl_name [WAIT n|NOWAIT] ...\nLOCK TABLE ... [WAIT n|NOWAIT]\nOPTIMIZE TABLE tbl_name [WAIT n|NOWAIT]\nRENAME TABLE tbl_name [WAIT n|NOWAIT] ...\nSELECT ... FOR UPDATE [WAIT n|NOWAIT]\nSELECT ... LOCK IN SHARE MODE [WAIT n|NOWAIT]\nTRUNCATE TABLE tbl_name [WAIT n|NOWAIT]\n \nDescription\n----------- \nThe lock wait timeout can be explicitly set in the statement\nby using either WAIT n (to set the wait in seconds) or\nNOWAIT, in which case the statement will immediately fail if\nthe lock cannot be obtained. WAIT 0 is equivalent to NOWAIT.\n \n\n\nURL: https://mariadb.com/kb/en/library/wait-and-nowait/','','https://mariadb.com/kb/en/library/wait-and-nowait/'),(116,'Account Locking',10,'Account locking was introduced in MariaDB 10.4.2.\n \nDescription\n----------- \nAccount locking permits privileged administrators to\nlock/unlock user accounts. No new client connections will be\npermitted if an account is locked (existing connections are\nnot affected).\n \nUser accounts can be locked at creation, with the CREATE\nUSER statement, or modified after creation with the ALTER\nUSER statement. For example:\n \nCREATE USER \'lorin\'@\'localhost\' ACCOUNT LOCK;\n \nor\n \nALTER USER \'marijn\'@\'localhost\' ACCOUNT LOCK;\n \nThe server will return an ER_ACCOUNT_HAS_BEEN_LOCKED error\nwhen locked users attempt to connect:\n \nmysql -ulorin\n ERROR 4151 (HY000): Access denied, this account is locked\n \nThe ALTER USER statement is also used to unlock a user:\n \nALTER USER \'lorin\'@\'localhost\' ACCOUNT UNLOCK;\n \nThe SHOW CREATE USER statement will show whether the account\nis locked:\n \nSHOW CREATE USER \'marijn\'@\'localhost\';\n \n+-----------------------------------------------+\n| CREATE USER for marijn@localhost |\n+-----------------------------------------------+\n| CREATE USER \'marijn\'@\'localhost\' ACCOUNT LOCK |\n+-----------------------------------------------+\n \nas well as querying the mysql.global_priv table:\n \nSELECT CONCAT(user, \'@\', host, \' => \',\nJSON_DETAILED(priv)) FROM mysql.global_priv \n WHERE user=\'marijn\';\n+--------------------------------------------------------------------------------------+\n| CONCAT(user, \'@\', host, \' => \', JSON_DETAILED(priv)) |\n+--------------------------------------------------------------------------------------+\n| marijn@localhost => {\n \"access\": 0,\n \"plugin\": \"mysql_native_password\",\n \"authentication_string\": \"\",\n \"account_locked\": true,\n \"password_last_changed\": 1558017158\n} |\n+--------------------------------------------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/account-locking/','','https://mariadb.com/kb/en/library/account-locking/'),(168,'IS_USED_LOCK',14,'Syntax\n------ \nIS_USED_LOCK(str)\n \nDescription\n----------- \nChecks whether the lock named str is in use (that is,\nlocked). If so,\nit returns the connection identifier of the client that\nholds the\nlock. Otherwise, it returns NULL. str is case insensitive.\n \nIf the metadata_lock_info plugin is installed, the\nInformation Schema metadata_lock_info table contains\ninformation about locks of this kind (as well as metadata\nlocks).\n \nStatements using the IS_USED_LOCK() function are not safe\nfor replication.\n \n\n\nURL: https://mariadb.com/kb/en/library/is_used_lock/','','https://mariadb.com/kb/en/library/is_used_lock/'),(120,'DROP USER',10,'Syntax\n------ \nDROP USER [IF EXISTS] user_name [, user_name] ...\n \nDescription\n----------- \nThe DROP USER statement removes one or more MariaDB\naccounts. It removes\nprivilege rows for the account from all grant tables. To use\nthis statement,\nyou must have the global CREATE USER privilege\nor the DELETE privilege for the mysql database.\nEach account is named using the same format as for the\nCREATE USER\nstatement; for example, \'jeffrey\'@\'localhost\'. If you\nspecify\nonly the user name part of the account name, a host name\npart of \'%\' is\nused. For additional information about specifying account\nnames, see\nCREATE USER.\n \nNote that, if you specify an account that is currently\nconnected, it will not\nbe deleted until the connection is closed. The connection\nwill not be\nautomatically closed.\n \nIf any of the specified user accounts do not exist, ERROR\n1396 (HY000)\nresults. If an error occurs, DROP USER will still drop the\naccounts that do\nnot result in an error. Only one error is produced for all\nusers which have not\nbeen dropped:\n \nERROR 1396 (HY000): Operation DROP USER failed for\n\'u1\'@\'%\',\'u2\'@\'%\'\n \nFailed CREATE or DROP operations, for both users and roles,\nproduce the\nsame error code.\n \nIF EXISTS\n \nThe IF EXISTS clause was added in MariaDB 10.1.3\n \nIf the IF EXISTS clause is used, MariaDB will return a note\ninstead of an error if the user does not exist.\n \nExamples\n-------- \nDROP USER bob;\n \nIF EXISTS:\n \nDROP USER bob;\n \nERROR 1396 (HY000): Operation DROP USER failed for\n\'bob\'@\'%\'\n \nDROP USER IF EXISTS bob;\n \nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n \nSHOW WARNINGS;\n \n+-------+------+---------------------------------------------+\n| Level | Code | Message |\n+-------+------+---------------------------------------------+\n| Note | 1974 | Can\'t drop user \'bob\'@\'%\'; it doesn\'t\nexist |\n+-------+------+---------------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/drop-user/','','https://mariadb.com/kb/en/library/drop-user/'),(122,'User Password Expiry',10,'User password expiry was introduced in MariaDB 10.4.3.\n \nPassword expiry permits administrators to expire user\npasswords, either manually or automatically. \n \nSystem Variables\n \nThere are two system variables which affect password expiry:\ndefault_password_lifetime, which determines the amount of\ntime between requiring the user to change their password. 0,\nthe default, means automatic password expiry is not active.\n \nThe second variable, disconnect_on_expired_password\ndetermines whether a client is permitted to connect if their\npassword has expired, or whether they are permitted to\nconnect in sandbox mode, able to perform a limited subset of\nqueries related to resetting the password, in particular SET\nPASSWORD and SET.\n \nSetting a Password Expiry Limit for a User\n \nBesides automatic password expiry, as determined by\ndefault_password_lifetime, password expiry times can be set\non an individual user basis, overriding the global using the\nCREATE USER or ALTER USER statements, for example:\n \nCREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL\n120 DAY;\n \nALTER USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL\n120 DAY;\n \nLimits can be disabled by use of the NEVER keyword, for\nexample:\n \nCREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE NEVER;\n \nALTER USER \'monty\'@\'localhost\' PASSWORD EXPIRE NEVER;\n \nA manually set limit can be restored the system default by\nuse of DEFAULT, for example:\n \nCREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE DEFAULT;\n \nALTER USER \'monty\'@\'localhost\' PASSWORD EXPIRE DEFAULT;\n \nSHOW CREATE USER\n \nThe SHOW CREATE USER statement will display information\nabout the password expiry status of the user. Unlike MySQL,\nit will not display if the user is unlocked, or if the\npassword expiry is set to default.\n \nCREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL\n120 DAY;\n \nCREATE USER \'konstantin\'@\'localhost\' PASSWORD EXPIRE\nNEVER;\n \nCREATE USER \'amse\'@\'localhost\' PASSWORD EXPIRE DEFAULT;\n \nSHOW CREATE USER \'monty\'@\'localhost\';\n \n+------------------------------------------------------------------+\n| CREATE USER for monty@localhost |\n+------------------------------------------------------------------+\n| CREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE\nINTERVAL 120 DAY |\n+------------------------------------------------------------------+\n \nSHOW CREATE USER \'konstantin\'@\'localhost\';\n \n+------------------------------------------------------------+\n| CREATE USER for konstantin@localhost |\n+------------------------------------------------------------+\n| CREATE USER \'konstantin\'@\'localhost\' PASSWORD EXPIRE\nNEVER |\n+------------------------------------------------------------+\n \nSHOW CREATE USER \'amse\'@\'localhost\';\n \n+--------------------------------+\n| CREATE USER for amse@localhost |\n+--------------------------------+\n| CREATE USER \'amse\'@\'localhost\' |\n+--------------------------------+\n \n--connect-expired-password Client Option\n \nThe mysql client --connect-expired-password option notifies\nthe server that the client is prepared to handle expired\npassword sandbox mode (even if the --batch option was\nspecified).\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/user-password-expiry/','','https://mariadb.com/kb/en/library/user-password-expiry/'),(171,'NAME_CONST',14,'Syntax\n------ \nNAME_CONST(name,value)\n \nDescription\n----------- \nReturns the given value. When used to produce a result set\ncolumn,\n NAME_CONST() causes the column to have the given name. The\narguments should be constants.\n \nThis function is used internally when replicating stored\nprocedures. It makes little sense to use it explicitly in\nSQL statements, and it was not supposed to be used like\nthat.\n \nSELECT NAME_CONST(\'myname\', 14);\n+--------+\n| myname |\n+--------+\n| 14 |\n+--------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/name_const/','','https://mariadb.com/kb/en/library/name_const/'),(173,'SLEEP',14,'Syntax\n------ \nSLEEP(duration)\n \nDescription\n----------- \nSleeps (pauses) for the number of seconds given by the\nduration argument, then\nreturns 0. If SLEEP() is interrupted, it\nreturns 1. The duration may have a fractional part given in\nmicroseconds.\n \nStatements using the SLEEP() function are not safe for\nreplication.\n \nExample\n \nSELECT SLEEP(5.5);\n+------------+\n| SLEEP(5.5) |\n+------------+\n| 0 |\n+------------+\n1 row in set (5.50 sec)\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/sleep/','','https://mariadb.com/kb/en/library/sleep/'),(175,'UUID_SHORT',14,'Syntax\n------ \nUUID_SHORT()\n \nDescription\n----------- \nReturns a \"short\" universal identifier as a 64-bit\nunsigned integer (rather\nthan a string-form 128-bit identifier as returned by the\nUUID() function).\n \nThe value of UUID_SHORT() is guaranteed to be unique if the\nfollowing conditions hold:\nThe server_id of the current host is unique among your set\nof master and\n slave servers\nserver_id is between 0 and 255\nYou don\'t set back your system time for your server between\nmysqld restarts\nYou do not invoke UUID_SHORT() on average more than 16\n million times per second between mysqld restarts\n \nThe UUID_SHORT() return value is constructed this way:\n \n (server_id & 255) \n\nURL: https://mariadb.com/kb/en/library/uuid_short/','','https://mariadb.com/kb/en/library/uuid_short/'),(177,'!',15,'Syntax\n------ \nNOT, !\n \nDescription\n----------- \nLogical NOT. Evaluates to 1 if the operand is 0, to 0 if the\noperand\nis non-zero, and NOT NULL returns NULL.\n \nBy default, the ! operator has a higher precedence. If the\nHIGH_NOT_PRECEDENCE SQL_MODE flag is set, NOT and ! have the\nsame precedence.\n \nExamples\n-------- \nSELECT NOT 10;\n \n+--------+\n| NOT 10 |\n+--------+\n| 0 |\n+--------+\n \nSELECT NOT 0;\n \n+-------+\n| NOT 0 |\n+-------+\n| 1 |\n+-------+\n \nSELECT NOT NULL;\n \n+----------+\n| NOT NULL |\n+----------+\n| NULL |\n+----------+\n \nSELECT ! (1+1);\n+---------+\n| ! (1+1) |\n+---------+\n| 0 |\n+---------+\n \nSELECT ! 1+1;\n \n+-------+\n| ! 1+1 |\n+-------+\n| 1 |\n+-------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/not/','','https://mariadb.com/kb/en/library/not/'),(123,'RENAME USER',10,'Syntax\n------ \nRENAME USER old_user TO new_user\n [, old_user TO new_user] ...\n \nDescription\n----------- \nThe RENAME USER statement renames existing MariaDB accounts.\nTo use it,\nyou must have the global CREATE USER privilege\nor the UPDATE privilege for the mysql database.\nEach account is named using the same format as for the\nCREATE USER\nstatement; for example, \'jeffrey\'@\'localhost\'.\nIf you specify only the user name part of the account name,\na host\nname part of \'%\' is used.\n \nIf any of the old user accounts do not exist or any of the\nnew user accounts already\nexist, ERROR 1396 (HY000) results. If an error occurs,\nRENAME USER\nwill still rename the accounts that do not result in an\nerror.\n \nExamples\n-------- \nCREATE USER \'donald\', \'mickey\';\n \nRENAME USER \'donald\' TO \'duck\'@\'localhost\', \'mickey\'\nTO \'mouse\'@\'localhost\';\n \n\n \n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/rename-user/','','https://mariadb.com/kb/en/library/rename-user/'),(124,'REVOKE',10,'Privileges\n \nSyntax\n------ \nREVOKE \n priv_type [(column_list)]\n [, priv_type [(column_list)]] ...\n ON [object_type] priv_level\n FROM user [, user] ...\n \nREVOKE ALL PRIVILEGES, GRANT OPTION\n FROM user [, user] ...\n \nDescription\n----------- \nThe REVOKE statement enables system administrators to revoke\nprivileges (or roles - see section below) from MariaDB\naccounts. Each account is named using the same format\nas for the GRANT statement; for example,\n\'jeffrey\'@\'localhost\'. If you specify only the user name\npart\nof the account name, a host name part of \'%\' is used. For\ndetails on the levels at which privileges exist, the\nallowable\npriv_type and priv_level values, and the\nsyntax for specifying users and passwords, see GRANT.\n \nTo use the first REVOKE syntax, you must have the\nGRANT OPTION privilege, and you must have the privileges\nthat\nyou are revoking.\n \nTo revoke all privileges, use the second syntax, which drops\nall\nglobal, database, table, column, and routine privileges for\nthe named\nuser or users:\n \nREVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...\n \nTo use this REVOKE syntax, you must have the global\nCREATE USER privilege or the\nUPDATE privilege for the mysql database. See\nGRANT.\n \nExamples\n-------- \nREVOKE SUPER ON *.* FROM \'alexander\'@\'localhost\';\n \nRoles\n \nRoles were introduced in MariaDB 10.0.5.\n \nSyntax\n------ \nREVOKE role [, role ...]\n FROM grantee [, grantee2 ... ]\n \nDescription\n----------- \nREVOKE is also used to remove a role from a user or another\nrole that it\'s previously been assigned to. If a role has\npreviously been set as a default role, REVOKE does not\nremove the record of the default role from the mysql.user\ntable. If the role is subsequently granted again, it will\nagain be the user\'s default. Use SET DEFAULT ROLE NONE to\nexplicitly remove this.\n \nBefore MariaDB 10.1.13, the REVOKE role statement was not\npermitted in prepared statements.\n \nExample\n \nREVOKE journalist FROM hulda\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/revoke/','','https://mariadb.com/kb/en/library/revoke/'),(127,'CREATE ROLE',10,'Roles were introduced in MariaDB 10.0.5.\n \nSyntax\n------ \nCREATE [OR REPLACE] ROLE [IF NOT EXISTS] role \n [WITH ADMIN \n {CURRENT_USER | CURRENT_ROLE | user | role}]\n \nDescription\n----------- \nThe CREATE ROLE statement creates one or more MariaDB roles.\nTo\nuse it, you must have the global CREATE USER\nprivilege or the INSERT privilege for the mysql\ndatabase. For each account, CREATE ROLE creates a new row in\nthe\nmysql.user table that has no privileges, and with the\ncorresponding is_role field set to Y. It also creates a\nrecord in the\nmysql.roles_mapping table.\n \nIf any of the specified roles already exist, ERROR 1396\n(HY000) results. If\nan error occurs, CREATE ROLE will still create the roles\nthat do not result\nin an error. The maximum length for a role is 128\ncharacters. Role names can be\nquoted, as explained in the Identifier names page. Only\none error is produced for all roles which have not been\ncreated:\n \nERROR 1396 (HY000): Operation CREATE ROLE failed for\n\'a\',\'b\',\'c\'\n \nFailed CREATE or DROP operations, for both users and roles,\nproduce the\nsame error code.\n \nPUBLIC and NONE are reserved, and cannot be used as role\nnames.\n \nBefore MariaDB 10.1.13, the CREATE ROLE statement was not\npermitted in prepared statements.\n \nFor valid identifiers to use as role names, see Identifier\nNames.\n \nWITH ADMIN\n \nThe optional WITH ADMIN clause determines whether the\ncurrent user, the\ncurrent role or another user or role has use of the newly\ncreated role. If the\nclause is omitted, WITH ADMIN CURRENT_USER is treated as the\ndefault, which\nmeans that the current user will be able to GRANT this role\nto\nusers.\n \nOR REPLACE\n \nThe OR REPLACE clause was added in MariaDB 10.1.3\n \nIf the optional OR REPLACE clause is used, it acts as a\nshortcut for:\n \nDROP ROLE IF EXISTS name;\n \nCREATE ROLE name ...;\n \nIF NOT EXISTS\n \nThe IF NOT EXISTS clause was added in MariaDB 10.1.3\n \nWhen the IF NOT EXISTS clause is used, MariaDB will return a\nwarning instead of an error if the specified role already\nexists. Cannot be used together with the OR REPLACE clause.\n \nExamples\n-------- \nCREATE ROLE journalist;\n \nCREATE ROLE developer WITH ADMIN lorinda;\n \nThe OR REPLACE and IF NOT EXISTS clauses:\n \nCREATE ROLE journalist;\nERROR 1396 (HY000): Operation CREATE ROLE failed for\n\'journalist\'\n \nCREATE OR REPLACE ROLE journalist;\nQuery OK, 0 rows affected (0.00 sec)\n \nCREATE ROLE IF NOT EXISTS journalist;\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n \nSHOW WARNINGS;\n+-------+------+---------------------------------------------------+\n| Level | Code | Message |\n+-------+------+---------------------------------------------------+\n| Note | 1975 | Can\'t create role \'journalist\'; it\nalready exists |\n+-------+------+---------------------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/create-role/','','https://mariadb.com/kb/en/library/create-role/'),(178,'&&',15,'Syntax\n------ \nAND, &&\n \nDescription\n----------- \nLogical AND. Evaluates to 1 if all operands are non-zero and\nnot NULL,\nto 0 if one or more operands are 0, otherwise NULL is\nreturned.\n \nFor this operator, short-circuit evaluation can be used.\n \nExamples\n-------- \nSELECT 1 && 1;\n \n+--------+\n| 1 && 1 |\n+--------+\n| 1 |\n+--------+\n \nSELECT 1 && 0;\n \n+--------+\n| 1 && 0 |\n+--------+\n| 0 |\n+--------+\n \nSELECT 1 && NULL;\n \n+-----------+\n| 1 && NULL |\n+-----------+\n| NULL |\n+-----------+\n \nSELECT 0 && NULL;\n \n+-----------+\n| 0 && NULL |\n+-----------+\n| 0 |\n+-----------+\n \nSELECT NULL && 0;\n \n+-----------+\n| NULL && 0 |\n+-----------+\n| 0 |\n+-----------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/and/','','https://mariadb.com/kb/en/library/and/'),(182,'Assignment Operator (:=)',15,'Syntax\n------ \nvar_name := expr\n \nDescription\n----------- \nAssignment operator for assigning a value. The value on the\nright is assigned to the variable on left.\n \nUnlike the = operator, := can always be used to assign a\nvalue to a variable.\n \nThis operator works with both user-defined variables and\nlocal variables.\n \nWhen assigning the same value to several variables,\nLAST_VALUE() can be useful.\n \nExamples\n-------- \n SELECT @x := 10;\n \n+----------+\n| @x := 10 |\n+----------+\n| 10 |\n+----------+\n \nSELECT @x, @y := @x;\n \n+------+----------+\n| @x | @y := @x |\n+------+----------+\n| 10 | 10 |\n+------+----------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/assignment-operator/','','https://mariadb.com/kb/en/library/assignment-operator/'),(125,'SET PASSWORD',10,'Syntax\n------ \nSET PASSWORD [FOR user] =\n {\n PASSWORD(\'some password\')\n | OLD_PASSWORD(\'some password\')\n | \'encrypted password\'\n }\n \nDescription\n----------- \nThe SET PASSWORD statement assigns a password to an existing\nMariaDB user\naccount.\n \nIf the password is specified using the PASSWORD() or\nOLD_PASSWORD()\nfunction, the literal text of the password should be given.\nIf the\npassword is specified without using either function, the\npassword\nshould be the already-encrypted password value as returned\nby\nPASSWORD().\n \nOLD_PASSWORD() should only be used if your MariaDB/MySQL\nclients are very old (< 4.0.0).\n \nWith no FOR clause, this statement sets the password for the\ncurrent\nuser. Any client that has connected to the server using a\nnon-anonymous\naccount can change the password for that account.\n \nWith a FOR clause, this statement sets the password for a\nspecific\naccount on the current server host. Only clients that have\nthe UPDATE\nprivilege for the mysql database can do this. The user value\nshould be\ngiven in user_name@host_name format, where user_name and\nhost_name are\nexactly as they are listed in the User and Host columns of\nthe\nmysql.user table entry. \n \nThe argument to PASSWORD() and the password given to MariaDB\nclients can be of arbitrary length.\n \nAuthentication Plugin Support\n \nIn MariaDB 10.4 and later, SET PASSWORD (with or without\nPASSWORD()) works for accounts authenticated via any\nauthentication plugin that supports passwords stored in the\nmysql.global_priv table.\n \nThe ed25519, mysql_native_password, and mysql_old_password\nauthentication plugins store passwords in the\nmysql.global_priv table.\n \nIf you run SET PASSWORD on an account that authenticates\nwith one of these authentication plugins that stores\npasswords in the mysql.global_priv table, then the\nPASSWORD() function is evaluated by the specific\nauthentication plugin used by the account. The\nauthentication plugin hashes the password with a method that\nis compatible with that specific authentication plugin.\n \nThe unix_socket, named_pipe, gssapi, and pam authentication\nplugins do not store passwords in the mysql.global_priv\ntable. These authentication plugins rely on other methods to\nauthenticate the user.\n \nIf you attempt to run SET PASSWORD on an account that\nauthenticates with one of these authentication plugins that\ndoesn\'t store a password in the mysql.global_priv table,\nthen MariaDB Server will raise a warning like the following:\n \nSET PASSWORD is ignored for users authenticating via\nunix_socket plugin\n \nSee Authentication from MariaDB 10.4 for an overview of\nauthentication changes in MariaDB 10.4.\n \nMariaDB until 10.3\n \nIn MariaDB 10.3 and before, SET PASSWORD (with or without\nPASSWORD()) only works for accounts authenticated via\nmysql_native_password or mysql_old_password authentication\nplugins\n \nPasswordless User Accounts\n \nUser accounts do not always require passwords to login.\n \nThe unix_socket and named_pipe authentication plugins do not\nrequire a password to authenticate the user.\n \nThe gssapi and pam authentication plugins may or may not\nrequire a password to authenticate the user, depending on\nthe specific configuration.\n \nThe mysql_native_password and mysql_old_password\nauthentication plugins require passwords for authentication,\nbut the password can be blank. In that case, no password is\nrequired.\n \nIf you provide a password while attempting to log into the\nserver as an account that doesn\'t require a password, then\nMariaDB server will simply ignore the password.\n \nIn MariaDB 10.4 and later, a user account can be defined to\nuse multiple authentication plugins in a specific order of\npreference. This specific scenario may be more noticeable in\nthese versions, since an account could be associated with\nsome authentication plugins that require a password, and\nsome that do not.\n \nExample\n \nFor example, if you had an entry with User and\nHost column values of \'bob\' and \n\'%.loc.gov\', you would write the\nstatement like this:\n \nSET PASSWORD FOR \'bob\'@\'%.loc.gov\' =\nPASSWORD(\'newpass\');\n \n\n\nURL: https://mariadb.com/kb/en/library/set-password/','','https://mariadb.com/kb/en/library/set-password/'),(128,'DROP ROLE',10,'Roles were introduced in MariaDB 10.0.5.\n \nSyntax\n------ \nDROP ROLE [IF EXISTS] role_name [,role_name ...]\n \nDescription\n----------- \nThe DROP ROLE statement removes one or more MariaDB roles.\nTo use this\nstatement, you must have the global CREATE USER privilege or\nthe DELETE privilege for the mysql database.\n \nDROP ROLE does not disable roles for connections which\nselected them with SET ROLE. If a role has previously been\nset as a default role, DROP ROLE does not remove the record\nof the default role from the mysql.user table. If the role\nis subsequently recreated and granted, it will again be the\nuser\'s default. Use SET DEFAULT ROLE NONE to explicitly\nremove this.\n \nIf any of the specified user accounts do not exist, ERROR\n1396 (HY000)\nresults. If an error occurs, DROP ROLE will still drop the\nroles that\ndo not result in an error. Only one error is produced for\nall roles which have not been dropped:\n \nERROR 1396 (HY000): Operation DROP ROLE failed for\n\'a\',\'b\',\'c\'\n \nFailed CREATE or DROP operations, for both users and roles,\nproduce the same error code.\n \nBefore MariaDB 10.1.13, the DROP ROLE statement was not\npermitted in prepared statements.\n \nIF EXISTS\n \nThe IF EXISTS clause was added in MariaDB 10.1.3\n \nIf the IF EXISTS clause is used, MariaDB will return a\nwarning instead of an error if the role does not exist.\n \nExamples\n-------- \nDROP ROLE journalist;\n \nThe same thing using the optional IF EXISTS clause:\n \nDROP ROLE journalist;\n \nERROR 1396 (HY000): Operation DROP ROLE failed for\n\'journalist\'\n \nDROP ROLE IF EXISTS journalist;\n \nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n \nNote (Code 1975): Can\'t drop role \'journalist\'; it\ndoesn\'t exist\n \n\n\nURL: https://mariadb.com/kb/en/library/drop-role/','','https://mariadb.com/kb/en/library/drop-role/'),(189,'GROUP_CONCAT',16,'Syntax\n------ \nGROUP_CONCAT(expr)\n \nDescription\n----------- \nThis function returns a string result with the concatenated\nnon-NULL\nvalues from a group. It returns NULL if there are no\nnon-NULL values.\n \nThe maximum returned length in bytes is determined by the\ngroup_concat_max_len server system variable, which defaults\nto 1M (>= MariaDB 10.2.4) or 1K (\n\nURL: https://mariadb.com/kb/en/library/group_concat/','','https://mariadb.com/kb/en/library/group_concat/'),(195,'STDDEV_SAMP',16,'Syntax\n------ \nSTDDEV_SAMP(expr)\n \nDescription\n----------- \nReturns the sample standard deviation of expr (the square\nroot of VAR_SAMP()).\n \nIt is an aggregate function, and so can be used with the\nGROUP BY clause.\n \nFrom MariaDB 10.2.2, STDDEV_SAMP() can be used as a window\nfunction.\n \nSTDDEV_SAMP() returns NULL if there were no matching rows.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/stddev_samp/','','https://mariadb.com/kb/en/library/stddev_samp/'),(200,'BENCHMARK',17,'Syntax\n------ \nBENCHMARK(count,expr)\n \nDescription\n----------- \nThe BENCHMARK() function executes the expression expr\nrepeatedly count\ntimes. It may be used to time how quickly MariaDB processes\nthe\nexpression. The result value is always 0. The intended use\nis from\nwithin the mysql client, which reports query execution\ntimes.\n \nExamples\n-------- \nSELECT BENCHMARK(1000000,ENCODE(\'hello\',\'goodbye\'));\n+----------------------------------------------+\n| BENCHMARK(1000000,ENCODE(\'hello\',\'goodbye\')) |\n+----------------------------------------------+\n| 0 |\n+----------------------------------------------+\n1 row in set (0.21 sec)\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/benchmark/','','https://mariadb.com/kb/en/library/benchmark/'),(126,'Roles Overview',10,'Roles were introduced in MariaDB 10.0.5.\n \nDescription\n----------- \nA role bundles a number of privileges together. It assists\nlarger organizations where, typically, a number of users\nwould have the same privileges, and, previously, the only\nway to change the privileges for a group of users was by\nchanging each user\'s privileges individually. \n \nAlternatively, multiple external users could have been\nassigned the same user, and there would have been no way to\nsee which actual user was responsible for which action.\n \nWith roles, managing this is easy. For example, there could\nbe a number of users assigned to a journalist role, with\nidentical privileges. Changing the privileges for all the\njournalists is a matter of simply changing the role\'s\nprivileges, while the individual user is still linked with\nany changes that take place.\n \nRoles are created with the CREATE ROLE statement, and\ndropped with the DROP ROLE statement. Roles are then\nassigned to a user with an extension to the GRANT statement,\nwhile privileges are assigned to a role in the regular way\nwith GRANT. Similarly, the REVOKE statement can be used to\nboth revoke a role from a user, or revoke a privilege from a\nrole.\n \nOnce a user has connected, he can obtain all privileges\nassociated with a role by setting a role with the SET ROLE\nstatement. The CURRENT_ROLE function returns the currently\nset role for the session, if any.\n \nOnly roles granted directly to a user can be set, roles\ngranted to other roles cannot. Instead the privileges\ngranted to a role, which is, in turn, granted to another\nrole (grantee), will be immediately available to any user\nwho sets this second grantee role.\n \nRoles were implemented as a GSoC 2013 project by Vicentiu\nCiorbaru. \n \nThe SET DEFAULT ROLE statement allows one to set a default\nrole for a user. A default role is automatically enabled\nwhen a user connects (an implicit SET ROLE statement is\nexecuted immediately after a connection is established).\n \nSystem Tables\n \nInformation about roles and who they\'ve been granted to can\nbe found in the Information Schema APPLICABLE_ROLES table as\nwell as the mysql.ROLES_MAPPING table.\n \nThe Information Schema ENABLED_ROLES table shows the enabled\nroles for the current session.\n \nExamples\n-------- \nCreating a role and granting a privilege:\n \nCREATE ROLE journalist;\n \nGRANT SHOW DATABASES ON *.* TO journalist;\n \nGRANT journalist to hulda;\n \nNote, that hulda has no SHOW DATABASES privilege, even\nthough she was granted the journalist role. She needs to set\nthe role first:\n \nSHOW DATABASES;\n \n+--------------------+\n| Database |\n+--------------------+\n| information_schema |\n+--------------------+\n \nSELECT CURRENT_ROLE;\n \n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| NULL |\n+--------------+\n \nSET ROLE journalist;\n \nSELECT CURRENT_ROLE;\n \n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| journalist |\n+--------------+\n \nSHOW DATABASES;\n \n+--------------------+\n| Database |\n+--------------------+\n| ... |\n| information_schema |\n| mysql |\n| performance_schema |\n| test |\n| ... |\n+--------------------+\n \nSET ROLE NONE;\n \nRoles can be granted to roles:\n \nCREATE ROLE writer;\n \nGRANT SELECT ON data.* TO writer;\n \nGRANT writer TO journalist;\n \nBut one does not need to set a role granted to a role. For\nexample, hulda will automatically get all writer privileges\nwhen she sets the journalist role:\n \nSELECT CURRENT_ROLE;\n \n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| NULL |\n+--------------+\n \nSHOW TABLES FROM data;\n \nEmpty set (0.01 sec)\n \nSET ROLE journalist;\n \nSELECT CURRENT_ROLE;\n \n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| journalist |\n+--------------+\n \nSHOW TABLES FROM data;\n \n+------------------------------+\n| Tables_in_data |\n+------------------------------+\n| set1 |\n| ... |\n+------------------------------+\n \nRoles and Views (and Stored Routines)\n \nWhen a user sets a role, he, in a sense, has two identities\nwith two associated sets of privileges.\nBut a view (or a stored routine) can have only one definer.\nSo, when a view (or a stored routine) is created with the\nSQL SECURITY DEFINER, one can specify whether the definer\nshould be CURRENT_USER (and the view will have none of the\nprivileges of the user\'s role) or CURRENT_ROLE (in this\ncase, the view will use role\'s privileges, but none of the\nuser\'s privileges). As a result, sometimes one can create a\nview that is impossible to use.\n \nCREATE ROLE r1;\n \nGRANT ALL ON db1.* TO r1;\n \nGRANT r1 TO foo@localhost;\n \nGRANT ALL ON db.* TO foo@localhost;\n \nSELECT CURRENT_USER\n+---------------+\n| current_user |\n+---------------+\n| foo@localhost |\n+---------------+\n \nSET ROLE r1;\n \nCREATE TABLE db1.t1 (i int);\n \nCREATE VIEW db.v1 AS SELECT * FROM db1.t1;\n \nSHOW CREATE VIEW db.v1;\n \n+------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+\n| View | Create View | character_set_client |\ncollation_connection |\n+------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+\n| v1 | CREATE ALGORITHM=UNDEFINED DEFINER=`foo`@`localhost`\nSQL SECURITY DEFINER VIEW `db`.`v1` AS SELECT `db1`.`t1`.`i`\nAS `i` from `db1`.`t1` | utf8 | utf8_general_ci |\n+------+------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+\n \nCREATE DEFINER=CURRENT_ROLE VIEW db.v2 AS SELECT * FROM\ndb1.t1;\n \nSHOW CREATE VIEW db.b2;\n \n+------+-----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+\n| View | Create View | character_set_client |\ncollation_connection |\n+------+-----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+\n| v2 | CREATE ALGORITHM=UNDEFINED DEFINER=`r1` SQL SECURITY\nDEFINER VIEW `db`.`v2` AS select `db1`.`t1`.`a` AS `a` from\n`db1`.`t1` | utf8 | utf8_general_ci |\n+------+-----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+\n \nOther Resources\n \nRoles Review by Peter Gulutzan\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/roles_overview/','','https://mariadb.com/kb/en/library/roles_overview/'),(201,'BINLOG_GTID_POS',17,'From version 10.0.2, MariaDB supports global transaction IDs\nfor replication.\n \nSyntax\n------ \nBINLOG_GTID_POS(binlog_filename,binlog_offset)\n \nDescription\n----------- \nThe BINLOG_GTID_POS() function takes as input an old-style\nbinary log position in the form of a file name and a file\noffset. It looks up the position in the current binlog, and\nreturns a string representation of the corresponding GTID\nposition. If the position is not found in the current\nbinlog, NULL is returned.\n \nExamples\n-------- \nSELECT BINLOG_GTID_POS(\"master-bin.000001\", 600);\n \n\n\nURL: https://mariadb.com/kb/en/library/binlog_gtid_pos/','','https://mariadb.com/kb/en/library/binlog_gtid_pos/'),(204,'COLLATION',17,'Syntax\n------ \nCOLLATION(str)\n \nDescription\n----------- \nReturns the collation of the string argument. If str is not\na string, it is considered as a binary string (so the\nfunction returns \'binary\'). This applies to NULL, too. The\nreturn value is a string in the utf8 character set.\n \nSee Character Sets and Collations.\n \nExamples\n-------- \nSELECT COLLATION(\'abc\');\n+-------------------+\n| COLLATION(\'abc\') |\n+-------------------+\n| latin1_swedish_ci |\n+-------------------+\n \nSELECT COLLATION(_utf8\'abc\');\n+-----------------------+\n| COLLATION(_utf8\'abc\') |\n+-----------------------+\n| utf8_general_ci |\n+-----------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/collation/','','https://mariadb.com/kb/en/library/collation/'),(129,'SET ROLE',10,'Roles were introduced in MariaDB 10.0.5.\n \nSyntax\n------ \nSET ROLE { role | NONE }\n \nDescription\n----------- \nThe SET ROLE statement enables a role, along with all of its\nassociated permissions, for the current session. To unset a\nrole, use NONE .\n \nIf a role that doesn\'t exist, or to which the user has not\nbeen assigned, is specified, an ERROR 1959 (OP000): Invalid\nrole specification error occurs.\n \nFrom MariaDB 10.1.1, an automatic SET ROLE is implicitly\nperformed when a user connects if that user has been\nassigned a default role. See SET DEFAULT ROLE.\n \nExample\n \nSELECT CURRENT_ROLE;\n \n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| NULL |\n+--------------+\n \nSET ROLE staff;\n \nSELECT CURRENT_ROLE;\n \n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| staff |\n+--------------+\n \nSET ROLE NONE;\n \nQuery OK, 0 rows affected (0.00 sec)\n \nSELECT CURRENT_ROLE();\n+----------------+\n| CURRENT_ROLE() |\n+----------------+\n| NULL |\n+----------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/set-role/','','https://mariadb.com/kb/en/library/set-role/'),(130,'SET DEFAULT ROLE',10,'Default roles were implemented in MariaDB 10.1.1.\n \nSyntax\n------ \nSET DEFAULT ROLE { role | NONE } [ FOR user@host ]\n \nDescription\n----------- \nThe SET DEFAULT ROLE statement sets a default role for a\nspecified (or current) user. A default role is automatically\nenabled when a user connects (an implicit SET ROLE statement\nis executed immediately after a connection is established).\n \nTo be able to set a role as a default, one needs the\nprivileges to enable this role (if you cannot do SET ROLE X,\nyou won\'t be able to do SET DEFAULT ROLE X). To set a\ndefault role for another user one needs to have write access\nto the mysql database.\n \nTo remove a user\'s default role, use SET DEFAULT ROLE NONE\n[ FOR user@host ]. The record of the default role is not\nremoved if the role is dropped or revoked, so if the role is\nsubsequently re-created or granted, it will again be the\nuser\'s default role.\n \nThe default role is stored in a new column in the mysql.user\ntable, and currently viewing this table is the only way to\nsee which role has been assigned to a user as the default. \n \nExamples\n-------- \nSetting a default role for the current user:\n \nSET DEFAULT ROLE journalist;\n \nRemoving a default role from the current user:\n \nSET DEFAULT ROLE NONE;\n \n\n \n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/set-default-role/','','https://mariadb.com/kb/en/library/set-default-role/'),(136,'AES_ENCRYPT',12,'Syntax\n------ \nAES_ENCRYPT(str,key_str)\n \nDescription\n----------- \nAES_ENCRYPT() and AES_DECRYPT() allow encryption and\ndecryption of\ndata using the official AES (Advanced Encryption Standard)\nalgorithm,\npreviously known as \"Rijndael.\" Encoding with a 128-bit\nkey length is\nused, but you can extend it up to 256 bits by modifying the\nsource. We\nchose 128 bits because it is much faster and it is secure\nenough for\nmost purposes.\n \nAES_ENCRYPT() encrypts a string str using the key key_str,\nand returns a binary string.\n \nAES_DECRYPT() decrypts the encrypted string and returns the\noriginal\nstring.\n \nThe input arguments may be any length. If either argument is\nNULL, the result of this function is also NULL.\n \nBecause AES is a block-level algorithm, padding is used to\nencode\nuneven length strings and so the result string length may be\ncalculated using this formula:\n \n16 x (trunc(string_length / 16) + 1)\n \nIf AES_DECRYPT() detects invalid data or incorrect padding,\nit returns\nNULL. However, it is possible for AES_DECRYPT() to return a\nnon-NULL\nvalue (possibly garbage) if the input data or the key is\ninvalid.\n \nExamples\n-------- \nINSERT INTO t VALUES\n(AES_ENCRYPT(\'text\',SHA2(\'password\',512)));\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/aes_encrypt/','','https://mariadb.com/kb/en/library/aes_encrypt/'),(137,'COMPRESS',12,'Syntax\n------ \nCOMPRESS(string_to_compress)\n \nDescription\n----------- \nCompresses a string and returns the result as a binary\nstring. This\nfunction requires MariaDB to have been compiled with a\ncompression\nlibrary such as zlib. Otherwise, the return value is always\nNULL. The\ncompressed string can be uncompressed with UNCOMPRESS().\n \nThe have_compress server system variable indicates whether a\ncompression library is present. \n \nExamples\n-------- \nSELECT LENGTH(COMPRESS(REPEAT(\'a\',1000)));\n+------------------------------------+\n| LENGTH(COMPRESS(REPEAT(\'a\',1000))) |\n+------------------------------------+\n| 21 |\n+------------------------------------+\n \nSELECT LENGTH(COMPRESS(\'\'));\n+----------------------+\n| LENGTH(COMPRESS(\'\')) |\n+----------------------+\n| 0 |\n+----------------------+\n \nSELECT LENGTH(COMPRESS(\'a\'));\n+-----------------------+\n| LENGTH(COMPRESS(\'a\')) |\n+-----------------------+\n| 13 |\n+-----------------------+\n \nSELECT LENGTH(COMPRESS(REPEAT(\'a\',16)));\n+----------------------------------+\n| LENGTH(COMPRESS(REPEAT(\'a\',16))) |\n+----------------------------------+\n| 15 |\n+----------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/compress/','','https://mariadb.com/kb/en/library/compress/'),(205,'CONNECTION_ID',17,'Syntax\n------ \nCONNECTION_ID()\n \nDescription\n----------- \nReturns the connection ID (thread ID) for the connection.\nEvery\nthread (including events) has an ID that is unique among the\nset of currently\nconnected clients.\n \nUntil MariaDB 10.3.1, returns MYSQL_TYPE_LONGLONG, or\nbigint(10), in all cases. From MariaDB 10.3.1, returns\nMYSQL_TYPE_LONG, or int(10), when the result would fit\nwithin 32-bits.\n \nExamples\n-------- \nSELECT CONNECTION_ID();\n+-----------------+\n| CONNECTION_ID() |\n+-----------------+\n| 3 |\n+-----------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/connection_id/','','https://mariadb.com/kb/en/library/connection_id/'),(216,'SCHEMA',17,'Syntax\n------ \nSCHEMA()\n \nDescription\n----------- \nThis function is a synonym for DATABASE().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/schema/','','https://mariadb.com/kb/en/library/schema/'),(217,'SESSION_USER',17,'Syntax\n------ \nSESSION_USER()\n \nDescription\n----------- \nSESSION_USER() is a synonym for USER().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/session_user/','','https://mariadb.com/kb/en/library/session_user/'),(218,'SYSTEM_USER',17,'Syntax\n------ \nSYSTEM_USER()\n \nDescription\n----------- \nSYSTEM_USER() is a synonym for USER().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/system_user/','','https://mariadb.com/kb/en/library/system_user/'),(222,'<',18,'Syntax\n------ \n\n\nURL: https://mariadb.com/kb/en/library/less-than/','','https://mariadb.com/kb/en/library/less-than/'),(223,'<=',18,'Syntax\n------ \n\n\nURL: https://mariadb.com/kb/en/library/less-than-or-equal/','','https://mariadb.com/kb/en/library/less-than-or-equal/'),(228,'BETWEEN AND',18,'Syntax\n------ \nexpr BETWEEN min AND max\n \nDescription\n----------- \nIf expr is greater than or equal to min and expr is less\nthan or equal\nto max, BETWEEN returns 1, otherwise it returns 0. This is\nequivalent\nto the expression (min \n\nURL: https://mariadb.com/kb/en/library/between-and/','','https://mariadb.com/kb/en/library/between-and/'),(230,'GREATEST',18,'Syntax\n------ \nGREATEST(value1,value2,...)\n \nDescription\n----------- \nWith two or more arguments, returns the largest\n(maximum-valued)\nargument. The arguments are compared using the same rules as\nfor\nLEAST().\n \nExamples\n-------- \nSELECT GREATEST(2,0);\n+---------------+\n| GREATEST(2,0) |\n+---------------+\n| 2 |\n+---------------+\n \nSELECT GREATEST(34.0,3.0,5.0,767.0);\n+------------------------------+\n| GREATEST(34.0,3.0,5.0,767.0) |\n+------------------------------+\n| 767.0 |\n+------------------------------+\n \nSELECT GREATEST(\'B\',\'A\',\'C\');\n+-----------------------+\n| GREATEST(\'B\',\'A\',\'C\') |\n+-----------------------+\n| C |\n+-----------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/greatest/','','https://mariadb.com/kb/en/library/greatest/'),(139,'DES_DECRYPT',12,'Syntax\n------ \nDES_DECRYPT(crypt_str[,key_str])\n \nDescription\n----------- \nDecrypts a string encrypted with DES_ENCRYPT(). If an error\noccurs,\nthis function returns NULL.\n \nThis function works only if MariaDB has been configured with\nTLS\nsupport.\n \nIf no key_str argument is given, DES_DECRYPT() examines the\nfirst byte\nof the encrypted string to determine the DES key number that\nwas used\nto encrypt the original string, and then reads the key from\nthe DES\nkey file to decrypt the message. For this to work, the user\nmust have\nthe SUPER privilege. The key file can be specified with the\n--des-key-file server option.\n \nIf you pass this function a key_str argument, that string is\nused as\nthe key for decrypting the message.\n \nIf the crypt_str argument does not appear to be an encrypted\nstring,\nMariaDB returns the given crypt_str.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/des_decrypt/','','https://mariadb.com/kb/en/library/des_decrypt/'),(140,'DES_ENCRYPT',12,'Syntax\n------ \nDES_ENCRYPT(str[,{key_num|key_str}])\n \nDescription\n----------- \nEncrypts the string with the given key using the Triple-DES\nalgorithm.\n \nThis function works only if MariaDB has been configured with\nTLS support.\n \nThe encryption key to use is chosen based on the second\nargument to\nDES_ENCRYPT(), if one was given. With no argument, the first\nkey from\nthe DES key file is used. With a key_num argument, the given\nkey \nnumber (0-9) from the DES key file is used. With a key_str\nargument,\nthe given key string is used to encrypt str. \n \nThe key file can be specified with the --des-key-file server\noption.\n \nThe return string is a binary string where the first\ncharacter is \nCHAR(128 | key_num). If an error occurs, DES_ENCRYPT()\nreturns NULL.\n \nThe 128 is added to make it easier to recognize an encrypted\nkey. If\nyou use a string key, key_num is 127.\n \nThe string length for the result is given by this formula:\n \nnew_len = orig_len + (8 - (orig_len % 8)) + 1\n \nEach line in the DES key file has the following format:\n \nkey_num des_key_str\n \nEach key_num value must be a number in the range from 0 to\n9. Lines in\nthe file may be in any order. des_key_str is the string that\nis used\nto encrypt the message. There should be at least one space\nbetween the\nnumber and the key. The first key is the default key that is\nused if\nyou do not specify any key argument to DES_ENCRYPT().\n \nYou can tell MariaDB to read new key values from the key\nfile with the\nFLUSH DES_KEY_FILE statement. This requires the RELOAD\nprivilege.\n \nOne benefit of having a set of default keys is that it gives\napplications a way to check for the existence of encrypted\ncolumn\nvalues, without giving the end user the right to decrypt\nthose values.\n \nExamples\n-------- \nSELECT customer_address FROM customer_table \n WHERE crypted_credit_card =\nDES_ENCRYPT(\'credit_card_number\');\n \n\n\nURL: https://mariadb.com/kb/en/library/des_encrypt/','','https://mariadb.com/kb/en/library/des_encrypt/'),(141,'ENCODE',12,'Syntax\n------ \nENCODE(str,pass_str)\n \nDescription\n----------- \nENCODE is not considered cryptographically secure, and\nshould not be used for password encryption.\n \nEncrypt str using pass_str as the password. To decrypt the\nresult, use\nDECODE().\n \nThe result is a binary string of the same length as str.\n \nThe strength of the encryption is based on how good the\nrandom generator is. \n \nIt is not recommended to rely on the encryption performed by\nthe ENCODE function. Using a salt value (changed when a\npassword is updated) will improve matters somewhat, but for\nstoring passwords, consider a more cryptographically secure\nfunction, such as SHA2().\n \nExamples\n-------- \nENCODE(\'not so secret text\',\nCONCAT(\'random_salt\',\'password\'))\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/encode/','','https://mariadb.com/kb/en/library/encode/'),(142,'ENCRYPT',12,'Syntax\n------ \nENCRYPT(str[,salt])\n \nDescription\n----------- \nEncrypts a string using the Unix crypt() system call,\nreturning an encrypted binary string. The salt argument\nshould be a string with at least two characters or the\nreturned result will be NULL. If no salt argument is given,\na random value of sufficient length is used.\n \nIt is not recommended to use ENCRYPT() with utf16, utf32 or\nucs2 multi-byte character sets because the crypt() system\ncall expects a string terminated with a zero byte.\n \nNote that the underlying crypt() system call may have some\nlimitations, such as ignoring all but the first eight\ncharacters.\n \nIf the have_crypt system variable is set to NO (because the\ncrypt() system call is not available), the ENCRYPT function\nwill always return NULL.\n \nExamples\n-------- \nSELECT ENCRYPT(\'encrypt me\');\n+-----------------------+\n| ENCRYPT(\'encrypt me\') |\n+-----------------------+\n| 4I5BsEx0lqTDk |\n+-----------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/encrypt/','','https://mariadb.com/kb/en/library/encrypt/'),(232,'INTERVAL',18,'Syntax\n------ \nINTERVAL(N,N1,N2,N3,...)\n \nDescription\n----------- \nReturns the index of the last argument that is less than the\nfirst argument or is NULL. \n \nReturns 0 if N < N1, 1 if N < N2, 2 if N < N3 and so on or\n-1 if N is NULL. All\narguments are treated as integers. It is required that N1 <\nN2 < N3 \n\nURL: https://mariadb.com/kb/en/library/interval/','','https://mariadb.com/kb/en/library/interval/'),(235,'IS NOT NULL',18,'Syntax\n------ \nIS NOT NULL\n \nDescription\n----------- \nTests whether a value is not NULL. See also NULL Values in\nMariaDB.\n \nExamples\n-------- \nSELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;\n+---------------+---------------+------------------+\n| 1 IS NOT NULL | 0 IS NOT NULL | NULL IS NOT NULL |\n+---------------+---------------+------------------+\n| 1 | 1 | 0 |\n+---------------+---------------+------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/is-not-null/','','https://mariadb.com/kb/en/library/is-not-null/'),(237,'ISNULL',18,'Syntax\n------ \nISNULL(expr)\n \nDescription\n----------- \nIf expr is NULL, ISNULL() returns 1, otherwise it returns 0.\n \nSee also NULL Values in MariaDB.\n \nExamples\n-------- \nSELECT ISNULL(1+1);\n+-------------+\n| ISNULL(1+1) |\n+-------------+\n| 0 |\n+-------------+\n \nSELECT ISNULL(1/0);\n+-------------+\n| ISNULL(1/0) |\n+-------------+\n| 1 |\n+-------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/isnull/','','https://mariadb.com/kb/en/library/isnull/'),(241,'Operator Precedence',19,'The precedence is the order in which the SQL operators are\nevaluated.\n \nThe following list shows the SQL operator precedence.\nOperators that appear first in the list have a higher\nprecedence. Operators which are listed together have the\nsame precedence.\nINTERVAL\nBINARY, COLLATE\n!\n- (unary minus), [[bitwise-not|]] (unary bit inversion)\n|| (string concatenation)\n^\n*, /, DIV, %, MOD\n-, +\n \n&\n|\n= (comparison), , >=, >, \n\nURL: https://mariadb.com/kb/en/library/operator-precedence/','','https://mariadb.com/kb/en/library/operator-precedence/'),(242,'&',19,'Syntax\n------ \n&\n \nDescription\n----------- \nBitwise AND. Converts the values to binary and compares\nbits. Only if both the corresponding bits are 1 is the\nresulting bit also 1.\n \nSee also bitwise OR.\n \nExamples\n-------- \nSELECT 2&1;\n+-----+\n| 2&1 |\n+-----+\n| 0 |\n+-----+\n \nSELECT 3&1;\n+-----+\n| 3&1 |\n+-----+\n| 1 |\n+-----+\n \nSELECT 29 & 15;\n+---------+\n| 29 & 15 |\n+---------+\n| 13 |\n+---------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/bitwise_and/','','https://mariadb.com/kb/en/library/bitwise_and/'),(144,'OLD_PASSWORD',12,'Syntax\n------ \nOLD_PASSWORD(str)\n \nDescription\n----------- \nOLD_PASSWORD() was added to MySQL when the implementation of\n\nPASSWORD() was changed to improve security. OLD_PASSWORD()\nreturns the\nvalue of the old (pre-MySQL 4.1) implementation of\nPASSWORD() as a\nstring, and is intended to permit you to reset passwords for\nany\npre-4.1 clients that need to connect to a more recent MySQL\nserver version, or any version of MariaDB,\nwithout locking them out.\n \nAs of MariaDB 5.5, the return value is a nonbinary string in\nthe connection character set and collation, determined by\nthe values of the character_set_connection and\ncollation_connection system variables. Before 5.5, the\nreturn value was a binary string.\n \nThe return value is 16 bytes in length, or NULL if the\nargument was NULL.\n \n\n\nURL: https://mariadb.com/kb/en/library/old_password/','','https://mariadb.com/kb/en/library/old_password/'),(146,'SHA1',12,'Syntax\n------ \nSHA1(str), SHA(str)\n \nDescription\n----------- \nCalculates an SHA-1 160-bit checksum for the string str, as\ndescribed in\nRFC 3174 (Secure Hash Algorithm).\n \nThe value is returned as a string of 40 hex digits, or NULL\nif the argument was NULL. As of MariaDB 5.5, the return\nvalue is a nonbinary string in the connection character set\nand collation, determined by the values of the\ncharacter_set_connection and collation_connection system\nvariables. Before 5.5, the return value was a binary string.\n \nExamples\n-------- \nSELECT SHA1(\'some boring text\');\n+------------------------------------------+\n| SHA1(\'some boring text\') |\n+------------------------------------------+\n| af969fc2085b1bb6d31e517d5c456def5cdd7093 |\n+------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/sha1/','','https://mariadb.com/kb/en/library/sha1/'),(147,'SHA2',12,'SHA2() was introduced in MariaDB 5.5\n \nSyntax\n------ \nSHA2(str,hash_len)\n \nDescription\n----------- \nGiven a string str, calculates an SHA-2 checksum, which is\nconsidered more cryptographically secure than its SHA-1\nequivalent. The SHA-2 family includes SHA-224, SHA-256,\nSHA-384, and SHA-512, and the hash_len must correspond to\none of these, i.e. 224, 256, 384 or 512. 0 is equivalent to\n256.\n \nThe return value is a nonbinary string in the connection\ncharacter set and collation, determined by the values of the\ncharacter_set_connection and collation_connection system\nvariables. \n \nNULL is returned if the hash length is not valid, or the\nstring str is NULL.\n \nSHA2 will only work if MariaDB was has been configured with\nTLS support. \n \nExamples\n-------- \nSELECT SHA2(\'Maria\',224);\n+----------------------------------------------------------+\n| SHA2(\'Maria\',224) |\n+----------------------------------------------------------+\n| 6cc67add32286412efcab9d0e1675a43a5c2ef3cec8879f81516ff83 |\n+----------------------------------------------------------+\n \nSELECT SHA2(\'Maria\',256);\n+------------------------------------------------------------------+\n| SHA2(\'Maria\',256) |\n+------------------------------------------------------------------+\n|\n9ff18ebe7449349f358e3af0b57cf7a032c1c6b2272cb2656ff85eb112232f16\n|\n+------------------------------------------------------------------+\n \nSELECT SHA2(\'Maria\',0);\n+------------------------------------------------------------------+\n| SHA2(\'Maria\',0) |\n+------------------------------------------------------------------+\n|\n9ff18ebe7449349f358e3af0b57cf7a032c1c6b2272cb2656ff85eb112232f16\n|\n+------------------------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/sha2/','','https://mariadb.com/kb/en/library/sha2/'),(148,'UNCOMPRESS',12,'Syntax\n------ \nUNCOMPRESS(string_to_uncompress)\n \nDescription\n----------- \nUncompresses a string compressed by the COMPRESS() function.\nIf the\nargument is not a compressed value, the result is NULL. This\nfunction\nrequires MariaDB to have been compiled with a compression\nlibrary such\nas zlib. Otherwise, the return value is always NULL. The\nhave_compress server system variable indicates whether a\ncompression library is present. \n \nExamples\n-------- \nSELECT UNCOMPRESS(COMPRESS(\'a string\'));\n+----------------------------------+\n| UNCOMPRESS(COMPRESS(\'a string\')) |\n+----------------------------------+\n| a string |\n+----------------------------------+\n \nSELECT UNCOMPRESS(\'a string\');\n+------------------------+\n| UNCOMPRESS(\'a string\') |\n+------------------------+\n| NULL |\n+------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/uncompress/','','https://mariadb.com/kb/en/library/uncompress/'),(149,'UNCOMPRESSED_LENGTH',12,'Syntax\n------ \nUNCOMPRESSED_LENGTH(compressed_string)\n \nDescription\n----------- \nReturns the length that the compressed string had before\nbeing\ncompressed with COMPRESS().\n \nUNCOMPRESSED_LENGTH() returns NULL or an incorrect result if\nthe string is not compressed.\n \nUntil MariaDB 10.3.1, returns MYSQL_TYPE_LONGLONG, or\nbigint(10), in all cases. From MariaDB 10.3.1, returns\nMYSQL_TYPE_LONG, or int(10), when the result would fit\nwithin 32-bits.\n \nExamples\n-------- \nSELECT UNCOMPRESSED_LENGTH(COMPRESS(REPEAT(\'a\',30)));\n+-----------------------------------------------+\n| UNCOMPRESSED_LENGTH(COMPRESS(REPEAT(\'a\',30))) |\n+-----------------------------------------------+\n| 30 |\n+-----------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/uncompressed_length/','','https://mariadb.com/kb/en/library/uncompressed_length/'),(243,'<<',19,'Syntax\n------ \nvalue1 \n\nURL: https://mariadb.com/kb/en/library/shift-left/','','https://mariadb.com/kb/en/library/shift-left/'),(244,'>>',19,'Syntax\n------ \nvalue1 >> value2\n \nDescription\n----------- \nConverts a longlong (BIGINT) number (value1) to binary and\nshifts value2 units to the right.\n \nExamples\n-------- \nSELECT 4 >> 2;\n+--------+\n| 4 >> 2 |\n+--------+\n| 1 |\n+--------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/shift-right/','','https://mariadb.com/kb/en/library/shift-right/'),(245,'BIT_COUNT',19,'Syntax\n------ \nBIT_COUNT(N)\n \nDescription\n----------- \nReturns the number of bits that are set in the argument N.\n \nExamples\n-------- \nSELECT BIT_COUNT(29), BIT_COUNT(b\'101010\');\n+---------------+----------------------+\n| BIT_COUNT(29) | BIT_COUNT(b\'101010\') |\n+---------------+----------------------+\n| 4 | 3 |\n+---------------+----------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/bit_count/','','https://mariadb.com/kb/en/library/bit_count/'),(246,'^',19,'Syntax\n------ \n^\n \nDescription\n----------- \nBitwise XOR. Converts the values to binary and compares\nbits. If one (and only one) of the corresponding bits is 1\nis the resulting bit also 1.\n \nExamples\n-------- \nSELECT 1 ^ 1;\n+-------+\n| 1 ^ 1 |\n+-------+\n| 0 |\n+-------+\n \nSELECT 1 ^ 0;\n+-------+\n| 1 ^ 0 |\n+-------+\n| 1 |\n+-------+\n \nSELECT 11 ^ 3;\n+--------+\n| 11 ^ 3 |\n+--------+\n| 8 |\n+--------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/bitwise-xor/','','https://mariadb.com/kb/en/library/bitwise-xor/'),(247,'|',19,'Syntax\n------ \n|\n \nDescription\n----------- \nBitwise OR. Converts the values to binary and compares bits.\nIf either of the corresponding bits has a value of 1, the\nresulting bit is also 1.\n \nSee also bitwise AND.\n \nExamples\n-------- \nSELECT 2|1;\n+-----+\n| 2|1 |\n+-----+\n| 3 |\n+-----+\n \nSELECT 29 | 15;\n+---------+\n| 29 | 15 |\n+---------+\n| 31 |\n+---------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/bitwise-or/','','https://mariadb.com/kb/en/library/bitwise-or/'),(158,'GET_LOCK',14,'Syntax\n------ \nGET_LOCK(str,timeout)\n \nDescription\n----------- \nTries to obtain a lock with a name given by the string str,\nusing a timeout of timeout seconds. Returns 1 if the lock\nwas obtained successfully, 0 if the attempt timed out (for\nexample, because another client has previously locked the\nname), or NULL if an error occurred (such as running out of\nmemory or the thread was killed with mysqladmin kill).\n \nA lock is released with RELEASE_LOCK(), when the connection\nterminates (either normally or abnormally), or before\nMariaDB 10.0.2, when the connection executes another\nGET_LOCK statement. From MariaDB 10.0.2, a connection can\nhold multiple locks at the same time, so a lock that is no\nlonger needed needs to be explicitly released.\n \nThe IS_FREE_LOCK function returns whether a specified lock a\nfree or not, and the IS_USED_LOCK whether the function is in\nuse or not.\n \nLocks obtained with GET_LOCK() do not interact with\ntransactions. That is, committing a transaction does not\nrelease any such locks obtained during the transaction.\n \nFrom MariaDB 10.0.2, it is also possible to recursively set\nthe same lock. If a lock with the same name is set n times,\nit needs to be released n times as well. \n \nstr is case insensitive for GET_LOCK() and related\nfunctions. If str is an empty string or NULL, GET_LOCK()\nreturns NULL and does nothing. From MariaDB 10.2.2, timeout\nsupports microseconds. Before then, it was rounded to the\nclosest integer.\n \nIf the metadata_lock_info plugin is installed, locks\nacquired with this function are visible in the Information\nSchema METADATA_LOCK_INFO table.\n \nThis function can be used to implement application locks or\nto simulate record locks. Names are locked on a server-wide\nbasis. If a name has been locked by one client, GET_LOCK()\nblocks any request by another client for a lock with the\nsame name. This allows clients that agree on a given lock\nname to use the name to perform cooperative advisory\nlocking. But be aware that it also allows a client that is\nnot among the set of cooperating clients to lock a name,\neither inadvertently or deliberately, and thus prevent any\nof the cooperating clients from locking that name. One way\nto reduce the likelihood of this is to use lock names that\nare database-specific or application-specific. For example,\nuse lock names of the form db_name.str or app_name.str.\n \nStatements using the GET_LOCK() function are not safe for\nreplication.\n \nThe patch to permit multiple locks was contributed by\nKonstantin \"Kostja\" Osipov (MDEV-3917).\n \nExamples\n-------- \nSELECT GET_LOCK(\'lock1\',10);\n+----------------------+\n| GET_LOCK(\'lock1\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n \nSELECT IS_FREE_LOCK(\'lock1\'), IS_USED_LOCK(\'lock1\');\n+-----------------------+-----------------------+\n| IS_FREE_LOCK(\'lock1\') | IS_USED_LOCK(\'lock1\') |\n+-----------------------+-----------------------+\n| 0 | 46 |\n+-----------------------+-----------------------+\n \nSELECT IS_FREE_LOCK(\'lock2\'), IS_USED_LOCK(\'lock2\');\n+-----------------------+-----------------------+\n| IS_FREE_LOCK(\'lock2\') | IS_USED_LOCK(\'lock2\') |\n+-----------------------+-----------------------+\n| 1 | NULL |\n+-----------------------+-----------------------+\n \nFrom MariaDB 10.0.2, multiple locks can be held:\n \nSELECT GET_LOCK(\'lock2\',10);\n+----------------------+\n| GET_LOCK(\'lock2\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n \nSELECT IS_FREE_LOCK(\'lock1\'), IS_FREE_LOCK(\'lock2\');\n+-----------------------+-----------------------+\n| IS_FREE_LOCK(\'lock1\') | IS_FREE_LOCK(\'lock2\') |\n+-----------------------+-----------------------+\n| 0 | 0 |\n+-----------------------+-----------------------+\n \nSELECT RELEASE_LOCK(\'lock1\'), RELEASE_LOCK(\'lock2\');\n+-----------------------+-----------------------+\n| RELEASE_LOCK(\'lock1\') | RELEASE_LOCK(\'lock2\') |\n+-----------------------+-----------------------+\n| 1 | 1 |\n+-----------------------+-----------------------+\n \nBefore MariaDB 10.0.2, a connection could only hold a single\nlock:\n \nSELECT GET_LOCK(\'lock2\',10);\n+----------------------+\n| GET_LOCK(\'lock2\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n \nSELECT IS_FREE_LOCK(\'lock1\'), IS_FREE_LOCK(\'lock2\');\n+-----------------------+-----------------------+\n| IS_FREE_LOCK(\'lock1\') | IS_FREE_LOCK(\'lock2\') |\n+-----------------------+-----------------------+\n| 1 | 0 |\n+-----------------------+-----------------------+\n \nSELECT RELEASE_LOCK(\'lock1\'), RELEASE_LOCK(\'lock2\');\n+-----------------------+-----------------------+\n| RELEASE_LOCK(\'lock1\') | RELEASE_LOCK(\'lock2\') |\n+-----------------------+-----------------------+\n| NULL | 1 |\n+-----------------------+-----------------------+\n \nFrom MariaDB 10.0.2, it is possible to hold the same lock\nrecursively. This example is viewed using the\nmetadata_lock_info plugin:\n \nSELECT GET_LOCK(\'lock3\',10);\n+----------------------+\n| GET_LOCK(\'lock3\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n \nSELECT GET_LOCK(\'lock3\',10);\n+----------------------+\n| GET_LOCK(\'lock3\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n \nSELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO;\n \n+-----------+---------------------+---------------+-----------+--------------+------------+\n| THREAD_ID | LOCK_MODE | LOCK_DURATION | LOCK_TYPE |\nTABLE_SCHEMA | TABLE_NAME |\n+-----------+---------------------+---------------+-----------+--------------+------------+\n| 46 | MDL_SHARED_NO_WRITE | NULL | User lock | lock3 | |\n+-----------+---------------------+---------------+-----------+--------------+------------+\n \nSELECT RELEASE_LOCK(\'lock3\');\n+-----------------------+\n| RELEASE_LOCK(\'lock3\') |\n+-----------------------+\n| 1 |\n+-----------------------+\n \nSELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO;\n \n+-----------+---------------------+---------------+-----------+--------------+------------+\n| THREAD_ID | LOCK_MODE | LOCK_DURATION | LOCK_TYPE |\nTABLE_SCHEMA | TABLE_NAME |\n+-----------+---------------------+---------------+-----------+--------------+------------+\n| 46 | MDL_SHARED_NO_WRITE | NULL | User lock | lock3 | |\n+-----------+---------------------+---------------+-----------+--------------+------------+\n \nSELECT RELEASE_LOCK(\'lock3\');\n+-----------------------+\n| RELEASE_LOCK(\'lock3\') |\n+-----------------------+\n| 1 |\n+-----------------------+\n \nSELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO;\n \nEmpty set (0.000 sec)\n \nTimeout example: Connection 1:\n \nSELECT GET_LOCK(\'lock4\',10);\n+----------------------+\n| GET_LOCK(\'lock4\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n \nConnection 2:\n \nSELECT GET_LOCK(\'lock4\',10);\n \nAfter 10 seconds...\n \n+----------------------+\n| GET_LOCK(\'lock4\',10) |\n+----------------------+\n| 0 |\n+----------------------+\n \nDeadlocks are automatically detected and resolved.\nConnection 1:\n \nSELECT GET_LOCK(\'lock5\',10); \n+----------------------+\n| GET_LOCK(\'lock5\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n \nConnection 2:\n \nSELECT GET_LOCK(\'lock6\',10);\n+----------------------+\n| GET_LOCK(\'lock6\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n \nConnection 1:\n \nSELECT GET_LOCK(\'lock6\',10); \n+----------------------+\n| GET_LOCK(\'lock6\',10) |\n+----------------------+\n| 0 |\n+----------------------+\n \nConnection 2:\n \nSELECT GET_LOCK(\'lock5\',10);\nERROR 1213 (40001): Deadlock found when trying to get lock;\n try restarting transaction\n \n\n\nURL: https://mariadb.com/kb/en/library/get_lock/','','https://mariadb.com/kb/en/library/get_lock/'),(159,'INET6_ATON',14,'INET6_ATON() has been available since MariaDB 10.0.12.\n \nSyntax\n------ \nINET6_ATON(expr)\n \nDescription\n----------- \nGiven an IPv6 or IPv4 network address as a string, returns a\nbinary string that represents the numeric value of the\naddress.\n \nNo trailing zone ID\'s or traling network masks are\npermitted. For IPv4 addresses, or IPv6 addresses with IPv4\naddress parts, no classful addresses or trailing port\nnumbers are permitted and octal numbers are not supported.\n \nThe returned binary string will be VARBINARY(16) or\nVARBINARY(4) for IPv6 and IPv4 addresses respectively.\n \nReturns NULL if the argument is not understood.\n \nExamples\n-------- \nSELECT HEX(INET6_ATON(\'10.0.1.1\'));\n+-----------------------------+\n| HEX(INET6_ATON(\'10.0.1.1\')) |\n+-----------------------------+\n| 0A000101 |\n+-----------------------------+\n \nSELECT HEX(INET6_ATON(\'48f3::d432:1431:ba23:846f\'));\n+----------------------------------------------+\n| HEX(INET6_ATON(\'48f3::d432:1431:ba23:846f\')) |\n+----------------------------------------------+\n| 48F3000000000000D4321431BA23846F |\n+----------------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/inet6_aton/','','https://mariadb.com/kb/en/library/inet6_aton/'),(160,'INET6_NTOA',14,'INET6_NTOA() has been available from MariaDB 10.0.12.\n \nSyntax\n------ \nINET6_NTOA(expr)\n \nDescription\n----------- \nGiven an IPv6 or IPv4 network address as a numeric binary\nstring, returns the address as a nonbinary string in the\nconnection character set.\n \nThe return string is lowercase, and is platform independent,\nsince it does not use functions specific to the operating\nsystem. It has a maximum length of 39 characters.\n \nReturns NULL if the argument is not understood.\n \nExamples\n-------- \nSELECT INET6_NTOA(UNHEX(\'0A000101\'));\n+-------------------------------+\n| INET6_NTOA(UNHEX(\'0A000101\')) |\n+-------------------------------+\n| 10.0.1.1 |\n+-------------------------------+\n \nSELECT\nINET6_NTOA(UNHEX(\'48F3000000000000D4321431BA23846F\'));\n+-------------------------------------------------------+\n| INET6_NTOA(UNHEX(\'48F3000000000000D4321431BA23846F\')) |\n+-------------------------------------------------------+\n| 48f3::d432:1431:ba23:846f |\n+-------------------------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/inet6_ntoa/','','https://mariadb.com/kb/en/library/inet6_ntoa/'),(164,'IS_IPV4',14,'IS_IPV4() has been available since MariaDB 10.0.12.\n \nSyntax\n------ \nIS_IPV4(expr)\n \nDescription\n----------- \nIf the expression is a valid IPv4 address, returns 1,\notherwise returns 0.\n \nIS_IPV4() is stricter than INET_ATON(), but as strict as\nINET6_ATON(), in determining the validity of an IPv4\naddress. This implies that if IS_IPV4 returns 1, the same\nexpression will always return a non-NULL result when passed\nto INET_ATON(), but that the reverse may not apply.\n \nExamples\n-------- \nSELECT IS_IPV4(\'1110.0.1.1\');\n+-----------------------+\n| IS_IPV4(\'1110.0.1.1\') |\n+-----------------------+\n| 0 |\n+-----------------------+\n \nSELECT IS_IPV4(\'48f3::d432:1431:ba23:846f\');\n+--------------------------------------+\n| IS_IPV4(\'48f3::d432:1431:ba23:846f\') |\n+--------------------------------------+\n| 0 |\n+--------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/is_ipv4/','','https://mariadb.com/kb/en/library/is_ipv4/'),(165,'IS_IPV4_COMPAT',14,'IS_IPV4_COMPAT() has been available since MariaDB 10.0.12.\n \nSyntax\n------ \nIS_IPV4_COMPAT(expr)\n \nDescription\n----------- \nReturns 1 if a given numeric binary string IPv6 address,\nsuch as returned by INET6_ATON(), is IPv4-compatible,\notherwise returns 0. \n \nExamples\n-------- \nSELECT IS_IPV4_COMPAT(INET6_ATON(\'::10.0.1.1\'));\n+------------------------------------------+\n| IS_IPV4_COMPAT(INET6_ATON(\'::10.0.1.1\')) |\n+------------------------------------------+\n| 1 |\n+------------------------------------------+\n \nSELECT\nIS_IPV4_COMPAT(INET6_ATON(\'::48f3::d432:1431:ba23:846f\'));\n+-----------------------------------------------------------+\n|\nIS_IPV4_COMPAT(INET6_ATON(\'::48f3::d432:1431:ba23:846f\'))\n|\n+-----------------------------------------------------------+\n| 0 |\n+-----------------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/is_ipv4_compat/','','https://mariadb.com/kb/en/library/is_ipv4_compat/'),(166,'IS_IPV4_MAPPED',14,'IS_IPV4_MAPPED() has been available since MariaDB 10.0.12.\n \nSyntax\n------ \nIS_IPV4_MAPPED(expr)\n \nDescription\n----------- \nReturns 1 if a given a numeric binary string IPv6 address,\nsuch as returned by INET6_ATON(), is a valid IPv4-mapped\naddress, otherwise returns 0.\n \nExamples\n-------- \nSELECT IS_IPV4_MAPPED(INET6_ATON(\'::10.0.1.1\'));\n+------------------------------------------+\n| IS_IPV4_MAPPED(INET6_ATON(\'::10.0.1.1\')) |\n+------------------------------------------+\n| 0 |\n+------------------------------------------+\n \nSELECT IS_IPV4_MAPPED(INET6_ATON(\'::ffff:10.0.1.1\'));\n+-----------------------------------------------+\n| IS_IPV4_MAPPED(INET6_ATON(\'::ffff:10.0.1.1\')) |\n+-----------------------------------------------+\n| 1 |\n+-----------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/is_ipv4_mapped/','','https://mariadb.com/kb/en/library/is_ipv4_mapped/'),(248,'~',19,'Syntax\n------ \n~\n \nDescription\n----------- \nBitwise NOT. Converts the value to 4 bytes binary and\ninverts all bits.\n \nExamples\n-------- \nSELECT 3 & ~1;\n+--------+\n| 3 & ~1 |\n+--------+\n| 2 |\n+--------+\n \nSELECT 5 & ~1;\n+--------+\n| 5 & ~1 |\n+--------+\n| 4 |\n+--------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/bitwise-not/','','https://mariadb.com/kb/en/library/bitwise-not/'),(250,'TRUE FALSE',19,'Description\n----------- \nThe constants TRUE and FALSE evaluate to 1 and 0,\nrespectively. The\nconstant names can be written in any lettercase.\n \nExamples\n-------- \nSELECT TRUE, true, FALSE, false;\n \n+------+------+-------+-------+\n| TRUE | TRUE | FALSE | FALSE |\n+------+------+-------+-------+\n| 1 | 1 | 0 | 0 |\n+------+------+-------+-------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/true-false/','','https://mariadb.com/kb/en/library/true-false/'),(253,'CHECK VIEW',20,'CHECK VIEW was introduced in MariaDB 10.0.18.\n \nSyntax\n------ \nCHECK VIEW view_name\n \nDescription\n----------- \nThe CHECK VIEW statement was introduced in MariaDB 10.0.18\nto assist with fixing MDEV-6916, an issue introduced in\nMariaDB 5.2 where the view algorithms were swapped. It\nchecks whether the view algorithm is correct. It is run as\npart of mysql_upgrade, and should not normally be required\nin regular use.\n \n\n\nURL: https://mariadb.com/kb/en/library/check-view/','','https://mariadb.com/kb/en/library/check-view/'),(269,'BLOB and TEXT Data Types',22,'Description\n----------- \nA BLOB is a binary large object that can hold a variable\namount of\ndata. The four BLOB types are \nTINYBLOB,\nBLOB, \nMEDIUMBLOB, and\nLONGBLOB.\n \nThese differ only in the maximum length of the values they\ncan hold. \n \nThe TEXT types are \nTINYTEXT,\nTEXT,\nMEDIUMTEXT, and\nLONGTEXT.\nJSON (alias for LONGTEXT)\n \nThese correspond to the four BLOB types and have the same\nmaximum lengths and storage requirements.\n \nStarting from MariaDB 10.2.1, BLOB and TEXT columns can have\na DEFAULT value.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/blob-and-text-data-types/','','https://mariadb.com/kb/en/library/blob-and-text-data-types/'),(169,'MASTER_GTID_WAIT',14,'MASTER_GTID_WAIT() was included in MariaDB 10.0.9.\n \nSyntax\n------ \nMASTER_GTID_WAIT(gtid-list[, timeout)\n \nDescription\n----------- \nThis function takes a string containing a comma-separated\nlist of global transaction id\'s\n(similar to the value of, for example, gtid_binlog_pos). It\nwaits until the value of gtid_slave_pos has the same or\nhigher seq_no within all replication domains specified in\nthe gtid-list; in other words, it waits until the slave has\nreached the specified GTID position.\n \nAn optional second argument gives a timeout in seconds. If\nthe timeout\nexpires before the specified GTID position is reached, then\nthe function\nreturns -1. Passing NULL or a negative number for the\ntimeout means no timeout, and the function will wait\nindefinitely.\n \n If the wait completes without a timeout, 0 is returned.\nPassing NULL for the\n gtid-list makes the function return NULL immediately,\nwithout waiting.\n \nThe gtid-list may be the empty string, in which case\nMASTER_GTID_WAIT()\nreturns immediately. If the gtid-list contains fewer domains\nthan\ngtid_slave_pos, then only those domains are waited upon. If\ngtid-list\ncontains a domain that is not present in @@gtid_slave_pos,\nthen\nMASTER_GTID_WAIT() will wait until an event containing such\ndomain_id arrives\non the slave (or until timed out or killed).\n \nMASTER_GTID_WAIT() can be useful to ensure that a slave has\ncaught up to\na master. Simply take the value of gtid_binlog_pos on the\nmaster, and use it in a MASTER_GTID_WAIT() call on the\nslave; when the call completes, the slave\nwill have caught up with that master position.\n \nMASTER_GTID_WAIT() can also be used in client applications\ntogether with the\nlast_gtid session variable. This is useful in a\nread-scaleout replication setup, where the application\nwrites to a single master but divides the\nreads out to a number of slaves to distribute the load. In\nsuch a setup, there\nis a risk that an application could first do an update on\nthe master, and then\na bit later do a read on a slave, and if the slave is not\nfast enough, the\ndata read from the slave might not include the update just\nmade, possibly\nconfusing the application and/or the end-user. One way to\navoid this is to\nrequest the value of last_gtid on the master just after the\nupdate. Then\nbefore doing the read on the slave, do a MASTER_GTID_WAIT()\non the value\nobtained from the master; this will ensure that the read is\nnot performed\nuntil the slave has replicated sufficiently far for the\nupdate to have become\nvisible.\n \nNote that MASTER_GTID_WAIT() can be used even if the slave\nis configured not\nto use GTID for connections (CHANGE MASTER TO\nmaster_use_gtid=no). This is\nbecause from MariaDB 10, GTIDs are always logged on the\nmaster server, and\nalways recorded on the slave servers.\n \nDifferences to MASTER_POS_WAIT()\n \nMASTER_GTID_WAIT() is global; it waits for any master\nconnection to reach\n the specified GTID position. MASTER_POS_WAIT() works only\nagainst a\n specific connection. This also means that while\nMASTER_POS_WAIT() aborts if\n its master connection is terminated with STOP SLAVE or due\nto an error,\n MASTER_GTID_WAIT() continues to wait while slaves are\nstopped.\n \nMASTER_GTID_WAIT() can take its timeout as a floating-point\nvalue, so a\n timeout in fractional seconds is supported, eg.\nMASTER_GTID_WAIT(\"0-1-100\",\n 0.5). (The minimum wait is one microsecond, 0.000001\nseconds).\n \nMASTER_GTID_WAIT() allows one to specify a timeout of zero\nin order to do a\n non-blocking check to see if the slaves have progressed to\na specific GTID position\n (MASTER_POS_WAIT() takes a zero timeout as meaning an\ninfinite wait). To do\n an infinite MASTER_GTID_WAIT(), specify a negative timeout,\nor omit the\n timeout argument.\n \nMASTER_GTID_WAIT() does not return the number of events\nexecuted since the\n wait started, nor does it return NULL if a slave thread is\nstopped. It\n always returns either 0 for successful wait completed, or\n-1 for timeout\n reached (or NULL if the specified gtid-pos is NULL).\n \nSince MASTER_GTID_WAIT() looks only at the seq_no part of\nthe GTIDs, not the\nserver_id, care is needed if a slave becomes diverged from\nanother server so\nthat two different GTIDs with the same seq_no (in the same\ndomain) arrive at\nthe same server. This situation is in any case best avoided;\nsetting\ngtid_strict_mode is recommended, as this will prevent any\nsuch out-of-order sequence numbers from ever being\nreplicated on a slave.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/master_gtid_wait/','','https://mariadb.com/kb/en/library/master_gtid_wait/'),(170,'MASTER_POS_WAIT',14,'MASTER_POS_WAIT was introduced in MariaDB 10.0.9.\n \nSyntax\n------ \nMASTER_POS_WAIT(log_name,log_pos[,timeout,[\"connection_name\"]])\n \nDescription\n----------- \nThis function is useful in replication for controlling\nmaster/slave synchronization. It blocks until the slave has\nread and applied all updates up to the specified position\n(log_name,log_pos) in the master log. The return value is\nthe number of log events the slave had to wait for to\nadvance to the specified position. The function returns NULL\nif\nthe slave SQL thread is not started, the slave\'s master\ninformation is not\ninitialized, the arguments are incorrect, or an error\noccurs. It returns -1 if\nthe timeout has been exceeded. If the slave SQL thread stops\nwhile\n MASTER_POS_WAIT() is waiting, the function returns NULL. If\nthe slave is past the specified position, the function\nreturns immediately.\n \nIf a timeout value is specified, MASTER_POS_WAIT() stops\nwaiting when timeout seconds have elapsed. timeout must be\ngreater than 0; a\nzero or negative timeout means no timeout.\n \nThe connection_name is used when you are using\nmulti-source-replication. If you don\'t specify it, it\'s\nset to the value of the default_master_connection system\nvariable.\n \nStatements using the MASTER_POS_WAIT() function are not safe\nfor replication.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/master_pos_wait/','','https://mariadb.com/kb/en/library/master_pos_wait/'),(272,'CHAR BYTE',22,'Description\n----------- \nThe CHAR BYTE data type is an alias for the \nBINARY data type. This is a\ncompatibility feature.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/char-byte/','','https://mariadb.com/kb/en/library/char-byte/'),(281,'LONGBLOB',22,'Syntax\n------ \nLONGBLOB\n \nDescription\n----------- \nA BLOB column with a \nmaximum length of 4,294,967,295 bytes or 4GB (232 - 1). The\neffective maximum length of LONGBLOB columns depends on the\nconfigured maximum packet size in the client/server protocol\nand\navailable memory. Each LONGBLOB value is stored using a\nfour-byte\nlength prefix that indicates the number of bytes in the\nvalue.\n \nOracle Mode\n \nIn Oracle mode from MariaDB 10.3, BLOB is a synonym for\nLONGBLOB.\n \n\n\nURL: https://mariadb.com/kb/en/library/longblob/','','https://mariadb.com/kb/en/library/longblob/'),(283,'MEDIUMBLOB',22,'Syntax\n------ \nMEDIUMBLOB\n \nDescription\n----------- \nA BLOB column with a maximum\nlength of 16,777,215 (224 - 1) bytes.\nEach MEDIUMBLOB value is stored using a three-byte length\nprefix that\nindicates the number of bytes in the value. \n \n\n\nURL: https://mariadb.com/kb/en/library/mediumblob/','','https://mariadb.com/kb/en/library/mediumblob/'),(285,'MEDIUMTEXT',22,'Syntax\n------ \nMEDIUMTEXT [CHARACTER SET charset_name] [COLLATE\ncollation_name]\n \nDescription\n----------- \nA TEXT column with a \nmaximum length of 16,777,215 (224 - 1)\ncharacters. The effective maximum length is less if the\nvalue\ncontains multi-byte characters. Each MEDIUMTEXT value is\nstored using\na three-byte length prefix that indicates the number of\nbytes in the\nvalue.\n \n\n\nURL: https://mariadb.com/kb/en/library/mediumtext/','','https://mariadb.com/kb/en/library/mediumtext/'),(172,'RELEASE_LOCK',14,'Syntax\n------ \nRELEASE_LOCK(str)\n \nDescription\n----------- \nReleases the lock named by the string str that was obtained\nwith GET_LOCK(). Returns 1 if the lock was released, 0 if\nthe lock was not established by this thread (in which case\nthe lock is not\nreleased), and NULL if the named lock did not exist. The\nlock does not exist if it was never obtained by a call to\nGET_LOCK() or if it has previously been released.\n \nMariaDB until 10.0.1\n \nBefore 10.0.2, GET_LOCK() released the existing lock, if\nany. Since 10.0.2 this does not happen, because multiple\nlocks are allowed.\n \nstr is case insensitive. If str is an empty string or NULL,\nRELEASE_LOCK() returns NULL and does nothing.\n \nStatements using the RELEASE_LOCK() function are not safe\nfor replication.\n \nThe DO statement is convenient to use with RELEASE_LOCK().\n \nExamples\n-------- \nConnection1:\n \nSELECT GET_LOCK(\'lock1\',10);\n+----------------------+\n| GET_LOCK(\'lock1\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n \nConnection 2:\n \nSELECT GET_LOCK(\'lock2\',10);\n+----------------------+\n| GET_LOCK(\'lock2\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n \nConnection 1:\n \nSELECT RELEASE_LOCK(\'lock1\'), RELEASE_LOCK(\'lock2\'),\nRELEASE_LOCK(\'lock3\');\n+-----------------------+-----------------------+-----------------------+\n| RELEASE_LOCK(\'lock1\') | RELEASE_LOCK(\'lock2\') |\nRELEASE_LOCK(\'lock3\') |\n+-----------------------+-----------------------+-----------------------+\n| 1 | 0 | NULL |\n+-----------------------+-----------------------+-----------------------+\n \nFrom MariaDB 10.0.2, it is possible to hold the same lock\nrecursively. This example is viewed using the\nmetadata_lock_info plugin:\n \nSELECT GET_LOCK(\'lock3\',10);\n+----------------------+\n| GET_LOCK(\'lock3\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n \nSELECT GET_LOCK(\'lock3\',10);\n+----------------------+\n| GET_LOCK(\'lock3\',10) |\n+----------------------+\n| 1 |\n+----------------------+\n \nSELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO;\n \n+-----------+---------------------+---------------+-----------+--------------+------------+\n| THREAD_ID | LOCK_MODE | LOCK_DURATION | LOCK_TYPE |\nTABLE_SCHEMA | TABLE_NAME |\n+-----------+---------------------+---------------+-----------+--------------+------------+\n| 46 | MDL_SHARED_NO_WRITE | NULL | User lock | lock3 | |\n+-----------+---------------------+---------------+-----------+--------------+------------+\n \nSELECT RELEASE_LOCK(\'lock3\');\n+-----------------------+\n| RELEASE_LOCK(\'lock3\') |\n+-----------------------+\n| 1 |\n+-----------------------+\n \nSELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO;\n \n+-----------+---------------------+---------------+-----------+--------------+------------+\n| THREAD_ID | LOCK_MODE | LOCK_DURATION | LOCK_TYPE |\nTABLE_SCHEMA | TABLE_NAME |\n+-----------+---------------------+---------------+-----------+--------------+------------+\n| 46 | MDL_SHARED_NO_WRITE | NULL | User lock | lock3 | |\n+-----------+---------------------+---------------+-----------+--------------+------------+\n \nSELECT RELEASE_LOCK(\'lock3\');\n+-----------------------+\n| RELEASE_LOCK(\'lock3\') |\n+-----------------------+\n| 1 |\n+-----------------------+\n \nSELECT * FROM INFORMATION_SCHEMA.METADATA_LOCK_INFO;\n \nEmpty set (0.000 sec)\n \n\n\nURL: https://mariadb.com/kb/en/library/release_lock/','','https://mariadb.com/kb/en/library/release_lock/'),(174,'UUID',14,'Syntax\n------ \nUUID()\n \nDescription\n----------- \nReturns a Universal Unique Identifier (UUID) generated\naccording to \"DCE 1.1:\nRemote Procedure Call\" (Appendix A) CAE (Common\nApplications Environment)\nSpecifications published by The Open Group in October\n1997 \n(Document Number C706).\n \nA UUID is designed as a number that is globally unique in\nspace and time. Two\ncalls to UUID() are expected to generate two different\nvalues, even if these calls are performed on two separate\ncomputers that are\nnot connected to each other.\n \nA UUID is a 128-bit number represented by a utf8 string of\nfive\nhexadecimal numbers in aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\nformat:\nThe first three numbers are generated from a timestamp.\nThe fourth number preserves temporal uniqueness in case the\ntimestamp value\n loses monotonicity (for example, due to daylight saving\ntime).\nThe fifth number is an IEEE 802 node number that provides\nspatial uniqueness.\n A random number is substituted if the latter is not\navailable (for example,\n because the host computer has no Ethernet card, or we do\nnot know how to find\n the hardware address of an interface on your operating\nsystem). In this case,\n spatial uniqueness cannot be guaranteed. Nevertheless, a\ncollision should\n have very low probability.\n \nCurrently, the MAC address of an interface is taken into\naccount only on FreeBSD and Linux. On other operating\nsystems, MariaDB uses a randomly generated 48-bit number.\n \nStatements using the UUID() function are not safe for\nreplication.\n \nUUID() results are intended to be unique, but cannot always\nbe relied upon to unpredictable and unguessable, so should\nnot be relied upon for these purposes.\n \nExamples\n-------- \nSELECT UUID();\n+--------------------------------------+\n| UUID() |\n+--------------------------------------+\n| cd41294a-afb0-11df-bc9b-00241dd75637 |\n+--------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/uuid/','','https://mariadb.com/kb/en/library/uuid/'),(287,'ROW',22,'The ROW data type was introduced in MariaDB 10.3.0.\n \nSyntax\n------ \nROW ( [{, }... ])\n \nDescription\n----------- \nROW is a data type for stored procedure variables.\n \nFeatures\n \nROW fields as normal variables\n \nROW fields (members) act as normal variables, and are able\nto appear in all\nquery parts where a stored procedure variable is allowed:\nAssignment is using the := operator and the SET command:\n \na.x:= 10;\n \na.x:= b.x;\n \nSET a.x= 10, a.y=20, a.z= b.z;\n \nPassing to functions and operators:\n \nSELECT f1(rec.a), rec.a\n\nURL: https://mariadb.com/kb/en/library/row/','','https://mariadb.com/kb/en/library/row/'),(288,'SET Data Type',22,'Syntax\n------ \nSET(\'value1\',\'value2\',...) [CHARACTER SET charset_name]\n[COLLATE collation_name]\n \nDescription\n----------- \nA set. A string object that can have zero or more values,\neach of\nwhich must be chosen from the list of values \'value1\',\n\'value2\', ... A\nSET column can have a maximum of 64 members. SET values are\nrepresented internally as integers.\n \n\n\nURL: https://mariadb.com/kb/en/library/set-data-type/','','https://mariadb.com/kb/en/library/set-data-type/'),(293,'TIMESTAMP',22,'Syntax\n------ \nTIMESTAMP [(\n\nURL: https://mariadb.com/kb/en/library/timestamp/','','https://mariadb.com/kb/en/library/timestamp/'),(294,'TINYBLOB',22,'Syntax\n------ \nTINYBLOB\n \nDescription\n----------- \nA BLOB column with a maximum length of \n255 (28 - 1) bytes. Each\nTINYBLOB value is stored using a one-byte length prefix that\nindicates\nthe number of bytes in the value.\n \n\n\nURL: https://mariadb.com/kb/en/library/tinyblob/','','https://mariadb.com/kb/en/library/tinyblob/'),(296,'TINYTEXT',22,'Syntax\n------ \nTINYTEXT [CHARACTER SET charset_name] [COLLATE\ncollation_name]\n \nDescription\n----------- \nA TEXT column with a maximum length of 255 (28 - 1)\ncharacters. The effective maximum length is less if the\nvalue contains multi-byte characters. Each TINYTEXT value is\nstored using a one-byte length prefix that indicates the\nnumber of bytes in the value.\n \n\n\nURL: https://mariadb.com/kb/en/library/tinytext/','','https://mariadb.com/kb/en/library/tinytext/'),(176,'VALUES / VALUE',14,'Syntax\n------ \nVALUE(col_name) \n \nMariaDB until 10.3.2\n \nVALUES(col_name) \n \nDescription\n----------- \nIn an INSERT ... ON DUPLICATE KEY UPDATE statement, you can\nuse the VALUES(col_name) function in the UPDATE clause to\nrefer to column values from the INSERT portion of the\nstatement. In other words, VALUES(col_name) in the UPDATE\nclause refers to the value of col_name that would be\ninserted, had no duplicate-key conflict occurred. This\nfunction is especially useful in multiple-row inserts.\n \nThe VALUES() function is meaningful only in INSERT ... ON\nDUPLICATE KEY UPDATE statements and returns NULL otherwise.\n \nIn MariaDB 10.3.3 this function was renamed to VALUE(),\nbecause it\'s incompatible with the standard Table Value\nConstructors syntax, implemented in MariaDB 10.3.3.\n \nThe VALUES() function can still be used even from MariaDB\n10.3.3, but only in INSERT ... ON DUPLICATE KEY UPDATE\nstatements; it\'s a syntax error otherwise.\n \nExamples\n-------- \nINSERT INTO t (a,b,c) VALUES (1,2,3),(4,5,6)\n ON DUPLICATE KEY UPDATE c=VALUE(a)+VALUE(b);\n \nMariaDB until 10.3.2\n \nINSERT INTO t (a,b,c) VALUES (1,2,3),(4,5,6)\n ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/values-value/','','https://mariadb.com/kb/en/library/values-value/'),(179,'||',15,'Syntax\n------ \nOR, ||\n \nDescription\n----------- \nLogical OR. When both operands are non-NULL, the result is 1\nif any\noperand is non-zero, and 0 otherwise. With a NULL operand,\nthe result\nis 1 if the other operand is non-zero, and NULL otherwise.\nIf both\noperands are NULL, the result is NULL.\n \nFor this operator, short-circuit evaluation can be used.\n \nNote that, if the PIPES_AS_CONCAT SQL_MODE is set, || is\nused as a string concatenation operator. This means that a\n|| b is the same as CONCAT(a,b). See CONCAT() for details.\n \nOracle Mode\n \nIn Oracle mode from MariaDB 10.3, || ignores NULL.\n \nExamples\n-------- \nSELECT 1 || 1;\n \n+--------+\n| 1 || 1 |\n+--------+\n| 1 |\n+--------+\n \nSELECT 1 || 0;\n \n+--------+\n| 1 || 0 |\n+--------+\n| 1 |\n+--------+\n \nSELECT 0 || 0;\n \n+--------+\n| 0 || 0 |\n+--------+\n| 0 |\n+--------+\n \nSELECT 0 || NULL;\n \n+-----------+\n| 0 || NULL |\n+-----------+\n| NULL |\n+-----------+\n \nSELECT 1 || NULL;\n \n+-----------+\n| 1 || NULL |\n+-----------+\n| 1 |\n+-----------+\n \nIn Oracle mode, from MariaDB 10.3:\n \nSELECT 0 || NULL;\n \n+-----------+\n| 0 || NULL |\n+-----------+\n| 0 |\n+-----------+\n \n\n\nURL: https://mariadb.com/kb/en/library/or/','','https://mariadb.com/kb/en/library/or/'),(180,'XOR',15,'Syntax\n------ \nXOR\n \nDescription\n----------- \nXOR stands for eXclusive OR. Returns NULL if either operand\nis NULL. For non-NULL\noperands, evaluates to 1 if an odd number of operands is\nnon-zero,\notherwise 0 is returned.\n \nExamples\n-------- \nSELECT 1 XOR 1;\n \n+---------+\n| 1 XOR 1 |\n+---------+\n| 0 |\n+---------+\n \nSELECT 1 XOR 0;\n \n+---------+\n| 1 XOR 0 |\n+---------+\n| 1 |\n+---------+\n \nSELECT 1 XOR NULL;\n \n+------------+\n| 1 XOR NULL |\n+------------+\n| NULL |\n+------------+\n \nIn the following example, the right 1 XOR 1 is evaluated\nfirst, and returns 0. Then, 1 XOR 0 is evaluated, and 1 is\nreturned.\n \nSELECT 1 XOR 1 XOR 1;\n \n+---------------+\n| 1 XOR 1 XOR 1 |\n+---------------+\n| 1 |\n+---------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/xor/','','https://mariadb.com/kb/en/library/xor/'),(181,'Assignment Operator (=)',15,'Syntax\n------ \nidentifier = expr\n \nDescription\n----------- \nThe equal sign is used as both an assignment operator in\ncertain contexts, and as a comparison operator. When used as\nassignment operator, the value on the right is assigned to\nthe variable (or column, in some contexts) on the left.\n \nSince its use can be ambiguous, unlike the := assignment\noperator, the = assignment operator cannot be used in all\ncontexts, and is only valid as part of a SET statement, or\nthe SET clause of an UPDATE statement\n \nThis operator works with both user-defined variables and\nlocal variables.\n \nExamples\n-------- \nUPDATE table_name SET x = 2 WHERE x > 100;\n \nSET @x = 1, @y := 2;\n \n\n \n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/assignment-operators-assignment-operator/','','https://mariadb.com/kb/en/library/assignment-operators-assignment-operator/'),(183,'Stored Aggregate Functions',16,'The ability to create stored aggregate functions was added\nin MariaDB 10.3.3.\n \nAggregate functions are functions that are computed over a\nsequence of rows and return one result for the sequence of\nrows.\n \nCreating a custom aggregate function is done using the\nCREATE FUNCTION statement with two main differences:\nThe addition of the AGGREGATE keyword, so CREATE AGGREGATE\nFUNCTION\nThe FETCH GROUP NEXT ROW instruction inside the loop\nOracle PL/SQL compatibility using SQL/PL is provided\n \nStandard Syntax\n \nCREATE AGGREGATE FUNCTION function_name (parameters) RETURNS\nreturn_type\nBEGIN\n All types of declarations\n DECLARE CONTINUE HANDLER FOR NOT FOUND RETURN return_val;\n LOOP\n FETCH GROUP NEXT ROW; // fetches next row from table\n other instructions\n END LOOP;\nEND\n \nStored aggregate functions were a 2016 Google Summer of Code\nproject by Varun Gupta.\n \nUsing SQL/PL\n \nSET sql_mode=Oracle;\nDELIMITER //\n \nCREATE AGGREGATE FUNCTION function_name (parameters) RETURN\nreturn_type\n declarations\nBEGIN\n LOOP\n FETCH GROUP NEXT ROW; -- fetches next row from table\n -- other instructions\n \n END LOOP;\nEXCEPTION\n WHEN NO_DATA_FOUND THEN\n RETURN return_val;\nEND //\n \nDELIMITER ;\n \nExamples\n-------- \nFirst a simplified example:\n \nCREATE TABLE marks(stud_id INT, grade_count INT);\n \nINSERT INTO marks VALUES (1,6), (2,4), (3,7), (4,5), (5,8);\n \nSELECT * FROM marks;\n \n+---------+-------------+\n| stud_id | grade_count |\n+---------+-------------+\n| 1 | 6 |\n| 2 | 4 |\n| 3 | 7 |\n| 4 | 5 |\n| 5 | 8 |\n+---------+-------------+\n \nDELIMITER //\nCREATE AGGREGATE FUNCTION IF NOT EXISTS aggregate_count(x\nINT) RETURNS INT\nBEGIN\n DECLARE count_students INT DEFAULT 0;\n \n DECLARE CONTINUE HANDLER FOR NOT FOUND\n RETURN count_students;\n \n LOOP\n FETCH GROUP NEXT ROW;\n \n IF x THEN\n SET count_students = count_students+1;\n \n END IF;\n \n END LOOP;\n \nEND //\nDELIMITER ;\n \nA non-trivial example that cannot easily be rewritten using\nexisting functions:\n \nDELIMITER //\nCREATE AGGREGATE FUNCTION medi_int(x INT) RETURNS DOUBLE\nBEGIN\n DECLARE CONTINUE HANDLER FOR NOT FOUND\n BEGIN\n DECLARE res DOUBLE;\n \n DECLARE cnt INT DEFAULT (SELECT COUNT(*) FROM tt);\n DECLARE lim INT DEFAULT (cnt-1) DIV 2;\n \n IF cnt % 2 = 0 THEN\n SET res = (SELECT AVG(a) FROM (SELECT a FROM tt ORDER BY a\nLIMIT lim,2) ttt);\n ELSE\n SET res = (SELECT a FROM tt ORDER BY a LIMIT lim,1);\n END IF;\n \n DROP TEMPORARY TABLE tt;\n \n RETURN res;\n \n END;\n \n CREATE TEMPORARY TABLE tt (a INT);\n LOOP\n FETCH GROUP NEXT ROW;\n \n INSERT INTO tt VALUES (x);\n END LOOP;\n \nEND //\nDELIMITER ;\n \nSQL/PL Example\n \nThis uses the same marks table as created above.\n \nSET sql_mode=Oracle;\n \nDELIMITER //\n \nCREATE AGGREGATE FUNCTION aggregate_count(x INT) RETURN INT\nAS count_students INT DEFAULT 0;\n \nBEGIN\n LOOP\n FETCH GROUP NEXT ROW;\n \n IF x THEN\n SET count_students := count_students+1;\n \n END IF;\n \n END LOOP;\n \nEXCEPTION\n WHEN NO_DATA_FOUND THEN\n RETURN count_students;\n \nEND aggregate_count //\nDELIMITER ;\n \nSELECT aggregate_count(stud_id) FROM marks;\n \n\n\nURL:\nhttps://mariadb.com/kb/en/library/stored-aggregate-functions/','','https://mariadb.com/kb/en/library/stored-aggregate-functions/'),(184,'AVG',16,'Syntax\n------ \nAVG([DISTINCT] expr)\n \nDescription\n----------- \nReturns the average value of expr. The DISTINCT option can\nbe used to return the average of the distinct values of\nexpr. NULL values are ignored. It is an aggregate function,\nand so can be used with the GROUP BY clause.\n \nAVG() returns NULL if there were no matching rows.\n \nFrom MariaDB 10.2.0, AVG() can be used as a window function.\n \nExamples\n-------- \nCREATE TABLE sales (sales_value INT);\n \nINSERT INTO sales VALUES(10),(20),(20),(40);\n \nSELECT AVG(sales_value) FROM sales;\n \n+------------------+\n| AVG(sales_value) |\n+------------------+\n| 22.5000 |\n+------------------+\n \nSELECT AVG(DISTINCT(sales_value)) FROM sales;\n \n+----------------------------+\n| AVG(DISTINCT(sales_value)) |\n+----------------------------+\n| 23.3333 |\n+----------------------------+\n \nCommonly, AVG() is used with a GROUP BY clause:\n \nCREATE TABLE student (name CHAR(10), test CHAR(10), score\nTINYINT); \n \nINSERT INTO student VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73), \n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31), \n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88), \n (\'Tatiana\', \'SQL\', 87), (\'Tatiana\', \'Tuning\', 83);\n \nSELECT name, AVG(score) FROM student GROUP BY name;\n \n+---------+------------+\n| name | AVG(score) |\n+---------+------------+\n| Chun | 74.0000 |\n| Esben | 37.0000 |\n| Kaolin | 72.0000 |\n| Tatiana | 85.0000 |\n+---------+------------+\n \nBe careful to avoid this common mistake, not grouping\ncorrectly and returning mismatched data: \n \nSELECT name,test,AVG(score) FROM student;\n \n+------+------+------------+\n| name | test | MIN(score) |\n+------+------+------------+\n| Chun | SQL | 31 |\n+------+------+------------+\n \nAs a window function:\n \nCREATE TABLE student_test (name CHAR(10), test CHAR(10),\nscore TINYINT); \n \nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73), \n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31), \n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88), \n (\'Tatiana\', \'SQL\', 87), (\'Tatiana\', \'Tuning\', 83);\n \nSELECT name, test, score, AVG(score) OVER (PARTITION BY\ntest) \n AS average_by_test FROM student_test;\n \n+---------+--------+-------+-----------------+\n| name | test | score | average_by_test |\n+---------+--------+-------+-----------------+\n| Chun | SQL | 75 | 65.2500 |\n| Chun | Tuning | 73 | 68.7500 |\n| Esben | SQL | 43 | 65.2500 |\n| Esben | Tuning | 31 | 68.7500 |\n| Kaolin | SQL | 56 | 65.2500 |\n| Kaolin | Tuning | 88 | 68.7500 |\n| Tatiana | SQL | 87 | 65.2500 |\n| Tatiana | Tuning | 83 | 68.7500 |\n+---------+--------+-------+-----------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/avg/','','https://mariadb.com/kb/en/library/avg/'),(185,'BIT_AND',16,'Syntax\n------ \nBIT_AND(expr)\n \nDescription\n----------- \nReturns the bitwise AND of all bits in expr. The calculation\nis performed with 64-bit (BIGINT) precision. It is an\naggregate function, and so can be used with the GROUP BY\nclause.\n \nFrom MariaDB 10.2.0, BIT_AND() can be used as a window\nfunction.\n \nExamples\n-------- \nCREATE TABLE vals (x INT);\n \nINSERT INTO vals VALUES(111),(110),(100);\n \nSELECT BIT_AND(x), BIT_OR(x), BIT_XOR(x) FROM vals;\n \n+------------+-----------+------------+\n| BIT_AND(x) | BIT_OR(x) | BIT_XOR(x) |\n+------------+-----------+------------+\n| 100 | 111 | 101 |\n+------------+-----------+------------+\n \nAs an aggregate function:\n \nCREATE TABLE vals2 (category VARCHAR(1), x INT);\n \nINSERT INTO vals2 VALUES\n (\'a\',111),(\'a\',110),(\'a\',100),\n (\'b\',\'000\'),(\'b\',001),(\'b\',011);\n \nSELECT category, BIT_AND(x), BIT_OR(x), BIT_XOR(x) \n FROM vals GROUP BY category;\n \n+----------+------------+-----------+------------+\n| category | BIT_AND(x) | BIT_OR(x) | BIT_XOR(x) |\n+----------+------------+-----------+------------+\n| a | 100 | 111 | 101 |\n| b | 0 | 11 | 10 |\n+----------+------------+-----------+------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/bit_and/','','https://mariadb.com/kb/en/library/bit_and/'),(186,'BIT_OR',16,'Syntax\n------ \nBIT_OR(expr)\n \nDescription\n----------- \nReturns the bitwise OR of all bits in expr. The calculation\nis performed with 64-bit (BIGINT) precision. It is an\naggregate function, and so can be used with the GROUP BY\nclause.\n \nFrom MariaDB 10.2.0, BIT_OR can be used as a window\nfunction.\n \nExamples\n-------- \nCREATE TABLE vals (x INT);\n \nINSERT INTO vals VALUES(111),(110),(100);\n \nSELECT BIT_AND(x), BIT_OR(x), BIT_XOR(x) FROM vals;\n \n+------------+-----------+------------+\n| BIT_AND(x) | BIT_OR(x) | BIT_XOR(x) |\n+------------+-----------+------------+\n| 100 | 111 | 101 |\n+------------+-----------+------------+\n \nAs an aggregate function:\n \nCREATE TABLE vals2 (category VARCHAR(1), x INT);\n \nINSERT INTO vals2 VALUES\n (\'a\',111),(\'a\',110),(\'a\',100),\n (\'b\',\'000\'),(\'b\',001),(\'b\',011);\n \nSELECT category, BIT_AND(x), BIT_OR(x), BIT_XOR(x) \n FROM vals GROUP BY category;\n \n+----------+------------+-----------+------------+\n| category | BIT_AND(x) | BIT_OR(x) | BIT_XOR(x) |\n+----------+------------+-----------+------------+\n| a | 100 | 111 | 101 |\n| b | 0 | 11 | 10 |\n+----------+------------+-----------+------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/bit_or/','','https://mariadb.com/kb/en/library/bit_or/'),(302,'CLOSE',23,'Syntax\n------ \nCLOSE cursor_name\n \nDescription\n----------- \nThis statement closes a previously opened cursor. The cursor\nmust have been previously opened or else an error occurs.\n \nIf not closed explicitly, a cursor is closed at the end of\nthe\ncompound statement in which it was declared.\n \nSee Cursor Overview for an example.\n \n\n\nURL: https://mariadb.com/kb/en/library/close/','','https://mariadb.com/kb/en/library/close/'),(304,'DECLARE CURSOR',23,'Syntax\n------ \n\n\nURL: https://mariadb.com/kb/en/library/declare-cursor/','','https://mariadb.com/kb/en/library/declare-cursor/'),(307,'FETCH',23,'Syntax\n------ \nFETCH cursor_name INTO var_name [, var_name] ...\n \nDescription\n----------- \nThis statement fetches the next row (if a row exists) using\nthe\nspecified open cursor, and advances the cursor pointer.\n \nvar_name can be a local variable, but not a user-defined\nvariable.\n \nIf no more rows are available, a No Data condition occurs\nwith\nSQLSTATE value 02000. To detect this condition, you can set\nup a\nhandler for it (or for a NOT FOUND condition).\n \nSee Cursor Overview for an example.\n \n\n\nURL: https://mariadb.com/kb/en/library/fetch/','','https://mariadb.com/kb/en/library/fetch/'),(309,'GOTO',23,'The GOTO statement was introduced in MariaDB 10.3 for Oracle\ncompatibility.\n \nSyntax\n------ \nGOTO label\n \nDescription\n----------- \nThe GOTO statement causes the code to jump to the specified\nlabel, and continue operating from there. It is only\naccepted when in Oracle mode.\n \nExample\n \nSET sql_mode=ORACLE;\n \nDELIMITER //\n \nCREATE OR REPLACE PROCEDURE p1 AS\n \nBEGIN\n \n SELECT 1;\n \n GOTO label;\n \n SELECT 2;\n \n SELECT 3;\n \nEND;\n \n//\n \nDELIMITER \n \ncall p1();\n+---+\n| 1 |\n+---+\n| 1 |\n+---+\n1 row in set (0.000 sec)\n \n+---+\n| 3 |\n+---+\n| 3 |\n+---+\n1 row in set (0.000 sec)\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/goto/','','https://mariadb.com/kb/en/library/goto/'),(310,'IF',23,'Syntax\n------ \nIF search_condition THEN statement_list\n [ELSEIF search_condition THEN statement_list] ...\n [ELSE statement_list]\nEND IF;\n \nDescription\n----------- \nIF implements a basic conditional construct. If the\nsearch_condition\nevaluates to true, the corresponding SQL statement list is\nexecuted.\nIf no search_condition matches, the statement list in the\nELSE clause\nis executed. Each statement_list consists of one or more\nstatements.\n \n\n\nURL: https://mariadb.com/kb/en/library/if/','','https://mariadb.com/kb/en/library/if/'),(187,'BIT_XOR',16,'Syntax\n------ \nBIT_XOR(expr)\n \nDescription\n----------- \nReturns the bitwise XOR of all bits in expr. The calculation\nis performed with 64-bit (BIGINT) precision. It is an\naggregate function, and so can be used with the GROUP BY\nclause.\n \nFrom MariaDB 10.2.0, BIT_XOR() can be used as a window\nfunction.\n \nExamples\n-------- \nCREATE TABLE vals (x INT);\n \nINSERT INTO vals VALUES(111),(110),(100);\n \nSELECT BIT_AND(x), BIT_OR(x), BIT_XOR(x) FROM vals;\n \n+------------+-----------+------------+\n| BIT_AND(x) | BIT_OR(x) | BIT_XOR(x) |\n+------------+-----------+------------+\n| 100 | 111 | 101 |\n+------------+-----------+------------+\n \nAs an aggregate function:\n \nCREATE TABLE vals2 (category VARCHAR(1), x INT);\n \nINSERT INTO vals2 VALUES\n (\'a\',111),(\'a\',110),(\'a\',100),\n (\'b\',\'000\'),(\'b\',001),(\'b\',011);\n \nSELECT category, BIT_AND(x), BIT_OR(x), BIT_XOR(x) \n FROM vals GROUP BY category;\n \n+----------+------------+-----------+------------+\n| category | BIT_AND(x) | BIT_OR(x) | BIT_XOR(x) |\n+----------+------------+-----------+------------+\n| a | 100 | 111 | 101 |\n| b | 0 | 11 | 10 |\n+----------+------------+-----------+------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/bit_xor/','','https://mariadb.com/kb/en/library/bit_xor/'),(188,'COUNT',16,'Syntax\n------ \nCOUNT(expr)\n \nDescription\n----------- \nReturns a count of the number of non-NULL values of expr in\nthe rows retrieved by a SELECT statement. The result is a\nBIGINT value. It is an aggregate function, and so can be\nused with the GROUP BY clause.\n \nCOUNT(*) counts the total number of rows in a table.\n \nCOUNT() returns 0 if there were no matching rows.\n \nFrom MariaDB 10.2.0, COUNT() can be used as a window\nfunction.\n \nExamples\n-------- \nCREATE TABLE student (name CHAR(10), test CHAR(10), score\nTINYINT); \n \nINSERT INTO student VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73), \n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31), \n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88), \n (\'Tatiana\', \'SQL\', 87), (\'Tatiana\', \'Tuning\', 83);\n \nSELECT COUNT(*) FROM student;\n \n+----------+\n| COUNT(*) |\n+----------+\n| 8 |\n+----------+\n \nCOUNT(DISTINCT) example:\n \nSELECT COUNT(DISTINCT (name)) FROM student;\n \n+------------------------+\n| COUNT(DISTINCT (name)) |\n+------------------------+\n| 4 |\n+------------------------+\n \nAs a window function\n \nCREATE OR REPLACE TABLE student_test (name CHAR(10), test\nCHAR(10), score TINYINT);\n \nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73), \n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31), \n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88), \n (\'Tatiana\', \'SQL\', 87);\n \nSELECT name, test, score, COUNT(score) OVER (PARTITION BY\nname) \n AS tests_written FROM student_test;\n \n+---------+--------+-------+---------------+\n| name | test | score | tests_written |\n+---------+--------+-------+---------------+\n| Chun | SQL | 75 | 2 |\n| Chun | Tuning | 73 | 2 |\n| Esben | SQL | 43 | 2 |\n| Esben | Tuning | 31 | 2 |\n| Kaolin | SQL | 56 | 2 |\n| Kaolin | Tuning | 88 | 2 |\n| Tatiana | SQL | 87 | 1 |\n+---------+--------+-------+---------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/count/','','https://mariadb.com/kb/en/library/count/'),(190,'MAX',16,'Syntax\n------ \nMAX([DISTINCT] expr)\n \nDescription\n----------- \nReturns the largest, or maximum, value of expr. MAX() can\nalso take a string\nargument in which case it returns the maximum string value.\nThe DISTINCT\nkeyword can be used to find the maximum of the distinct\nvalues of expr,\nhowever, this produces the same result as omitting DISTINCT.\n \nNote that SET and ENUM fields are currently compared by\ntheir string value rather than their relative position in\nthe set, so MAX() may produce a different highest result\nthan ORDER BY DESC.\n \nIt is an aggregate function, and so can be used with the\nGROUP BY clause.\n \nFrom MariaDB 10.2.2, MAX() can be used as a window function.\n \nMAX() returns NULL if there were no matching rows.\n \nExamples\n-------- \nCREATE TABLE student (name CHAR(10), test CHAR(10), score\nTINYINT); \n \nINSERT INTO student VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73), \n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31), \n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88), \n (\'Tatiana\', \'SQL\', 87), (\'Tatiana\', \'Tuning\', 83);\n \nSELECT name, MAX(score) FROM student GROUP BY name;\n \n+---------+------------+\n| name | MAX(score) |\n+---------+------------+\n| Chun | 75 |\n| Esben | 43 |\n| Kaolin | 88 |\n| Tatiana | 87 |\n+---------+------------+\n \nMAX string:\n \nSELECT MAX(name) FROM student;\n \n+-----------+\n| MAX(name) |\n+-----------+\n| Tatiana |\n+-----------+\n \nBe careful to avoid this common mistake, not grouping\ncorrectly and returning mismatched data: \n \nSELECT name,test,MAX(SCORE) FROM student;\n \n+------+------+------------+\n| name | test | MAX(SCORE) |\n+------+------+------------+\n| Chun | SQL | 88 |\n+------+------+------------+\n \nDifference between ORDER BY DESC and MAX():\n \nCREATE TABLE student2(name CHAR(10),grade\nENUM(\'b\',\'c\',\'a\'));\n \nINSERT INTO student2\nVALUES(\'Chun\',\'b\'),(\'Esben\',\'c\'),(\'Kaolin\',\'a\');\n \nSELECT MAX(grade) FROM student2;\n \n+------------+\n| MAX(grade) |\n+------------+\n| c |\n+------------+\n \nSELECT grade FROM student2 ORDER BY grade DESC LIMIT 1;\n \n+-------+\n| grade |\n+-------+\n| a |\n+-------+\n \nAs a window function:\n \nCREATE OR REPLACE TABLE student_test (name CHAR(10), test\nCHAR(10), score TINYINT);\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73), \n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31), \n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88), \n (\'Tatiana\', \'SQL\', 87);\n \nSELECT name, test, score, MAX(score) \n OVER (PARTITION BY name) AS highest_score FROM\nstudent_test;\n \n+---------+--------+-------+---------------+\n| name | test | score | highest_score |\n+---------+--------+-------+---------------+\n| Chun | SQL | 75 | 75 |\n| Chun | Tuning | 73 | 75 |\n| Esben | SQL | 43 | 43 |\n| Esben | Tuning | 31 | 43 |\n| Kaolin | SQL | 56 | 88 |\n| Kaolin | Tuning | 88 | 88 |\n| Tatiana | SQL | 87 | 87 |\n+---------+--------+-------+---------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/max/','','https://mariadb.com/kb/en/library/max/'),(311,'ITERATE',23,'Syntax\n------ \nITERATE label\n \nITERATE can appear only within LOOP, REPEAT, and WHILE\nstatements.\nITERATE means \"do the loop again\", and uses the\nstatement\'s label to determine which statements to repeat.\nThe label must be in the same stored program, not in a\ncaller procedure.\n \nIf you try to use ITERATE with a non-existing label, or if\nthe label is associated to a construct which is not a loop,\nthe following error will be produced:\n \nERROR 1308 (42000): ITERATE with no matching label: \n \nBelow is an example of how ITERATE might be used:\n \nCREATE PROCEDURE doiterate(p1 INT)\nBEGIN\n label1: LOOP\n SET p1 = p1 + 1;\n \n IF p1 \n\nURL: https://mariadb.com/kb/en/library/iterate/','','https://mariadb.com/kb/en/library/iterate/'),(314,'LOOP',23,'Syntax\n------ \n[begin_label:] LOOP\n statement_list\nEND LOOP [end_label]\n \nDescription\n----------- \nLOOP implements a simple loop construct, enabling repeated\nexecution\nof the statement list, which consists of one or more\nstatements, each\nterminated by a semicolon (i.e., ;) statement delimiter. The\nstatements\nwithin the loop are repeated until the loop is exited;\nusually this is\naccomplished with a LEAVE statement.\n \nA LOOP statement can be labeled. end_label cannot be given\nunless\nbegin_label also is present. If both are present, they must\nbe the\nsame.\n \nSee Delimiters in the mysql client for more on delimiter\nusage in the client.\n \n\n\nURL: https://mariadb.com/kb/en/library/loop/','','https://mariadb.com/kb/en/library/loop/'),(191,'MIN',16,'Syntax\n------ \nMIN([DISTINCT] expr)\n \nDescription\n----------- \nReturns the minimum value of expr. MIN() may take a string\nargument, in which case it returns the minimum string value.\nThe DISTINCT\nkeyword can be used to find the minimum of the distinct\nvalues of expr,\nhowever, this produces the same result as omitting DISTINCT.\n \nNote that SET and ENUM fields are currently compared by\ntheir string value rather than their relative position in\nthe set, so MIN() may produce a different lowest result than\nORDER BY ASC.\n \nIt is an aggregate function, and so can be used with the\nGROUP BY clause.\n \nFrom MariaDB 10.2.2, MIN() can be used as a window function.\n \nMIN() returns NULL if there were no matching rows.\n \nExamples\n-------- \nCREATE TABLE student (name CHAR(10), test CHAR(10), score\nTINYINT); \n \nINSERT INTO student VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73), \n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31), \n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88), \n (\'Tatiana\', \'SQL\', 87), (\'Tatiana\', \'Tuning\', 83);\n \nSELECT name, MIN(score) FROM student GROUP BY name;\n \n+---------+------------+\n| name | MIN(score) |\n+---------+------------+\n| Chun | 73 |\n| Esben | 31 |\n| Kaolin | 56 |\n| Tatiana | 83 |\n+---------+------------+\n \nMIN() with a string:\n \nSELECT MIN(name) FROM student;\n \n+-----------+\n| MIN(name) |\n+-----------+\n| Chun |\n+-----------+\n \nBe careful to avoid this common mistake, not grouping\ncorrectly and returning mismatched data: \n \nSELECT name,test,MIN(score) FROM student;\n \n+------+------+------------+\n| name | test | MIN(score) |\n+------+------+------------+\n| Chun | SQL | 31 |\n+------+------+------------+\n \nDifference between ORDER BY ASC and MIN():\n \nCREATE TABLE student2(name CHAR(10),grade\nENUM(\'b\',\'c\',\'a\'));\n \nINSERT INTO student2\nVALUES(\'Chun\',\'b\'),(\'Esben\',\'c\'),(\'Kaolin\',\'a\');\n \nSELECT MIN(grade) FROM student2;\n \n+------------+\n| MIN(grade) |\n+------------+\n| a |\n+------------+\n \nSELECT grade FROM student2 ORDER BY grade ASC LIMIT 1;\n \n+-------+\n| grade |\n+-------+\n| b |\n+-------+\n \nAs a window function:\n \nCREATE OR REPLACE TABLE student_test (name CHAR(10), test\nCHAR(10), score TINYINT);\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73), \n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31), \n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88), \n (\'Tatiana\', \'SQL\', 87);\n \nSELECT name, test, score, MIN(score) \n OVER (PARTITION BY name) AS lowest_score FROM student_test;\n \n+---------+--------+-------+--------------+\n| name | test | score | lowest_score |\n+---------+--------+-------+--------------+\n| Chun | SQL | 75 | 73 |\n| Chun | Tuning | 73 | 73 |\n| Esben | SQL | 43 | 31 |\n| Esben | Tuning | 31 | 31 |\n| Kaolin | SQL | 56 | 56 |\n| Kaolin | Tuning | 88 | 56 |\n| Tatiana | SQL | 87 | 87 |\n+---------+--------+-------+--------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/min/','','https://mariadb.com/kb/en/library/min/'),(192,'STD',16,'Syntax\n------ \nSTD(expr)\n \nDescription\n----------- \nReturns the population standard deviation of expr. This is\nan extension\nto standard SQL. The standard SQL function STDDEV_POP() can\nbe used instead. \n \nIt is an aggregate function, and so can be used with the\nGROUP BY clause.\n \nFrom MariaDB 10.2.2, STD() can be used as a window function.\n \nThis function returns NULL if there were no matching rows.\n \nExamples\n-------- \nAs an aggregate function:\n \nCREATE OR REPLACE TABLE stats (category VARCHAR(2), x INT);\n \nINSERT INTO stats VALUES \n (\'a\',1),(\'a\',2),(\'a\',3),\n (\'b\',11),(\'b\',12),(\'b\',20),(\'b\',30),(\'b\',60);\n \nSELECT category, STDDEV_POP(x), STDDEV_SAMP(x), VAR_POP(x) \n FROM stats GROUP BY category;\n \n+----------+---------------+----------------+------------+\n| category | STDDEV_POP(x) | STDDEV_SAMP(x) | VAR_POP(x) |\n+----------+---------------+----------------+------------+\n| a | 0.8165 | 1.0000 | 0.6667 |\n| b | 18.0400 | 20.1693 | 325.4400 |\n+----------+---------------+----------------+------------+\n \nAs a window function:\n \nCREATE OR REPLACE TABLE student_test (name CHAR(10), test\nCHAR(10), score TINYINT);\n \nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73), \n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31), \n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88), \n (\'Tatiana\', \'SQL\', 87);\n \nSELECT name, test, score, STDDEV_POP(score) \n OVER (PARTITION BY test) AS stddev_results FROM\nstudent_test;\n \n+---------+--------+-------+----------------+\n| name | test | score | stddev_results |\n+---------+--------+-------+----------------+\n| Chun | SQL | 75 | 16.9466 |\n| Chun | Tuning | 73 | 24.1247 |\n| Esben | SQL | 43 | 16.9466 |\n| Esben | Tuning | 31 | 24.1247 |\n| Kaolin | SQL | 56 | 16.9466 |\n| Kaolin | Tuning | 88 | 24.1247 |\n| Tatiana | SQL | 87 | 16.9466 |\n+---------+--------+-------+----------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/std/','','https://mariadb.com/kb/en/library/std/'),(193,'STDDEV',16,'Syntax\n------ \nSTDDEV(expr)\n \nDescription\n----------- \nReturns the population standard deviation of expr. This\nfunction is\nprovided for compatibility with Oracle. The standard SQL\nfunction\nSTDDEV_POP() can be used instead.\n \nIt is an aggregate function, and so can be used with the\nGROUP BY clause.\n \nFrom MariaDB 10.2.2, STDDEV() can be used as a window\nfunction.\n \nThis function returns NULL if there were no matching rows.\n \nExamples\n-------- \nAs an aggregate function:\n \nCREATE OR REPLACE TABLE stats (category VARCHAR(2), x INT);\n \nINSERT INTO stats VALUES \n (\'a\',1),(\'a\',2),(\'a\',3),\n (\'b\',11),(\'b\',12),(\'b\',20),(\'b\',30),(\'b\',60);\n \nSELECT category, STDDEV_POP(x), STDDEV_SAMP(x), VAR_POP(x) \n FROM stats GROUP BY category;\n \n+----------+---------------+----------------+------------+\n| category | STDDEV_POP(x) | STDDEV_SAMP(x) | VAR_POP(x) |\n+----------+---------------+----------------+------------+\n| a | 0.8165 | 1.0000 | 0.6667 |\n| b | 18.0400 | 20.1693 | 325.4400 |\n+----------+---------------+----------------+------------+\n \nAs a window function:\n \nCREATE OR REPLACE TABLE student_test (name CHAR(10), test\nCHAR(10), score TINYINT);\n \nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73), \n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31), \n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88), \n (\'Tatiana\', \'SQL\', 87);\n \nSELECT name, test, score, STDDEV_POP(score) \n OVER (PARTITION BY test) AS stddev_results FROM\nstudent_test;\n \n+---------+--------+-------+----------------+\n| name | test | score | stddev_results |\n+---------+--------+-------+----------------+\n| Chun | SQL | 75 | 16.9466 |\n| Chun | Tuning | 73 | 24.1247 |\n| Esben | SQL | 43 | 16.9466 |\n| Esben | Tuning | 31 | 24.1247 |\n| Kaolin | SQL | 56 | 16.9466 |\n| Kaolin | Tuning | 88 | 24.1247 |\n| Tatiana | SQL | 87 | 16.9466 |\n+---------+--------+-------+----------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/stddev/','','https://mariadb.com/kb/en/library/stddev/'),(315,'OPEN',23,'Syntax\n------ \n\n\nURL: https://mariadb.com/kb/en/library/open/','','https://mariadb.com/kb/en/library/open/'),(318,'RETURN',23,'Syntax\n------ \nRETURN expr \n \nThe RETURN statement terminates execution of a stored\nfunction and\nreturns the value expr to the function caller. There must be\nat least\none RETURN statement in a stored function. If the function\nhas multiple exit points, all exit points must have a\nRETURN.\n \nThis statement is not used in stored procedures, triggers,\nor events. LEAVE can be used instead.\n \nThe following example shows that RETURN can return the\nresult of a scalar subquery:\n \nCREATE FUNCTION users_count() RETURNS BOOL\n READS SQL DATA\nBEGIN\n RETURN (SELECT COUNT(DISTINCT User) FROM mysql.user);\nEND;\n \n\n \n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/return/','','https://mariadb.com/kb/en/library/return/'),(194,'STDDEV_POP',16,'Syntax\n------ \nSTDDEV_POP(expr)\n \nDescription\n----------- \nReturns the population standard deviation of expr (the\nsquare root of\nVAR_POP()). You can also use STD() or\nSTDDEV(), which are equivalent but not standard SQL.\n \nIt is an aggregate function, and so can be used with the\nGROUP BY clause.\n \nFrom MariaDB 10.2.2, STDDEV_POP() can be used as a window\nfunction.\n \nSTDDEV_POP() returns NULL if there were no matching rows.\n \nExamples\n-------- \nAs an aggregate function:\n \nCREATE OR REPLACE TABLE stats (category VARCHAR(2), x INT);\n \nINSERT INTO stats VALUES \n (\'a\',1),(\'a\',2),(\'a\',3),\n (\'b\',11),(\'b\',12),(\'b\',20),(\'b\',30),(\'b\',60);\n \nSELECT category, STDDEV_POP(x), STDDEV_SAMP(x), VAR_POP(x) \n FROM stats GROUP BY category;\n \n+----------+---------------+----------------+------------+\n| category | STDDEV_POP(x) | STDDEV_SAMP(x) | VAR_POP(x) |\n+----------+---------------+----------------+------------+\n| a | 0.8165 | 1.0000 | 0.6667 |\n| b | 18.0400 | 20.1693 | 325.4400 |\n+----------+---------------+----------------+------------+\n \nAs a window function:\n \nCREATE OR REPLACE TABLE student_test (name CHAR(10), test\nCHAR(10), score TINYINT);\n \nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73), \n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31), \n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88), \n (\'Tatiana\', \'SQL\', 87);\n \nSELECT name, test, score, STDDEV_POP(score) \n OVER (PARTITION BY test) AS stddev_results FROM\nstudent_test;\n \n+---------+--------+-------+----------------+\n| name | test | score | stddev_results |\n+---------+--------+-------+----------------+\n| Chun | SQL | 75 | 16.9466 |\n| Chun | Tuning | 73 | 24.1247 |\n| Esben | SQL | 43 | 16.9466 |\n| Esben | Tuning | 31 | 24.1247 |\n| Kaolin | SQL | 56 | 16.9466 |\n| Kaolin | Tuning | 88 | 24.1247 |\n| Tatiana | SQL | 87 | 16.9466 |\n+---------+--------+-------+----------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/stddev_pop/','','https://mariadb.com/kb/en/library/stddev_pop/'),(196,'SUM',16,'Syntax\n------ \nSUM([DISTINCT] expr)\n \nDescription\n----------- \nReturns the sum of expr. If the return set has no rows,\nSUM() returns\nNULL. The DISTINCT keyword can be used to sum only the\ndistinct values\nof expr.\n \nFrom MariaDB 10.2.0, SUM() can be used as a window function,\nalthough not with the DISTINCT specifier.\n \nExamples\n-------- \nCREATE TABLE sales (sales_value INT);\nINSERT INTO sales VALUES(10),(20),(20),(40);\n \nSELECT SUM(sales_value) FROM sales;\n \n+------------------+\n| SUM(sales_value) |\n+------------------+\n| 90 |\n+------------------+\n \nSELECT SUM(DISTINCT(sales_value)) FROM sales;\n \n+----------------------------+\n| SUM(DISTINCT(sales_value)) |\n+----------------------------+\n| 70 |\n+----------------------------+\n \nCommonly, SUM is used with a GROUP BY clause:\n \nCREATE TABLE sales (name CHAR(10), month CHAR(10), units\nINT);\n \nINSERT INTO sales VALUES \n (\'Chun\', \'Jan\', 75), (\'Chun\', \'Feb\', 73),\n (\'Esben\', \'Jan\', 43), (\'Esben\', \'Feb\', 31),\n (\'Kaolin\', \'Jan\', 56), (\'Kaolin\', \'Feb\', 88),\n (\'Tatiana\', \'Jan\', 87), (\'Tatiana\', \'Feb\', 83);\n \nSELECT name, SUM(units) FROM sales GROUP BY name;\n \n+---------+------------+\n| name | SUM(units) |\n+---------+------------+\n| Chun | 148 |\n| Esben | 74 |\n| Kaolin | 144 |\n| Tatiana | 170 |\n+---------+------------+\n \nThe GROUP BY clause is required when using an aggregate\nfunction along with regular column data, otherwise the\nresult will be a mismatch, as in the following common type\nof mistake:\n \nSELECT name,SUM(units) FROM sales\n;\n+------+------------+\n| name | SUM(units) |\n+------+------------+\n| Chun | 536 |\n+------+------------+\n \nAs a window function:\n \nCREATE OR REPLACE TABLE student_test (name CHAR(10), test\nCHAR(10), score TINYINT);\nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73), \n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31), \n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88), \n (\'Tatiana\', \'SQL\', 87);\n \nSELECT name, test, score, SUM(score) OVER (PARTITION BY\nname) AS total_score FROM student_test;\n \n+---------+--------+-------+-------------+\n| name | test | score | total_score |\n+---------+--------+-------+-------------+\n| Chun | SQL | 75 | 148 |\n| Chun | Tuning | 73 | 148 |\n| Esben | SQL | 43 | 74 |\n| Esben | Tuning | 31 | 74 |\n| Kaolin | SQL | 56 | 144 |\n| Kaolin | Tuning | 88 | 144 |\n| Tatiana | SQL | 87 | 87 |\n+---------+--------+-------+-------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/sum/','','https://mariadb.com/kb/en/library/sum/'),(197,'VARIANCE',16,'Syntax\n------ \nVARIANCE(expr) \n \nDescription\n----------- \nReturns the population standard variance of expr. This is an\nextension to\nstandard SQL. The standard SQL function VAR_POP() can be\nused\ninstead.\n \nVariance is calculated by\nworking out the mean for the set\nfor each number, subtracting the mean and squaring the\nresult\ncalculate the average of the resulting differences\n \nIt is an aggregate function, and so can be used with the\nGROUP BY clause.\n \nFrom MariaDB 10.2.2, VARIANCE() can be used as a window\nfunction.\n \nVARIANCE() returns NULL if there were no matching rows.\n \nExamples\n-------- \nCREATE TABLE v(i tinyint);\n \nINSERT INTO v VALUES(101),(99);\n \nSELECT VARIANCE(i) FROM v;\n \n+-------------+\n| VARIANCE(i) |\n+-------------+\n| 1.0000 |\n+-------------+\n \nINSERT INTO v VALUES(120),(80);\n \nSELECT VARIANCE(i) FROM v;\n \n+-------------+\n| VARIANCE(i) |\n+-------------+\n| 200.5000 |\n+-------------+\n \nAs an aggregate function:\n \nCREATE OR REPLACE TABLE stats (category VARCHAR(2), x INT);\n \nINSERT INTO stats VALUES \n (\'a\',1),(\'a\',2),(\'a\',3),\n (\'b\',11),(\'b\',12),(\'b\',20),(\'b\',30),(\'b\',60);\n \nSELECT category, STDDEV_POP(x), STDDEV_SAMP(x), VAR_POP(x) \n FROM stats GROUP BY category;\n \n+----------+---------------+----------------+------------+\n| category | STDDEV_POP(x) | STDDEV_SAMP(x) | VAR_POP(x) |\n+----------+---------------+----------------+------------+\n| a | 0.8165 | 1.0000 | 0.6667 |\n| b | 18.0400 | 20.1693 | 325.4400 |\n+----------+---------------+----------------+------------+\n \nAs a window function:\n \nCREATE OR REPLACE TABLE student_test (name CHAR(10), test\nCHAR(10), score TINYINT);\n \nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73), \n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31), \n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88), \n (\'Tatiana\', \'SQL\', 87);\n \nSELECT name, test, score, VAR_POP(score) \n OVER (PARTITION BY test) AS variance_results FROM\nstudent_test;\n \n+---------+--------+-------+------------------+\n| name | test | score | variance_results |\n+---------+--------+-------+------------------+\n| Chun | SQL | 75 | 287.1875 |\n| Chun | Tuning | 73 | 582.0000 |\n| Esben | SQL | 43 | 287.1875 |\n| Esben | Tuning | 31 | 582.0000 |\n| Kaolin | SQL | 56 | 287.1875 |\n| Kaolin | Tuning | 88 | 582.0000 |\n| Tatiana | SQL | 87 | 287.1875 |\n+---------+--------+-------+------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/variance/','','https://mariadb.com/kb/en/library/variance/'),(321,'WHILE',23,'Syntax\n------ \n[begin_label:] WHILE search_condition DO\n statement_list\nEND WHILE [end_label]\n \nDescription\n----------- \nThe statement list within a WHILE statement is repeated as\nlong as the\nsearch_condition is true. statement_list consists of one or\nmore\nstatements. If the loop must be executed at least once,\nREPEAT ... LOOP can be used instead.\n \nA WHILE statement can be labeled. end_label cannot be given\nunless\nbegin_label also is present. If both are present, they must\nbe the\nsame.\n \nExamples\n-------- \nCREATE PROCEDURE dowhile()\nBEGIN\n DECLARE v1 INT DEFAULT 5;\n \n WHILE v1 > 0 DO\n ...\n SET v1 = v1 - 1;\n \n END WHILE;\n \nEND\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/while/','','https://mariadb.com/kb/en/library/while/'),(198,'VAR_POP',16,'Syntax\n------ \nVAR_POP(expr)\n \nDescription\n----------- \nReturns the population standard variance of expr. It\nconsiders rows as\nthe whole population, not as a sample, so it has the number\nof rows as\nthe denominator. You can also use VARIANCE(), which is\nequivalent but\nis not standard SQL.\n \nVariance is calculated by\nworking out the mean for the set\nfor each number, subtracting the mean and squaring the\nresult\ncalculate the average of the resulting differences\n \nIt is an aggregate function, and so can be used with the\nGROUP BY clause.\n \nFrom MariaDB 10.2.2, VAR_POP() can be used as a window\nfunction.\n \nVAR_POP() returns NULL if there were no matching rows.\n \nExamples\n-------- \nCREATE TABLE v(i tinyint);\n \nINSERT INTO v VALUES(101),(99);\n \nSELECT VAR_POP(i) FROM v;\n \n+------------+\n| VAR_POP(i) |\n+------------+\n| 1.0000 |\n+------------+\n \nINSERT INTO v VALUES(120),(80);\n \nSELECT VAR_POP(i) FROM v;\n \n+------------+\n| VAR_POP(i) |\n+------------+\n| 200.5000 |\n+------------+\n \nAs an aggregate function:\n \nCREATE OR REPLACE TABLE stats (category VARCHAR(2), x INT);\n \nINSERT INTO stats VALUES \n (\'a\',1),(\'a\',2),(\'a\',3),\n (\'b\',11),(\'b\',12),(\'b\',20),(\'b\',30),(\'b\',60);\n \nSELECT category, STDDEV_POP(x), STDDEV_SAMP(x), VAR_POP(x) \n FROM stats GROUP BY category;\n \n+----------+---------------+----------------+------------+\n| category | STDDEV_POP(x) | STDDEV_SAMP(x) | VAR_POP(x) |\n+----------+---------------+----------------+------------+\n| a | 0.8165 | 1.0000 | 0.6667 |\n| b | 18.0400 | 20.1693 | 325.4400 |\n+----------+---------------+----------------+------------+\n \nAs a window function:\n \nCREATE OR REPLACE TABLE student_test (name CHAR(10), test\nCHAR(10), score TINYINT);\n \nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73), \n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31), \n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88), \n (\'Tatiana\', \'SQL\', 87);\n \nSELECT name, test, score, VAR_POP(score) \n OVER (PARTITION BY test) AS variance_results FROM\nstudent_test;\n \n+---------+--------+-------+------------------+\n| name | test | score | variance_results |\n+---------+--------+-------+------------------+\n| Chun | SQL | 75 | 287.1875 |\n| Chun | Tuning | 73 | 582.0000 |\n| Esben | SQL | 43 | 287.1875 |\n| Esben | Tuning | 31 | 582.0000 |\n| Kaolin | SQL | 56 | 287.1875 |\n| Kaolin | Tuning | 88 | 582.0000 |\n| Tatiana | SQL | 87 | 287.1875 |\n+---------+--------+-------+------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/var_pop/','','https://mariadb.com/kb/en/library/var_pop/'),(199,'VAR_SAMP',16,'Syntax\n------ \nVAR_SAMP(expr)\n \nDescription\n----------- \nReturns the sample variance of expr. That is, the\ndenominator is the number of rows minus one.\n \nIt is an aggregate function, and so can be used with the\nGROUP BY clause.\n \nFrom MariaDB 10.2.2, VAR_SAMP() can be used as a window\nfunction.\n \nVAR_SAMP() returns NULL if there were no matching rows.\n \nExamples\n-------- \nAs an aggregate function:\n \nCREATE OR REPLACE TABLE stats (category VARCHAR(2), x INT);\n \nINSERT INTO stats VALUES \n (\'a\',1),(\'a\',2),(\'a\',3),\n (\'b\',11),(\'b\',12),(\'b\',20),(\'b\',30),(\'b\',60);\n \nSELECT category, STDDEV_POP(x), STDDEV_SAMP(x), VAR_POP(x) \n FROM stats GROUP BY category;\n \n+----------+---------------+----------------+------------+\n| category | STDDEV_POP(x) | STDDEV_SAMP(x) | VAR_POP(x) |\n+----------+---------------+----------------+------------+\n| a | 0.8165 | 1.0000 | 0.6667 |\n| b | 18.0400 | 20.1693 | 325.4400 |\n+----------+---------------+----------------+------------+\n \nAs a window function:\n \nCREATE OR REPLACE TABLE student_test (name CHAR(10), test\nCHAR(10), score TINYINT);\n \nINSERT INTO student_test VALUES \n (\'Chun\', \'SQL\', 75), (\'Chun\', \'Tuning\', 73), \n (\'Esben\', \'SQL\', 43), (\'Esben\', \'Tuning\', 31), \n (\'Kaolin\', \'SQL\', 56), (\'Kaolin\', \'Tuning\', 88), \n (\'Tatiana\', \'SQL\', 87);\n \nSELECT name, test, score, VAR_SAMP(score) \n OVER (PARTITION BY test) AS variance_results FROM\nstudent_test;\n \n+---------+--------+-------+------------------+\n| name | test | score | variance_results |\n+---------+--------+-------+------------------+\n| Chun | SQL | 75 | 382.9167 |\n| Chun | Tuning | 73 | 873.0000 |\n| Esben | SQL | 43 | 382.9167 |\n| Esben | Tuning | 31 | 873.0000 |\n| Kaolin | SQL | 56 | 382.9167 |\n| Kaolin | Tuning | 88 | 873.0000 |\n| Tatiana | SQL | 87 | 382.9167 |\n+---------+--------+-------+------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/var_samp/','','https://mariadb.com/kb/en/library/var_samp/'),(202,'CHARSET',17,'Syntax\n------ \nCHARSET(str)\n \nDescription\n----------- \nReturns the character set of the string argument. If str is\nnot a string, it is considered as a binary string (so the\nfunction returns \'binary\'). This applies to NULL, too. The\nreturn value is a string in the utf8 character set.\n \nExamples\n-------- \nSELECT CHARSET(\'abc\');\n+----------------+\n| CHARSET(\'abc\') |\n+----------------+\n| latin1 |\n+----------------+\n \nSELECT CHARSET(CONVERT(\'abc\' USING utf8));\n+------------------------------------+\n| CHARSET(CONVERT(\'abc\' USING utf8)) |\n+------------------------------------+\n| utf8 |\n+------------------------------------+\n \nSELECT CHARSET(USER());\n+-----------------+\n| CHARSET(USER()) |\n+-----------------+\n| utf8 |\n+-----------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/charset/','','https://mariadb.com/kb/en/library/charset/'),(322,'BUFFER',24,'A synonym for ST_BUFFER.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/buffer/','','https://mariadb.com/kb/en/library/buffer/'),(323,'CONVEXHULL',24,'A synonym for ST_CONVEXHULL.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/convexhull/','','https://mariadb.com/kb/en/library/convexhull/'),(324,'GEOMETRYCOLLECTION',24,'Syntax\n------ \nGeometryCollection(g1,g2,...)\n \nDescription\n----------- \nConstructs a WKB GeometryCollection. If any argument is not\na well-formed WKB representation of a geometry, the return\nvalue is NULL.\n \nExamples\n-------- \nCREATE TABLE gis_geometrycollection (g GEOMETRYCOLLECTION);\nSHOW FIELDS FROM gis_geometrycollection;\n \nINSERT INTO gis_geometrycollection VALUES\n (GeomCollFromText(\'GEOMETRYCOLLECTION(POINT(0 0),\nLINESTRING(0 0,10 10))\')),\n (GeometryFromWKB(AsWKB(GeometryCollection(Point(44, 6),\nLineString(Point(3, 6), Point(7, 9)))))),\n (GeomFromText(\'GeometryCollection()\')),\n (GeomFromText(\'GeometryCollection EMPTY\'));\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/geometrycollection/','','https://mariadb.com/kb/en/library/geometrycollection/'),(326,'MULTILINESTRING',24,'Syntax\n------ \nMultiLineString(ls1,ls2,...)\n \nDescription\n----------- \nConstructs a WKB MultiLineString value using WKB LineString\narguments. If any argument is not a WKB LineString, the\nreturn value is\nNULL.\n \nExample\n \nCREATE TABLE gis_multi_line (g MULTILINESTRING);\nINSERT INTO gis_multi_line VALUES\n (MultiLineStringFromText(\'MULTILINESTRING((10 48,10 21,10\n0),(16 0,16 23,16 48))\')),\n (MLineFromText(\'MULTILINESTRING((10 48,10 21,10 0))\')),\n (MLineFromWKB(AsWKB(MultiLineString(LineString(Point(1, 2),\nPoint(3, 5)), LineString(Point(2, 5),Point(5, 8),Point(21,\n7))))));\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/multilinestring/','','https://mariadb.com/kb/en/library/multilinestring/'),(327,'MULTIPOINT',24,'Syntax\n------ \nMultiPoint(pt1,pt2,...)\n \nDescription\n----------- \nConstructs a WKB MultiPoint value using WKB Point arguments.\nIf any argument is not a WKB Point, the return value is\nNULL.\n \nExamples\n-------- \nSET @g = ST_GEOMFROMTEXT(\'MultiPoint( 1 1, 2 2, 5 3, 7 2, 9\n3, 8 4, 6 6, 6 9, 4 9, 1 5 )\');\n \nCREATE TABLE gis_multi_point (g MULTIPOINT);\nINSERT INTO gis_multi_point VALUES\n (MultiPointFromText(\'MULTIPOINT(0 0,10 10,10 20,20\n20)\')),\n (MPointFromText(\'MULTIPOINT(1 1,11 11,11 21,21 21)\')),\n (MPointFromWKB(AsWKB(MultiPoint(Point(3, 6), Point(4,\n10)))));\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/multipoint/','','https://mariadb.com/kb/en/library/multipoint/'),(203,'COERCIBILITY',17,'Syntax\n------ \nCOERCIBILITY(str)\n \nDescription\n----------- \nReturns the collation coercibility value of the string\nargument. Coercibility defines what will be converted to\nwhat in case of collation conflict, with an expression with\nhigher coercibility being converted to the collation of an\nexpression with lower coercibility.\n \nCoercibility | Description | Example | \n \n0 | Explicit | Value using a COLLATE clause | \n \n1 | No collation | Concatenated strings using different\ncollations | \n \n2 | Implicit | Column value | \n \n3 | Constant | USER() return value | \n \n4 | Coercible | Literal string | \n \n5 | Ignorable | NULL or derived from NULL | \n \nExamples\n-------- \nSELECT COERCIBILITY(\'abc\' COLLATE latin1_swedish_ci);\n+-----------------------------------------------+\n| COERCIBILITY(\'abc\' COLLATE latin1_swedish_ci) |\n+-----------------------------------------------+\n| 0 |\n+-----------------------------------------------+\n \nSELECT COERCIBILITY(USER());\n+----------------------+\n| COERCIBILITY(USER()) |\n+----------------------+\n| 3 |\n+----------------------+\n \nSELECT COERCIBILITY(\'abc\');\n+---------------------+\n| COERCIBILITY(\'abc\') |\n+---------------------+\n| 4 |\n+---------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/coercibility/','','https://mariadb.com/kb/en/library/coercibility/'),(206,'CURRENT_ROLE',17,'Roles were introduced in MariaDB 10.0.5.\n \nSyntax\n------ \nCURRENT_ROLE, CURRENT_ROLE()\n \nDescription\n----------- \nReturns the current role name. This determines your access\nprivileges. The return value is a string in the\nutf8 character set.\n \nIf there is no current role, NULL is returned.\n \nThe output of SELECT CURRENT_ROLE is equivalent to the\ncontents of the ENABLED_ROLES Information Schema table.\n \nUSER() returns the combination of user and host used to\nlogin. CURRENT_USER() returns the account used to determine\ncurrent connection\'s privileges.\n \nExamples\n-------- \nSELECT CURRENT_ROLE;\n \n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| NULL |\n+--------------+\n \nSET ROLE staff;\n \nSELECT CURRENT_ROLE;\n \n+--------------+\n| CURRENT_ROLE |\n+--------------+\n| staff |\n+--------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/current_role/','','https://mariadb.com/kb/en/library/current_role/'),(207,'CURRENT_USER',17,'Syntax\n------ \nCURRENT_USER, CURRENT_USER()\n \nDescription\n----------- \nReturns the user name and host name combination for the\nMariaDB account\nthat the server used to authenticate the current client.\nThis account\ndetermines your access privileges. The return value is a\nstring in the\nutf8 character set.\n \nThe value of CURRENT_USER() can differ from the value of\nUSER(). CURRENT_ROLE() returns the current active role.\n \nExamples\n-------- \nshell> mysql --user=\"anonymous\"\n \nMariaDB [(none)]> select user(),current_user();\n+---------------------+----------------+\n| user() | current_user() |\n+---------------------+----------------+\n| anonymous@localhost | @localhost |\n+---------------------+----------------+\n \nWhen calling CURRENT_USER() in a stored procedure, it\nreturns the owner of the stored procedure, as defined with\nDEFINER.\n \n\n\nURL: https://mariadb.com/kb/en/library/current_user/','','https://mariadb.com/kb/en/library/current_user/'),(208,'DATABASE',17,'Syntax\n------ \nDATABASE()\n \nDescription\n----------- \nReturns the default (current) database name as a string in\nthe utf8 character set. If there is no default database,\nDATABASE() returns NULL. Within a stored routine, the\ndefault database is the database that the routine is\nassociated with, which is not necessarily the same as the\ndatabase that is the default in the calling context.\n \nSCHEMA() is a synonym for DATABASE().\n \nTo select a default database, the USE statement can be run.\nAnother way to set the default database is specifying its\nname at mysql command line client startup.\n \nExamples\n-------- \nSELECT DATABASE();\n+------------+\n| DATABASE() |\n+------------+\n| NULL |\n+------------+\n \nUSE test;\n \nDatabase changed\n \nSELECT DATABASE();\n+------------+\n| DATABASE() |\n+------------+\n| test |\n+------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/database/','','https://mariadb.com/kb/en/library/database/'),(210,'DEFAULT',17,'Syntax\n------ \nDEFAULT(col_name)\n \nDescription\n----------- \nReturns the default value for a table column. If the column\nhas no default value, NULL is returned.\nFor integer columns using AUTO_INCREMENT, 0 is returned.\n \nWhen using DEFAULT as a value to set in an INSERT or UPDATE\nstatement, you can use the bare keyword DEFAULT without the\nparentheses and argument to\nrefer to the column in context. You can only use DEFAULT as\na bare keyword if you are using it\nalone without a surrounding expression or function.\n \nExamples\n-------- \nSelect only non-default values for a column:\n \nSELECT i FROM t WHERE i != DEFAULT(i);\n \nUpdate values to be one greater than the default value:\n \nUPDATE t SET i = DEFAULT(i)+1 WHERE i \n\nURL: https://mariadb.com/kb/en/library/default/','','https://mariadb.com/kb/en/library/default/'),(329,'POINT',24,'Syntax\n------ \nPoint(x,y)\n \nDescription\n----------- \nConstructs a WKB Point using the given coordinates.\n \nExamples\n-------- \nSET @g = ST_GEOMFROMTEXT(\'Point(1 1)\');\n \nCREATE TABLE gis_point (g POINT);\nINSERT INTO gis_point VALUES\n (PointFromText(\'POINT(10 10)\')),\n (PointFromText(\'POINT(20 10)\')),\n (PointFromText(\'POINT(20 20)\')),\n (PointFromWKB(AsWKB(PointFromText(\'POINT(10 20)\'))));\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/point/','','https://mariadb.com/kb/en/library/point/'),(330,'PointOnSurface',24,'A synonym for ST_PointOnSurface.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/pointonsurface/','','https://mariadb.com/kb/en/library/pointonsurface/'),(334,'ST_INTERSECTION',24,'Syntax\n------ \nST_INTERSECTION(g1,g2)\n \nDescription\n----------- \nReturns a geometry that is the intersection, or shared\nportion, of geometry g1 and geometry g2.\n \nExamples\n-------- \nSET @g1 = ST_GEOMFROMTEXT(\'POINT(2 1)\');\n \nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(2 1, 0 2)\');\n \nSELECT ASTEXT(ST_INTERSECTION(@g1,@g2));\n+----------------------------------+\n| ASTEXT(ST_INTERSECTION(@g1,@g2)) |\n+----------------------------------+\n| POINT(2 1) |\n+----------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_intersection/','','https://mariadb.com/kb/en/library/st_intersection/'),(335,'ST_POINTONSURFACE',24,'ST_POINTONSURFACE() was introduced in MariaDB 10.1.2\n \nSyntax\n------ \nST_PointOnSurface(g)\nPointOnSurface(g)\n \nDescription\n----------- \nGiven a geometry, returns a POINT guaranteed to intersect a\nsurface. However, see MDEV-7514.\n \nST_PointOnSurface() and PointOnSurface() are synonyms.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_pointonsurface/','','https://mariadb.com/kb/en/library/st_pointonsurface/'),(338,'BINLOG',26,'Syntax\n------ \nBINLOG \'str\'\n \nDescription\n----------- \nBINLOG is an internal-use statement. It is generated by the\nmysqlbinlog program as the printable representation of\ncertain events\nin binary log files. The \'str\' value is a base 64-encoded\nstring the that server decodes to determine the data change\nindicated by the\ncorresponding event. This statement requires the SUPER\nprivilege. It was added in MySQL 5.1.5.\n \n\n\nURL: https://mariadb.com/kb/en/library/binlog/','','https://mariadb.com/kb/en/library/binlog/'),(209,'DECODE_HISTOGRAM',17,'DECODE_HISTOGRAM() was introduced in MariaDB 10.0.2\n \nSyntax\n------ \nDECODE_HISTOGRAM(hist_type,histogram)\n \nNote: Before MariaDB 10.0.10 the arguments were reversed.\n \nDescription\n----------- \nReturns a string of comma separated numeric values\ncorresponding to a probability distribution represented by\nthe histogram of type hist_type (SINGLE_PREC_HB or\nDOUBLE_PREC_HB). The hist_type and histogram would be\ncommonly used from the mysql.column_stats table.\n \nSee Histogram Based Statistics for details.\n \nExamples\n-------- \nCREATE TABLE origin (\n i INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,\n v INT UNSIGNED NOT NULL\n);\n \nINSERT INTO origin(v) VALUES \n (1),(2),(3),(4),(5),(10),(20),\n (30),(40),(50),(60),(70),(80),\n (90),(100),(200),(400),(800);\n \nSET histogram_size=10,histogram_type=SINGLE_PREC_HB;\n \nANALYZE TABLE origin PERSISTENT FOR ALL;\n \n+-------------+---------+----------+-----------------------------------------+\n| Table | Op | Msg_type | Msg_text |\n+-------------+---------+----------+-----------------------------------------+\n| test.origin | analyze | status | Engine-independent\nstatistics collected |\n| test.origin | analyze | status | OK |\n+-------------+---------+----------+-----------------------------------------+\n \nSELECT db_name,table_name,column_name,hist_type,\n hex(histogram),decode_histogram(hist_type,histogram) \n FROM mysql.column_stats WHERE db_name=\'test\' and\ntable_name=\'origin\';\n \n+---------+------------+-------------+----------------+----------------------+-------------------------------------------------------------------+\n| db_name | table_name | column_name | hist_type |\nhex(histogram) | decode_histogram(hist_type,histogram) |\n+---------+------------+-------------+----------------+----------------------+-------------------------------------------------------------------+\n| test | origin | i | SINGLE_PREC_HB | 0F2D3C5A7887A5C3D2F0\n|\n0.059,0.118,0.059,0.118,0.118,0.059,0.118,0.118,0.059,0.118,0.059\n|\n| test | origin | v | SINGLE_PREC_HB | 000001060C0F161C1F7F\n|\n0.000,0.000,0.004,0.020,0.024,0.012,0.027,0.024,0.012,0.376,0.502\n|\n+---------+------------+-------------+----------------+----------------------+-------------------------------------------------------------------+\n \nSET histogram_size=20,histogram_type=DOUBLE_PREC_HB;\n \nANALYZE TABLE origin PERSISTENT FOR ALL;\n \n+-------------+---------+----------+-----------------------------------------+\n| Table | Op | Msg_type | Msg_text |\n+-------------+---------+----------+-----------------------------------------+\n| test.origin | analyze | status | Engine-independent\nstatistics collected |\n| test.origin | analyze | status | OK |\n+-------------+---------+----------+-----------------------------------------+\n \nSELECT db_name,table_name,column_name,\n hist_type,hex(histogram),decode_histogram(hist_type,histogram)\n\n FROM mysql.column_stats WHERE db_name=\'test\' and\ntable_name=\'origin\';\n \n+---------+------------+-------------+----------------+------------------------------------------+-----------------------------------------------------------------------------------------+\n| db_name | table_name | column_name | hist_type |\nhex(histogram) | decode_histogram(hist_type,histogram) |\n+---------+------------+-------------+----------------+------------------------------------------+-----------------------------------------------------------------------------------------+\n| test | origin | i | DOUBLE_PREC_HB |\n0F0F2D2D3C3C5A5A78788787A5A5C3C3D2D2F0F0 |\n0.05882,0.11765,0.05882,0.11765,0.11765,0.05882,0.11765,0.11765,0.05882,0.11765,0.05882\n|\n| test | origin | v | DOUBLE_PREC_HB |\n5200F600480116067E0CB30F1B16831CB81FD67F |\n0.00125,0.00250,0.00125,0.01877,0.02502,0.01253,0.02502,0.02502,0.01253,0.37546,0.50063\n|\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/decode_histogram/','','https://mariadb.com/kb/en/library/decode_histogram/'),(211,'FOUND_ROWS',17,'Syntax\n------ \nFOUND_ROWS()\n \nDescription\n----------- \nA SELECT statement may include a LIMIT clause to restrict\nthe number\nof rows the server returns to the client. In some cases, it\nis\ndesirable to know how many rows the statement would have\nreturned\nwithout the LIMIT, but without running the statement again.\nTo obtain\nthis row count, include a SQL_CALC_FOUND_ROWS option in the\nSELECT\nstatement, and then invoke FOUND_ROWS() afterwards.\n \nYou can also use FOUND_ROWS() to obtain the number of rows\nreturned by a SELECT which does not contain a LIMIT clause.\nIn this case you don\'t need to use the SQL_CALC_FOUND_ROWS\noption. This can be useful for example in a stored\nprocedure.\n \nAlso, this function works with some other statements which\nreturn a resultset, including SHOW, DESC and HELP. For\nDELETE ... RETURNING you should use ROW_COUNT(). It also\nworks as a prepared statement, or after executing a prepared\nstatement.\n \nStatements which don\'t return any results don\'t affect\nFOUND_ROWS() - the previous value will still be returned.\n \nWarning: When used after a CALL statement, this function\nreturns the number of rows selected by the last query in the\nprocedure, not by the whole procedure.\n \nStatements using the FOUND_ROWS() function are not safe for\nreplication.\n \nExamples\n-------- \nSHOW ENGINES;\n \n+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+\n| Engine | Support | Comment | Transactions | XA |\nSavepoints |\n+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+\n| InnoDB | DEFAULT | Supports transactions, row-level\nlocking, and foreign keys | YES | YES | YES |\n...\n| SPHINX | YES | Sphinx storage engine | NO | NO | NO |\n+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+\n11 rows in set (0.01 sec)\n \nSELECT FOUND_ROWS();\n+--------------+\n| FOUND_ROWS() |\n+--------------+\n| 11 |\n+--------------+\n \nSELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100\nLIMIT 10;\n \nSELECT FOUND_ROWS();\n+--------------+\n| FOUND_ROWS() |\n+--------------+\n| 23 |\n+--------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/found_rows/','','https://mariadb.com/kb/en/library/found_rows/'),(341,'FLUSH QUERY CACHE',26,'Description\n----------- \nYou can defragment the query cache to better utilize its\nmemory with\nthe FLUSH QUERY CACHE statement. The statement does not\nremove any queries from the cache.\n \nThe RESET QUERY CACHE statement removes all query results\nfrom the query cache.\nThe FLUSH TABLES statement also does this.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/flush-query-cache/','','https://mariadb.com/kb/en/library/flush-query-cache/'),(345,'LOAD INDEX',26,'Syntax\n------ \nLOAD INDEX INTO CACHE\n tbl_index_list [, tbl_index_list] ...\n \ntbl_index_list:\n tbl_name\n [[INDEX|KEY] (index_name[, index_name] ...)]\n [IGNORE LEAVES]\n \nDescription\n----------- \nThe LOAD INDEX INTO CACHE statement preloads a table index\ninto the key\ncache to which it has been assigned by an explicit CACHE\nINDEX\nstatement, or into the default key cache otherwise. \nLOAD INDEX INTO CACHE is used only for MyISAM or Aria\ntables. Until MariaDB 5.3, it was not supported for tables\nhaving user-defined partitioning, but this limitation was\nremoved in MariaDB 5.5.\n \nThe IGNORE LEAVES modifier causes only blocks for the\nnonleaf nodes of\nthe index to be preloaded.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/load-index/','','https://mariadb.com/kb/en/library/load-index/'),(212,'LAST_INSERT_ID',17,'Syntax\n------ \nLAST_INSERT_ID(), LAST_INSERT_ID(expr)\n \nDescription\n----------- \nLAST_INSERT_ID() (no arguments) returns\nthe first automatically generated value successfully\ninserted for an\nAUTO_INCREMENT column as a result of the most recently\nexecuted INSERT\nstatement. The value of LAST_INSERT_ID() remains unchanged\nif no rows\nare successfully inserted.\n \nIf one gives an argument to LAST_INSERT_ID(), then it will\nreturn the value of the expression and\nthe next call to LAST_INSERT_ID() will return the same\nvalue. The value will also be sent to the client\nand can be accessed by the mysql_insert_id function.\n \nFor example, after inserting a row that generates an\nAUTO_INCREMENT\nvalue, you can get the value like this:\n \nSELECT LAST_INSERT_ID();\n+------------------+\n| LAST_INSERT_ID() |\n+------------------+\n| 9 |\n+------------------+\n \nYou can also use LAST_INSERT_ID() to delete the last\ninserted row:\n \nDELETE FROM product WHERE id = LAST_INSERT_ID();\n \nIf no rows were successfully inserted, LAST_INSERT_ID()\nreturns 0.\n \nThe value of LAST_INSERT_ID() will be consistent across all\nversions\nif all rows in the INSERT or UPDATE statement were\nsuccessful.\n \nThe currently executing statement does not affect the value\nof\nLAST_INSERT_ID(). Suppose that you generate an\nAUTO_INCREMENT value\nwith one statement, and then refer to LAST_INSERT_ID() in a\nmultiple-row INSERT statement that inserts rows into a table\nwith its\nown AUTO_INCREMENT column. The value of LAST_INSERT_ID()\nwill remain\nstable in the second statement; its value for the second and\nlater\nrows is not affected by the earlier row insertions.\n(However, if you\nmix references to LAST_INSERT_ID() and LAST_INSERT_ID(expr),\nthe\neffect is undefined.)\n \nIf the previous statement returned an error, the value of\nLAST_INSERT_ID() is undefined. For transactional tables, if\nthe\nstatement is rolled back due to an error, the value of\nLAST_INSERT_ID() is left undefined. For manual ROLLBACK, the\nvalue of\nLAST_INSERT_ID() is not restored to that before the\ntransaction; it\nremains as it was at the point of the ROLLBACK.\n \nWithin the body of a stored routine (procedure or function)\nor a\ntrigger, the value of LAST_INSERT_ID() changes the same way\nas for\nstatements executed outside the body of these kinds of\nobjects. The\neffect of a stored routine or trigger upon the value of\nLAST_INSERT_ID() that is seen by following statements\ndepends on the\nkind of routine:\nIf a stored procedure executes statements that change the\nvalue of LAST_INSERT_ID(), the new value will be seen by\nstatements that follow the procedure call.\n \nFor stored functions and triggers that change the value, the\nvalue is restored when the function or trigger ends, so\nfollowing statements will not see a changed value.\n \nExamples\n-------- \nCREATE TABLE t (\n id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY, \n f VARCHAR(1)) \nENGINE = InnoDB;\n \nINSERT INTO t(f) VALUES(\'a\');\n \nSELECT LAST_INSERT_ID();\n+------------------+\n| LAST_INSERT_ID() |\n+------------------+\n| 1 |\n+------------------+\n \nINSERT INTO t(f) VALUES(\'b\');\n \nINSERT INTO t(f) VALUES(\'c\');\n \nSELECT LAST_INSERT_ID();\n+------------------+\n| LAST_INSERT_ID() |\n+------------------+\n| 3 |\n+------------------+\n \nINSERT INTO t(f) VALUES(\'d\'),(\'e\');\n \nSELECT LAST_INSERT_ID();\n+------------------+\n| LAST_INSERT_ID() |\n+------------------+\n| 4 |\n+------------------+\n \nSELECT * FROM t;\n \n+----+------+\n| id | f |\n+----+------+\n| 1 | a |\n| 2 | b |\n| 3 | c |\n| 4 | d |\n| 5 | e |\n+----+------+\n \nSELECT LAST_INSERT_ID(12);\n+--------------------+\n| LAST_INSERT_ID(12) |\n+--------------------+\n| 12 |\n+--------------------+\n \nSELECT LAST_INSERT_ID();\n+------------------+\n| LAST_INSERT_ID() |\n+------------------+\n| 12 |\n+------------------+\n \nINSERT INTO t(f) VALUES(\'f\');\n \nSELECT LAST_INSERT_ID();\n+------------------+\n| LAST_INSERT_ID() |\n+------------------+\n| 6 |\n+------------------+\n \nSELECT * FROM t;\n \n+----+------+\n| id | f |\n+----+------+\n| 1 | a |\n| 2 | b |\n| 3 | c |\n| 4 | d |\n| 5 | e |\n| 6 | f |\n+----+------+\n \nSELECT LAST_INSERT_ID(12);\n+--------------------+\n| LAST_INSERT_ID(12) |\n+--------------------+\n| 12 |\n+--------------------+\n \nINSERT INTO t(f) VALUES(\'g\');\n \nSELECT * FROM t;\n \n+----+------+\n| id | f |\n+----+------+\n| 1 | a |\n| 2 | b |\n| 3 | c |\n| 4 | d |\n| 5 | e |\n| 6 | f |\n| 7 | g |\n+----+------+\n \n\n\nURL: https://mariadb.com/kb/en/library/last_insert_id/','','https://mariadb.com/kb/en/library/last_insert_id/'),(214,'PROCEDURE ANALYSE',17,'Syntax\n------ \nanalyse([max_elements[,max_memory]])\n \nDescription\n----------- \nThis procedure is defined in the sql/sql_analyse.cc file. It\nexamines\nthe result from a query and returns an analysis of the\nresults that\nsuggests optimal data types for each column. To obtain this\nanalysis,\nappend PROCEDURE ANALYSE to the end of a SELECT statement:\n \nSELECT ... FROM ... WHERE ... PROCEDURE\nANALYSE([max_elements,[max_memory]])\n \nFor example:\n \nSELECT col1, col2 FROM table1 PROCEDURE ANALYSE(10, 2000);\n \nThe results show some statistics for the values returned by\nthe query,\nand propose an optimal data type for the columns. This can\nbe helpful\nfor checking your existing tables, or after importing new\ndata. You\nmay need to try different settings for the arguments so that\nPROCEDURE\nANALYSE() does not suggest the ENUM data type when it is not\nappropriate.\n \nThe arguments are optional and are used as follows:\nmax_elements (default 256) is the maximum number of distinct\nvalues that analyse notices per column. This is used by\nanalyse to check whether the optimal data type should be of\ntype ENUM; if there are more than max_elements distinct\nvalues, then ENUM is not a suggested type.\nmax_memory (default 8192) is the maximum amount of memory\nthat analyse should allocate per column while trying to find\nall distinct values.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/procedure-analyse/','','https://mariadb.com/kb/en/library/procedure-analyse/'),(375,'SHOW FUNCTION CODE',26,'Syntax\n------ \nSHOW FUNCTION CODE func_name\n \nDescription\n----------- \nSHOW FUNCTION CODE shows a representation of the internal\nimplementation of the stored function.\n \nIt is similar to SHOW PROCEDURE CODE but for stored\nfunctions.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-function-code/','','https://mariadb.com/kb/en/library/show-function-code/'),(391,'SHOW PROFILES',26,'Syntax\n------ \nSHOW PROFILES\n \nDescription\n----------- \nThe SHOW PROFILES statement displays profiling information\nthat indicates resource usage for statements executed during\nthe course of the\ncurrent session. It is used together with \nSHOW PROFILE.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-profiles/','','https://mariadb.com/kb/en/library/show-profiles/'),(392,'SHOW QUERY_RESPONSE_TIME',26,'SHOW QUERY_RESPONSE_TIME was introduced in MariaDB 10.1.1.\n \nStarting with MariaDB 10.1.1, which introduced the\nInformation Schema plugin extension, it is possible to use\nSHOW QUERY_RESPONSE_TIME as an alternative for retrieving\ninformation from the QUERY_RESPONSE_TIME plugin.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/show-query_response_time/','','https://mariadb.com/kb/en/library/show-query_response_time/'),(395,'SHOW SLAVE STATUS',26,'Syntax\n------ \nSHOW SLAVE [\"connection_name\"] STATUS\n \nor\n \nSHOW ALL SLAVES STATUS\n \nDescription\n----------- \nThis statement is to be run on a slave and provides status\ninformation on essential parameters of the replication slave\nthreads.\n \nThis statement requires the SUPER or the REPLICATION_CLIENT\nprivilege.\n \nMulti-source\n \nMariaDB 10.0 introduced the FULL and \"connection_name\"\noptions to\nallow you to connect to many masters at the same time.\n \nALL SLAVES gives you a list of all connections to the\nmaster.\n \nThe rows will be sorted according to Connection_name.\n \nIf you specify a connection_name, you only get the\ninformation about that\nconnection. If connection_name is not used, then the name\nset by default_master_connection is used. If the connection\nname doesn\'t exist you will get an error:\nThere is no master connection for \'xxx\'.\n \nColumn descriptions\n \nName | Description | Added | \n \nConnection_name | Name of the master connection. Returned\nwith SHOW ALL SLAVES STATUS only. | MariaDB 10.0 | \n \nSlave_SQL_State | State of SQL thread. Returned with SHOW\nALL SLAVES STATUS only. See Slave SQL Thread States. |\nMariaDB 10.0 | \n \nSlave_IO_State | State of I/O thread. See Slave I/O Thread\nStates. | MariaDB 10.0 | \n \nMaster_host | Master host that the slave is connected to. | \n| \n \nMaster_user | Account user name being used to connect to the\nmaster. | | \n \nMaster_port | The port being used to connect to the master.\n| | \n \nConnect_Retry | Time in seconds between retries to connect.\nThe default is 60. The CHANGE MASTER TO statement can set\nthis. The master-retry-count option determines the maximum\nnumber of reconnection attempts. | | \n \nMaster_Log_File | Name of the master binary log file that\nthe I/O thread is currently reading from. | | \n \nRead_Master_Log_Pos | Position up to which the I/O thread\nhas read in the current master binary log file. | | \n \nRelay_Log_File | Name of the relay log file that the SQL\nthread is currently processing. | | \n \nRelay_Log_Pos | Position up to which the SQL thread has\nfinished processing in the current relay log file. | | \n \nRelay_Master_Log_File | Name of the master binary log file\nthat contains the most recent event executed by the SQL\nthread. | | \n \nSlave_IO_Running | Whether the slave I/O thread is running\nand connected (Yes), running but not connected to a master\n(Connecting) or not running (No). | | \n \nSlave_SQL_Running | Whether or not the SQL thread is\nrunning. | | \n \nReplicate_Do_DB | Databases specified for replicating with\nthe replicate_do_db option. | | \n \nReplicate_Ignore_DB | Databases specified for ignoring with\nthe replicate_ignore_db option. | | \n \nReplicate_Do_Table | Tables specified for replicating with\nthe replicate_do_table option. | | \n \nReplicate_Ignore_Table | Tables specified for ignoring with\nthe replicate_ignore_table option. | | \n \nReplicate_Wild_Do_Table | Tables specified for replicating\nwith the replicate_wild_do_table option. | | \n \nReplicate_Wild_Ignore_Table | Tables specified for ignoring\nwith the replicate_wild_ignore_table option. | | \n \nLast_Errno | Alias for Last_SQL_Errno (see below) | | \n \nLast Error | Alias for Last_SQL_Error (see below) | | \n \nSkip_Counter | Number of events that a slave skips from the\nmaster, as recorded in the sql_slave_skip_counter system\nvariable. | | \n \nExec_Master_Log_Pos | Position up to which the SQL thread\nhas processed in the current master binary log file. Can be\nused to start a new slave from a current slave with the\nCHANGE MASTER TO ... MASTER_LOG_POS option. | | \n \nRelay_Log_Space | Total size of all relay log files\ncombined. | | \n \nUntil_Condition | | | \n \nUntil_Log_File | The MASTER_LOG_FILE value of the START\nSLAVE UNTIL condition. | | \n \nUntil_Log_Pos | The MASTER_LOG_POS value of the START SLAVE\nUNTIL condition. | | \n \nMaster_SSL_Allowed | Whether an SSL connection is permitted\n(Yes), not permitted (No) or permitted but without the slave\nhaving SSL support enabled (Ignored) | | \n \nMaster_SSL_CA_File | The MASTER_SSL_CA option of the CHANGE\nMASTER TO statement. | | \n \nMaster_SSL_CA_Path | The MASTER_SSL_CAPATH option of the\nCHANGE MASTER TO statement. | | \n \nMaster_SSL_Cert | The MASTER_SSL_CERT option of the CHANGE\nMASTER TO statement. | | \n \nMaster_SSL_Cipher | The MASTER_SSL_CIPHER option of the\nCHANGE MASTER TO statement. | | \n \nMaster_SSL_Key | The MASTER_SSL_KEY option of the CHANGE\nMASTER TO statement. | | \n \nSeconds_Behind_Master | Difference between the timestamp\nlogged on the master for the event that the slave is\ncurrently processing, and the current timestamp on the\nslave. Zero if the slave is not currently processing an\nevent. From MariaDB 10.0.23 and MariaDB 10.1.9, with\nparallel replication, seconds_behind_master is updated only\nafter transactions commit. | | \n \nMaster_SSL_Verify_Server_Cert | The\nMASTER_SSL_VERIFY_SERVER_CERT option of the CHANGE MASTER TO\nstatement. | | \n \nLast_IO_Errno | Error code of the most recent error that\ncaused the I/O thread to stop (also recorded in the slave\'s\nerror log). 0 means no error. RESET SLAVE or RESET MASTER\nwill reset this value. | | \n \nLast_IO_Error | Error message of the most recent error that\ncaused the I/O thread to stop (also recorded in the slave\'s\nerror log). An empty string means no error. RESET SLAVE or\nRESET MASTER will reset this value. | | \n \nLast_SQL_Errno | Error code of the most recent error that\ncaused the SQL thread to stop (also recorded in the slave\'s\nerror log). 0 means no error. RESET SLAVE or RESET MASTER\nwill reset this value. | | \n \nLast_SQL_Error | Error message of the most recent error that\ncaused the SQL thread to stop (also recorded in the slave\'s\nerror log). An empty string means no error. RESET SLAVE or\nRESET MASTER will reset this value. | | \n \nReplicate_Ignore_Server_Ids | List of server_ids that are\ncurrently being ignored for replication purposes, or an\nempty string for none, as specified in the IGNORE_SERVER_IDS\noption of the CHANGE MASTER TO statement. | | \n \nMaster_Server_Id | The master\'s server_id value. | | \n \nMaster_SSL_Crl | The MASTER_SSL_CRL option of the CHANGE\nMASTER TO statement. | MariaDB 10.0 | \n \nMaster_SSL_Crlpath | The MASTER_SSL_CRLPATH option of the\nCHANGE MASTER TO statement. | MariaDB 10.0 | \n \nUsing_Gtid | Whether or not global transaction ID\'s are\nbeing used for replication (can be No, Slave_Pos, or\nCurrent_Pos). | MariaDB 10.0.2 | \n \nGtid_IO_Pos | Current global transaction ID value. | MariaDB\n10.0.2 | \n \nRetried_transactions | Number of retried transactions for\nthis connection. Returned with SHOW ALL SLAVES STATUS only.\n| MariaDB 10.0 | \n \nMax_relay_log_size | Max relay log size for this connection.\nReturned with SHOW ALL SLAVES STATUS only. | MariaDB 10.0 | \n \nExecuted_log_entries | How many log entries the slave has\nexecuted. Returned with SHOW ALL SLAVES STATUS only. |\nMariaDB 10.0 | \n \nSlave_received_heartbeats | How many heartbeats we have got\nfrom the master. Returned with SHOW ALL SLAVES STATUS only.\n| MariaDB 10.0 | \n \nSlave_heartbeat_period | How often to request a heartbeat\npacket from the master (in seconds). Returned with SHOW ALL\nSLAVES STATUS only. | MariaDB 10.0 | \n \nGtid_Slave_Pos | GTID of the last event group replicated on\na slave server, for each replication domain, as stored in\nthe gtid_slave_pos system variable. Returned with SHOW ALL\nSLAVES STATUS only. | MariaDB 10.0 | \n \nSQL_Delay | Value specified by MASTER_DELAY in CHANGE MASTER\n(or 0 if none). | MariaDB 10.2.3 | \n \nSQL_Remaining_Delay | When the slave is delaying the\nexecution of an event due to MASTER_DELAY, this is the\nnumber of seconds of delay remaining before the event will\nbe applied. Otherwise, the value is NULL. | MariaDB 10.2.3 |\n\n \nSlave_SQL_Running_State | The state of the SQL driver\nthreads, same as in SHOW PROCESSLIST. When the slave is\ndelaying the execution of an event due to MASTER_DELAY, this\nfield displays: \"Waiting until MASTER_DELAY seconds after\nmaster executed event\". | MariaDB 10.2.3 | \n \nExamples\n-------- \nIf you issue this statement using the mysql client,\nyou can use a \\G statement terminator rather than a\nsemicolon to\nobtain a more readable vertical layout.\n \nSHOW SLAVE STATUS\\G\n*************************** 1. row\n***************************\n Slave_IO_State: Waiting for master to send event\n Master_Host: db01.example.com\n Master_User: replicant\n Master_Port: 3306\n Connect_Retry: 60\n Master_Log_File: mariadb-bin.000010\n Read_Master_Log_Pos: 548\n Relay_Log_File: relay-bin.000004\n Relay_Log_Pos: 837\n Relay_Master_Log_File: mariadb-bin.000010\n Slave_IO_Running: Yes\n Slave_SQL_Running: Yes\n Replicate_Do_DB: \n Replicate_Ignore_DB: \n Replicate_Do_Table: \n Replicate_Ignore_Table: \n Replicate_Wild_Do_Table: \n Replicate_Wild_Ignore_Table: \n Last_Errno: 0\n Last_Error: \n Skip_Counter: 0\n Exec_Master_Log_Pos: 548\n Relay_Log_Space: 1497\n Until_Condition: None\n Until_Log_File: \n Until_Log_Pos: 0\n Master_SSL_Allowed: No\n Master_SSL_CA_File: \n Master_SSL_CA_Path: \n Master_SSL_Cert: \n Master_SSL_Cipher: \n Master_SSL_Key: \n Seconds_Behind_Master: 0\nMaster_SSL_Verify_Server_Cert: No\n Last_IO_Errno: 0\n Last_IO_Error: \n Last_SQL_Errno: 0\n Last_SQL_Error: \n Replicate_Ignore_Server_Ids: \n Master_Server_Id: 101\n Master_SSL_Crl: \n Master_SSL_Crlpath: \n Using_Gtid: No\n Gtid_IO_Pos: \n \nMariaDB [(none)]> SHOW ALL SLAVES STATUS\\G\n*************************** 1. row\n***************************\n Connection_name: \n Slave_SQL_State: Slave has read all relay log; waiting for\nthe slave I/O thread to update it\n Slave_IO_State: Waiting for master to send event\n Master_Host: db01.example.com\n Master_User: replicant\n Master_Port: 3306\n Connect_Retry: 60\n Master_Log_File: mariadb-bin.000010\n Read_Master_Log_Pos: 3608\n Relay_Log_File: relay-bin.000004\n Relay_Log_Pos: 3897\n Relay_Master_Log_File: mariadb-bin.000010\n Slave_IO_Running: Yes\n Slave_SQL_Running: Yes\n Replicate_Do_DB: \n Replicate_Ignore_DB: \n Replicate_Do_Table: \n Replicate_Ignore_Table: \n Replicate_Wild_Do_Table: \n Replicate_Wild_Ignore_Table: \n Last_Errno: 0\n Last_Error: \n Skip_Counter: 0\n Exec_Master_Log_Pos: 3608\n Relay_Log_Space: 4557\n Until_Condition: None\n Until_Log_File: \n Until_Log_Pos: 0\n Master_SSL_Allowed: No\n Master_SSL_CA_File: \n Master_SSL_CA_Path: \n Master_SSL_Cert: \n Master_SSL_Cipher: \n Master_SSL_Key: \n Seconds_Behind_Master: 0\nMaster_SSL_Verify_Server_Cert: No\n Last_IO_Errno: 0\n Last_IO_Error: \n Last_SQL_Errno: 0\n Last_SQL_Error: \n Replicate_Ignore_Server_Ids: \n Master_Server_Id: 101\n Master_SSL_Crl: \n Master_SSL_Crlpath: \n Using_Gtid: No\n Gtid_IO_Pos:\n Retried_transactions: 0\n Max_relay_log_size: 104857600\n Executed_log_entries: 40\n Slave_received_heartbeats: 11\n Slave_heartbeat_period: 1800.000\n Gtid_Slave_Pos: 0-101-2320\n \nYou can also access some of the variables directly from\nstatus variables:\n \nSET @@default_master_connection=\"test\" ;\nshow status like \"%slave%\"\n \nVariable_name Value\nCom_show_slave_hosts 0\nCom_show_slave_status 0\nCom_start_all_slaves 0\nCom_start_slave 0\nCom_stop_all_slaves 0\nCom_stop_slave 0\nRpl_semi_sync_slave_status OFF\nSlave_connections 0\nSlave_heartbeat_period 1800.000\nSlave_open_temp_tables 0\nSlave_received_heartbeats 0\nSlave_retried_transactions 0\nSlave_running OFF\nSlaves_connected 0\nSlaves_running 1\n \n\n\nURL: https://mariadb.com/kb/en/library/show-slave-status/','','https://mariadb.com/kb/en/library/show-slave-status/'),(396,'SHOW STATUS',26,'Syntax\n------ \nSHOW [GLOBAL | SESSION] STATUS\n [LIKE \'pattern\' | WHERE expr]\n \nDescription\n----------- \nSHOW STATUS provides server status information. This\ninformation also can be obtained using the mysqladmin\nextended-status command, or by querying the Information\nSchema GLOBAL_STATUS and SESSION_STATUS tables.\nThe LIKE clause, if present, indicates which variable names\nto match. The WHERE clause can be given to select rows using\nmore general conditions.\n \nWith the GLOBAL modifier, SHOW STATUS\ndisplays the status values for all connections to MariaDB.\nWith\nSESSION, it displays the status values\nfor the current connection. If no modifier is present, the\ndefault is\n SESSION. LOCAL is a synonym for\n SESSION. If you see a lot of 0 values, the reason is\nprobably that you have used SHOW STATUS with a new\nconnection instead of SHOW GLOBAL STATUS.\n \nSome status variables have only a global value. For these,\nyou get the\nsame value for both GLOBAL and SESSION.\n \nSee Server Status Variables for a full list, scope and\ndescription of the variables that can be viewed with SHOW\nSTATUS.\n \nThe LIKE clause, if present on its own, indicates which\nvariable name to match.\n \nThe WHERE and LIKE clauses can be given to select rows using\nmore general conditions, as discussed in Extended SHOW.\n \nExamples\n-------- \nFull output from MariaDB 10.1.17:\n \nSHOW GLOBAL STATUS;\n \n+--------------------------------------------------------------+----------------------------------------+\n| Variable_name | Value |\n+--------------------------------------------------------------+----------------------------------------+\n| Aborted_clients | 0 |\n| Aborted_connects | 0 |\n| Access_denied_errors | 0 |\n| Acl_column_grants | 0 |\n| Acl_database_grants | 2 |\n| Acl_function_grants | 0 |\n| Acl_procedure_grants | 0 |\n| Acl_proxy_users | 2 |\n| Acl_role_grants | 0 |\n| Acl_roles | 0 |\n| Acl_table_grants | 0 |\n| Acl_users | 6 |\n| Aria_pagecache_blocks_not_flushed | 0 |\n| Aria_pagecache_blocks_unused | 15706 |\n| Aria_pagecache_blocks_used | 0 |\n| Aria_pagecache_read_requests | 0 |\n| Aria_pagecache_reads | 0 |\n| Aria_pagecache_write_requests | 0 |\n| Aria_pagecache_writes | 0 |\n| Aria_transaction_log_syncs | 0 |\n| Binlog_commits | 0 |\n| Binlog_group_commits | 0 |\n| Binlog_group_commit_trigger_count | 0 |\n| Binlog_group_commit_trigger_lock_wait | 0 |\n| Binlog_group_commit_trigger_timeout | 0 |\n| Binlog_snapshot_file | |\n| Binlog_snapshot_position | 0 |\n| Binlog_bytes_written | 0 |\n| Binlog_cache_disk_use | 0 |\n| Binlog_cache_use | 0 |\n| Binlog_stmt_cache_disk_use | 0 |\n| Binlog_stmt_cache_use | 0 |\n| Busy_time | 0.000000 |\n| Bytes_received | 432 |\n| Bytes_sent | 15183 |\n| Com_admin_commands | 1 |\n| Com_alter_db | 0 |\n| Com_alter_db_upgrade | 0 |\n| Com_alter_event | 0 |\n| Com_alter_function | 0 |\n| Com_alter_procedure | 0 |\n| Com_alter_server | 0 |\n| Com_alter_table | 0 |\n| Com_alter_tablespace | 0 |\n| Com_analyze | 0 |\n| Com_assign_to_keycache | 0 |\n| Com_begin | 0 |\n| Com_binlog | 0 |\n| Com_call_procedure | 0 |\n| Com_change_db | 0 |\n| Com_change_master | 0 |\n| Com_check | 0 |\n| Com_checksum | 0 |\n| Com_commit | 0 |\n| Com_compound_sql | 0 |\n| Com_create_db | 0 |\n| Com_create_event | 0 |\n| Com_create_function | 0 |\n| Com_create_index | 0 |\n| Com_create_procedure | 0 |\n| Com_create_role | 0 |\n| Com_create_server | 0 |\n| Com_create_table | 0 |\n| Com_create_temporary_table | 0 |\n| Com_create_trigger | 0 |\n| Com_create_udf | 0 |\n| Com_create_user | 0 |\n| Com_create_view | 0 |\n| Com_dealloc_sql | 0 |\n| Com_delete | 0 |\n| Com_delete_multi | 0 |\n| Com_do | 0 |\n| Com_drop_db | 0 |\n| Com_drop_event | 0 |\n| Com_drop_function | 0 |\n| Com_drop_index | 0 |\n| Com_drop_procedure | 0 |\n| Com_drop_role | 0 |\n| Com_drop_server | 0 |\n| Com_drop_table | 0 |\n| Com_drop_temporary_table | 0 |\n| Com_drop_trigger | 0 |\n| Com_drop_user | 0 |\n| Com_drop_view | 0 |\n| Com_empty_query | 0 |\n| Com_execute_sql | 0 |\n| Com_flush | 0 |\n| Com_get_diagnostics | 0 |\n| Com_grant | 0 |\n| Com_grant_role | 0 |\n| Com_ha_close | 0 |\n| Com_ha_open | 0 |\n| Com_ha_read | 0 |\n| Com_help | 0 |\n| Com_insert | 0 |\n| Com_insert_select | 0 |\n| Com_install_plugin | 0 |\n| Com_kill | 0 |\n| Com_load | 0 |\n| Com_lock_tables | 0 |\n| Com_optimize | 0 |\n| Com_preload_keys | 0 |\n| Com_prepare_sql | 0 |\n| Com_purge | 0 |\n| Com_purge_before_date | 0 |\n| Com_release_savepoint | 0 |\n| Com_rename_table | 0 |\n| Com_rename_user | 0 |\n| Com_repair | 0 |\n| Com_replace | 0 |\n| Com_replace_select | 0 |\n| Com_reset | 0 |\n| Com_resignal | 0 |\n| Com_revoke | 0 |\n| Com_revoke_all | 0 |\n| Com_revoke_role | 0 |\n| Com_rollback | 0 |\n| Com_rollback_to_savepoint | 0 |\n| Com_savepoint | 0 |\n| Com_select | 1 |\n| Com_set_option | 0 |\n| Com_show_authors | 0 |\n| Com_show_binlog_events | 0 |\n| Com_show_binlogs | 0 |\n| Com_show_charsets | 0 |\n| Com_show_collations | 0 |\n| Com_show_contributors | 0 |\n| Com_show_create_db | 0 |\n| Com_show_create_event | 0 |\n| Com_show_create_func | 0 |\n| Com_show_create_proc | 0 |\n| Com_show_create_table | 0 |\n| Com_show_create_trigger | 0 |\n| Com_show_databases | 0 |\n| Com_show_engine_logs | 0 |\n| Com_show_engine_mutex | 0 |\n| Com_show_engine_status | 0 |\n| Com_show_errors | 0 |\n| Com_show_events | 0 |\n| Com_show_explain | 0 |\n| Com_show_fields | 0 |\n| Com_show_function_status | 0 |\n| Com_show_generic | 0 |\n| Com_show_grants | 0 |\n| Com_show_keys | 0 |\n| Com_show_master_status | 0 |\n| Com_show_open_tables | 0 |\n| Com_show_plugins | 0 |\n| Com_show_privileges | 0 |\n| Com_show_procedure_status | 0 |\n| Com_show_processlist | 0 |\n| Com_show_profile | 0 |\n| Com_show_profiles | 0 |\n| Com_show_relaylog_events | 0 |\n| Com_show_slave_hosts | 0 |\n| Com_show_slave_status | 0 |\n| Com_show_status | 2 |\n| Com_show_storage_engines | 0 |\n| Com_show_table_status | 0 |\n| Com_show_tables | 0 |\n| Com_show_triggers | 0 |\n| Com_show_variables | 0 |\n| Com_show_warnings | 0 |\n| Com_shutdown | 0 |\n| Com_signal | 0 |\n| Com_start_all_slaves | 0 |\n| Com_start_slave | 0 |\n| Com_stmt_close | 0 |\n| Com_stmt_execute | 0 |\n| Com_stmt_fetch | 0 |\n| Com_stmt_prepare | 0 |\n| Com_stmt_reprepare | 0 |\n| Com_stmt_reset | 0 |\n| Com_stmt_send_long_data | 0 |\n| Com_stop_all_slaves | 0 |\n| Com_stop_slave | 0 |\n| Com_truncate | 0 |\n| Com_uninstall_plugin | 0 |\n| Com_unlock_tables | 0 |\n| Com_update | 0 |\n| Com_update_multi | 0 |\n| Com_xa_commit | 0 |\n| Com_xa_end | 0 |\n| Com_xa_prepare | 0 |\n| Com_xa_recover | 0 |\n| Com_xa_rollback | 0 |\n| Com_xa_start | 0 |\n| Compression | OFF |\n| Connection_errors_accept | 0 |\n| Connection_errors_internal | 0 |\n| Connection_errors_max_connections | 0 |\n| Connection_errors_peer_address | 0 |\n| Connection_errors_select | 0 |\n| Connection_errors_tcpwrap | 0 |\n| Connections | 4 |\n| Cpu_time | 0.000000 |\n| Created_tmp_disk_tables | 0 |\n| Created_tmp_files | 6 |\n| Created_tmp_tables | 2 |\n| Delayed_errors | 0 |\n| Delayed_insert_threads | 0 |\n| Delayed_writes | 0 |\n| Delete_scan | 0 |\n| Empty_queries | 0 |\n| Executed_events | 0 |\n| Executed_triggers | 0 |\n| Feature_delay_key_write | 0 |\n| Feature_dynamic_columns | 0 |\n| Feature_fulltext | 0 |\n| Feature_gis | 0 |\n| Feature_locale | 0 |\n| Feature_subquery | 0 |\n| Feature_timezone | 0 |\n| Feature_trigger | 0 |\n| Feature_xml | 0 |\n| Flush_commands | 1 |\n| Handler_commit | 1 |\n| Handler_delete | 0 |\n| Handler_discover | 0 |\n| Handler_external_lock | 0 |\n| Handler_icp_attempts | 0 |\n| Handler_icp_match | 0 |\n| Handler_mrr_init | 0 |\n| Handler_mrr_key_refills | 0 |\n| Handler_mrr_rowid_refills | 0 |\n| Handler_prepare | 0 |\n| Handler_read_first | 3 |\n| Handler_read_key | 0 |\n| Handler_read_last | 0 |\n| Handler_read_next | 0 |\n| Handler_read_prev | 0 |\n| Handler_read_retry | 0 |\n| Handler_read_rnd | 0 |\n| Handler_read_rnd_deleted | 0 |\n| Handler_read_rnd_next | 537 |\n| Handler_rollback | 0 |\n| Handler_savepoint | 0 |\n| Handler_savepoint_rollback | 0 |\n| Handler_tmp_update | 0 |\n| Handler_tmp_write | 516 |\n| Handler_update | 0 |\n| Handler_write | 0 |\n| Innodb_available_undo_logs | 128 |\n| Innodb_background_log_sync | 222 |\n| Innodb_buffer_pool_bytes_data | 2523136 |\n| Innodb_buffer_pool_bytes_dirty | 0 |\n| Innodb_buffer_pool_dump_status | Dumping buffer pool(s)\nnot yet started |\n| Innodb_buffer_pool_load_status | Loading buffer pool(s)\nnot yet started |\n| Innodb_buffer_pool_pages_data | 154 |\n| Innodb_buffer_pool_pages_dirty | 0 |\n| Innodb_buffer_pool_pages_flushed | 1 |\n| Innodb_buffer_pool_pages_free | 8037 |\n| Innodb_buffer_pool_pages_lru_flushed | 0 |\n| Innodb_buffer_pool_pages_made_not_young | 0 |\n| Innodb_buffer_pool_pages_made_young | 0 |\n| Innodb_buffer_pool_pages_misc | 0 |\n| Innodb_buffer_pool_pages_old | 0 |\n| Innodb_buffer_pool_pages_total | 8191 |\n| Innodb_buffer_pool_read_ahead | 0 |\n| Innodb_buffer_pool_read_ahead_evicted | 0 |\n| Innodb_buffer_pool_read_ahead_rnd | 0 |\n| Innodb_buffer_pool_read_requests | 558 |\n| Innodb_buffer_pool_reads | 155 |\n| Innodb_buffer_pool_wait_free | 0 |\n| Innodb_buffer_pool_write_requests | 1 |\n| Innodb_checkpoint_age | 0 |\n| Innodb_checkpoint_max_age | 80826164 |\n| Innodb_data_fsyncs | 5 |\n| Innodb_data_pending_fsyncs | 0 |\n| Innodb_data_pending_reads | 0 |\n| Innodb_data_pending_writes | 0 |\n| Innodb_data_read | 2609664 |\n| Innodb_data_reads | 172 |\n| Innodb_data_writes | 5 |\n| Innodb_data_written | 34304 |\n| Innodb_dblwr_pages_written | 1 |\n| Innodb_dblwr_writes | 1 |\n| Innodb_deadlocks | 0 |\n| Innodb_have_atomic_builtins | ON |\n| Innodb_history_list_length | 0 |\n| Innodb_ibuf_discarded_delete_marks | 0 |\n| Innodb_ibuf_discarded_deletes | 0 |\n| Innodb_ibuf_discarded_inserts | 0 |\n| Innodb_ibuf_free_list | 0 |\n| Innodb_ibuf_merged_delete_marks | 0 |\n| Innodb_ibuf_merged_deletes | 0 |\n| Innodb_ibuf_merged_inserts | 0 |\n| Innodb_ibuf_merges | 0 |\n| Innodb_ibuf_segment_size | 2 |\n| Innodb_ibuf_size | 1 |\n| Innodb_log_waits | 0 |\n| Innodb_log_write_requests | 0 |\n| Innodb_log_writes | 1 |\n| Innodb_lsn_current | 1616829 |\n| Innodb_lsn_flushed | 1616829 |\n| Innodb_lsn_last_checkpoint | 1616829 |\n| Innodb_master_thread_active_loops | 0 |\n| Innodb_master_thread_idle_loops | 222 |\n| Innodb_max_trx_id | 2308 |\n| Innodb_mem_adaptive_hash | 2217568 |\n| Innodb_mem_dictionary | 630703 |\n| Innodb_mem_total | 140771328 |\n| Innodb_mutex_os_waits | 1 |\n| Innodb_mutex_spin_rounds | 30 |\n| Innodb_mutex_spin_waits | 1 |\n| Innodb_oldest_view_low_limit_trx_id | 0 |\n| Innodb_os_log_fsyncs | 3 |\n| Innodb_os_log_pending_fsyncs | 0 |\n| Innodb_os_log_pending_writes | 0 |\n| Innodb_os_log_written | 512 |\n| Innodb_page_size | 16384 |\n| Innodb_pages_created | 0 |\n| Innodb_pages_read | 154 |\n| Innodb_pages_written | 1 |\n| Innodb_purge_trx_id | 0 |\n| Innodb_purge_undo_no | 0 |\n| Innodb_read_views_memory | 88 |\n| Innodb_row_lock_current_waits | 0 |\n| Innodb_row_lock_time | 0 |\n| Innodb_row_lock_time_avg | 0 |\n| Innodb_row_lock_time_max | 0 |\n| Innodb_row_lock_waits | 0 |\n| Innodb_rows_deleted | 0 |\n| Innodb_rows_inserted | 0 |\n| Innodb_rows_read | 0 |\n| Innodb_rows_updated | 0 |\n| Innodb_system_rows_deleted | 0 |\n| Innodb_system_rows_inserted | 0 |\n| Innodb_system_rows_read | 0 |\n| Innodb_system_rows_updated | 0 |\n| Innodb_s_lock_os_waits | 2 |\n| Innodb_s_lock_spin_rounds | 60 |\n| Innodb_s_lock_spin_waits | 2 |\n| Innodb_truncated_status_writes | 0 |\n| Innodb_x_lock_os_waits | 0 |\n| Innodb_x_lock_spin_rounds | 0 |\n| Innodb_x_lock_spin_waits | 0 |\n| Innodb_page_compression_saved | 0 |\n| Innodb_page_compression_trim_sect512 | 0 |\n| Innodb_page_compression_trim_sect1024 | 0 |\n| Innodb_page_compression_trim_sect2048 | 0 |\n| Innodb_page_compression_trim_sect4096 | 0 |\n| Innodb_page_compression_trim_sect8192 | 0 |\n| Innodb_page_compression_trim_sect16384 | 0 |\n| Innodb_page_compression_trim_sect32768 | 0 |\n| Innodb_num_index_pages_written | 0 |\n| Innodb_num_non_index_pages_written | 5 |\n| Innodb_num_pages_page_compressed | 0 |\n| Innodb_num_page_compressed_trim_op | 0 |\n| Innodb_num_page_compressed_trim_op_saved | 0 |\n| Innodb_num_pages_page_decompressed | 0 |\n| Innodb_num_pages_page_compression_error | 0 |\n| Innodb_num_pages_encrypted | 0 |\n| Innodb_num_pages_decrypted | 0 |\n| Innodb_have_lz4 | OFF |\n| Innodb_have_lzo | OFF |\n| Innodb_have_lzma | OFF |\n| Innodb_have_bzip2 | OFF |\n| Innodb_have_snappy | OFF |\n| Innodb_defragment_compression_failures | 0 |\n| Innodb_defragment_failures | 0 |\n| Innodb_defragment_count | 0 |\n| Innodb_onlineddl_rowlog_rows | 0 |\n| Innodb_onlineddl_rowlog_pct_used | 0 |\n| Innodb_onlineddl_pct_progress | 0 |\n| Innodb_secondary_index_triggered_cluster_reads | 0 |\n| Innodb_secondary_index_triggered_cluster_reads_avoided | 0\n|\n| Innodb_encryption_rotation_pages_read_from_cache | 0 |\n| Innodb_encryption_rotation_pages_read_from_disk | 0 |\n| Innodb_encryption_rotation_pages_modified | 0 |\n| Innodb_encryption_rotation_pages_flushed | 0 |\n| Innodb_encryption_rotation_estimated_iops | 0 |\n| Innodb_scrub_background_page_reorganizations | 0 |\n| Innodb_scrub_background_page_splits | 0 |\n| Innodb_scrub_background_page_split_failures_underflow | 0\n|\n|\nInnodb_scrub_background_page_split_failures_out_of_filespace\n| 0 |\n| Innodb_scrub_background_page_split_failures_missing_index\n| 0 |\n| Innodb_scrub_background_page_split_failures_unknown | 0 |\n| Key_blocks_not_flushed | 0 |\n| Key_blocks_unused | 107163 |\n| Key_blocks_used | 0 |\n| Key_blocks_warm | 0 |\n| Key_read_requests | 0 |\n| Key_reads | 0 |\n| Key_write_requests | 0 |\n| Key_writes | 0 |\n| Last_query_cost | 0.000000 |\n| Master_gtid_wait_count | 0 |\n| Master_gtid_wait_time | 0 |\n| Master_gtid_wait_timeouts | 0 |\n| Max_statement_time_exceeded | 0 |\n| Max_used_connections | 1 |\n| Memory_used | 273614696 |\n| Not_flushed_delayed_rows | 0 |\n| Open_files | 25 |\n| Open_streams | 0 |\n| Open_table_definitions | 18 |\n| Open_tables | 11 |\n| Opened_files | 77 |\n| Opened_plugin_libraries | 0 |\n| Opened_table_definitions | 18 |\n| Opened_tables | 18 |\n| Opened_views | 0 |\n| Performance_schema_accounts_lost | 0 |\n| Performance_schema_cond_classes_lost | 0 |\n| Performance_schema_cond_instances_lost | 0 |\n| Performance_schema_digest_lost | 0 |\n| Performance_schema_file_classes_lost | 0 |\n| Performance_schema_file_handles_lost | 0 |\n| Performance_schema_file_instances_lost | 0 |\n| Performance_schema_hosts_lost | 0 |\n| Performance_schema_locker_lost | 0 |\n| Performance_schema_mutex_classes_lost | 0 |\n| Performance_schema_mutex_instances_lost | 0 |\n| Performance_schema_rwlock_classes_lost | 0 |\n| Performance_schema_rwlock_instances_lost | 0 |\n| Performance_schema_session_connect_attrs_lost | 0 |\n| Performance_schema_socket_classes_lost | 0 |\n| Performance_schema_socket_instances_lost | 0 |\n| Performance_schema_stage_classes_lost | 0 |\n| Performance_schema_statement_classes_lost | 0 |\n| Performance_schema_table_handles_lost | 0 |\n| Performance_schema_table_instances_lost | 0 |\n| Performance_schema_thread_classes_lost | 0 |\n| Performance_schema_thread_instances_lost | 0 |\n| Performance_schema_users_lost | 0 |\n| Prepared_stmt_count | 0 |\n| Qcache_free_blocks | 1 |\n| Qcache_free_memory | 1031336 |\n| Qcache_hits | 0 |\n| Qcache_inserts | 0 |\n| Qcache_lowmem_prunes | 0 |\n| Qcache_not_cached | 0 |\n| Qcache_queries_in_cache | 0 |\n| Qcache_total_blocks | 1 |\n| Queries | 4 |\n| Questions | 4 |\n| Rows_read | 10 |\n| Rows_sent | 517 |\n| Rows_tmp_read | 516 |\n| Rpl_status | AUTH_MASTER |\n| Select_full_join | 0 |\n| Select_full_range_join | 0 |\n| Select_range | 0 |\n| Select_range_check | 0 |\n| Select_scan | 2 |\n| Slave_connections | 0 |\n| Slave_heartbeat_period | 0.000 |\n| Slave_open_temp_tables | 0 |\n| Slave_received_heartbeats | 0 |\n| Slave_retried_transactions | 0 |\n| Slave_running | OFF |\n| Slave_skipped_errors | 0 |\n| Slaves_connected | 0 |\n| Slaves_running | 0 |\n| Slow_launch_threads | 0 |\n| Slow_queries | 0 |\n| Sort_merge_passes | 0 |\n| Sort_priority_queue_sorts | 0 |\n| Sort_range | 0 |\n| Sort_rows | 0 |\n| Sort_scan | 0 |\n| Ssl_accept_renegotiates | 0 |\n| Ssl_accepts | 0 |\n| Ssl_callback_cache_hits | 0 |\n| Ssl_cipher | |\n| Ssl_cipher_list | |\n| Ssl_client_connects | 0 |\n| Ssl_connect_renegotiates | 0 |\n| Ssl_ctx_verify_depth | 0 |\n| Ssl_ctx_verify_mode | 0 |\n| Ssl_default_timeout | 0 |\n| Ssl_finished_accepts | 0 |\n| Ssl_finished_connects | 0 |\n| Ssl_server_not_after | |\n| Ssl_server_not_before | |\n| Ssl_session_cache_hits | 0 |\n| Ssl_session_cache_misses | 0 |\n| Ssl_session_cache_mode | NONE |\n| Ssl_session_cache_overflows | 0 |\n| Ssl_session_cache_size | 0 |\n| Ssl_session_cache_timeouts | 0 |\n| Ssl_sessions_reused | 0 |\n| Ssl_used_session_cache_entries | 0 |\n| Ssl_verify_depth | 0 |\n| Ssl_verify_mode | 0 |\n| Ssl_version | |\n| Subquery_cache_hit | 0 |\n| Subquery_cache_miss | 0 |\n| Syncs | 2 |\n| Table_locks_immediate | 21 |\n| Table_locks_waited | 0 |\n| Tc_log_max_pages_used | 0 |\n| Tc_log_page_size | 4096 |\n| Tc_log_page_waits | 0 |\n| Threadpool_idle_threads | 0 |\n| Threadpool_threads | 0 |\n| Threads_cached | 0 |\n| Threads_connected | 1 |\n| Threads_created | 2 |\n| Threads_running | 1 |\n| Update_scan | 0 |\n| Uptime | 223 |\n| Uptime_since_flush_status | 223 |\n| wsrep_cluster_conf_id | 18446744073709551615 |\n| wsrep_cluster_size | 0 |\n| wsrep_cluster_state_uuid | |\n| wsrep_cluster_status | Disconnected |\n| wsrep_connected | OFF |\n| wsrep_local_bf_aborts | 0 |\n| wsrep_local_index | 18446744073709551615 |\n| wsrep_provider_name | |\n| wsrep_provider_vendor | |\n| wsrep_provider_version | |\n| wsrep_ready | OFF |\n| wsrep_thread_count | 0 |\n+--------------------------------------------------------------+----------------------------------------+\n516 rows in set (0.00 sec)\n \nExample of filtered output:\n \nSHOW STATUS LIKE \'Key%\';\n \n+------------------------+--------+\n| Variable_name | Value |\n+------------------------+--------+\n| Key_blocks_not_flushed | 0 |\n| Key_blocks_unused | 107163 |\n| Key_blocks_used | 0 |\n| Key_blocks_warm | 0 |\n| Key_read_requests | 0 |\n| Key_reads | 0 |\n| Key_write_requests | 0 |\n| Key_writes | 0 |\n+------------------------+--------+\n8 rows in set (0.00 sec)\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-status/','','https://mariadb.com/kb/en/library/show-status/'),(409,'DO',27,'Syntax\n------ \nDO expr [, expr] ...\n \nDescription\n----------- \n DO executes the expressions but does not return any\nresults. In most respects, DO is shorthand for\n SELECT expr, ..., but has the advantage that it is slightly\nfaster when you do not care about the result.\n \n DO is useful primarily with functions that have side\n effects, such as RELEASE_LOCK().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/do/','','https://mariadb.com/kb/en/library/do/'),(213,'LAST_VALUE',17,'Syntax\n------ \nLAST_VALUE(expr,[expr,...])\n \nLAST_VALUE(expr) OVER (\n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n) \n \nDescription\n----------- \nLAST_VALUE() evaluates all expressions and returns the last.\n \nThis is useful together with setting user variables to a\nvalue with @var:=expr, for example when you want to get data\nof rows updated/deleted without having to do two queries\nagainst the table.\n \nSince MariaDB 10.2.2, LAST_VALUE can be used as a window\nfunction.\n \nReturns NULL if no last value exists.\n \nExamples\n-------- \nCREATE TABLE t1 (a int, b int);\nINSERT INTO t1 VALUES(1,10),(2,20);\nDELETE FROM t1 WHERE a=1 AND last_value(@a:=a,@b:=b,1);\nSELECT @a,@b;\n \n+------+------+\n| @a | @b |\n+------+------+\n| 1 | 10 |\n+------+------+\n \nAs a window function:\n \nCREATE TABLE t1 (\n pk int primary key,\n a int,\n b int,\n c char(10),\n d decimal(10, 3),\n e real\n);\n \nINSERT INTO t1 VALUES\n( 1, 0, 1, \'one\', 0.1, 0.001),\n( 2, 0, 2, \'two\', 0.2, 0.002),\n( 3, 0, 3, \'three\', 0.3, 0.003),\n( 4, 1, 2, \'three\', 0.4, 0.004),\n( 5, 1, 1, \'two\', 0.5, 0.005),\n( 6, 1, 1, \'one\', 0.6, 0.006),\n( 7, 2, NULL, \'n_one\', 0.5, 0.007),\n( 8, 2, 1, \'n_two\', NULL, 0.008),\n( 9, 2, 2, NULL, 0.7, 0.009),\n(10, 2, 0, \'n_four\', 0.8, 0.010),\n(11, 2, 10, NULL, 0.9, NULL);\n \nSELECT pk, FIRST_VALUE(pk) OVER (ORDER BY pk) AS first_asc,\n LAST_VALUE(pk) OVER (ORDER BY pk) AS last_asc,\n FIRST_VALUE(pk) OVER (ORDER BY pk DESC) AS first_desc,\n LAST_VALUE(pk) OVER (ORDER BY pk DESC) AS last_desc\nFROM t1\nORDER BY pk DESC;\n \n+----+-----------+----------+------------+-----------+\n| pk | first_asc | last_asc | first_desc | last_desc |\n+----+-----------+----------+------------+-----------+\n| 11 | 1 | 11 | 11 | 11 |\n| 10 | 1 | 10 | 11 | 10 |\n| 9 | 1 | 9 | 11 | 9 |\n| 8 | 1 | 8 | 11 | 8 |\n| 7 | 1 | 7 | 11 | 7 |\n| 6 | 1 | 6 | 11 | 6 |\n| 5 | 1 | 5 | 11 | 5 |\n| 4 | 1 | 4 | 11 | 4 |\n| 3 | 1 | 3 | 11 | 3 |\n| 2 | 1 | 2 | 11 | 2 |\n| 1 | 1 | 1 | 11 | 1 |\n+----+-----------+----------+------------+-----------+\n \nCREATE OR REPLACE TABLE t1 (i int);\nINSERT INTO t1 VALUES\n(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);\n \nSELECT i,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW\nand 1 FOLLOWING) AS f_1f,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW and\n1 FOLLOWING) AS l_1f,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 PRECEDING\nAND 1 FOLLOWING) AS f_1p1f,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 PRECEDING AND\n1 FOLLOWING) AS f_1p1f,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 2 PRECEDING\nAND 1 PRECEDING) AS f_2p1p,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 2 PRECEDING AND\n1 PRECEDING) AS f_2p1p,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 FOLLOWING\nAND 2 FOLLOWING) AS f_1f2f,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 FOLLOWING AND\n2 FOLLOWING) AS f_1f2f\nFROM t1;\n \n+------+------+------+--------+--------+--------+--------+--------+--------+\n| i | f_1f | l_1f | f_1p1f | f_1p1f | f_2p1p | f_2p1p |\nf_1f2f | f_1f2f |\n+------+------+------+--------+--------+--------+--------+--------+--------+\n| 1 | 1 | 2 | 1 | 2 | NULL | NULL | 2 | 3 |\n| 2 | 2 | 3 | 1 | 3 | 1 | 1 | 3 | 4 |\n| 3 | 3 | 4 | 2 | 4 | 1 | 2 | 4 | 5 |\n| 4 | 4 | 5 | 3 | 5 | 2 | 3 | 5 | 6 |\n| 5 | 5 | 6 | 4 | 6 | 3 | 4 | 6 | 7 |\n| 6 | 6 | 7 | 5 | 7 | 4 | 5 | 7 | 8 |\n| 7 | 7 | 8 | 6 | 8 | 5 | 6 | 8 | 9 |\n| 8 | 8 | 9 | 7 | 9 | 6 | 7 | 9 | 10 |\n| 9 | 9 | 10 | 8 | 10 | 7 | 8 | 10 | 10 |\n| 10 | 10 | 10 | 9 | 10 | 8 | 9 | NULL | NULL |\n+------+------+------+--------+--------+--------+--------+--------+--------+\n \n\n\nURL: https://mariadb.com/kb/en/library/last_value/','','https://mariadb.com/kb/en/library/last_value/'),(215,'ROW_COUNT',17,'Syntax\n------ \nROW_COUNT()\n \nDescription\n----------- \nROW_COUNT() returns the number of rows updated, inserted or\ndeleted\nby the preceding statement. This is the same as the row\ncount that the\nmysql client displays and the value from the\nmysql_affected_rows() C\nAPI function.\n \nGenerally:\nFor statements which return a result set (such as SELECT,\nSHOW, DESC or HELP), returns -1, even when the result set is\nempty. This is also true for administrative statements, such\nas OPTIMIZE.\nFor DML statements other than SELECT and for ALTER TABLE,\nreturns the number of affected rows.\nFor DDL statements (including TRUNCATE) and for other\nstatements which don\'t return any result set (such as USE,\nDO, SIGNAL or DEALLOCATE PREPARE), returns 0.\n \nFor UPDATE, affected rows is by default the number of rows\nthat were actually changed. If the CLIENT_FOUND_ROWS flag to\nmysql_real_connect() is specified when connecting to mysqld,\naffected rows is instead the number of rows matched by the\nWHERE clause. \n \nFor REPLACE, deleted rows are also counted. So, if REPLACE\ndeletes a row and adds a new row, ROW_COUNT() returns 2.\n \nFor INSERT ... ON DUPLICATE KEY, updated rows are counted\ntwice. So, if INSERT adds a new rows and modifies another\nrow, ROW_COUNT() returns 3.\n \nROW_COUNT() does not take into account rows that are not\ndirectly deleted/updated by the last statement. This means\nthat rows deleted by foreign keys or triggers are not\ncounted.\n \nWarning: You can use ROW_COUNT() with prepared statements,\nbut you need to call it after EXECUTE, not after DEALLOCATE\nPREPARE, because the row count for allocate prepare is\nalways 0.\n \nWarning: When used after a CALL statement, this function\nreturns the number of rows affected by the last statement in\nthe procedure, not by the whole procedure.\n \nWarning: After INSERT DELAYED, ROW_COUNT() returns the\nnumber of the rows you tried to insert, not the number of\nthe successful writes.\n \nThis information can also be found in the diagnostics area.\n \nStatements using the ROW_COUNT() function are not safe for\nreplication.\n \nExamples\n-------- \nCREATE TABLE t (A INT);\n \nINSERT INTO t VALUES(1),(2),(3);\n \nSELECT ROW_COUNT();\n+-------------+\n| ROW_COUNT() |\n+-------------+\n| 3 |\n+-------------+\n \nDELETE FROM t WHERE A IN(1,2);\n \nSELECT ROW_COUNT(); \n+-------------+\n| ROW_COUNT() |\n+-------------+\n| 2 |\n+-------------+\n \nExample with prepared statements:\n \nSET @q = \'INSERT INTO t VALUES(1),(2),(3);\';\n \nPREPARE stmt FROM @q;\n \nEXECUTE stmt;\n \nQuery OK, 3 rows affected (0.39 sec)\nRecords: 3 Duplicates: 0 Warnings: 0\n \nSELECT ROW_COUNT();\n+-------------+\n| ROW_COUNT() |\n+-------------+\n| 3 |\n+-------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/row_count/','','https://mariadb.com/kb/en/library/row_count/'),(410,'DUAL',27,'Description\n----------- \nYou are allowed to specify DUAL as a dummy table name in\nsituations where no tables are referenced, such as the\nfollowing SELECT statement:\n \nSELECT 1 + 1 FROM DUAL;\n \n+-------+\n| 1 + 1 |\n+-------+\n| 2 |\n+-------+\n \n DUAL is purely for the convenience of people who require\n that all SELECT statements should have\n FROM and possibly other clauses. MariaDB ignores the\n clauses. MariaDB does not require FROM DUAL if no tables\n are referenced.\n \nFROM DUAL could be used when you only SELECT computed\nvalues, but require a WHERE clause, perhaps to test that a\nscript correctly handles empty resultsets:\n \nSELECT 1 FROM DUAL WHERE FALSE;\n \nEmpty set (0.00 sec)\n \n\n\nURL: https://mariadb.com/kb/en/library/dual/','','https://mariadb.com/kb/en/library/dual/'),(412,'FOR UPDATE',27,'The FOR UPDATE clause of SELECT applies only when autocommit\nis set to 0 or the SELECT is enclosed in a transaction. A\nlock is acquired on the rows, and other transactions are\nprevented from writing the rows, acquire locks, and from\nreading them (unless their isolation level is READ\nUNCOMMITTED).\n \nIf autocommit is set to 1, the LOCK IN SHARE MODE and FOR\nUPDATE clauses have no effect.\n \nIf the isolation level is set to SERIALIZABLE, all plain\nSELECT statements are converted to SELECT ... LOCK IN SHARE\nMODE.\n \nExample\n \nSELECT * FROM trans WHERE period=2001 FOR UPDATE;\n \n\n\nURL: https://mariadb.com/kb/en/library/for-update/','','https://mariadb.com/kb/en/library/for-update/'),(219,'USER',17,'Syntax\n------ \nUSER()\n \nDescription\n----------- \nReturns the current MariaDB user name and host name, given\nwhen authenticating to MariaDB, as a string in the utf8\ncharacter set.\n \nNote that the value of USER() may differ from the value of\nCURRENT_USER(), which is the user used to authenticate the\ncurrent client. \nCURRENT_ROLE() returns the current active role.\n \nSYSTEM_USER() and SESSION_USER are synonyms for USER().\n \nStatements using the USER() function or one of its synonyms\nare not safe for statement level replication.\n \nExamples\n-------- \nshell> mysql --user=\"anonymous\"\n \nMariaDB [(none)]> select user(),current_user();\n+---------------------+----------------+\n| user() | current_user() |\n+---------------------+----------------+\n| anonymous@localhost | @localhost |\n+---------------------+----------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/user/','','https://mariadb.com/kb/en/library/user/'),(220,'VERSION',17,'Syntax\n------ \nVERSION()\n \nDescription\n----------- \nReturns a string that indicates the MariaDB server version.\nThe string\nuses the utf8 character set.\n \nExamples\n-------- \nSELECT VERSION();\n+------------------------------+\n| VERSION() |\n+------------------------------+\n| 10.0.3-MariaDB-1~precise-log |\n+------------------------------+\n \nThe VERSION() string may have one or more of the following\nsuffixes:\n \nSuffix | Description | \n \n-embedded | The server is an embedded server (libmysqld). | \n \n-log | General logging, slow logging or binary (replication)\nlogging is enabled. | \n \n-debug | The server is compiled for debugging. | \n \n-valgrind |  The server is compiled to be instrumented with\nvalgrind. | \n \nChanging the Version String\n \nSome old legacy code may break because they are parsing the\nVERSION string and expecting a MySQL string or a simple\nversion\nstring like Joomla til API17, see MDEV-7780.\n \nIn MariaDB 10.2 one can fool these applications by setting\nthe version string from the command line or the my.cnf files\nwith --version=....\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/version/','','https://mariadb.com/kb/en/library/version/'),(221,'!=',18,'Syntax\n------ \n, !=\n \nDescription\n----------- \nNot equal operator. Evaluates both SQL expressions and\nreturns 1 if they are not equal and 0 if they are equal, or\nNULL if either expression is NULL. If the expressions return\ndifferent data types, (for instance, a number and a string),\nperforms type conversion.\n \nWhen used in row comparisons these two queries return the\nsame results:\n \nSELECT (t1.a, t1.b) != (t2.x, t2.y) \nFROM t1 INNER JOIN t2;\n \nSELECT (t1.a != t2.x) OR (t1.b != t2.y)\nFROM t1 INNER JOIN t2;\n \nExamples\n-------- \nSELECT \'.01\' \'0.01\';\n \n+-----------------+\n| \'.01\' \'0.01\' |\n+-----------------+\n| 1 |\n+-----------------+\n \nSELECT .01 \'0.01\';\n \n+---------------+\n| .01 \'0.01\' |\n+---------------+\n| 0 |\n+---------------+\n \nSELECT \'zapp\' \'zappp\';\n \n+-------------------+\n| \'zapp\' \'zappp\' |\n+-------------------+\n| 1 |\n+-------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/not-equal/','','https://mariadb.com/kb/en/library/not-equal/'),(224,'<=>',18,'Syntax\n------ \n\n \nDescription\n----------- \nNULL-safe equal operator. It performs an equality comparison\nlike\nthe = operator, but returns 1 rather than NULL if both\noperands are\nNULL, and 0 rather than NULL if one operand is NULL.\n \na b is equivalent to a = b OR (a IS NULL AND b IS NULL).\n \nWhen used in row comparisons these two queries return the\nsame results:\n \nSELECT (t1.a, t1.b) (t2.x, t2.y) \nFROM t1 INNER JOIN t2;\n \nSELECT (t1.a t2.x) AND (t1.b t2.y)\nFROM t1 INNER JOIN t2;\n \nSee also NULL Values in MariaDB.\n \nExamples\n-------- \nSELECT 1 1, NULL NULL, 1 NULL;\n \n+---------+---------------+------------+\n| 1 1 | NULL NULL | 1 NULL |\n+---------+---------------+------------+\n| 1 | 1 | 0 |\n+---------+---------------+------------+\n \nSELECT 1 = 1, NULL = NULL, 1 = NULL;\n \n+-------+-------------+----------+\n| 1 = 1 | NULL = NULL | 1 = NULL |\n+-------+-------------+----------+\n| 1 | NULL | NULL |\n+-------+-------------+----------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/null-safe-equal/','','https://mariadb.com/kb/en/library/null-safe-equal/'),(225,'=',18,'Syntax\n------ \nleft_expr = right_expr\n \nDescription\n----------- \nEqual operator. Evaluates both SQL expressions and returns 1\nif they are equal, 0 if they are not equal, or NULL if\neither expression is NULL. If the expressions return\ndifferent data types (for example, a number and a string), a\ntype conversion is performed.\n \nWhen used in row comparisons these two queries are\nsynonymous and return the same results:\n \nSELECT (t1.a, t1.b) = (t2.x, t2.y) FROM t1 INNER JOIN t2;\n \nSELECT (t1.a = t2.x) AND (t1.b = t2.y) FROM t1 INNER JOIN\nt2;\n \nTo perform a NULL-safe comparison, use the operator.\n \n= can also be used as an assignment operator.\n \nExamples\n-------- \nSELECT 1 = 0;\n \n+-------+\n| 1 = 0 |\n+-------+\n| 0 |\n+-------+\n \nSELECT \'0\' = 0;\n \n+---------+\n| \'0\' = 0 |\n+---------+\n| 1 |\n+---------+\n \nSELECT \'0.0\' = 0;\n \n+-----------+\n| \'0.0\' = 0 |\n+-----------+\n| 1 |\n+-----------+\n \nSELECT \'0.01\' = 0;\n \n+------------+\n| \'0.01\' = 0 |\n+------------+\n| 0 |\n+------------+\n \nSELECT \'.01\' = 0.01;\n \n+--------------+\n| \'.01\' = 0.01 |\n+--------------+\n| 1 |\n+--------------+\n \nSELECT (5 * 2) = CONCAT(\'1\', \'0\');\n+----------------------------+\n| (5 * 2) = CONCAT(\'1\', \'0\') |\n+----------------------------+\n| 1 |\n+----------------------------+\n \nSELECT 1 = NULL;\n \n+----------+\n| 1 = NULL |\n+----------+\n| NULL |\n+----------+\n \nSELECT NULL = NULL;\n \n+-------------+\n| NULL = NULL |\n+-------------+\n| NULL |\n+-------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/equal/','','https://mariadb.com/kb/en/library/equal/'),(414,'HANDLER Commands',27,'Syntax\n------ \nHANDLER tbl_name OPEN [ [AS] alias]\nHANDLER tbl_name READ index_name { = | >= | = | \n\nURL: https://mariadb.com/kb/en/library/handler-commands/','','https://mariadb.com/kb/en/library/handler-commands/'),(428,'LOCK IN SHARE MODE',27,'When LOCK IN SHARE MODE is specified in a SELECT statement,\nMariaDB will wait until all transactions that have modified\nthe rows are committed. Then, a write lock is acquired. All\ntransactions can read the rows, but if they want to modify\nthem, they have to wait until your transaction is committed.\n \nInnoDB/XtraDB supports row-level locking. selected rows can\nbe locked using LOCK IN SHARE MODE or FOR UPDATE. In both\ncases, a lock is acquired on the rows read by the query, and\nit will be released when the current transaction is\ncommitted.\n \nIf autocommit is set to 1, the LOCK IN SHARE MODE and FOR\nUPDATE clauses have no effect.\n \n\n\nURL: https://mariadb.com/kb/en/library/lock-in-share-mode/','','https://mariadb.com/kb/en/library/lock-in-share-mode/'),(431,'PROCEDURE',27,'The PROCEDURE clause of SELECT passes the whole result set\nto a Procedure which will process it. These Procedures are\nnot Stored Procedures, and can only be written in the C\nlanguage, so it is necessary to recompile the server.\n \nCurrently, the only available procedure is ANALYSE, which\nexamines the resultset and suggests the optimal datatypes\nfor each column. It is defined in the sql/sql_analyse.cc\nfile, and can be used as an example to create more\nProcedures.\n \nThis clause cannot be used in a view\'s definition.\n \n\n\nURL: https://mariadb.com/kb/en/library/procedure/','','https://mariadb.com/kb/en/library/procedure/'),(226,'>',18,'Syntax\n------ \n>\n \nDescription\n----------- \nGreater than operator. Evaluates both SQL expressions and\nreturns 1 if the left value is greater than the right value\nand 0 if it is not, or NULL if either expression is NULL. If\nthe expressions return different data types, (for instance,\na number and a string), performs type conversion.\n \nWhen used in row comparisons these two queries return the\nsame results:\n \nSELECT (t1.a, t1.b) > (t2.x, t2.y) \nFROM t1 INNER JOIN t2;\n \nSELECT (t1.a > t2.x) OR ((t1.a = t2.x) AND (t1.b > t2.y))\nFROM t1 INNER JOIN t2;\n \nExamples\n-------- \nSELECT 2 > 2;\n \n+-------+\n| 2 > 2 |\n+-------+\n| 0 |\n+-------+\n \nSELECT \'b\' > \'a\';\n \n+-----------+\n| \'b\' > \'a\' |\n+-----------+\n| 1 |\n+-----------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/greater-than/','','https://mariadb.com/kb/en/library/greater-than/'),(227,'>=',18,'Syntax\n------ \n>=\n \nDescription\n----------- \nGreater than or equal operator. Evaluates both SQL\nexpressions and returns 1 if the left value is greater than\nor equal to the right value and 0 if it is not, or NULL if\neither expression is NULL. If the expressions return\ndifferent data types, (for instance, a number and a string),\nperforms type conversion.\n \nWhen used in row comparisons these two queries return the\nsame results:\n \nSELECT (t1.a, t1.b) >= (t2.x, t2.y) \nFROM t1 INNER JOIN t2;\n \nSELECT (t1.a > t2.x) OR ((t1.a = t2.x) AND (t1.b >= t2.y))\nFROM t1 INNER JOIN t2;\n \nExamples\n-------- \nSELECT 2 >= 2;\n \n+--------+\n| 2 >= 2 |\n+--------+\n| 1 |\n+--------+\n \nSELECT \'A\' >= \'a\';\n \n+------------+\n| \'A\' >= \'a\' |\n+------------+\n| 1 |\n+------------+\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/greater-than-or-equal/','','https://mariadb.com/kb/en/library/greater-than-or-equal/'),(229,'COALESCE',18,'Syntax\n------ \nCOALESCE(value,...)\n \nDescription\n----------- \nReturns the first non-NULL value in the list, or NULL if\nthere are no\nnon-NULL values. At least one parameter must be passed.\n \nSee also NULL Values in MariaDB.\n \nExamples\n-------- \nSELECT COALESCE(NULL,1);\n+------------------+\n| COALESCE(NULL,1) |\n+------------------+\n| 1 |\n+------------------+\n \nSELECT COALESCE(NULL,NULL,NULL);\n+--------------------------+\n| COALESCE(NULL,NULL,NULL) |\n+--------------------------+\n| NULL |\n+--------------------------+\n \nWhen two arguments are given, COALESCE() is the same as\nIFNULL():\n \nSET @a=NULL, @b=1;\n \nSELECT COALESCE(@a, @b), IFNULL(@a, @b);\n+------------------+----------------+\n| COALESCE(@a, @b) | IFNULL(@a, @b) |\n+------------------+----------------+\n| 1 | 1 |\n+------------------+----------------+\n \nHex type confusion:\n \nCREATE TABLE t1 (a INT, b VARCHAR(10));\nINSERT INTO t1 VALUES (0x31, 0x61),(COALESCE(0x31),\nCOALESCE(0x61));\n \nSELECT * FROM t1;\n \n+------+------+\n| a | b |\n+------+------+\n| 49 | a |\n| 1 | a |\n+------+------+\n \nThe reason for the differing results above is that when 0x31\nis inserted directly to the column, it\'s treated as a\nnumber (see Hexadecimal Literals), while when 0x31 is passed\nto COALESCE(), it\'s treated as a string, because:\nHEX values have a string data type by default.\nCOALESCE() has the same data type as the argument. \n \n\n\nURL: https://mariadb.com/kb/en/library/coalesce/','','https://mariadb.com/kb/en/library/coalesce/'),(231,'IN',18,'Syntax\n------ \nexpr IN (value,...)\n \nDescription\n----------- \nReturns 1 if expr is equal to any of the values in the IN\nlist, else\nreturns 0. If all values are constants, they are evaluated\naccording\nto the type of expr and sorted. The search for the item then\nis done\nusing a binary search. This means IN is very quick if the IN\nvalue\nlist consists entirely of constants. Otherwise, type\nconversion takes\nplace according to the rules described at Type Conversion,\nbut\napplied to all the arguments.\n \nIf expr is NULL, IN always returns NULL. If at least one of\nthe values in the list is NULL, and one of the comparisons\nis true, the result is 1. If at least one of the values in\nthe list is NULL and none of the comparisons is true, the\nresult is NULL.\n \nExamples\n-------- \nSELECT 2 IN (0,3,5,7);\n+----------------+\n| 2 IN (0,3,5,7) |\n+----------------+\n| 0 |\n+----------------+\n \nSELECT \'wefwf\' IN (\'wee\',\'wefwf\',\'weg\');\n+----------------------------------+\n| \'wefwf\' IN (\'wee\',\'wefwf\',\'weg\') |\n+----------------------------------+\n| 1 |\n+----------------------------------+ \n \nType conversion:\n \nSELECT 1 IN (\'1\', \'2\', \'3\');\n+----------------------+\n| 1 IN (\'1\', \'2\', \'3\') |\n+----------------------+\n| 1 |\n+----------------------+\n \nSELECT NULL IN (1, 2, 3);\n+-------------------+\n| NULL IN (1, 2, 3) |\n+-------------------+\n| NULL |\n+-------------------+\n \nMariaDB [(none)]> SELECT 1 IN (1, 2, NULL);\n+-------------------+\n| 1 IN (1, 2, NULL) |\n+-------------------+\n| 1 |\n+-------------------+\n \nMariaDB [(none)]> SELECT 5 IN (1, 2, NULL);\n+-------------------+\n| 5 IN (1, 2, NULL) |\n+-------------------+\n| NULL |\n+-------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/in/','','https://mariadb.com/kb/en/library/in/'),(442,'EXPLAIN',28,'Syntax\n------ \nEXPLAIN tbl_name\n \nOr\n \nEXPLAIN [EXTENDED | PARTITIONS] \n {SELECT select_options | UPDATE update_options | DELETE\ndelete_options}\n \nDescription\n----------- \nThe EXPLAIN statement can be used either as a synonym for\nDESCRIBE or as a way to obtain information about how MariaDB\nexecutes a SELECT (as well as UPDATE and DELETE since\nMariaDB 10.0.5) statement:\n\'EXPLAIN tbl_name\' is synonymous with \n \'DESCRIBE tbl_name\' or \n \'SHOW COLUMNS FROM tbl_name\'.\nWhen you precede a SELECT statement (or, since MariaDB\n10.0.5, an UPDATE or a DELETE as well) with the keyword \n EXPLAIN, MariaDB displays information from the optimizer\n about the query execution plan. That is, MariaDB explains\nhow it would\n process the SELECT, UPDATE or DELETE, including information\nabout how tables\n are joined and in which order. EXPLAIN EXTENDED can be\n used to provide additional information.\nEXPLAIN PARTITIONS has been available since MySQL 5.1.5. It\nis useful only when examining queries involving partitioned\ntables. For details, see Partition pruning and selection.\nANALYZE statement, which performs the query as well as\nproducing EXPLAIN output, and provides actual as well as\nestimated statistics, has been available from MariaDB\n10.1.0.\nSince MariaDB 10.0.5, it has been possible to have EXPLAIN\noutput printed in the slow query log. See EXPLAIN in the\nSlow Query Log for details.\n \nSince MariaDB 10.0, SHOW EXPLAIN shows the output of a\nrunning statement. In some cases, its output can be closer\nto reality than EXPLAIN.\n \nSince MariaDB 10.1, the ANALYZE statement runs a statement\nand returns information about its execution plan. It also\nshows additional columns, to check how much the optimizer\'s\nestimation about filtering and found rows are close to\nreality.\n \nThere is an online EXPLAIN Analyzer that you can use to\nshare EXPLAIN and EXPLAIN EXTENDED output with others.\n \nEXPLAIN can acquire metadata locks in the same way that\nSELECT does, as it needs to know table metadata and,\nsometimes, data as well.\n \nThe columns in EXPLAIN ... SELECT\n \nColumn name | Description | \n \nid | Sequence number that shows in which order tables are\njoined. | \n \nselect_type | What kind of SELECT the table comes from. | \n \ntable | Alias name of table. Materialized temporary tables\nfor sub queries are named | \n \ntype | How rows are found from the table (join type). | \n \npossible_keys | keys in table that could be used to find\nrows in the table | \n \nkey | The name of the key that is used to retrieve rows.\nNULL is no key was used. | \n \nkey_len | How many bytes of the key that was used (shows if\nwe are using only parts of the multi-column key). | \n \nref | The reference that is used to as the key value. | \n \nrows | An estimate of how many rows we will find in the\ntable for each key lookup. | \n \nExtra | Extra information about this join. | \n \nHere are descriptions of the values for some of the more\ncomplex columns in EXPLAIN ... SELECT:\n \n\"select_type\" column\n \nThe select_type column can have the following values:\n \nValue | Description | \n \nDEPENDENT SUBQUERY | The SUBQUERY is DEPENDENT. | \n \nDEPENDENT UNION | The UNION is DEPENDENT. | \n \nDERIVED | The SELECT is DERIVED from the PRIMARY. | \n \nMATERIALIZED | The SUBQUERY is MATERIALIZED. | \n \nPRIMARY | The SELECT is a PRIMARY one. | \n \nSIMPLE | The SELECT is a SIMPLE one. | \n \nSUBQUERY | The SELECT is a SUBQUERY of the PRIMARY. | \n \nUNCACHEABLE SUBQUERY | The SUBQUERY is UNCACHEABLE. | \n \nUNCACHEABLE UNION | The UNION is UNCACHEABLE. | \n \nUNION | The SELECT is a UNION of the PRIMARY. | \n \nUNION RESULT | The result of the UNION. | \n \n\"Type\" column\n \nThis column contains information on how the table is\naccessed.\n \nValue | Description | \n \nALL | A full table scan is done for the table (all rows are\nread). This is bad if the table is large and the table is\njoined against a previous table! This happens when the\noptimizer could not find any usable index to access rows. | \n \nconst | There is only one possibly matching row in the\ntable. The row is read before the optimization phase and all\ncolumns in the table are treated as constants. | \n \neq_ref | A unique index is used to find the rows. This is\nthe best possible plan to find the row. | \n \nfulltext | A fulltext index is used to access the rows. | \n \nindex_merge | A \'range\' access is done for for several\nindex and the found rows are merged. The key column shows\nwhich keys are used. | \n \nindex_subquery | This is similar as ref, but used for sub\nqueries that are transformed to key lookups. | \n \nindex | A full scan over the used index. Better than ALL but\nstill bad if index is large and the table is joined against\na previous table. | \n \nrange | The table will be accessed with a key over one or\nmore value ranges. | \n \nref_or_null | Like \'ref\' but in addition another search\nfor the \'null\' value is done if the first value was not\nfound. This happens usually with sub queries. | \n \nref | A non unique index or prefix of an unique index is\nused to find the rows. Good if the prefix doesn\'t match\nmany rows. | \n \nsystem | The table has 0 or 1 rows. | \n \nunique_subquery | This is similar as eq_ref, but used for\nsub queries that are transformed to key lookups | \n \n\"Extra\" column\n \nThis column consists of one or more of the following values,\nseparated by \';\'\n \n Note that some of these values are detected after the\noptimization phase.\n \nThe optimization phase can do the following changes to the\nWHERE clause:\nAdd the expressions from the ON and USING clauses to the\nWHERE\n clause.\nConstant propagation: If there is column=constant, replace\nall column\n instances with this constant.\nReplace all columns from \'const\' tables with their values.\nRemove the used key columns from the WHERE (as this will be\ntested as\n part of the key lookup).\nRemove impossible constant sub expressions.\n For example WHERE \'(a=1 and a=2) OR b=1\' becomes \'b=1\'.\nReplace columns with other columns that has identical\nvalues:\n Example: WHERE a=b and a=c may be treated\n as \'WHERE a=b and a=c and b=c\'.\nAdd extra conditions to detect impossible row conditions\nearlier. This\n happens mainly with OUTER JOIN where we in some cases add\ndetection\n of NULL values in the WHERE (Part of \'Not exists\'\noptimization).\n This can cause an unexpected \'Using where\' in the Extra\ncolumn.\nFor each table level we remove expressions that have already\nbeen tested when\n we read the previous row. Example: When joining tables t1\nwith t2\n using the following WHERE \'t1.a=1 and t1.a=t2.b\', we\ndon\'t have to\n test \'t1.a=1\' when checking rows in t2 as we already know\nthat this\n expression is true. \n \nValue | Description | \n \nconst row not found | The table was a system table (a table\nwith should exactly one row), but no row was found. | \n \nDistinct | If distinct optimization (remove duplicates) was\nused. This is marked only for the last table in the SELECT.\n| \n \nFull scan on NULL key | The table is a part of the sub query\nand if the value that is used to match the sub query will be\nNULL, we will do a full table scan. | \n \nImpossible HAVING | The used HAVING clause is always false\nso the SELECT will return no rows. | \n \nImpossible WHERE noticed after reading const tables. | The\nused WHERE clause is always false so the SELECT will return\nno rows. This case was detected after we had read all\n\'const\' tables and used the column values as constant in\nthe WHERE clause. For example: WHERE const_column=5 and\nconst_column had a value of 4. | \n \nImpossible WHERE | The used WHERE clause is always false so\nthe SELECT will return no rows. For example: WHERE 1=2 | \n \nNo matching min/max row | During early optimization of\nMIN()/MAX() values it was detected that no row could match\nthe WHERE clause. The MIN()/MAX() function will return NULL.\n| \n \nno matching row in const table | The table was a const table\n(a table with only one possible matching row), but no row\nwas found. | \n \nNo tables used | The SELECT was a sub query that did not use\nany tables. For example a there was no FROM clause or a FROM\nDUAL clause. | \n \nNot exists | Stop searching after more row if we find one\nsingle matching row. This optimization is used with LEFT\nJOIN where one is explicitly searching for rows that\ndoesn\'t exists in the LEFT JOIN TABLE. Example: SELECT *\nFROM t1 LEFT JOIN t2 on (...) WHERE t2.not_null_column IS\nNULL. As t2.not_null_column can only be NULL if there was no\nmatching row for on condition, we can stop searching if we\nfind a single matching row. | \n \nOpen_frm_only | For information_schema tables. Only the frm\n(table definition file was opened) was opened for each\nmatching row. | \n \nOpen_full_table | For information_schema tables. A full\ntable open for each matching row is done to retrieve the\nrequested information. (Slow) | \n \nOpen_trigger_only | For information_schema tables. Only the\ntrigger file definition was opened for each matching row. | \n \nRange checked for each record (index map: ...) | This only\nhappens when there was no good default index to use but\nthere may some index that could be used when we can treat\nall columns from previous table as constants. For each row\ncombination the optimizer will decide which index to use (if\nany) to fetch a row from this table. This is not fast, but\nfaster than a full table scan that is the only other choice.\nThe index map is a bitmask that shows which index are\nconsidered for each row condition. | \n \nScanned 0/1/all databases | For information_schema tables.\nShows how many times we had to do a directory scan. | \n \nSelect tables optimized away | All tables in the join was\noptimized away. This happens when we are only using\nCOUNT(*), MIN() and MAX() functions in the SELECT and we\nwhere able to replace all of these with constants. | \n \nSkip_open_table | For information_schema tables. The queried\ntable didn\'t need to be opened. | \n \nunique row not found | The table was detected to be a const\ntable (a table with only one possible matching row) during\nthe early optimization phase, but no row was found. | \n \nUsing filesort | Filesort is needed to resolve the query.\nThis means an extra phase where we first collect all columns\nto sort, sort them with a disk based merge sort and then use\nthe sorted set to retrieve the rows in sorted order. If the\ncolumn set is small, we store all the columns in the sort\nfile to not have to go to the database to retrieve them\nagain. | \n \nUsing index | Only the index is used to retrieve the needed\ninformation from the table. There is no need to perform an\nextra seek to retrieve the actual record. | \n \nUsing index condition | Like \'Using where\' but the where\ncondition is pushed down to the table engine for internal\noptimization at the index level. | \n \nUsing index condition(BKA) | Like \'Using index condition\'\nbut in addition we use batch key access to retrieve rows. | \n \nUsing index for group-by | The index is being used to\nresolve a GROUP BY or DISTINCT query. The rows are not read.\nThis is very efficient if the table has a lot of identical\nindex entries as duplicates are quickly jumped over. | \n \nUsing intersect(...) | For index_merge joins. Shows which\nindex are part of the intersect. | \n \nUsing join buffer | We store previous row combinations in a\nrow buffer to be able to match each row against all of the\nrows combinations in the join buffer at one go. | \n \nUsing sort_union(...) | For index_merge joins. Shows which\nindex are part of the union. | \n \nUsing temporary | A temporary table is created to hold the\nresult. This typically happens if you are using GROUP BY,\nDISTINCT or ORDER BY. | \n \nUsing where | A WHERE expression (in additional to the\npossible key lookup) is used to check if the row should be\naccepted. If you don\'t have \'Using where\' together with a\njoin type of ALL, you are probably doing something wrong! | \n \nUsing where with pushed condition | Like \'Using where\' but\nthe where condition is pushed down to the table engine for\ninternal optimization at the row level. | \n \nUsing buffer | The UPDATE statement will first buffer the\nrows, and then run the updates, rather than do updates on\nthe fly. See Using Buffer UPDATE Algorithm for a detailed\nexplanation. | \n \nEXPLAIN EXTENDED\n \nThe EXTENDED keyword adds another column, filtered, to the\noutput. This is a percentage estimate of the table rows that\nwill be filtered by the condition.\n \nAn EXPLAIN EXTENDED will always throw a warning, as it adds\nextra Message information to a subsequent SHOW WARNINGS\nstatement. This includes what the SELECT query would look\nlike after optimizing and rewriting rules are applied and\nhow the optimizer qualifies columns and tables.\n \nExamples\n-------- \nAs synonym for DESCRIBE or SHOW COLUMNS FROM:\n \nDESCRIBE city;\n \n+------------+----------+------+-----+---------+----------------+\n| Field | Type | Null | Key | Default | Extra |\n+------------+----------+------+-----+---------+----------------+\n| Id | int(11) | NO | PRI | NULL | auto_increment |\n| Name | char(35) | YES | | NULL | |\n| Country | char(3) | NO | UNI | | |\n| District | char(20) | YES | MUL | | |\n| Population | int(11) | YES | | NULL | |\n+------------+----------+------+-----+---------+----------------+\n \nA simple set of examples to see how EXPLAIN can identify\npoor index usage:\n \nCREATE TABLE IF NOT EXISTS `employees_example` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `first_name` varchar(30) NOT NULL,\n `last_name` varchar(40) NOT NULL,\n `position` varchar(25) NOT NULL,\n `home_address` varchar(50) NOT NULL,\n `home_phone` varchar(12) NOT NULL,\n `employee_code` varchar(25) NOT NULL,\n PRIMARY KEY (`id`),\n UNIQUE KEY `employee_code` (`employee_code`),\n KEY `first_name` (`first_name`,`last_name`)\n) ENGINE=Aria;\n \nINSERT INTO `employees_example` (`first_name`, `last_name`,\n`position`, `home_address`, `home_phone`, `employee_code`)\n VALUES\n (\'Mustapha\', \'Mond\', \'Chief Executive Officer\', \'692\nPromiscuous Plaza\', \'326-555-3492\', \'MM1\'),\n (\'Henry\', \'Foster\', \'Store Manager\', \'314 Savage\nCircle\', \'326-555-3847\', \'HF1\'),\n (\'Bernard\', \'Marx\', \'Cashier\', \'1240 Ambient\nAvenue\', \'326-555-8456\', \'BM1\'),\n (\'Lenina\', \'Crowne\', \'Cashier\', \'281 Bumblepuppy\nBoulevard\', \'328-555-2349\', \'LC1\'),\n (\'Fanny\', \'Crowne\', \'Restocker\', \'1023 Bokanovsky\nLane\', \'326-555-6329\', \'FC1\'),\n (\'Helmholtz\', \'Watson\', \'Janitor\', \'944 Soma\nCourt\', \'329-555-2478\', \'HW1\');\n \nSHOW INDEXES FROM employees_example;\n \n+-------------------+------------+---------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+\n| Table | Non_unique | Key_name | Seq_in_index | Column_name\n| Collation | Cardinality | Sub_part | Packed | Null |\nIndex_type | Comment | Index_comment |\n+-------------------+------------+---------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+\n| employees_example | 0 | PRIMARY | 1 | id | A | 7 | NULL |\nNULL | | BTREE | | |\n| employees_example | 0 | employee_code | 1 | employee_code\n| A | 7 | NULL | NULL | | BTREE | | |\n| employees_example | 1 | first_name | 1 | first_name | A |\nNULL | NULL | NULL | | BTREE | | |\n| employees_example | 1 | first_name | 2 | last_name | A |\nNULL | NULL | NULL | | BTREE | | |\n+-------------------+------------+---------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+\n \nSELECT on a primary key:\n \nEXPLAIN SELECT * FROM employees_example WHERE id=1;\n \n+------+-------------+-------------------+-------+---------------+---------+---------+-------+------+-------+\n| id | select_type | table | type | possible_keys | key |\nkey_len | ref | rows | Extra |\n+------+-------------+-------------------+-------+---------------+---------+---------+-------+------+-------+\n| 1 | SIMPLE | employees_example | const | PRIMARY | PRIMARY\n| 4 | const | 1 | |\n+------+-------------+-------------------+-------+---------------+---------+---------+-------+------+-------+\n \nThe type is const, which means that only one possible result\ncould be returned. \nNow, returning the same record but searching by their phone\nnumber:\n \nEXPLAIN SELECT * FROM employees_example WHERE\nhome_phone=\'326-555-3492\';\n \n+------+-------------+-------------------+------+---------------+------+---------+------+------+-------------+\n| id | select_type | table | type | possible_keys | key |\nkey_len | ref | rows | Extra |\n+------+-------------+-------------------+------+---------------+------+---------+------+------+-------------+\n| 1 | SIMPLE | employees_example | ALL | NULL | NULL | NULL\n| NULL | 6 | Using where |\n+------+-------------+-------------------+------+---------------+------+---------+------+------+-------------+\n \nHere, the type is All, which means no index could be used.\nLooking at the rows count, a full table scan (all six rows)\nhad to be performed in order to retrieve the record. If\nit\'s a requirement to search by phone number, an index will\nhave to be created.\n \nSHOW EXPLAIN example:\n \nSHOW EXPLAIN FOR 1;\n \n+------+-------------+-------+-------+---------------+------+---------+------+---------+-------------+\n| id | select_type | table | type | possible_keys | key |\nkey_len | ref | rows | Extra |\n+------+-------------+-------+-------+---------------+------+---------+------+---------+-------------+\n| 1 | SIMPLE | tbl | index | NULL | a | 5 | NULL | 1000107 |\nUsing index |\n+------+-------------+-------+-------+---------------+------+---------+------+---------+-------------+\n1 row in set, 1 warning (0.00 sec)\n \nExample of ref_or_null optimization\n \nSELECT * FROM table_name\n WHERE key_column=expr OR key_column IS NULL;\n \nref_or_null is something that often happens when you use\nsubqueries with NOT IN as then one has to do an extra check\nfor NULL values if the first value didn\'t have a matching\nrow. \n \n\n\nURL: https://mariadb.com/kb/en/library/explain/','','https://mariadb.com/kb/en/library/explain/'),(443,'EXPLAIN ANALYZE',28,'The syntax for the EXPLAIN ANALYZE feature was changed to\nANALYZE statement, available since MariaDB 10.1.0. See\nANALYZE statement. \n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/explain-analyze/','','https://mariadb.com/kb/en/library/explain-analyze/'),(446,'CONTAINS',30,'Syntax\n------ \nContains(g1,g2)\n \nDescription\n----------- \nReturns 1 or 0 to indicate whether a geometry g1 completely\ncontains geometry g2. CONTAINS() is based on the original\nMySQL implementation and uses object bounding rectangles,\nwhile ST_CONTAINS() uses object shapes. \n \nThis tests the opposite relationship to Within().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/contains/','','https://mariadb.com/kb/en/library/contains/'),(448,'DISJOINT',30,'Syntax\n------ \nDisjoint(g1,g2)\n \nDescription\n----------- \nReturns 1 or 0 to indicate whether g1 is spatially disjoint\nfrom\n(does not intersect) g2.\n \nDISJOINT() tests the opposite relationship to INTERSECTS().\n \nDISJOINT() is based on the original MySQL implementation and\nuses object bounding rectangles, while ST_DISJOINT() uses\nobject shapes.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/disjoint/','','https://mariadb.com/kb/en/library/disjoint/'),(449,'EQUALS',30,'Syntax\n------ \nEquals(g1,g2)\n \nFrom MariaDB 10.2.3:\n \nMBREQUALS(g1,g2)\n \nDescription\n----------- \nReturns 1 or 0 to indicate whether g1 is spatially equal to\ng2.\n \nEQUALS() is based on the original MySQL implementation and\nuses object bounding rectangles, while ST_EQUALS() uses\nobject shapes.\n \nFrom MariaDB 10.2.3, MBREQUALS is a synonym for Equals.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/equals/','','https://mariadb.com/kb/en/library/equals/'),(450,'INTERSECTS',30,'Syntax\n------ \nINTERSECTS(g1,g2)\n \nDescription\n----------- \nReturns 1 or 0 to indicate whether geometry g1 spatially\nintersects geometry g2.\n \nINTERSECTS() is based on the original MySQL implementation\nand uses object bounding rectangles, while ST_INTERSECTS()\nuses object shapes.\n \nINTERSECTS() tests the opposite relationship to DISJOINT().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/intersects/','','https://mariadb.com/kb/en/library/intersects/'),(451,'OVERLAPS',30,'Syntax\n------ \nOVERLAPS(g1,g2)\n \nDescription\n----------- \nReturns 1 or 0 to indicate whether g1 spatially overlaps g2.\nThe term spatially overlaps is used if two geometries\nintersect and their\nintersection results in a geometry of the same dimension but\nnot equal to\neither of the given geometries.\n \nOVERLAPS() is based on the original MySQL implementation and\nuses object bounding rectangles, while ST_OVERLAPS() uses\nobject shapes.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/overlaps/','','https://mariadb.com/kb/en/library/overlaps/'),(233,'IS',18,'Syntax\n------ \nIS boolean_value\n \nDescription\n----------- \nTests a value against a boolean value, where boolean_value\ncan be\nTRUE, FALSE, or UNKNOWN.\n \nThere is an important difference between using IS TRUE or\ncomparing a value with TRUE using =. When using =, only 1\nequals to TRUE. But when using IS TRUE, all values which are\nlogically true (like a number > 1) return TRUE.\n \nExamples\n-------- \nSELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;\n+-----------+------------+-----------------+\n| 1 IS TRUE | 0 IS FALSE | NULL IS UNKNOWN |\n+-----------+------------+-----------------+\n| 1 | 1 | 1 |\n+-----------+------------+-----------------+\n \nDifference between = and IS TRUE:\n \nSELECT 2 = TRUE, 2 IS TRUE;\n+----------+-----------+\n| 2 = TRUE | 2 IS TRUE |\n+----------+-----------+\n| 0 | 1 |\n+----------+-----------+\n \n\n\nURL: https://mariadb.com/kb/en/library/is/','','https://mariadb.com/kb/en/library/is/'),(234,'IS NOT',18,'Syntax\n------ \nIS NOT boolean_value\n \nDescription\n----------- \nTests a value against a boolean value, where boolean_value\ncan be\nTRUE, FALSE, or UNKNOWN. \n \nExamples\n-------- \nSELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT\nUNKNOWN;\n+------------------+------------------+---------------------+\n| 1 IS NOT UNKNOWN | 0 IS NOT UNKNOWN | NULL IS NOT UNKNOWN\n|\n+------------------+------------------+---------------------+\n| 1 | 1 | 0 |\n+------------------+------------------+---------------------+\n \nSELECT NULL IS NOT TRUE, NULL IS NOT FALSE;\n+------------------+-------------------+\n| NULL IS NOT TRUE | NULL IS NOT FALSE |\n+------------------+-------------------+\n| 1 | 1 |\n+------------------+-------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/is-not/','','https://mariadb.com/kb/en/library/is-not/'),(236,'IS NULL',18,'Syntax\n------ \nIS NULL\n \nDescription\n----------- \nTests whether a value is NULL. See also NULL Values in\nMariaDB.\n \nExamples\n-------- \nSELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;\n+-----------+-----------+--------------+\n| 1 IS NULL | 0 IS NULL | NULL IS NULL |\n+-----------+-----------+--------------+\n| 0 | 0 | 1 |\n+-----------+-----------+--------------+\n \nCompatibility\n \nSome ODBC applications use the syntax auto_increment_field\nIS NOT NULL to find the latest row that was inserted with an\nautogenerated key value. If your applications need this, you\ncan set the sql_auto_is_null variable to 1.\n \nSET @@sql_auto_is_null=1;\nCREATE TABLE t1 (auto_increment_column INT NOT NULL\nAUTO_INCREMENT PRIMARY KEY);\nINSERT INTO t1 VALUES (NULL);\nSELECT * FROM t1 WHERE auto_increment_column IS NULL;\n \n+-----------------------+\n| auto_increment_column |\n+-----------------------+\n| 1 |\n+-----------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/is-null/','','https://mariadb.com/kb/en/library/is-null/'),(238,'LEAST',18,'Syntax\n------ \nLEAST(value1,value2,...)\n \nDescription\n----------- \nWith two or more arguments, returns the smallest\n(minimum-valued)\nargument. The arguments are compared using the following\nrules:\nIf the return value is used in an INTEGER context or all\narguments are integer-valued, they are compared as integers.\nIf the return value is used in a REAL context or all\narguments are real-valued, they are compared as reals.\nIf any argument is a case-sensitive string, the arguments\nare compared as case-sensitive strings.\nIn all other cases, the arguments are compared as\ncase-insensitive strings.\n \nLEAST() returns NULL if any argument is NULL.\n \nExamples\n-------- \nSELECT LEAST(2,0);\n+------------+\n| LEAST(2,0) |\n+------------+\n| 0 |\n+------------+\n \nSELECT LEAST(34.0,3.0,5.0,767.0);\n+---------------------------+\n| LEAST(34.0,3.0,5.0,767.0) |\n+---------------------------+\n| 3.0 |\n+---------------------------+\n \nSELECT LEAST(\'B\',\'A\',\'C\');\n+--------------------+\n| LEAST(\'B\',\'A\',\'C\') |\n+--------------------+\n| A |\n+--------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/least/','','https://mariadb.com/kb/en/library/least/'),(239,'NOT BETWEEN',18,'Syntax\n------ \nexpr NOT BETWEEN min AND max\n \nDescription\n----------- \nThis is the same as NOT (expr BETWEEN min AND max).\n \nNote that the meaning of the alternative form NOT expr\nBETWEEN min AND max is affected by the HIGH_NOT_PRECEDENCE\nSQL_MODE flag.\n \nExamples\n-------- \nSELECT 1 NOT BETWEEN 2 AND 3;\n+-----------------------+\n| 1 NOT BETWEEN 2 AND 3 |\n+-----------------------+\n| 1 |\n+-----------------------+\n \nSELECT \'b\' NOT BETWEEN \'a\' AND \'c\';\n+-----------------------------+\n| \'b\' NOT BETWEEN \'a\' AND \'c\' |\n+-----------------------------+\n| 0 |\n+-----------------------------+\n \nNULL:\n \nSELECT 1 NOT BETWEEN 1 AND NULL;\n+--------------------------+\n| 1 NOT BETWEEN 1 AND NULL |\n+--------------------------+\n| NULL |\n+--------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/not-between/','','https://mariadb.com/kb/en/library/not-between/'),(240,'NOT IN',18,'Syntax\n------ \nexpr NOT IN (value,...)\n \nDescription\n----------- \nThis is the same as NOT (expr IN (value,...)).\n \nExamples\n-------- \nSELECT 2 NOT IN (0,3,5,7);\n+--------------------+\n| 2 NOT IN (0,3,5,7) |\n+--------------------+\n| 1 |\n+--------------------+\n \nSELECT \'wefwf\' NOT IN (\'wee\',\'wefwf\',\'weg\');\n+--------------------------------------+\n| \'wefwf\' NOT IN (\'wee\',\'wefwf\',\'weg\') |\n+--------------------------------------+\n| 0 |\n+--------------------------------------+\n \nSELECT 1 NOT IN (\'1\', \'2\', \'3\');\n+--------------------------+\n| 1 NOT IN (\'1\', \'2\', \'3\') |\n+--------------------------+\n| 0 |\n+--------------------------+\n \nNULL:\n \nSELECT NULL NOT IN (1, 2, 3);\n+-----------------------+\n| NULL NOT IN (1, 2, 3) |\n+-----------------------+\n| NULL |\n+-----------------------+\n \nSELECT 1 NOT IN (1, 2, NULL);\n+-----------------------+\n| 1 NOT IN (1, 2, NULL) |\n+-----------------------+\n| 0 |\n+-----------------------+\n \nSELECT 5 NOT IN (1, 2, NULL);\n+-----------------------+\n| 5 NOT IN (1, 2, NULL) |\n+-----------------------+\n| NULL |\n+-----------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/not-in/','','https://mariadb.com/kb/en/library/not-in/'),(454,'ST_DIFFERENCE',30,'Syntax\n------ \nST_DIFFERENCE(g1,g2)\n \nDescription\n----------- \nReturns a geometry representing the point set difference of\nthe given geometry values.\n \nExample\n \nSET @g1 = POINT(10,10), @g2 = POINT(20,20);\n \nSELECT ST_AsText(ST_Difference(@g1, @g2));\n+------------------------------------+\n| ST_AsText(ST_Difference(@g1, @g2)) |\n+------------------------------------+\n| POINT(10 10) |\n+------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_difference/','','https://mariadb.com/kb/en/library/st_difference/'),(456,'ST_DISTANCE',30,'ST_DISTANCE() was introduced in MariaDB 5.3.3.\n \nSyntax\n------ \nST_DISTANCE(g1,g2)\n \nDescription\n----------- \nReturns the distance between two geometries, or null if not\ngiven valid inputs.\n \nExample\n \nSELECT ST_Distance(POINT(1,2),POINT(2,2));\n+------------------------------------+\n| ST_Distance(POINT(1,2),POINT(2,2)) |\n+------------------------------------+\n| 1 |\n+------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_distance/','','https://mariadb.com/kb/en/library/st_distance/'),(459,'ST_LENGTH',30,'Syntax\n------ \nST_LENGTH(ls)\n \nDescription\n----------- \nReturns as a double-precision number the length of the\nLineString value ls in its associated spatial reference.\n \nExamples\n-------- \nSET @ls = \'LineString(1 1,2 2,3 3)\';\n \nSELECT ST_LENGTH(ST_GeomFromText(@ls));\n+---------------------------------+\n| ST_LENGTH(ST_GeomFromText(@ls)) |\n+---------------------------------+\n| 2.82842712474619 |\n+---------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_length/','','https://mariadb.com/kb/en/library/st_length/'),(249,'Parentheses',19,'Parentheses are sometimes called precedence operators - this\nmeans that they can be used to change the other operator\'s\nprecedence in an expression. The expressions that are\nwritten between parentheses are computed before the\nexpressions that are written outside. Parentheses must\nalways contain an expression (that is, they cannot be\nempty), and can be nested.\n \nFor example, the following expressions could return\ndifferent results:\nNOT a OR b\nNOT (a OR b)\n \nIn the first case, NOT applies to a, so if a is FALSE or b\nis TRUE, the expression returns TRUE. In the second case,\nNOT applies to the result of a OR b, so if at least one of a\nor b is TRUE, the expression is TRUE.\n \nWhen the precedence of operators is not intuitive, you can\nuse parentheses to make it immediately clear for whoever\nreads the statement.\n \nThe precedence of the NOT operator can also be affected by\nthe HIGH_NOT_PRECEDENCE SQL_MODE flag.\n \nOther uses\n \nParentheses must always be used to enclose subqueries.\n \nParentheses can also be used in a JOIN statement between\nmultiple tables to determine which tables must be joined\nfirst.\n \nAlso, parentheses are used to enclose the list of parameters\nto be passed to built-in functions, user-defined functions\nand stored routines. However, when no parameter is passed to\na stored procedure, parentheses are optional. For builtin\nfunctions and user-defined functions, spaces are not allowed\nbetween the function name and the open parenthesis, unless\nthe IGNORE_SPACE SQL_MODE is set. For stored routines (and\nfor functions if IGNORE_SPACE is set) spaces are allowed\nbefore the open parenthesis, including tab characters and\nnew line characters.\n \nSyntax errors\n \nIf there are more open parentheses than closed parentheses,\nthe error usually looks like this:\n \nERROR 1064 (42000): You have an error in your SQL syntax;\ncheck the manual that\ncorresponds to your MariaDB server version for the right\nsyntax to use near \'\' a\nt line 1\n \nNote the empty string.\n \nIf there are more closed parentheses than open parentheses,\nthe error usually looks like this:\n \nERROR 1064 (42000): You have an error in your SQL syntax;\ncheck the manual that\ncorresponds to your MariaDB server version for the right\nsyntax to use near \')\'\nat line 1\n \nNote the quoted closed parenthesis.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/parentheses/','','https://mariadb.com/kb/en/library/parentheses/'),(251,'ANALYZE TABLE',20,'Syntax\n------ \nANALYZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name\n[,tbl_name ...] \n [PERSISTENT FOR [ALL|COLUMNS ([col_name [,col_name ...]])] \n [INDEXES ([index_name [,index_name ...]])]] \n \nDescription\n----------- \nANALYZE TABLE analyzes and stores the key distribution for a\ntable (index statistics). During the analysis, the table is\nlocked with a read lock. This statement works with MyISAM,\nAria and InnoDB tables. For MyISAM tables, this statement is\nequivalent\nto using myisamchk --analyze.\n \nFor more information on how the analysis works within\nInnoDB, see\nInnoDB Limitations.\n \nMariaDB uses the stored key distribution to decide the order\nin which\ntables should be joined when you perform a join on something\nother than\na constant. In addition, key distributions can be used when\ndeciding\nwhich indexes to use for a specific table within a query.\n \nThis statement requires SELECT and INSERT privileges for the\ntable.\n \nBy default, ANALYZE TABLE statements are written to the\nbinary log and will be replicated. The NO_WRITE_TO_BINLOG\nkeyword (LOCAL is an alias) will ensure the statement is not\nwritten to the binary log. \n \nANALYZE TABLE is also supported for partitioned tables. You\ncan use ALTER TABLE ... ANALYZE PARTITION to analyze one or\nmore partitions.\n \nEngine-Independent Statistics\n \nMariaDB 10.0.1 extended ANALYZE TABLE to support\nengine-independent statistics.\n \nEngine-independent statistics are collected by doing full\ntable and full index scans, and collecting can be quite\nexpensive. \n \nANALYZE TABLE behavior depends on the value of the\nuse_stat_tables system variable.\n \nIf use_stat_tables is set to never (default in = MariaDB\n10.4.1), ANALYZE TABLE t will collect storage engine\nstatistics, and not engine-independent statistics.\n \nIf use_stat_tables is set to complementary or preferably,\nANALYZE TABLE t will collect engine-independent statistics. \n \nIn order to collect engine-independent statistics when\nuse_stat_tables is not set to one of the above two values\n(it is not by default), the extended form of ANALYZE TABLE,\nusing PERSISTENT FOR, must be used. This also allows one to\ncollect statistics only for particular columns or indexes.\nNote that engine-independent statistics are used by default\nfrom MariaDB 10.4 (use_stat_tables=preferably_for_queries),\nso you will probably want to use PERSISTENT FOR.\n \nIt is recommended to collect engine-independent statistics\non as-needed basis, so typically one will not have\nengine-independent statistics for all indexes/all columns. \n \nNote that statistics for blob and text columns are not\ncollected. If explicitly specified, a warning is returned.\n \n-- update all engine-independent statistics for all columns\nand indexes\nANALYZE TABLE tbl PERSISTENT FOR ALL;\n \n-- update specific columns and indexes:\nANALYZE TABLE tbl PERSISTENT FOR COLUMNS (col1,col2,...)\nINDEXES (idx1,idx2,...);\n \n-- empty lists are allowed:\nANALYZE TABLE tbl PERSISTENT FOR COLUMNS (col1,col2,...)\nINDEXES ();\nANALYZE TABLE tbl PERSISTENT FOR COLUMNS () INDEXES\n(idx1,idx2,...);\n \n-- the following will only update mysql.table_stat fields:\nANALYZE TABLE tbl PERSISTENT FOR COLUMNS () INDEXES ();\n \n-- with use_stat_tables = COMPLEMENTARY, a simple ANALYZE\nTABLE \n-- collects engine-independent statistics for all columns\nand indexes.\nSET SESSION use_stat_tables=\'COMPLEMENTARY\';\n \nANALYZE TABLE tbl;\n \nThe PERSISTENT FOR is required to update the\nengine-independent statistics even if the table has the\noption STATS_PERSISTENT=1 (which refers to InnoDB Persistent\nStatistics).\n \nThe Aria storage engine supports progress reporting for the\nANALYZE TABLE statement.\n \n\n\nURL: https://mariadb.com/kb/en/library/analyze-table/','','https://mariadb.com/kb/en/library/analyze-table/'),(460,'ST_OVERLAPS',30,'Syntax\n------ \nST_OVERLAPS(g1,g2)\n \nDescription\n----------- \nReturns 1 or 0 to indicate whether geometry g1 spatially\noverlaps geometry g2.\n \nThe term spatially overlaps is used if two geometries\nintersect and their\nintersection results in a geometry of the same dimension but\nnot equal to\neither of the given geometries.\n \nST_OVERLAPS() uses object shapes, while OVERLAPS(), based on\nthe original MySQL implementation, uses object bounding\nrectangles.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st-overlaps/','','https://mariadb.com/kb/en/library/st-overlaps/'),(463,'TOUCHES',30,'Syntax\n------ \nTouches(g1,g2)\n \nDescription\n----------- \nReturns 1 or 0 to indicate whether g1 spatially touches g2.\nTwo\ngeometries spatially touch if the interiors of the\ngeometries do not intersect,\nbut the boundary of one of the geometries intersects either\nthe boundary or the\ninterior of the other.\n \nTOUCHES() is based on the original MySQL implementation and\nuses object bounding rectangles, while ST_TOUCHES() uses\nobject shapes.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/touches/','','https://mariadb.com/kb/en/library/touches/'),(469,'CURRENT_DATE',31,'Syntax\n------ \nCURRENT_DATE, CURRENT_DATE()\n \nDescription\n----------- \nCURRENT_DATE and CURRENT_DATE() are synonyms for CURDATE().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/current_date/','','https://mariadb.com/kb/en/library/current_date/'),(252,'CHECK TABLE',20,'Syntax\n------ \nCHECK TABLE tbl_name [, tbl_name] ... [option] ...\n \noption = {FOR UPGRADE | QUICK | FAST | MEDIUM | EXTENDED |\nCHANGED}\n \nDescription\n----------- \nCHECK TABLE checks a table or tables for errors. CHECK TABLE\nworks for\nArchive, Aria, CSV, InnoDB, and MyISAM tables. For Aria and\nMyISAM tables, the\nkey statistics are updated as well. For CSV, see also\nChecking and Repairing CSV Tables.\n \nAs an alternative, myisamchk is a commandline tool for\nchecking MyISAM tables when the tables are not being\naccessed.\n \nFor checking dynamic columns integrity, COLUMN_CHECK() can\nbe used.\n \nCHECK TABLE can also check views for problems, such as\ntables\nthat are referenced in the view definition that no longer\nexist.\n \nCHECK TABLE is also supported for partitioned tables. You\ncan\nuse ALTER TABLE ... CHECK PARTITION \nto check one or more partitions.\n \nThe meaning of the different options are as follows - note\nthat this can vary a bit between\nstorage engines:\n \nFOR UPGRADE | Do a very quick check if the storage format\nfor the table has changed so that one needs to do a REPAIR.\nThis is only needed when one upgrades between major versions\nof MariaDB or MySQL. This is usually done by running\nmysql_upgrade. | \n \nFAST | Only check tables that has not been closed properly\nor are marked as corrupt. Only supported by the MyISAM and\nAria engines. For other engines the table is checked\nnormally | \n \nCHANGED | Check only tables that has changed since last\nREPAIR / CHECK. Only supported by the MyISAM and Aria\nengines. For other engines the table is checked normally. | \n \nQUICK | Do a fast check. For MyISAM and Aria engine this\nmeans we skip checking the delete link chain which may take\nsome time. | \n \nMEDIUM | Scan also the data files. Checks integrity between\ndata and index files with checksums. In most cases this\nshould find all possible errors. | \n \nEXTENDED | Does a full check to verify every possible error.\nFor MyISAM and Aria we verify for each row that all it keys\nexists and points to the row. This may take a long time on\nbig tables! | \n \nFor most cases running CHECK TABLE without options or MEDIUM\nshould be\ngood enough.\n \nSince MariaDB 5.3, the Aria storage engine supports progress\nreporting for this statement.\n \nIf you want to know if two tables are identical, take a look\nat CHECKSUM TABLE.\n \nXtraDB/InnoDB\n \nIf CHECK TABLE finds an error in an InnoDB table, MariaDB\nmight shutdown to prevent the error propagation. In this\ncase, the problem will be reported in the error log.\nOtherwise, since MariaDB 5.5, the table or an index might be\nmarked as corrupted, to prevent use. This does not happen\nwith some minor problems, like a wrong number of entries in\na secondary index. Those problems are reported in the output\nof CHECK TABLE.\n \nEach tablespace contains a header with metadata. This header\nis not checked by this statement.\n \nDuring the execution of CHECK TABLE, other threads may be\nblocked.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/sql-commands-check-table/','','https://mariadb.com/kb/en/library/sql-commands-check-table/'),(254,'CHECKSUM TABLE',20,'Syntax\n------ \nCHECKSUM TABLE tbl_name [, tbl_name] ... [ QUICK | EXTENDED\n]\n \nDescription\n----------- \nCHECKSUM TABLE reports a table checksum. This is very\nuseful if you want to know if two tables are the same (for\nexample on a master\nand slave).\n \nWith QUICK, the live table checksum is reported if it is\navailable, or NULL otherwise. This is very fast. A live\nchecksum is enabled by specifying the CHECKSUM=1 table\noption when you create the table; currently, this is\nsupported\nonly for Aria and MyISAM tables.\n \nWith EXTENDED, the entire table is read row by row and the\nchecksum is calculated. This can be very slow for large\ntables.\n \nIf neither QUICK nor EXTENDED is\nspecified, MariaDB returns a live checksum if the table\nstorage engine supports\nit and scans the table otherwise.\n \nCHECKSUM TABLE requires the SELECT privilege for the table.\n \nFor a nonexistent table, CHECKSUM TABLE returns\nNULL and generates a warning.\n \nThe table row format affects the checksum value. If the row\nformat changes, the checksum will change. This means that\nwhen a table created with a MariaDB/MySQL version is\nupgraded to another version, the checksum value will\nprobably change.\n \nTwo identical tables should always match to the same\nchecksum value; however, also for non-identical tables there\nis a very slight chance that they will return the same value\nas the hashing algorithm is not completely collision-free.\n \nDifferences Between MariaDB and MySQL\n \nCHECKSUM TABLE may give a different result as MariaDB\ndoesn\'t\nignore NULLs in the columns as MySQL 5.1 does (Later MySQL\nversions should calculate checksums the same way as\nMariaDB). You can get the\n\'old style\' checksum in MariaDB by starting mysqld with\nthe\n--old option. Note however that that the MyISAM and Aria\nstorage engines in MariaDB are using the new checksum\ninternally, so if you are\nusing --old, the CHECKSUM command will be\nslower as it needs to calculate the checksum row by row.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/checksum-table/','','https://mariadb.com/kb/en/library/checksum-table/'),(470,'CURRENT_TIME',31,'Syntax\n------ \nCURRENT_TIME\nCURRENT_TIME([precision])\n \nDescription\n----------- \nCURRENT_TIME and CURRENT_TIME() are synonyms for CURTIME().\n \n\n\nURL: https://mariadb.com/kb/en/library/current_time/','','https://mariadb.com/kb/en/library/current_time/'),(471,'CURRENT_TIMESTAMP',31,'Syntax\n------ \nCURRENT_TIMESTAMP\nCURRENT_TIMESTAMP([precision])\n \nDescription\n----------- \nCURRENT_TIMESTAMP and CURRENT_TIMESTAMP() are synonyms for\nNOW().\n \n\n\nURL: https://mariadb.com/kb/en/library/current_timestamp/','','https://mariadb.com/kb/en/library/current_timestamp/'),(472,'CURTIME',31,'Syntax\n------ \nCURTIME([precision])\n \nDescription\n----------- \nReturns the current time as a value in \'HH:MM:SS\' or\nHHMMSS.uuuuuu format, depending on whether the function is\nused in a string or numeric context. The value is expressed\nin the current time zone.\n \nThe optional precision determines the microsecond precision.\nSee Microseconds in MariaDB.\n \nExamples\n-------- \nSELECT CURTIME();\n+-----------+\n| CURTIME() |\n+-----------+\n| 12:45:39 |\n+-----------+\n \nSELECT CURTIME() + 0;\n \n+---------------+\n| CURTIME() + 0 |\n+---------------+\n| 124545.000000 |\n+---------------+\n \nWith precision:\n \nSELECT CURTIME(2);\n+-------------+\n| CURTIME(2) |\n+-------------+\n| 09:49:08.09 |\n+-------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/curtime/','','https://mariadb.com/kb/en/library/curtime/'),(473,'DATE FUNCTION',31,'Syntax\n------ \nDATE(expr)\n \nDescription\n----------- \nExtracts the date part of the date or datetime expression\nexpr.\n \nExamples\n-------- \nSELECT DATE(\'2013-07-18 12:21:32\');\n+-----------------------------+\n| DATE(\'2013-07-18 12:21:32\') |\n+-----------------------------+\n| 2013-07-18 |\n+-----------------------------+\n \nError Handling\n \nUntil MariaDB 5.5.32, some versions of MariaDB returned\n0000-00-00 when passed an invalid date. From 5.5.32, NULL is\nreturned.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/date-function/','','https://mariadb.com/kb/en/library/date-function/'),(478,'DAY',31,'Syntax\n------ \nDAY(date)\n \nDescription\n----------- \nDAY() is a synonym for DAYOFMONTH().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/day/','','https://mariadb.com/kb/en/library/day/'),(255,'OPTIMIZE TABLE',20,'Syntax\n------ \nOPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE\n tbl_name [, tbl_name] ...\n [WAIT n | NOWAIT]\n \nDescription\n----------- \nOPTIMIZE TABLE has two main functions. It can either be used\nto defragment tables, or to update the InnoDB fulltext\nindex.\n \nWAIT/NOWAIT\n \nSet the lock wait timeout. See WAIT and NOWAIT.\n \nDefragmenting\n \nOPTIMIZE TABLE works for InnoDB (before MariaDB 10.1.1, only\nif the innodb_file_per_table server system variable is set),\nAria, MyISAM and ARCHIVE tables, and should be used if you\nhave deleted a large part of a table or if you have made\nmany changes to a table with variable-length\nrows (tables that have VARCHAR, VARBINARY, BLOB, or TEXT\ncolumns). Deleted rows are maintained in a\nlinked list and subsequent INSERT operations reuse old row\npositions.\n \nThis statement requires SELECT and INSERT privileges for the\ntable.\n \nBy default, OPTIMIZE TABLE statements are written to the\nbinary log and will be replicated. The NO_WRITE_TO_BINLOG\nkeyword (LOCAL is an alias) will ensure the statement is not\nwritten to the binary log. \n \nOPTIMIZE TABLE is also supported for partitioned tables. You\ncan use \nALTER TABLE ... OPTIMIZE PARTITION \nto optimize one or more partitions.\n \nYou can use OPTIMIZE TABLE to reclaim the unused\nspace and to defragment the data file. With other storage\nengines, OPTIMIZE TABLE does nothing by default, and returns\nthis message: \" The storage engine for the table doesn\'t\nsupport optimize\". However, if the server has been started\nwith the --skip-new option, OPTIMIZE TABLE is linked to\nALTER TABLE, and recreates the table. This operation frees\nthe unused space and updates index statistics.\n \nSince MariaDB 5.3, the Aria storage engine supports progress\nreporting for this statement.\n \nIf a MyISAM table is fragmented, concurrent inserts will not\nbe performed until an OPTIMIZE TABLE statement is executed\non that table, unless the concurrent_insert server system\nvariable is set to ALWAYS.\n \nUpdating an InnoDB fulltext index\n \nWhen rows are added or deleted to an InnoDB fulltext index,\nthe index is not immediately re-organized, as this can be an\nexpensive operation. Change statistics are stored in a\nseparate location . The fulltext index is only fully\nre-organized when an OPTIMIZE TABLE statement is run.\n \nBy default, an OPTIMIZE TABLE will defragment a table. In\norder to use it to update fulltext index statistics, the\ninnodb_optimize_fulltext_only system variable must be set to\n1. This is intended to be a temporary setting, and should be\nreset to 0 once the fulltext index has been re-organized.\n \nSince fulltext re-organization can take a long time, the\ninnodb_ft_num_word_optimize variable limits the\nre-organization to a number of words (2000 by default). You\ncan run multiple OPTIMIZE statements to fully re-organize\nthe index.\n \nDefragmenting InnoDB tablespaces\n \nMariaDB 10.1.1 merged the Facebook/Kakao defragmentation\npatch \n \nMariaDB 10.1.1 merged the Facebook/Kakao defragmentation\npatch, allowing one to use OPTIMIZE TABLE to defragment\nInnoDB tablespaces. For this functionality to be enabled,\nthe innodb_defragment system variable must be enabled. No\nnew tables are created and there is no need to copy data\nfrom old tables to new tables. Instead, this feature loads n\npages (determined by innodb-defragment-n-pages) and tries to\nmove records so that pages would be full of records and then\nfrees pages that are fully empty after the operation. Note\nthat tablespace files (including ibdata1) will not shrink as\nthe result of defragmentation, but one will get better\nmemory utilization in the InnoDB buffer pool as there are\nfewer data pages in use.\n \nSee Defragmenting InnoDB Tablespaces for more details.\n \n\n\nURL: https://mariadb.com/kb/en/library/optimize-table/','','https://mariadb.com/kb/en/library/optimize-table/'),(256,'REPAIR TABLE',20,'Syntax\n------ \nREPAIR [NO_WRITE_TO_BINLOG | LOCAL] TABLE\n tbl_name [, tbl_name] ...\n [QUICK] [EXTENDED] [USE_FRM]\n \nDescription\n----------- \nREPAIR TABLE repairs a possibly corrupted table. By default,\nit has the same effect as\n \nmyisamchk --recover tbl_name\n \nor\n \naria_chk --recover tbl_name\n \nSee aria_chk and myisamchk for more.\n \nREPAIR TABLE works for Archive, Aria, CSV and MyISAM tables.\nFor XtraDB/InnoDB, see recovery modes. For CSV, see also\nChecking and Repairing CSV Tables. For Archive, this\nstatement also improves compression. If the storage engine\ndoes not support this statement, a warning is issued.\n \nThis statement requires SELECT and INSERT privileges for the\ntable.\n \nBy default, REPAIR TABLE statements are written to the\nbinary log and will be replicated. The NO_WRITE_TO_BINLOG\nkeyword (LOCAL is an alias) will ensure the statement is not\nwritten to the binary log.\n \nWhen an index is recreated, the storage engine may use a\nconfigurable buffer in the process. Incrementing the buffer\nspeeds up the index creation. Aria and MyISAM allocate a\nbuffer whose size is defined by aria_sort_buffer_size or\nmyisam_sort_buffer_size, also used for ALTER TABLE.\n \nREPAIR TABLE is also supported for partitioned tables.\nHowever, the USE_FRM option cannot be used with this\nstatement\non a partitioned table.\n \n ALTER TABLE ... REPAIR PARTITION can be used\nto repair one or more partitions.\n \nThe Aria storage engine supports progress reporting for this\nstatement.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/repair-table/','','https://mariadb.com/kb/en/library/repair-table/'),(482,'DAYOFYEAR',31,'Syntax\n------ \nDAYOFYEAR(date)\n \nDescription\n----------- \nReturns the day of the year for date, in the range 1 to 366.\n \nExamples\n-------- \nSELECT DAYOFYEAR(\'2018-02-16\');\n+-------------------------+\n| DAYOFYEAR(\'2018-02-16\') |\n+-------------------------+\n| 47 |\n+-------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/dayofyear/','','https://mariadb.com/kb/en/library/dayofyear/'),(484,'FROM_DAYS',31,'Syntax\n------ \nFROM_DAYS(N)\n \nDescription\n----------- \nGiven a day number N, returns a DATE value. The day count is\nbased on the number of days from the start of the standard\ncalendar (0000-00-00). \n \nThe function is not designed for use with dates before the\nadvent of the Gregorian calendar in October 1582. Results\nwill not be reliable since it doesn\'t account for the lost\ndays when the calendar changed from the Julian calendar.\n \nThis is the converse of the TO_DAYS() function.\n \nExamples\n-------- \nSELECT FROM_DAYS(730669);\n+-------------------+\n| FROM_DAYS(730669) |\n+-------------------+\n| 2000-07-03 |\n+-------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/from_days/','','https://mariadb.com/kb/en/library/from_days/'),(489,'LOCALTIME',31,'Syntax\n------ \nLOCALTIME\nLOCALTIME([precision])\n \nDescription\n----------- \nLOCALTIME and LOCALTIME() are synonyms for NOW().\n \n\n\nURL: https://mariadb.com/kb/en/library/localtime/','','https://mariadb.com/kb/en/library/localtime/'),(490,'LOCALTIMESTAMP',31,'Syntax\n------ \nLOCALTIMESTAMP\nLOCALTIMESTAMP([precision])\n \nDescription\n----------- \nLOCALTIMESTAMP and LOCALTIMESTAMP() are synonyms for NOW().\n \n\n\nURL: https://mariadb.com/kb/en/library/localtimestamp/','','https://mariadb.com/kb/en/library/localtimestamp/'),(494,'MINUTE',31,'Syntax\n------ \nMINUTE(time)\n \nDescription\n----------- \nReturns the minute for time, in the range 0 to 59. \n \nExamples\n-------- \nSELECT MINUTE(\'2013-08-03 11:04:03\');\n+-------------------------------+\n| MINUTE(\'2013-08-03 11:04:03\') |\n+-------------------------------+\n| 4 |\n+-------------------------------+\n \n SELECT MINUTE (\'23:12:50\');\n+---------------------+\n| MINUTE (\'23:12:50\') |\n+---------------------+\n| 12 |\n+---------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/minute/','','https://mariadb.com/kb/en/library/minute/'),(257,'REPAIR VIEW',20,'REPAIR VIEW was introduced in MariaDB 10.0.18 and MariaDB\n5.5.43.\n \nSyntax\n------ \nREPAIR [NO_WRITE_TO_BINLOG | LOCAL] VIEW view_name[,\nview_name] ... [FROM MYSQL]\n \nDescription\n----------- \nThe REPAIR VIEW statement was introduced to assist with\nfixing MDEV-6916, an issue introduced in MariaDB 5.2 where\nthe view algorithms were swapped compared to their MySQL on\ndisk representation. It checks whether the view algorithm is\ncorrect. It is run as part of mysql_upgrade, and should not\nnormally be required in regular use.\n \nBy default it corrects the checksum and if necessary adds\nthe mariadb-version field. If the optional FROM MYSQL clause\nis used, and no mariadb-version field is present, the MERGE\nand TEMPTABLE algorithms are toggled.\n \nBy default, REPAIR VIEW statements are written to the binary\nlog and will be replicated. The NO_WRITE_TO_BINLOG keyword\n(LOCAL is an alias) will ensure the statement is not written\nto the binary log.\n \nNote that REPAIR VIEW in MariaDB 10.0.18 and MariaDB 5.5.43\ncould crash the server (see MDEV-8115). Upgrade to a later\nversion.\n \n\n\nURL: https://mariadb.com/kb/en/library/repair-view/','','https://mariadb.com/kb/en/library/repair-view/'),(258,'CREATE FUNCTION UDF',21,'Syntax\n------ \nCREATE [OR REPLACE] [AGGREGATE] FUNCTION [IF NOT EXISTS]\nfunction_name\n RETURNS {STRING|INTEGER|REAL|DECIMAL}\n SONAME shared_library_name\n \nDescription\n----------- \nA user-defined function (UDF) is a way to extend MariaDB\nwith a new function\nthat works like a native (built-in) MariaDB function such as\nABS() or\nCONCAT().\n \nfunction_name is the name that should be used in SQL\nstatements to invoke\nthe function. \n \nTo create a function, you must have the INSERT privilege for\nthe\nmysql database. This is necessary because CREATE FUNCTION\nadds a row to the\nmysql.func system table that records the function\'s name,\ntype, and shared library name. If you do not have this\ntable, you should run\nthe mysql_upgrade command to create it.\n \nUDFs need to be written in C, C++ or another language that\nuses C calling\nconventions, MariaDB needs to have been dynamically\ncompiled, and your\noperating system must support dynamic loading.\n \nFor an example, see sql/udf_example.cc in the source tree.\nFor a collection of existing UDFs see\nhttp://www.mysqludf.org/.\n \nStatements making use of user-defined functions are not\nsafe for replication.\n \nFor creating a stored function as opposed to a user-defined\nfunction, see\nCREATE FUNCTION.\n \nFor valid identifiers to use as function names, see\nIdentifier Names.\n \nRETURNS\n \nThe RETURNS clause indicates the type of the function\'s\nreturn value, and can be one of STRING, INTEGER, REAL or\nDECIMAL. DECIMAL functions currently return string values\nand should be written like STRING functions.\n \nshared_library_name\n \nshared_library_name is the basename of the shared object\nfile that contains\nthe code that implements the function. The file must be\nlocated in the plugin\ndirectory. This directory is given by the value of the\nplugin_dir system variable. Note that\nbefore MariaDB/MySQL 5.1, the shared object could be located\nin any directory\nthat was searched by your system\'s dynamic linker.\n \nAGGREGATE\n \nAggregate functions are summary functions such as SUM() and\nAVG().\n \nAggregate UDF functions can be used as window functions.\n \nOR REPLACE\n \nThe OR REPLACE clause was added in MariaDB 10.1.3\n \nIf the optional OR REPLACE clause is used, it acts as a\nshortcut for:\n \nDROP FUNCTION IF EXISTS function_name;\n \nCREATE FUNCTION name ...;\n \nIF NOT EXISTS\n \nThe IF NOT EXISTS clause was added in MariaDB 10.1.3\n \nWhen the IF NOT EXISTS clause is used, MariaDB will return a\nwarning instead of an error if the specified function\nalready exists. Cannot be used together with OR REPLACE.\n \nUpgrading a UDF\n \nTo upgrade the UDF\'s shared library, first run a\nDROP FUNCTION statement, then upgrade the shared library and\nfinally run the CREATE FUNCTION statement. If you upgrade\nwithout following\nthis process, you may crash the server.\n \nExamples\n-------- \nCREATE FUNCTION jsoncontains_path RETURNS integer SONAME\n\'ha_connect.so\';\n \nQuery OK, 0 rows affected (0.00 sec)\n \nOR REPLACE and IF NOT EXISTS:\n \nCREATE FUNCTION jsoncontains_path RETURNS integer SONAME\n\'ha_connect.so\';\n \nERROR 1125 (HY000): Function \'jsoncontains_path\' already\nexists\n \nCREATE OR REPLACE FUNCTION jsoncontains_path RETURNS integer\nSONAME \'ha_connect.so\';\n \nQuery OK, 0 rows affected (0.00 sec)\n \nCREATE FUNCTION IF NOT EXISTS jsoncontains_path RETURNS\ninteger SONAME \'ha_connect.so\';\n \nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n \nSHOW WARNINGS;\n \n+-------+------+---------------------------------------------+\n| Level | Code | Message |\n+-------+------+---------------------------------------------+\n| Note | 1125 | Function \'jsoncontains_path\' already\nexists |\n+-------+------+---------------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/create-function-udf/','','https://mariadb.com/kb/en/library/create-function-udf/'),(495,'MONTH',31,'Syntax\n------ \nMONTH(date)\n \nDescription\n----------- \nReturns the month for date in the range 1 to 12 for January\nto\nDecember, or 0 for dates such as \'0000-00-00\' or\n\'2008-00-00\' that\nhave a zero month part.\n \nExamples\n-------- \nSELECT MONTH(\'2019-01-03\');\n+---------------------+\n| MONTH(\'2019-01-03\') |\n+---------------------+\n| 1 |\n+---------------------+\n \nSELECT MONTH(\'2019-00-03\');\n+---------------------+\n| MONTH(\'2019-00-03\') |\n+---------------------+\n| 0 |\n+---------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/month/','','https://mariadb.com/kb/en/library/month/'),(496,'MONTHNAME',31,'Syntax\n------ \nMONTHNAME(date)\n \nDescription\n----------- \nReturns the full name of the month for date. The language\nused for the name is controlled by the value of the\nlc_time_names system variable. See server locale for more on\nthe supported locales.\n \nExamples\n-------- \nSELECT MONTHNAME(\'2019-02-03\');\n+-------------------------+\n| MONTHNAME(\'2019-02-03\') |\n+-------------------------+\n| February |\n+-------------------------+\n \nChanging the locale:\n \nSET lc_time_names = \'fr_CA\';\n \nSELECT MONTHNAME(\'2019-05-21\');\n+-------------------------+\n| MONTHNAME(\'2019-05-21\') |\n+-------------------------+\n| mai |\n+-------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/monthname/','','https://mariadb.com/kb/en/library/monthname/'),(500,'QUARTER',31,'Syntax\n------ \nQUARTER(date)\n \nDescription\n----------- \nReturns the quarter of the year for date, in the range 1 to\n4. Returns 0 if month contains a zero value, or NULL if the\ngiven value is not otherwise a valid date (zero values are\naccepted).\n \nExamples\n-------- \nSELECT QUARTER(\'2008-04-01\');\n+-----------------------+\n| QUARTER(\'2008-04-01\') |\n+-----------------------+\n| 2 |\n+-----------------------+\n \nSELECT QUARTER(\'2019-00-01\');\n+-----------------------+\n| QUARTER(\'2019-00-01\') |\n+-----------------------+\n| 0 |\n+-----------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/quarter/','','https://mariadb.com/kb/en/library/quarter/'),(501,'SECOND',31,'Syntax\n------ \nSECOND(time)\n \nDescription\n----------- \nReturns the second for a given time (which can include\nmicroseconds), in the range 0 to 59, or NULL if not given a\nvalid time value.\n \nExamples\n-------- \nSELECT SECOND(\'10:05:03\');\n+--------------------+\n| SECOND(\'10:05:03\') |\n+--------------------+\n| 3 |\n+--------------------+\n \nSELECT SECOND(\'10:05:01.999999\');\n+---------------------------+\n| SECOND(\'10:05:01.999999\') |\n+---------------------------+\n| 1 |\n+---------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/second/','','https://mariadb.com/kb/en/library/second/'),(259,'DROP FUNCTION UDF',21,'Syntax\n------ \nDROP FUNCTION [IF EXISTS] function_name\n \nDescription\n----------- \nThis statement drops the user-defined function (UDF) named\nfunction_name.\n \nTo drop a function, you must have the DELETE privilege for\nthe mysql database. This is because DROP FUNCTION removes\nthe row from the mysql.func system table that records the\nfunction\'s name, type and shared library name.\n \nFor dropping a stored function, see DROP FUNCTION.\n \nUpgrading a UDF\n \nTo upgrade the UDF\'s shared library, first run a DROP\nFUNCTION statement, then upgrade the shared library and\nfinally run the CREATE FUNCTION statement. If you upgrade\nwithout following this process, you may crash the server.\n \nExamples\n-------- \nDROP FUNCTION jsoncontains_path;\n \nIF EXISTS:\n \nDROP FUNCTION jsoncontains_path;\n \nERROR 1305 (42000): FUNCTION test.jsoncontains_path does not\nexist\n \nDROP FUNCTION IF EXISTS jsoncontains_path;\n \nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n \nSHOW WARNINGS;\n \n+-------+------+------------------------------------------------+\n| Level | Code | Message |\n+-------+------+------------------------------------------------+\n| Note | 1305 | FUNCTION test.jsoncontains_path does not\nexist |\n+-------+------+------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/drop-function-udf/','','https://mariadb.com/kb/en/library/drop-function-udf/'),(260,'Creating User-Defined Functions',21,'User-defined functions allow MariaDB to be extended with a\nnew function that works like a native (built-in) MariaDB\nfunction such as ABS() or CONCAT(). There are alternative\nways to add a new function: writing a native function (which\nrequires modifying and compiling the server source code), or\nwriting a stored function.\n \nStatements making use of user-defined functions are not safe\nfor replication.\n \nFunctions are written in C or C++, and to make use of them,\nthe operating system must support dynamic loading. \n \nEach new SQL function requires corresponding functions\nwritten in C/C++. In the list below, at least the main\nfunction - x() - and one other, are required. x should be\nreplaced by the name of the function you are creating.\n \nAll functions need to be thread-safe, so not global or\nstatic variables that change can be allocated. Memory is\nallocated in x_init()/ and freed in x_deinit(). \n \nSimple Functions\n \nx()\n \nRequired for all UDF\'s, this is where the results are\ncalculated.\n \nC/C++ type | SQL type | \n \nchar * | STRING | \n \nlong long | INTEGER | \n \ndouble | REAL | \n \nDECIMAL functions return string values, and so should be\nwritten accordingly. It is not possible to create ROW\nfunctions.\n \nx_init()\n \nInitialization function for x(). Can be used for the\nfollowing:\nCheck the number of arguments to X() (the SQL equivalent).\nVerify the argument types, or to force arguments to be of a\nparticular type after the function is called.\nSpecify whether the result can be NULL.\nSpecify the maximum result length.\nFor REAL functions, specify the maximum number of decimals\nfor the result.\nAllocate any required memory.\n To verify that the arguments are of a required type or,\nalternatively, to tell MySQL to coerce arguments to the\nrequired types when the main function is called.\n \nx_deinit()\n \nDe-initialization function for x(). Used to de-allocate\nmemory that was allocated in x_init().\n \nDescription\n----------- \nEach time the SQL function X() is called:\nMariaDB will first call the C/C++ initialization function,\nx_init(), assuming it exists. All setup will be performed,\nand if it returns an error, the SQL statement is aborted and\nno further functions are called.\nIf there is no x_init() function, or it has been called and\ndid not return an error, x() is then called once per row.\nAfter all rows have finished processing, x_deinit() is\ncalled, if present, to clean up by de-allocating any memory\nthat was allocated in x_init().\nSee User-defined Functions Calling Sequences for more\ndetails on the functions.\n \nAggregate Functions\n \nThe following functions are required for aggregate\nfunctions, such as AVG() and SUM(). \n \nx_clear()\n \nUsed to reset the current aggregate, but without inserting\nthe argument as the initial aggregate value for the new\ngroup.\n \nx_add()\n \nUsed to add the argument to the current aggregate. \n \nx_remove()\n \nStaring from MariaDB 10.4 it improves the support of window\nfunctions (so it is not obligatory to add it) and should\nremove the argument from the current aggregate.\n \nDescription\n----------- \nEach time the aggregate SQL function X() is called:\nMariaDB will first call the C/C++ initialization function,\nx_init(), assuming it exists. All setup will be performed,\nand if it returns an error, the SQL statement is aborted and\nno further functions are called.\nIf there is no x_init() function, or it has been called and\ndid not return an error, x() is then called once per row.\nAfter all rows have finished processing, x_deinit() is\ncalled, if present, to clean up by de-allocating any memory\nthat was allocated in x_init().\n \nMariaDB will first call the C/C++ initialization function,\nx_init(), assuming it exists. All setup will be performed,\nand if it returns an error, the SQL statement is aborted and\nno further functions are called.\nThe table is sorted according to the GROUP BY expression.\nx_clear() is called for the first row of each new group.\nx_add() is called once per row for each row in the same\ngroup.\nx() is called when the group changes, or after the last row,\nto get the aggregate result. \nThe latter three steps are repeated until all rows have been\nprocessed.\nAfter all rows have finished processing, x_deinit() is\ncalled, if present, to clean up by de-allocating any memory\nthat was allocated in x_init().\n \nExamples\n-------- \nFor an example, see sql/udf_example.cc in the source tree.\nFor a collection of existing UDFs see\nhttps://github.com/mysqludf.\n \n\n\nURL:\nhttps://mariadb.com/kb/en/library/creating-user-defined-functions/','','https://mariadb.com/kb/en/library/creating-user-defined-functions/'),(507,'TIME Function',31,'Syntax\n------ \nTIME(expr)\n \nDescription\n----------- \nExtracts the time part of the time or datetime expression\nexpr and\nreturns it as a string.\n \nExamples\n-------- \nSELECT TIME(\'2003-12-31 01:02:03\');\n+-----------------------------+\n| TIME(\'2003-12-31 01:02:03\') |\n+-----------------------------+\n| 01:02:03 |\n+-----------------------------+\n \nSELECT TIME(\'2003-12-31 01:02:03.000123\');\n+------------------------------------+\n| TIME(\'2003-12-31 01:02:03.000123\') |\n+------------------------------------+\n| 01:02:03.000123 |\n+------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/time-function/','','https://mariadb.com/kb/en/library/time-function/'),(512,'TIME_FORMAT',31,'Syntax\n------ \nTIME_FORMAT(time,format)\n \nDescription\n----------- \nThis is used like the DATE_FORMAT() function, but the format\nstring\nmay contain format specifiers only for hours, minutes, and\nseconds.\nOther specifiers produce a NULL value or 0.\n \nExamples\n-------- \nSELECT TIME_FORMAT(\'100:00:00\', \'%H %k %h %I %l\');\n+--------------------------------------------+\n| TIME_FORMAT(\'100:00:00\', \'%H %k %h %I %l\') |\n+--------------------------------------------+\n| 100 100 04 04 4 |\n+--------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/time_format/','','https://mariadb.com/kb/en/library/time_format/'),(261,'User-Defined Functions Calling Sequences',21,'The functions described in Creating User-defined Functions\nare expanded on this page. They are declared as follows:\n \nSimple Functions\n \nx()\n \nIf x() returns an integer, it is declared as follows:\n \nlong long x(UDF_INIT *initid, UDF_ARGS *args,\n char *is_null, char *error);\n \nIf x() returns a string (DECIMAL functions also return\nstring values), it is declared as follows:\n \nchar *x(UDF_INIT *initid, UDF_ARGS *args,\n char *result, unsigned long *length,\n char *is_null, char *error);\n \nIf x() returns a real, it is declared as follows:\n \ndouble x(UDF_INIT *initid, UDF_ARGS *args,\n char *is_null, char *error);\n \nx_init()\n \nmy_bool x_init(UDF_INIT *initid, UDF_ARGS *args, char\n*message);\n \nx_deinit()\n \nvoid x_deinit(UDF_INIT *initid);\n \nDescription\n----------- \ninitid is a parameter passed to all three functions that\npoints to a UDF_INIT structure, used for communicating\ninformation between the functions. Its structure members\nare:\nmy_bool maybe_null\nmaybe_null should be set to 1 if x_init can return a NULL\nvalue, Defaults to 1 if any arguments are declared\nmaybe_null.\n \nunsigned int decimals\nNumber of decimals after the decimal point. The default, if\nan explicit number of decimals is passed in the arguments to\nthe main function, is the maximum number of decimals, so if\n9.5, 9.55 and 9.555 are passed to the function, the default\nwould be three (based on 9.555, the maximum). If there are\nno explicit number of decimals, the default is set to 31, or\none more than the maximum for the DOUBLE, FLOAT and DECIMAL\ntypes. This default can be changed in the function to suit\nthe actual calculation.\n \nunsigned int max_length\nMaximum length of the result. For integers, the default is\n21. For strings, the length of the longest argument. For\nreals, the default is 13 plus the number of decimals\nindicated by initid->decimals. The length includes any signs\nor decimal points. Can also be set to 65KB or 16MB in order\nto return a BLOB. The memory remains unallocated, but this\nis used to decide on the data type to use if the data needs\nto be temporarily stored.\n \nchar *ptr\nA pointer for use as required by the function. Commonly,\ninitid->ptr is used to communicate allocated memory, with\nx_init() allocating the memory and assigning it to this\npointer, x() using it, and x_deinit() de-allocating it.\n \nmy_bool const_item\nShould be set to 1 in x_init() if x() always returns the\nsame value, otherwise 0.\n \n\nAggregate Functions\n \nx_clear()\n \nx_clear() is a required function for aggregate functions,\nand is declared as follows:\n \nvoid x_clear(UDF_INIT *initid, char *is_null, char *error);\n \nIt is called when the summary results need to be reset, that\nis at the beginning of each new group. but also to reset the\nvalues when there were no matching rows.\n \nis_null is set to point to CHAR(0) before calling x_clear().\n \nIn the case of an error, you can store the value to which\nthe error argument points (a single-byte variable, not a\nstring string buffer) in the variable.\n \nx_reset()\n \nx_reset() is declared as follows:\n \nvoid x_reset(UDF_INIT *initid, UDF_ARGS *args,\n char *is_null, char *error);\n \nIt is called on finding the first row in a new group. Should\nreset the summary variables, and then use UDF_ARGS as the\nfirst value in the group\'s internal summary value. The\nfunction is not required if the UDF interface uses\nx_clear().\n \nx_add()\n \nx_add() is declared as follows:\n \nvoid x_add(UDF_INIT *initid, UDF_ARGS *args,\n char *is_null, char *error);\n \nIt is called for all rows belonging to the same group, and\nshould be used to add the value in UDF_ARGS to the internal\nsummary variable.\n \nx_remove()\n \nx_remove() was added in MariaDB 10.4 and is declared as\nfollows (same as x_add()):\n \nvoid x_remove(UDF_INIT* initid, UDF_ARGS* args,\n char* is_null, char *error );\n \nIt adds more efficient support of aggregate UDFs as window\nfunctions. x_remove() should \"subtract\" the row (reverse\nx_add()). In MariaDB 10.4 aggregate UDFs will work as WINDOW\nfunctions without x_remove() but it will not be so\nefficient.\n \nIf x_remove() supported (defined) detected automatically.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/user-defined-functions-calling-sequences/','','https://mariadb.com/kb/en/library/user-defined-functions-calling-sequences/'),(262,'User-Defined Functions Security',21,'The MariaDB server imposes a number of limitations on\nuser-defined functions for security purposes.\nThe INSERT privilege for the mysql database is required to\nrun CREATE FUNCTION, as a record will be added to the\nmysql.func-table.\nThe DELETE privilege for the mysql database is required to\nrun DROP FUNCTION as the corresponding record will be\nremoved from the mysql.func-table.\nUDF object files can only be placed in the plugin directory,\nas specified by the value of the plugin_dir system variable.\nAt least one symbol, beyond the required x() - corresponding\nto an SQL function X()) - is required. These can be\nx_init(), x_deinit(), xxx_reset(), x_clear() and x_add()\nfunctions (see Creating User-defined Functions). The\nallow-suspicious-udfs mysqld option (by default unset)\nprovides a workaround, permitting only one symbol to be\nused. This is not recommended, as it opens the possibility\nof loading shared objects that are not legitimate\nuser-defined functions.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/user-defined-functions-security/','','https://mariadb.com/kb/en/library/user-defined-functions-security/'),(513,'TIME_TO_SEC',31,'Syntax\n------ \nTIME_TO_SEC(time)\n \nDescription\n----------- \nReturns the time argument, converted to seconds.\n \nThe value returned by TIME_TO_SEC is of type DOUBLE. Before\nMariaDB 5.3 (and MySQL 5.6), the type was INT. See\nMicroseconds in MariaDB.\n \nExamples\n-------- \nSELECT TIME_TO_SEC(\'22:23:00\');\n+-------------------------+\n| TIME_TO_SEC(\'22:23:00\') |\n+-------------------------+\n| 80580 |\n+-------------------------+\n \nSELECT TIME_TO_SEC(\'00:39:38\');\n+-------------------------+\n| TIME_TO_SEC(\'00:39:38\') |\n+-------------------------+\n| 2378 |\n+-------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/time_to_sec/','','https://mariadb.com/kb/en/library/time_to_sec/'),(517,'UTC_DATE',31,'Syntax\n------ \nUTC_DATE, UTC_DATE()\n \nDescription\n----------- \nReturns the current UTC date as a value in \'YYYY-MM-DD\' or\nYYYYMMDD\nformat, depending on whether the function is used in a\nstring or numeric context. \n \nExamples\n-------- \nSELECT UTC_DATE(), UTC_DATE() + 0;\n \n+------------+----------------+\n| UTC_DATE() | UTC_DATE() + 0 |\n+------------+----------------+\n| 2010-03-27 | 20100327 |\n+------------+----------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/utc_date/','','https://mariadb.com/kb/en/library/utc_date/'),(518,'UTC_TIME',31,'Syntax\n------ \nUTC_TIME\nUTC_TIME([precision])\n \nDescription\n----------- \nReturns the current UTC time as a value in \'HH:MM:SS\' or\nHHMMSS.uuuuuu format, depending on whether the function is\nused in a string or numeric context. \n \nThe optional precision determines the microsecond precision.\nSee Microseconds in MariaDB.\n \nExamples\n-------- \nSELECT UTC_TIME(), UTC_TIME() + 0;\n \n+------------+----------------+\n| UTC_TIME() | UTC_TIME() + 0 |\n+------------+----------------+\n| 17:32:34 | 173234.000000 |\n+------------+----------------+\n \nWith precision:\n \nSELECT UTC_TIME(5);\n+----------------+\n| UTC_TIME(5) |\n+----------------+\n| 07:52:50.78369 |\n+----------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/utc_time/','','https://mariadb.com/kb/en/library/utc_time/'),(263,'mysql.func Table',21,'The mysql.func table stores information about user-defined\nfunctions (UDFs) created with the CREATE FUNCTION UDF\nstatement.\n \nIn MariaDB 10.4 and later, this table uses the Aria storage\nengine.\n \nMariaDB until 10.3\n \nIn MariaDB 10.3 and before, this table uses the MyISAM\nstorage engine.\n \nThe mysql.func table contains the following fields:\n \nField | Type | Null | Key | Default | Description | \n \nname | char(64) | NO | PRI | | UDF name | \n \nret | tinyint(1) | NO | | 0 | | \n \ndl | char(128) | NO | | | Shared library name | \n \ntype | enum(\'function\',\'aggregate\') | NO | | NULL |\nType, either function or aggregate. Aggregate functions are\nsummary functions such as SUM() and AVG(). | \n \nExample\n \nSELECT * FROM mysql.func;\n+------------------------------+-----+--------------+-----------+\n| name | ret | dl | type |\n+------------------------------+-----+--------------+-----------+\n| spider_direct_sql | 2 | ha_spider.so | function |\n| spider_bg_direct_sql | 2 | ha_spider.so | aggregate |\n| spider_ping_table | 2 | ha_spider.so | function |\n| spider_copy_tables | 2 | ha_spider.so | function |\n| spider_flush_table_mon_cache | 2 | ha_spider.so | function\n|\n+------------------------------+-----+--------------+-----------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/mysqlfunc-table/','','https://mariadb.com/kb/en/library/mysqlfunc-table/'),(264,'AUTO_INCREMENT',22,'Description\n----------- \nThe AUTO_INCREMENT attribute can be used to generate a\nunique identity for new rows. When you insert a new record\nto the table, and the auto_increment field is NULL or\nDEFAULT, the value will automatically be incremented. This\nalso applies to 0, unless the NO_AUTO_VALUE_ON_ZERO SQL_MODE\nis enabled.\n \nAUTO_INCREMENT columns start from 1 by default. The\nautomatically generated value can never be lower than 0.\n \nEach table can have only one AUTO_INCREMENT column. It must\ndefined as a key (not necessarily the PRIMARY KEY or UNIQUE\nkey). In some storage engines (including the default\nInnoDB), if the key consists of multiple columns, the\nAUTO_INCREMENT column must be the first column. Storage\nengines that permit the column to be placed elsewhere are\nAria, MyISAM, MERGE, Spider, TokuDB, BLACKHOLE, FederatedX\nand Federated.\n \nCREATE TABLE animals (\n id MEDIUMINT NOT NULL AUTO_INCREMENT,\n name CHAR(30) NOT NULL,\n PRIMARY KEY (id)\n );\n \nINSERT INTO animals (name) VALUES\n (\'dog\'),(\'cat\'),(\'penguin\'),\n (\'fox\'),(\'whale\'),(\'ostrich\');\n \nSELECT * FROM animals;\n \n+----+---------+\n| id | name |\n+----+---------+\n| 1 | dog |\n| 2 | cat |\n| 3 | penguin |\n| 4 | fox |\n| 5 | whale |\n| 6 | ostrich |\n+----+---------+\n \nSERIAL is an alias for BIGINT UNSIGNED NOT NULL\nAUTO_INCREMENT UNIQUE.\n \nCREATE TABLE t (id SERIAL, c CHAR(1)) ENGINE=InnoDB;\n \nSHOW CREATE TABLE t \\G\n*************************** 1. row\n***************************\n Table: t\nCreate Table: CREATE TABLE `t` (\n `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,\n `c` char(1) DEFAULT NULL,\n UNIQUE KEY `id` (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\n \nSetting or Changing the Auto_Increment Value\n \nYou can use an ALTER TABLE statement to assign a new value\nto the auto_increment table option, or set the insert_id\nserver system variable to change the next AUTO_INCREMENT\nvalue inserted by the current session.\n \nLAST_INSERT_ID() can be used to see the last AUTO_INCREMENT\nvalue inserted by the current session.\n \nALTER TABLE animals AUTO_INCREMENT=8;\n \nINSERT INTO animals (name) VALUES (\'aardvark\');\n \nSELECT * FROM animals;\n \n+----+-----------+\n| id | name |\n+----+-----------+\n| 1 | dog |\n| 2 | cat |\n| 3 | penguin |\n| 4 | fox |\n| 5 | whale |\n| 6 | ostrich |\n| 8 | aardvark |\n+----+-----------+\n \nSET insert_id=12;\n \nINSERT INTO animals (name) VALUES (\'gorilla\');\n \nSELECT * FROM animals;\n \n+----+-----------+\n| id | name |\n+----+-----------+\n| 1 | dog |\n| 2 | cat |\n| 3 | penguin |\n| 4 | fox |\n| 5 | whale |\n| 6 | ostrich |\n| 8 | aardvark |\n| 12 | gorilla |\n+----+-----------+\n \nInnoDB/XtraDB\n \nUntil MariaDB 10.2.3, InnoDB and XtraDB used an\nauto-increment counter that is stored in memory. When the\nserver restarts, the counter is re-initialized to the\nhighest value used in the table, which cancels the effects\nof any AUTO_INCREMENT = N option in the table statements.\n \nFrom MariaDB 10.2.4, this restriction has been lifted and\nAUTO_INCREMENT is persistent.\n \nSee also AUTO_INCREMENT Handling in XtraDB/InnoDB.\n \nSetting Explicit Values\n \nIt is possible to specify a value for an AUTO_INCREMENT\ncolumn. The value must not exist in the key.\n \nIf the new value is higher than the current maximum value,\nthe AUTO_INCREMENT value is updated, so the next value will\nbe higher. If the new value is lower than the current\nmaximum value, the AUTO_INCREMENT value remains unchanged.\n \nThe following example demonstrates these behaviours:\n \nCREATE TABLE t (id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY\nKEY) ENGINE = InnoDB;\n \nINSERT INTO t VALUES (NULL);\nSELECT id FROM t;\n \n+----+\n| id |\n+----+\n| 1 |\n+----+\n \nINSERT INTO t VALUES (10); -- higher value\nSELECT id FROM t;\n \n+----+\n| id |\n+----+\n| 1 |\n| 10 |\n+----+\n \nINSERT INTO t VALUES (2); -- lower value\nINSERT INTO t VALUES (NULL); -- auto value\nSELECT id FROM t;\n \n+----+\n| id |\n+----+\n| 1 |\n| 2 |\n| 10 |\n| 11 |\n+----+\n \nThe ARCHIVE storage engine does not allow to insert a value\nthat is lower than the current maximum.\n \nMissing Values\n \nAn AUTO_INCREMENT column normally has missing values. This\nhappens because if a row is deleted, or an AUTO_INCREMENT\nvalue is explicitly updated, old values are never re-used.\nThe REPLACE statement also deletes a row, and its value is\nwasted. With InnoDB, values can be reserved by a\ntransaction; but if the transaction fails (for example,\nbecause of a ROLLBACK) the reserved value will be lost.\n \nThus AUTO_INCREMENT values can be used to sort results in a\nchronological order, but not to create a numeric sequence.\n \nReplication\n \nTo make master-master or Galera safe to use AUTO_INCREMENT\none should use the system variables \n auto_increment_increment and auto_increment_offset to\ngenerate unique values for each server.\n \nCHECK Constraints, DEFAULT Values and Virtual Columns\n \nFrom MariaDB 10.2.6 auto_increment columns are no longer\npermitted in CHECK constraints, DEFAULT value expressions\nand virtual columns. They were permitted in earlier\nversions, but did not work correctly. See MDEV-11117.\n \n\n\nURL: https://mariadb.com/kb/en/library/auto_increment/','','https://mariadb.com/kb/en/library/auto_increment/'),(526,'AsBinary',32,'A synonym for ST_AsBinary().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/wkb-asbinary/','','https://mariadb.com/kb/en/library/wkb-asbinary/'),(527,'AsWKB',32,'A synonym for ST_AsBinary().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/aswkb/','','https://mariadb.com/kb/en/library/aswkb/'),(528,'MLineFromWKB',32,'Syntax\n------ \nMLineFromWKB(wkb[,srid])\nMultiLineStringFromWKB(wkb[,srid])\n \nDescription\n----------- \nConstructs a MULTILINESTRING value using its WKB\nrepresentation and SRID.\n \nMLineFromWKB() and MultiLineStringFromWKB() are synonyms.\n \nExamples\n-------- \nSET @g = ST_AsBinary(MLineFromText(\'MULTILINESTRING((10\n48,10 21,10 0),(16 0,16 23,16 48))\'));\n \nSELECT ST_AsText(MLineFromWKB(@g));\n+--------------------------------------------------------+\n| ST_AsText(MLineFromWKB(@g)) |\n+--------------------------------------------------------+\n| MULTILINESTRING((10 48,10 21,10 0),(16 0,16 23,16 48)) |\n+--------------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/mlinefromwkb/','','https://mariadb.com/kb/en/library/mlinefromwkb/'),(265,'BIGINT',22,'Syntax\n------ \nBIGINT[(M)] [SIGNED | UNSIGNED | ZEROFILL]\n \nDescription\n----------- \nA large integer. The signed range is -9223372036854775808 to\n9223372036854775807. The unsigned range is 0 to\n18446744073709551615.\n \nIf a column has been set to ZEROFILL, all values will be\nprepended by zeros so that the BIGINT value contains a\nnumber of M digits.\n \nNote: If the ZEROFILL attribute has been specified, the\ncolumn will automatically become UNSIGNED.\n \nFor more details on the attributes, see Numeric Data Type\nOverview.\n \nSERIAL is an alias for:\n \nBIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE\n \nExamples\n-------- \nCREATE TABLE bigints (a BIGINT,b BIGINT UNSIGNED,c BIGINT\nZEROFILL);\n \nINSERT INTO bigints VALUES (-10,-10,-10);\nQuery OK, 1 row affected, 2 warnings (0.08 sec)\nWarning (Code 1264): Out of range value for column \'b\' at\nrow 1\nWarning (Code 1264): Out of range value for column \'c\' at\nrow 1\n \nINSERT INTO bigints VALUES (-10,10,-10);Query OK, 1 row\naffected, 1 warning (0.08 sec)\nWarning (Code 1264): Out of range value for column \'c\' at\nrow 1\n \nINSERT INTO bigints VALUES (-10,10,10);\n \nINSERT INTO bigints VALUES\n(9223372036854775808,9223372036854775808,9223372036854775808);\nQuery OK, 1 row affected, 1 warning (0.07 sec)\nWarning (Code 1264): Out of range value for column \'a\' at\nrow 1\n \nINSERT INTO bigints VALUES\n(9223372036854775807,9223372036854775808,9223372036854775808);\n \nSELECT * FROM bigints;\n+---------------------+---------------------+----------------------+\n| a | b | c |\n+---------------------+---------------------+----------------------+\n| -10 | 0 | 00000000000000000000 |\n| -10 | 10 | 00000000000000000000 |\n| -10 | 10 | 00000000000000000010 |\n| 9223372036854775807 | 9223372036854775808 |\n09223372036854775808 |\n| 9223372036854775807 | 9223372036854775808 |\n09223372036854775808 |\n+---------------------+---------------------+----------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/bigint/','','https://mariadb.com/kb/en/library/bigint/'),(266,'BINARY',22,'Syntax\n------ \nBINARY(M)\n \nDescription\n----------- \nThe BINARY type is similar to the CHAR type, but stores\nbinary\nbyte strings rather than non-binary character strings. M\nrepresents the\ncolumn length in bytes.\n \nIt contains no character set, and comparison and sorting are\nbased on the numeric value of the bytes.\n \nIf the maximum length is exceeded, and SQL strict mode is\nnot enabled , the extra characters will be dropped with a\nwarning. If strict mode is enabled, an error will occur.\n \nBINARY values are right-padded with 0x00 (the zero byte) to\nthe specified length when inserted. The padding is not\nremoved on select, so this needs to be taken into account\nwhen sorting and comparing, where all bytes are significant.\nThe zero byte, 0x00 is less than a space for comparison\npurposes.\n \nExamples\n-------- \nInserting too many characters, first with strict mode off,\nthen with it on:\n \nCREATE TABLE bins (a BINARY(10));\n \nINSERT INTO bins VALUES(\'12345678901\');\nQuery OK, 1 row affected, 1 warning (0.04 sec)\n \nSELECT * FROM bins;\n \n+------------+\n| a |\n+------------+\n| 1234567890 |\n+------------+\n \nSET sql_mode=\'STRICT_ALL_TABLES\';\n \nINSERT INTO bins VALUES(\'12345678901\');\nERROR 1406 (22001): Data too long for column \'a\' at row 1\n \nSorting is performed with the byte value:\n \nTRUNCATE bins;\n \nINSERT INTO bins VALUES(\'A\'),(\'B\'),(\'a\'),(\'b\');\n \nSELECT * FROM bins ORDER BY a;\n \n+------+\n| a |\n+------+\n| A |\n| B |\n| a |\n| b |\n+------+\n \nUsing CAST to sort as a CHAR instead:\n \nSELECT * FROM bins ORDER BY CAST(a AS CHAR);\n+------+\n| a |\n+------+\n| a |\n| A |\n| b |\n| B |\n+------+\n \nThe field is a BINARY(10), so padding of two \'\\0\'s are\ninserted, causing comparisons that don\'t take this into\naccount to fail:\n \nTRUNCATE bins;\n \nINSERT INTO bins VALUES(\'12345678\');\n \nSELECT a = \'12345678\', a = \'12345678\\0\\0\' from bins;\n \n+----------------+--------------------+\n| a = \'12345678\' | a = \'12345678\\0\\0\' |\n+----------------+--------------------+\n| 0 | 1 |\n+----------------+--------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/binary/','','https://mariadb.com/kb/en/library/binary/'),(267,'BIT',22,'Syntax\n------ \nBIT[(M)]\n \nDescription\n----------- \nA bit-field type. M indicates the number of bits per value,\nfrom 1 to\n64. The default is 1 if M is omitted.\n \nBit values can be inserted with b\'value\' notation, where\nvalue is the bit value in 0\'s and 1\'s.\n \nBit fields are automatically zero-padded from the left to\nthe full length of the bit, so for example in a BIT(4)\nfield, \'10\' is equivalent to \'0010\'.\n \nBits are returned as binary, so to display them, either add\n0, or use a function such as HEX, OCT or BIN to convert\nthem.\n \nExamples\n-------- \nCREATE TEMPORARY TABLE b ( b1 BIT(8) );\nINSERT INTO b VALUES\n(b\'11111111\'),(b\'01010101\'),(b\'1111111111111\');\nQuery OK, 3 rows affected, 1 warning (0.10 sec)\nRecords: 3 Duplicates: 0 Warnings: 1\n \nSHOW WARNINGS;\n+---------+------+---------------------------------------------+\n| Level | Code | Message |\n+---------+------+---------------------------------------------+\n| Warning | 1264 | Out of range value for column \'b1\' at\nrow 3 |\n+---------+------+---------------------------------------------+\n \nSELECT b1+0, HEX(b1), OCT(b1), BIN(b1) FROM b;\n+------+---------+---------+----------+\n| b1+0 | HEX(b1) | OCT(b1) | BIN(b1) |\n+------+---------+---------+----------+\n| 255 | FF | 377 | 11111111 |\n| 85 | 55 | 125 | 1010101 |\n| 255 | FF | 377 | 11111111 |\n+------+---------+---------+----------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/bit/','','https://mariadb.com/kb/en/library/bit/'),(529,'MPointFromWKB',32,'Syntax\n------ \nMPointFromWKB(wkb[,srid])\nMultiPointFromWKB(wkb[,srid])\n \nDescription\n----------- \nConstructs a MULTIPOINT value using its WKB representation\nand SRID.\n \nMPointFromWKB() and MultiPointFromWKB() are synonyms.\n \nExamples\n-------- \nSET @g = ST_AsBinary(MPointFromText(\'MultiPoint( 1 1, 2 2,\n5 3, 7 2, 9 3, 8 4, 6 6, 6 9, 4 9, 1 5 )\'));\n \nSELECT ST_AsText(MPointFromWKB(@g));\n+-----------------------------------------------------+\n| ST_AsText(MPointFromWKB(@g)) |\n+-----------------------------------------------------+\n| MULTIPOINT(1 1,2 2,5 3,7 2,9 3,8 4,6 6,6 9,4 9,1 5) |\n+-----------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/mpointfromwkb/','','https://mariadb.com/kb/en/library/mpointfromwkb/'),(531,'GeomCollFromWKB',32,'A synonym for ST_GeomCollFromWKB.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/wkb-geomcollfromwkb/','','https://mariadb.com/kb/en/library/wkb-geomcollfromwkb/'),(532,'GeometryCollectionFromWKB',32,'A synonym for ST_GeomCollFromWKB.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/geometrycollectionfromwkb/','','https://mariadb.com/kb/en/library/geometrycollectionfromwkb/'),(533,'GeometryFromWKB',32,'A synonym for ST_GeomFromWKB.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/geometryfromwkb/','','https://mariadb.com/kb/en/library/geometryfromwkb/'),(534,'GeomFromWKB',32,'A synonym for ST_GeomFromWKB.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/wkb-geomfromwkb/','','https://mariadb.com/kb/en/library/wkb-geomfromwkb/'),(535,'LineFromWKB',32,'A synonym for ST_LineFromWKB.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/wkb-linefromwkb/','','https://mariadb.com/kb/en/library/wkb-linefromwkb/'),(536,'LineStringFromWKB',32,'A synonym for ST_LineFromWKB.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/linestringfromwkb/','','https://mariadb.com/kb/en/library/linestringfromwkb/'),(268,'BLOB',22,'Syntax\n------ \nBLOB[(M)]\n \nDescription\n----------- \nA BLOB column with a maximum length of 65,535 (216 - 1)\nbytes. Each\nBLOB value is stored using a two-byte length prefix that\nindicates the\nnumber of bytes in the value.\n \nAn optional length M can be given for this type. If this is\ndone,\nMariaDB creates the column as the smallest BLOB type large\nenough to\nhold values M bytes long.\n \nBLOBS can also be used to store dynamic columns.\n \nBefore MariaDB 10.2.1, BLOB and TEXT columns could not be\nassigned a DEFAULT value. This restriction was lifted in\nMariaDB 10.2.1.\n \nIndexing\n \nIn MariaDB 10.4, it is possible to set a Unique index on a\ncolumn that uses the BLOB data type. In previous releases\nthis was not possible, as the index would only guarantee the\nuniqueness of a fixed number of characters.\n \nOracle Mode\n \nIn Oracle mode from MariaDB 10.3, BLOB is a synonym for\nLONGBLOB.\n \n\n\nURL: https://mariadb.com/kb/en/library/blob/','','https://mariadb.com/kb/en/library/blob/'),(270,'BOOLEAN',22,'Syntax\n------ \nBOOL, BOOLEAN\n \nDescription\n----------- \nThese types are synonyms for TINYINT(1). \nA value of zero is considered false. Non-zero values are\nconsidered true:\n \nmysql> SELECT IF(0, \'true\', \'false\');\n+------------------------+\n| IF(0, \'true\', \'false\') |\n+------------------------+\n| false |\n+------------------------+\n \nmysql> SELECT IF(1, \'true\', \'false\');\n+------------------------+\n| IF(1, \'true\', \'false\') |\n+------------------------+\n| true |\n+------------------------+\n \nmysql> SELECT IF(2, \'true\', \'false\');\n+------------------------+\n| IF(2, \'true\', \'false\') |\n+------------------------+\n| true |\n+------------------------+\n \nHowever, the values TRUE and FALSE are merely aliases for 1\nand 0,\nrespectively, as shown here:\n \nmysql> SELECT IF(0 = FALSE, \'true\', \'false\');\n \n+--------------------------------+\n| IF(0 = FALSE, \'true\', \'false\') |\n+--------------------------------+\n| true |\n+--------------------------------+\n \nmysql> SELECT IF(1 = TRUE, \'true\', \'false\');\n+-------------------------------+\n| IF(1 = TRUE, \'true\', \'false\') |\n+-------------------------------+\n| true |\n+-------------------------------+\n \nmysql> SELECT IF(2 = TRUE, \'true\', \'false\');\n+-------------------------------+\n| IF(2 = TRUE, \'true\', \'false\') |\n+-------------------------------+\n| false |\n+-------------------------------+\n \nmysql> SELECT IF(2 = FALSE, \'true\', \'false\');\n+--------------------------------+\n| IF(2 = FALSE, \'true\', \'false\') |\n+--------------------------------+\n| false |\n+--------------------------------+\n \nUNKNOWN is an alias for NULL.\n \nThe last two statements display the results shown because 2\nis equal\nto neither 1 nor 0.\n \n\n\nURL: https://mariadb.com/kb/en/library/boolean/','','https://mariadb.com/kb/en/library/boolean/'),(271,'CHAR',22,'This article covers the CHAR data type. See CHAR Function\nfor the function.\n \nSyntax\n------ \n[NATIONAL] CHAR[(M)] [CHARACTER SET charset_name] [COLLATE\ncollation_name]\n \nDescription\n----------- \nA fixed-length string that is always right-padded with\nspaces to the specified\nlength when stored. M represents the column length in\ncharacters. The range\nof M is 0 to 255. If M is omitted, the length is 1.\n \nCHAR(0) columns can contain 2 values: an empty string or\nNULL. Such columns cannot be part of an index. The CONNECT\nstorage engine does not support CHAR(0).\n \nNote: Trailing spaces are removed when CHAR values are\nretrieved\nunless the PAD_CHAR_TO_FULL_LENGTH SQL mode is enabled.\n \nBefore MariaDB 10.2, all collations were of type PADSPACE,\nmeaning that CHAR (as well as VARCHAR and TEXT) values are\ncompared without regard for trailing spaces. This does not\napply to the LIKE pattern-matching operator, which takes\ninto account trailing spaces.\n \nIf a unique index consists of a column where trailing pad\ncharacters are stripped or ignored, inserts into that column\nwhere values differ only by the number of trailing pad\ncharacters will result in a duplicate-key error.\n \nExamples\n-------- \nTrailing spaces:\n \nCREATE TABLE strtest (c CHAR(10));\nINSERT INTO strtest VALUES(\'Maria \');\n \nSELECT c=\'Maria\',c=\'Maria \' FROM strtest;\n \n+-----------+--------------+\n| c=\'Maria\' | c=\'Maria \' |\n+-----------+--------------+\n| 1 | 1 |\n+-----------+--------------+\n \nSELECT c LIKE \'Maria\',c LIKE \'Maria \' FROM strtest;\n \n+----------------+-------------------+\n| c LIKE \'Maria\' | c LIKE \'Maria \' |\n+----------------+-------------------+\n| 1 | 0 |\n+----------------+-------------------+\n \nNO PAD Collations\n \nNO PAD collations regard trailing spaces as normal\ncharacters. You can get a list of all NO PAD collations by\nquerying the Information Schema Collations table, for\nexample:\n \nSELECT collation_name FROM information_schema.collations \n WHERE collation_name LIKE \"%nopad%\";\n \n+------------------------------+\n| collation_name |\n+------------------------------+\n| big5_chinese_nopad_ci |\n| big5_nopad_bin |\n...\n \n\n\nURL: https://mariadb.com/kb/en/library/char/','','https://mariadb.com/kb/en/library/char/'),(537,'MultiLineStringFromWKB',32,'A synonym for MLineFromWKB().\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/multilinestringfromwkb/','','https://mariadb.com/kb/en/library/multilinestringfromwkb/'),(538,'MultiPointFromWKB',32,'A synonym for MPointFromWKB.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/multipointfromwkb/','','https://mariadb.com/kb/en/library/multipointfromwkb/'),(539,'MultiPolygonFromWKB',32,'Synonym for MPolyFromWKB.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/multipolygonfromwkb/','','https://mariadb.com/kb/en/library/multipolygonfromwkb/'),(540,'PointFromWKB',32,'A synonym for ST_PointFromWKB.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/wkb-pointfromwkb/','','https://mariadb.com/kb/en/library/wkb-pointfromwkb/'),(541,'PolyFromWKB',32,'A synonym for ST_PolyFromWKB.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/wkb-polyfromwkb/','','https://mariadb.com/kb/en/library/wkb-polyfromwkb/'),(542,'PolygonFromWKB',32,'A synonym for ST_PolyFromWKB.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/polygonfromwkb/','','https://mariadb.com/kb/en/library/polygonfromwkb/'),(543,'ST_AsBinary',32,'Syntax\n------ \nST_AsBinary(g)\nAsBinary(g)\nST_AsWKB(g)\nAsWKB(g)\n \nDescription\n----------- \nConverts a value in internal geometry format to its WKB\nrepresentation and returns the binary result.\n \nST_AsBinary(), AsBinary(), ST_AsWKB() and AsWKB() are\nsynonyms,\n \nExamples\n-------- \nSET @poly = ST_GeomFromText(\'POLYGON((0 0,0 1,1 1,1 0,0\n0))\');\nSELECT ST_AsBinary(@poly);\n \nSELECT ST_AsText(ST_GeomFromWKB(ST_AsWKB(@poly)));\n+--------------------------------------------+\n| ST_AsText(ST_GeomFromWKB(ST_AsWKB(@poly))) |\n+--------------------------------------------+\n| POLYGON((0 0,0 1,1 1,1 0,0 0)) |\n+--------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_asbinary/','','https://mariadb.com/kb/en/library/st_asbinary/'),(544,'ST_AsWKB',32,'A synonym for ST_AsBinary().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_aswkb/','','https://mariadb.com/kb/en/library/st_aswkb/'),(546,'ST_GeometryCollectionFromWKB',32,'A synonym for ST_GeomCollFromWKB.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/st_geometrycollectionfromwkb/','','https://mariadb.com/kb/en/library/st_geometrycollectionfromwkb/'),(547,'ST_GeometryFromWKB',32,'A synonym for ST_GeomFromWKB.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_geometryfromwkb/','','https://mariadb.com/kb/en/library/st_geometryfromwkb/'),(273,'DATE',22,'Syntax\n------ \nDATE\n \nDescription\n----------- \nA date. The supported range is \'1000-01-01\' to\n\'9999-12-31\'. MariaDB\ndisplays DATE values in \'YYYY-MM-DD\' format, but can be\nassigned dates in looser formats, including strings or\nnumbers, as long as they make sense. These include a short\nyear, YY-MM-DD, no delimiters, YYMMDD, or any other\nacceptable delimiter, for example YYYY/MM/DD. For details,\nsee date and time literals.\n \n\'0000-00-00\' is a permitted special value (zero-date),\nunless the NO_ZERO_DATE SQL_MODE is used. Also, individual\ncomponents of a date can be set to 0 (for example:\n\'2015-00-12\'), unless the NO_ZERO_IN_DATE SQL_MODE is\nused. In many cases, the result of en expression involving a\nzero-date, or a date with zero-parts, is NULL. If the\nALLOW_INVALID_DATES SQL_MODE is enabled, if the day part is\nin the range between 1 and 31, the date does not produce any\nerror, even for months that have less than 31 days.\n \nExamples\n-------- \nCREATE TABLE t1 (d DATE);\n \nINSERT INTO t1 VALUES (\"2010-01-12\"), (\"2011-2-28\"),\n(\'120314\'),(\'13*04*21\');\n \nSELECT * FROM t1;\n \n+------------+\n| d |\n+------------+\n| 2010-01-12 |\n| 2011-02-28 |\n| 2012-03-14 |\n| 2013-04-21 |\n+------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/date/','','https://mariadb.com/kb/en/library/date/'),(274,'DATETIME',22,'Syntax\n------ \nDATETIME [(microsecond precision)]\n \nDescription\n----------- \nA date and time combination. The supported range is\n\'1000-01-01 00:00:00.000000\' to \'9999-12-31\n23:59:59.999999\'.\nMariaDB displays DATETIME values in \'YYYY-MM-DD HH:MM:SS\'\nformat, but\nallows assignment of values to DATETIME columns using either\nstrings or\nnumbers. For details, see date and time literals.\n \nThe microsecond precision can be from 0-6. If not specified\n0 is used.\n \n\'0000-00-00\' is a permitted special value (zero-date),\nunless the NO_ZERO_DATE SQL_MODE is used. Also, individual\ncomponents of a date can be set to 0 (for example:\n\'2015-00-12\'), unless the NO_ZERO_IN_DATE SQL_MODE is\nused. In many cases, the result of en expression involving a\nzero-date, or a date with zero-parts, is NULL. If the\nALLOW_INVALID_DATES SQL_MODE is enabled, if the day part is\nin the range between 1 and 31, the date does not produce any\nerror, even for months that have less than 31 days.\n \nSince MariaDB 10.0.1, DATETIME columns also accept\nCURRENT_TIMESTAMP as the default value.\n \nMariaDB 10.1.2 introduced the --mysql56-temporal-format\noption, on by default, which allows MariaDB to store\nDATETMEs using the same low-level format MySQL 5.6 uses. For\nmore information, see Internal Format, below.\n \nFor storage requirements, see Data Type Storage\nRequirements.\n \nOracle Mode\n \nIn Oracle mode from MariaDB 10.3, DATE with a time portion\nis a synonym for DATETIME.\n \nInternal Format\n \nIn MariaDB 10.1.2 a new temporal format was introduced from\nMySQL 5.6 that alters how the TIME, DATETIME and TIMESTAMP\ncolumns operate at lower levels. These changes allow these\ntemporal data types to have fractional parts and negative\nvalues. You can disable this feature using the\nmysql56_temporal_format system variable.\n \nTables that include TIMESTAMP values that were created on an\nolder version of MariaDB or that were created while the\nmysql56_temporal_format system variable was disabled\ncontinue to store data using the older data type format.\n \nIn order to update table columns from the older format to\nthe newer format, execute an ALTER TABLE... MODIFY COLUMN\nstatement that changes the column to the *same* data type.\nThis change may be needed if you want to export the table\'s\ntablespace and import it onto a server that has\nmysql56_temporal_format=ON set (see MDEV-15225).\n \nFor instance, if you have a DATETIME column in your table: \n \nSHOW VARIABLES LIKE \'mysql56_temporal_format\';\n \n+-------------------------+-------+\n| Variable_name | Value |\n+-------------------------+-------+\n| mysql56_temporal_format | ON |\n+-------------------------+-------+\n \nALTER TABLE example_table MODIFY ts_col DATETIME;\n \nWhen MariaDB executes the ALTER TABLE statement, it converts\nthe data from the older temporal format to the newer one. \n \nIn the event that you have several tables and columns using\ntemporal data types that you want to switch over to the new\nformat, make sure the system variable is enabled, then\nperform a dump and restore using mysqldump. The columns\nusing relevant temporal data types are restored using the\nnew temporal format.\n \nExamples\n-------- \nCREATE TABLE t1 (d DATETIME);\n \nINSERT INTO t1 VALUES (\"2011-03-11\"), (\"2012-04-19\n13:08:22\"),\n (\"2013-07-18 13:44:22.123456\");\n \nSELECT * FROM t1;\n \n+---------------------+\n| d |\n+---------------------+\n| 2011-03-11 00:00:00 |\n| 2012-04-19 13:08:22 |\n| 2013-07-18 13:44:22 |\n+---------------------+\n \nCREATE TABLE t2 (d DATETIME(6));\n \nINSERT INTO t2 VALUES (\"2011-03-11\"), (\"2012-04-19\n13:08:22\"),\n (\"2013-07-18 13:44:22.123456\");\n \nSELECT * FROM t2;\n \n+----------------------------+\n| d |\n+----------------------------+\n| 2011-03-11 00:00:00.000000 |\n| 2012-04-19 13:08:22.000000 |\n| 2013-07-18 13:44:22.123456 |\n+----------------------------++\n \nStrings used in datetime context are automatically converted\nto datetime(6). If you want to have a datetime without\nseconds, you should use CONVERT(..,datetime).\n \nSELECT CONVERT(\'2007-11-30 10:30:19\',datetime);\n+-----------------------------------------+\n| CONVERT(\'2007-11-30 10:30:19\',datetime) |\n+-----------------------------------------+\n| 2007-11-30 10:30:19 |\n+-----------------------------------------+\n \nSELECT CONVERT(\'2007-11-30 10:30:19\',datetime(6));\n+--------------------------------------------+\n| CONVERT(\'2007-11-30 10:30:19\',datetime(6)) |\n+--------------------------------------------+\n| 2007-11-30 10:30:19.000000 |\n+--------------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/datetime/','','https://mariadb.com/kb/en/library/datetime/'),(548,'ST_GeomFromWKB',32,'Syntax\n------ \nST_GeomFromWKB(wkb[,srid])\nST_GeometryFromWKB(wkb[,srid])\nGeomFromWKB(wkb[,srid])\nGeometryFromWKB(wkb[,srid])\n \nDescription\n----------- \nConstructs a geometry value of any type using its WKB\nrepresentation and SRID.\n \nST_GeomFromWKB(), ST_GeometryFromWKB(), GeomFromWKB() and\nGeometryFromWKB() are synonyms.\n \nExamples\n-------- \nSET @g = ST_AsBinary(ST_LineFromText(\'LINESTRING(0 4, 4\n6)\'));\n \nSELECT ST_AsText(ST_GeomFromWKB(@g));\n+-------------------------------+\n| ST_AsText(ST_GeomFromWKB(@g)) |\n+-------------------------------+\n| LINESTRING(0 4,4 6) |\n+-------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_geomfromwkb/','','https://mariadb.com/kb/en/library/st_geomfromwkb/'),(549,'ST_LineFromWKB',32,'Syntax\n------ \nST_LineFromWKB(wkb[,srid])\nLineFromWKB(wkb[,srid])\nST_LineStringFromWKB(wkb[,srid])\nLineStringFromWKB(wkb[,srid])\n \nDescription\n----------- \nConstructs a LINESTRING value using its WKB representation\nand SRID.\n \nST_LineFromWKB(), LineFromWKB(), ST_LineStringFromWKB(), and\nLineStringFromWKB() are synonyms.\n \nExamples\n-------- \nSET @g = ST_AsBinary(ST_LineFromText(\'LineString(0 4,4\n6)\'));\n \nSELECT ST_AsText(ST_LineFromWKB(@g)) AS l;\n \n+---------------------+\n| l |\n+---------------------+\n| LINESTRING(0 4,4 6) |\n+---------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_linefromwkb/','','https://mariadb.com/kb/en/library/st_linefromwkb/'),(275,'DECIMAL',22,'Syntax\n------ \nDECIMAL[(M[,D])] [SIGNED | UNSIGNED | ZEROFILL]\n \nDescription\n----------- \nA packed \"exact\" fixed-point number. M is the total number\nof digits (the\nprecision) and D is the number of digits after the decimal\npoint (the\nscale). The decimal point and (for negative numbers) the\n\"-\" sign are not\ncounted in M. If D is 0, values have no decimal point or\nfractional\npart and on INSERT the value will be rounded to the nearest\nDECIMAL. The maximum number of digits (M) for DECIMAL is 65.\nThe maximum number of supported decimals (D) is 30 before\nMariadB 10.2.1 and 38 afterwards. If D is omitted, the\ndefault is 0. If M is omitted, the default is 10.\n \nUNSIGNED, if specified, disallows negative values.\n \nZEROFILL, if specified, pads the number with zeros, up to\nthe total number\nof digits specified by M.\n \nAll basic calculations (+, -, *, /) with DECIMAL columns are\ndone with\na precision of 65 digits.\n \nFor more details on the attributes, see Numeric Data Type\nOverview.\n \nOracle Mode\n \nIn Oracle mode from MariaDB 10.3, NUMBER is a synonym.\n \nExamples\n-------- \nCREATE TABLE t1 (d DECIMAL UNSIGNED ZEROFILL);\n \nINSERT INTO t1 VALUES (1),(2),(3),(4.0),(5.2),(5.7);\nQuery OK, 6 rows affected, 2 warnings (0.16 sec)\nRecords: 6 Duplicates: 0 Warnings: 2\n \nNote (Code 1265): Data truncated for column \'d\' at row 5\nNote (Code 1265): Data truncated for column \'d\' at row 6\n \nSELECT * FROM t1;\n \n+------------+\n| d |\n+------------+\n| 0000000001 |\n| 0000000002 |\n| 0000000003 |\n| 0000000004 |\n| 0000000005 |\n| 0000000006 |\n+------------+\n \nINSERT INTO t1 VALUES (-7);\nERROR 1264 (22003): Out of range value for column \'d\' at\nrow 1\n \n\n\nURL: https://mariadb.com/kb/en/library/decimal/','','https://mariadb.com/kb/en/library/decimal/'),(276,'ENUM',22,'Syntax\n------ \nENUM(\'value1\',\'value2\',...) [CHARACTER SET charset_name]\n[COLLATE collation_name]\n \nDescription\n----------- \nAn enumeration. A string object that can have only one\nvalue, chosen\nfrom the list of values \'value1\', \'value2\', ..., NULL or\nthe special \n\'\' error value. In theory, an ENUM column can have a\nmaximum of 65,535 distinct\nvalues; in practice, the real maximum depends on many\nfactors. ENUM values are represented internally as integers.\n \nTrailing spaces are automatically stripped from ENUM values\non table creation.\n \nENUMs require relatively little storage space compared to\nstrings, either one or two bytes depending on the number of\nenumeration values.\n \nNULL and empty values\n \nAn ENUM can also contain NULL and empty values. If the ENUM\ncolumn is declared to permit NULL values, NULL becomes a\nvalid value, as well as the default value (see below). If\nstrict SQL Mode is not enabled, and an invalid value is\ninserted into an ENUM, a special empty string, with an index\nvalue of zero (see Numeric index, below), is inserted, with\na warning. This may be confusing, because the empty string\nis also a possible value, and the only difference if that in\nthis case its index is not 0. Inserting will fail with an\nerror if strict mode is active.\n \nIf a DEFAULT clause is missing, the default value will be:\nNULL is the column is nullable;\notherwise, the first value in the enumaration.\n \nNumeric index\n \nENUM values are indexed numerically in the order they are\ndefined, and sorting will be performed in this numeric\norder. We suggest not using ENUM to store numerals, as there\nis little to no storage space benefit, and it is easy to\nconfuse the enum integer with the enum numeral value by\nleaving out the quotes.\n \nAn ENUM defined as ENUM(\'apple\',\'orange\',\'pear\') would\nhave the following index values:\n \nIndex | Value | \n \nNULL | NULL | \n \n0 | \'\' | \n \n1 | \'apple\' | \n \n2 | \'orange\' | \n \n3 | \'pear\' | \n \nExamples\n-------- \nCREATE TABLE fruits (\n id INT NOT NULL auto_increment PRIMARY KEY,\n fruit ENUM(\'apple\',\'orange\',\'pear\'),\n bushels INT);\n \nDESCRIBE fruits;\n \n+---------+-------------------------------+------+-----+---------+----------------+\n| Field | Type | Null | Key | Default | Extra |\n+---------+-------------------------------+------+-----+---------+----------------+\n| id | int(11) | NO | PRI | NULL | auto_increment |\n| fruit | enum(\'apple\',\'orange\',\'pear\') | YES | | NULL\n| |\n| bushels | int(11) | YES | | NULL | |\n+---------+-------------------------------+------+-----+---------+----------------+\n \nINSERT INTO fruits\n (fruit,bushels) VALUES\n (\'pear\',20),\n (\'apple\',100),\n (\'orange\',25);\n \nINSERT INTO fruits\n (fruit,bushels) VALUES\n (\'avocado\',10);\nERROR 1265 (01000): Data truncated for column \'fruit\' at\nrow 1\n \nSELECT * FROM fruits;\n \n+----+--------+---------+\n| id | fruit | bushels |\n+----+--------+---------+\n| 1 | pear | 20 |\n| 2 | apple | 100 |\n| 3 | orange | 25 |\n+----+--------+---------+\n \nSelecting by numeric index:\n \nSELECT * FROM fruits WHERE fruit=2;\n \n+----+--------+---------+\n| id | fruit | bushels |\n+----+--------+---------+\n| 3 | orange | 25 |\n+----+--------+---------+\n \nSorting is according to the index value:\n \nCREATE TABLE enums (a ENUM(\'2\',\'1\'));\n \nINSERT INTO enums VALUES (\'1\'),(\'2\');\n \nSELECT * FROM enums ORDER BY a ASC;\n \n+------+\n| a |\n+------+\n| 2 |\n| 1 |\n+------+\n \nIt\'s easy to get confused between returning the enum\ninteger with the stored value, so we don\'t suggest using\nENUM to store numerals. The first example returns the 1st\nindexed field (\'2\' has an index value of 1, as it\'s\ndefined first), while the second example returns the string\nvalue \'1\'.\n \nSELECT * FROM enums WHERE a=1;\n \n+------+\n| a |\n+------+\n| 2 |\n+------+\n \nSELECT * FROM enums WHERE a=\'1\';\n \n+------+\n| a |\n+------+\n| 1 |\n+------+\n \n\n\nURL: https://mariadb.com/kb/en/library/enum/','','https://mariadb.com/kb/en/library/enum/'),(550,'ST_LineStringFromWKB',32,'A synonym for ST_LineFromWKB.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_linestringfromwkb/','','https://mariadb.com/kb/en/library/st_linestringfromwkb/'),(551,'ST_PointFromWKB',32,'Syntax\n------ \nST_PointFromWKB(wkb[,srid])\nPointFromWKB(wkb[,srid])\n \nDescription\n----------- \nConstructs a POINT value using its WKB representation and\nSRID.\n \nST_PointFromWKB() and PointFromWKB() are synonyms.\n \nExamples\n-------- \nSET @g = ST_AsBinary(ST_PointFromText(\'POINT(0 4)\'));\n \nSELECT ST_AsText(ST_PointFromWKB(@g)) AS p;\n \n+------------+\n| p |\n+------------+\n| POINT(0 4) |\n+------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_pointfromwkb/','','https://mariadb.com/kb/en/library/st_pointfromwkb/'),(552,'ST_PolyFromWKB',32,'Syntax\n------ \nST_PolyFromWKB(wkb[,srid])\nST_PolygonFromWKB(wkb[,srid])\nPolyFromWKB(wkb[,srid])\nPolygonFromWKB(wkb[,srid])\n \nDescription\n----------- \nConstructs a POLYGON value using its WKB representation and\nSRID.\n \nST_PolyFromWKB(), ST_PolygonFromWKB(), PolyFromWKB() and\nPolygonFromWKB() are synonyms.\n \nExamples\n-------- \nSET @g = ST_AsBinary(ST_PolyFromText(\'POLYGON((1 1,1 5,4\n9,6 9,9 3,7 2,1 1))\'));\n \nSELECT ST_AsText(ST_PolyFromWKB(@g)) AS p;\n \n+----------------------------------------+\n| p |\n+----------------------------------------+\n| POLYGON((1 1,1 5,4 9,6 9,9 3,7 2,1 1)) |\n+----------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_polyfromwkb/','','https://mariadb.com/kb/en/library/st_polyfromwkb/'),(553,'ST_PolygonFromWKB',32,'A synonym for ST_PolyFromWKB.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_polygonfromwkb/','','https://mariadb.com/kb/en/library/st_polygonfromwkb/'),(277,'DOUBLE',22,'Syntax\n------ \nDOUBLE[(M,D)] [SIGNED | UNSIGNED | ZEROFILL]\nDOUBLE PRECISION[(M,D)] [SIGNED | UNSIGNED | ZEROFILL]\nREAL[(M,D)] [SIGNED | UNSIGNED | ZEROFILL]\n \nDescription\n----------- \nA normal-size (double-precision) floating-point number (see\nFLOAT for a single-precision floating-point number).\n \nAllowable values are:\n-1.7976931348623157E+308 to -2.2250738585072014E-308\n0\n2.2250738585072014E-308 to 1.7976931348623157E+308\n \nThese are the theoretical limits, based on the IEEE\nstandard. The actual range\nmight be slightly smaller depending on your hardware or\noperating system.\n \nM is the total number of digits and D is the number of\ndigits\nfollowing the decimal point. If M and D are omitted, values\nare stored\nto the limits allowed by the hardware. A double-precision\nfloating-point number is accurate to approximately 15\ndecimal places.\n \nUNSIGNED, if specified, disallows negative values.\n \nZEROFILL, if specified, pads the number with zeros, up to\nthe total number\nof digits specified by M.\n \nREAL and DOUBLE PRECISION are synonyms, unless the\nREAL_AS_FLOAT SQL mode is enabled, in which case REAL is a\nsynonym for FLOAT rather than DOUBLE.\n \nSee Floating Point Accuracy for issues when using\nfloating-point numbers.\n \nFor more details on the attributes, see Numeric Data Type\nOverview.\n \nExamples\n-------- \nCREATE TABLE t1 (d DOUBLE(5,0) zerofill);\n \nINSERT INTO t1 VALUES (1),(2),(3),(4);\n \nSELECT * FROM t1;\n \n+-------+\n| d |\n+-------+\n| 00001 |\n| 00002 |\n| 00003 |\n| 00004 |\n+-------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/double/','','https://mariadb.com/kb/en/library/double/'),(278,'FLOAT',22,'Syntax\n------ \nFLOAT[(M,D)] [SIGNED | UNSIGNED | ZEROFILL]\n \nDescription\n----------- \nA small (single-precision) floating-point number (see DOUBLE\nfor a regular-size floating point number). Allowable values\nare:\n-3.402823466E+38 to -1.175494351E-38\n0\n1.175494351E-38 to 3.402823466E+38. \n \nThese are the theoretical limits, based on the IEEE \nstandard. The actual range might be slightly smaller\ndepending on your\nhardware or operating system.\n \nM is the total number of digits and D is the number of\ndigits\nfollowing the decimal point. If M and D are omitted, values\nare stored\nto the limits allowed by the hardware. A single-precision\nfloating-point number is accurate to approximately 7 decimal\nplaces.\n \nUNSIGNED, if specified, disallows negative values.\n \nUsing FLOAT might give you some unexpected problems because\nall\ncalculations in MariaDB are done with double precision. See\nFloating Point Accuracy.\n \nFor more details on the attributes, see Numeric Data Type\nOverview.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/float/','','https://mariadb.com/kb/en/library/float/'),(280,'JSON Data Type',22,'The JSON alias was added in MariaDB 10.2.7. This was done to\nmake it possible to use JSON columns in statement based\nreplication from MySQL to MariaDB and to make it possible\nfor MariaDB to read mysqldumps from MySQL.\n \nJSON is an alias for LONGTEXT introduced for compatibility\nreasons with MySQL\'s JSON data type. MariaDB implements\nthis as a LONGTEXT rather, as the JSON data type contradicts\nthe SQL standard, and MariaDB\'s benchmarks indicate that\nperformance is at least equivalent.\n \nIn order to ensure that a a valid json document is inserted,\nthe JSON_VALID function can be used as a CHECK constraint.\nThis constraint is automatically included for types using\nthe JSON alias from MariaDB 10.4.3.\n \nExamples\n-------- \nCREATE TABLE t (j JSON);\n \nDESC t;\n+-------+----------+------+-----+---------+-------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+----------+------+-----+---------+-------+\n| j | longtext | YES | | NULL | |\n+-------+----------+------+-----+---------+-------+\n \nWith validation:\n \nCREATE TABLE t2 (\n j JSON \n CHECK (JSON_VALID(j))\n);\n \nINSERT INTO t2 VALUES (\'invalid\');\nERROR 4025 (23000): CONSTRAINT `j` failed for `test`.`t2`\n \nINSERT INTO t2 VALUES (\'{\"id\": 1, \"name\":\n\"Monty\"}\');\nQuery OK, 1 row affected (0.13 sec)\n \nReplicating JSON Data Between MySQL and MariaDB\n \nThe JSON type in MySQL stores the JSON object in a compact\nform, not as LONGTEXT as in MariaDB.\nThis means that row based replication will not work for JSON\ntypes from MySQL to MariaDB.\n \nThere are a a few different ways to solve this:\nUse statement based replication.\nChange the JSON column to type TEXT in MySQL\n \nConverting a MySQL TABLE with JSON Fields to MariaDB\n \nMariaDB can\'t directly access MySQL JSON format.\n \nThere is a a few different ways to move the table to\nMariaDB:\nChange the JSON column to type TEXT in MySQL. After this\nMariaDB can directly use the table without any need for a\ndump and restore.\nUse mysqldump to copy the table.\n \nDifferences Between MySQL JSON Strings and MariaDB JSON\nStrings\n \nIn MySQL, JSON is an object and is compared according to\njson values. In MariaDB JSON strings are normal strings and\ncompared as strings. One exception is when using\nJSON_EXTRACT() in which case strings are unescaped before\ncomparison.\n \n\n\nURL: https://mariadb.com/kb/en/library/json-data-type/','','https://mariadb.com/kb/en/library/json-data-type/'),(554,'BOUNDARY',36,'A synonym for ST_BOUNDARY.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/geometry-properties-boundary/','','https://mariadb.com/kb/en/library/geometry-properties-boundary/'),(555,'DIMENSION',36,'A synonym for ST_DIMENSION.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/dimension/','','https://mariadb.com/kb/en/library/dimension/'),(556,'ENVELOPE',36,'A synonym for ST_ENVELOPE.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/geometry-properties-envelope/','','https://mariadb.com/kb/en/library/geometry-properties-envelope/'),(557,'GeometryN',36,'A synonym for ST_GeometryN.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/geometry-properties-geometryn/','','https://mariadb.com/kb/en/library/geometry-properties-geometryn/'),(558,'GeometryType',36,'A synonym for ST_GeometryType.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/geometry-properties-geometrytype/','','https://mariadb.com/kb/en/library/geometry-properties-geometrytype/'),(559,'IsClosed',36,'A synonym for ST_IsClosed.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/isclosed/','','https://mariadb.com/kb/en/library/isclosed/'),(560,'IsEmpty',36,'A synonym for ST_IsEmpty.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/geometry-properties-isempty/','','https://mariadb.com/kb/en/library/geometry-properties-isempty/'),(561,'IsRing',36,'A synonym for ST_IsRing.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/isring/','','https://mariadb.com/kb/en/library/isring/'),(562,'IsSimple',36,'A synonym for ST_IsSImple.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/geometry-properties-issimple/','','https://mariadb.com/kb/en/library/geometry-properties-issimple/'),(563,'NumGeometries',36,'A synonym for ST_NumGeometries.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/geometry-properties-numgeometries/','','https://mariadb.com/kb/en/library/geometry-properties-numgeometries/'),(564,'SRID',36,'A synonym for ST_SRID.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/geometry-properties-srid/','','https://mariadb.com/kb/en/library/geometry-properties-srid/'),(566,'ST_DIMENSION',36,'Syntax\n------ \nST_Dimension(g)\nDimension(g)\n \nDescription\n----------- \nReturns the inherent dimension of the geometry value g. The\nresult can\nbe\n \nDimension | Definition | \n \n -1 | empty geometry | \n \n 0 | geometry with no length or area | \n \n 1 | geometry with no area but nonzero length | \n \n 2 | geometry with nonzero area | \n \nST_Dimension() and Dimension() are synonyms.\n \nExamples\n-------- \nSELECT Dimension(GeomFromText(\'LineString(1 1,2 2)\'));\n+------------------------------------------------+\n| Dimension(GeomFromText(\'LineString(1 1,2 2)\')) |\n+------------------------------------------------+\n| 1 |\n+------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_dimension/','','https://mariadb.com/kb/en/library/st_dimension/'),(279,'Geometry Types',22,'Description\n----------- \nMariaDB provides a standard way of creating spatial columns\nfor geometry types,\nfor example, with CREATE TABLE or ALTER TABLE.\nCurrently, spatial columns are supported for MyISAM, InnoDB,\nNDB, and ARCHIVE\ntables. See also SPATIAL INDEX.\n \nThe basic geometry type is GEOMETRY. But the type can be\nmore specific. The following types are supported:\n \nGeometry Types | \n \nPOINT | \n \nLINESTRING | \n \nPOLYGON | \n \nMULTIPOINT | \n \nMULTILINESTRING | \n \nMULTIPOLYGON | \n \nGEOMETRYCOLLECTION | \n \nGEOMETRY | \n \nExamples\n-------- \nNote: For clarity, only one type is listed per table in the\nexamples below, but a table\nrow can contain multiple types. For example:\n \nCREATE TABLE object (shapeA POLYGON, shapeB LINESTRING);\n \nPOINT\n \nCREATE TABLE gis_point (g POINT);\nSHOW FIELDS FROM gis_point;\n \nINSERT INTO gis_point VALUES\n (PointFromText(\'POINT(10 10)\')),\n (PointFromText(\'POINT(20 10)\')),\n (PointFromText(\'POINT(20 20)\')),\n (PointFromWKB(AsWKB(PointFromText(\'POINT(10 20)\'))));\n \nLINESTRING\n \nCREATE TABLE gis_line (g LINESTRING);\nSHOW FIELDS FROM gis_line;\n \nINSERT INTO gis_line VALUES\n (LineFromText(\'LINESTRING(0 0,0 10,10 0)\')),\n (LineStringFromText(\'LINESTRING(10 10,20 10,20 20,10 20,10\n10)\')),\n (LineStringFromWKB(AsWKB(LineString(Point(10, 10),\nPoint(40, 10)))));\n \nPOLYGON\n \nCREATE TABLE gis_polygon (g POLYGON);\nSHOW FIELDS FROM gis_polygon;\n \nINSERT INTO gis_polygon VALUES\n (PolygonFromText(\'POLYGON((10 10,20 10,20 20,10 20,10\n10))\')),\n (PolyFromText(\'POLYGON((0 0,50 0,50 50,0 50,0 0), (10\n10,20 10,20 20,10 20,10 10))\')),\n (PolyFromWKB(AsWKB(Polygon(LineString(Point(0, 0),\nPoint(30, 0), Point(30, 30), Point(0, 0))))));\n \nMULTIPOINT\n \nCREATE TABLE gis_multi_point (g MULTIPOINT);\nSHOW FIELDS FROM gis_multi_point;\n \nINSERT INTO gis_multi_point VALUES\n (MultiPointFromText(\'MULTIPOINT(0 0,10 10,10 20,20\n20)\')),\n (MPointFromText(\'MULTIPOINT(1 1,11 11,11 21,21 21)\')),\n (MPointFromWKB(AsWKB(MultiPoint(Point(3, 6), Point(4,\n10)))));\n \nMULTILINESTRING\n \nCREATE TABLE gis_multi_line (g MULTILINESTRING);\nSHOW FIELDS FROM gis_multi_line;\n \nINSERT INTO gis_multi_line VALUES\n (MultiLineStringFromText(\'MULTILINESTRING((10 48,10 21,10\n0),(16 0,16 23,16 48))\')),\n (MLineFromText(\'MULTILINESTRING((10 48,10 21,10 0))\')),\n (MLineFromWKB(AsWKB(MultiLineString(LineString(Point(1, 2),\nPoint(3, 5)), LineString(Point(2, 5), Point(5, 8), Point(21,\n7))))));\n \nMULTIPOLYGON\n \nCREATE TABLE gis_multi_polygon (g MULTIPOLYGON);\nSHOW FIELDS FROM gis_multi_polygon;\n \nINSERT INTO gis_multi_polygon VALUES\n (MultiPolygonFromText(\'MULTIPOLYGON(((28 26,28 0,84 0,84\n42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67\n13,59 13,59 18)))\')),\n (MPolyFromText(\'MULTIPOLYGON(((28 26,28 0,84 0,84 42,28\n26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59\n13,59 18)))\')),\n (MPolyFromWKB(AsWKB(MultiPolygon(Polygon(LineString(Point(0,\n3), Point(3, 3), Point(3, 0), Point(0, 3)))))));\n \nGEOMETRYCOLLECTION\n \nCREATE TABLE gis_geometrycollection (g GEOMETRYCOLLECTION);\nSHOW FIELDS FROM gis_geometrycollection;\n \nINSERT INTO gis_geometrycollection VALUES\n (GeomCollFromText(\'GEOMETRYCOLLECTION(POINT(0 0),\nLINESTRING(0 0,10 10))\')),\n (GeometryFromWKB(AsWKB(GeometryCollection(Point(44, 6),\nLineString(Point(3, 6), Point(7, 9)))))),\n (GeomFromText(\'GeometryCollection()\')),\n (GeomFromText(\'GeometryCollection EMPTY\'));\n \nGEOMETRY\n \nCREATE TABLE gis_geometry (g GEOMETRY);\nSHOW FIELDS FROM gis_geometry;\n \nINSERT into gis_geometry SELECT * FROM gis_point;\n \nINSERT into gis_geometry SELECT * FROM gis_line;\n \nINSERT into gis_geometry SELECT * FROM gis_polygon;\n \nINSERT into gis_geometry SELECT * FROM gis_multi_point;\n \nINSERT into gis_geometry SELECT * FROM gis_multi_line;\n \nINSERT into gis_geometry SELECT * FROM gis_multi_polygon;\n \nINSERT into gis_geometry SELECT * FROM\ngis_geometrycollection;\n \n\n \n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/geometry-types/','','https://mariadb.com/kb/en/library/geometry-types/'),(282,'LONGTEXT',22,'Syntax\n------ \nLONGTEXT [CHARACTER SET charset_name] [COLLATE\ncollation_name]\n \nDescription\n----------- \nA TEXT column with a maximum length of 4,294,967,295 or 4GB\n(232 - 1) characters. The effective maximum length is less\nif the value contains multi-byte characters. The effective\nmaximum length of LONGTEXT columns also depends on the\nconfigured maximum packet size in the client/server protocol\nand available memory. Each LONGTEXT value is stored using a\nfour-byte length prefix that indicates the number of bytes\nin the value.\n \nFrom MariaDB 10.2.7, JSON is an alias for LONGTEXT. See JSON\nData Type for details.\n \nOracle Mode\n \nIn Oracle mode from MariaDB 10.3, CLOB is a synonym for\nLONGTEXT.\n \n\n\nURL: https://mariadb.com/kb/en/library/longtext/','','https://mariadb.com/kb/en/library/longtext/'),(284,'MEDIUMINT',22,'Syntax\n------ \nMEDIUMINT[(M)] [SIGNED | UNSIGNED | ZEROFILL]\n \nDescription\n----------- \nA medium-sized integer. The signed range is -8388608 to\n8388607. The\nunsigned range is 0 to 16777215.\n \nZEROFILL pads the integer with zeroes and assumes UNSIGNED\n(even if UNSIGNED is not specified).\n \nFor details on the attributes, see Numeric Data Type\nOverview.\n \nExamples\n-------- \nCREATE TABLE mediumints (a MEDIUMINT,b MEDIUMINT UNSIGNED,c\nMEDIUMINT ZEROFILL);\n \nDESCRIBE mediumints;\n+-------+--------------------------------+------+-----+---------+-------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+--------------------------------+------+-----+---------+-------+\n| a | mediumint(9) | YES | | NULL | |\n| b | mediumint(8) unsigned | YES | | NULL | |\n| c | mediumint(8) unsigned zerofill | YES | | NULL | |\n+-------+--------------------------------+------+-----+---------+-------+\n \nINSERT INTO mediumints VALUES (-10,-10,-10);\nQuery OK, 1 row affected, 2 warnings (0.05 sec)\nWarning (Code 1264): Out of range value for column \'b\' at\nrow 1\nWarning (Code 1264): Out of range value for column \'c\' at\nrow 1\n \nINSERT INTO mediumints VALUES (-10,10,-10);\nQuery OK, 1 row affected, 1 warning (0.08 sec)\nWarning (Code 1264): Out of range value for column \'c\' at\nrow 1\n \nINSERT INTO mediumints VALUES (-10,10,10);\n \nINSERT INTO mediumints VALUES (8388608,8388608,8388608);\nQuery OK, 1 row affected, 1 warning (0.05 sec)\nWarning (Code 1264): Out of range value for column \'a\' at\nrow 1\n \nINSERT INTO mediumints VALUES (8388607,8388608,8388608);\n \nSELECT * FROM mediumints;\n+---------+---------+----------+\n| a | b | c |\n+---------+---------+----------+\n| -10 | 0 | 00000000 |\n| -10 | 0 | 00000000 |\n| -10 | 10 | 00000000 |\n| -10 | 10 | 00000010 |\n| 8388607 | 8388608 | 08388608 |\n| 8388607 | 8388608 | 08388608 |\n+---------+---------+----------+\n \n\n\nURL: https://mariadb.com/kb/en/library/mediumint/','','https://mariadb.com/kb/en/library/mediumint/'),(568,'ST_GEOMETRYN',36,'Syntax\n------ \nST_GeometryN(gc,N)\nGeometryN(gc,N)\n \nDescription\n----------- \nReturns the N-th geometry in the GeometryCollection gc.\nGeometries are numbered beginning with 1.\n \nST_GeometryN() and GeometryN() are synonyms.\n \nExample\n \nSET @gc = \'GeometryCollection(Point(1 1),LineString(12 14,\n9 11))\';\n \nSELECT AsText(GeometryN(GeomFromText(@gc),1));\n+----------------------------------------+\n| AsText(GeometryN(GeomFromText(@gc),1)) |\n+----------------------------------------+\n| POINT(1 1) |\n+----------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_geometryn/','','https://mariadb.com/kb/en/library/st_geometryn/'),(286,'Numeric Data Type Overview',22,'There are a number of numeric data types:\nTINYINT\nBOOLEAN - Synonym for TINYINT(1)\nSMALLINT\nMEDIUMINT\nINT, INTEGER\nBIGINT\nDECIMAL, DEC, NUMERIC, FIXED\nFLOAT\nDOUBLE, DOUBLE PRECISION, REAL\nBIT\n \nSee the specific articles for detailed information on each.\n \nSIGNED, UNSIGNED and ZEROFILL\n \nMost numeric types can be defined as SIGNED, UNSIGNED or\nZEROFILL, for example:\n \nTINYINT[(M)] [SIGNED | UNSIGNED | ZEROFILL]\n \nIf SIGNED, or no attribute, is specified, a portion of the\nnumeric type will be reserved for the sign (plus or minus).\nFor example, a TINYINT SIGNED can range from -128 to 127. \n \nIf UNSIGNED is specified, no portion of the numeric type is\nreserved for the sign, so for integer types range can be\nlarger. For example, a TINYINT UNSIGNED can range from 0 to\n255. Floating point and fixed-point types also can be\nUNSIGNED, but this only prevents negative values from being\nstored and doesn\'t alter the range. \n \nIf ZEROFILL is specified, the column will be set to UNSIGNED\nand the spaces used by default to pad the field are replaced\nwith zeros. ZEROFILL is ignored in expressions or as part of\na UNION. ZEROFILL is a non-standard MySQL and MariaDB\nenhancement.\n \nNote that although the preferred syntax indicates that the\nattributes are exclusive, more than one attribute can be\nspecified.\n \nUntil MariaDB 10.2.7 (MDEV-8659), any combination of the\nattributes could be used in any order, with duplicates. In\nthis case:\nthe presence of ZEROFILL makes the column UNSIGNED ZEROFILL.\nthe presence of UNSIGNED makes the column UNSIGNED.\n \nFrom MariaDB 10.2.8, only the following combinations are\nsupported:\nSIGNED\nUNSIGNED\nZEROFILL\nUNSIGNED ZEROFILL\nZEROFILL UNSIGNED\n \nThe latter two should be replaced with simply ZEROFILL, but\nare still accepted by the parser.\n \nExamples\n-------- \nCREATE TABLE zf (\n i1 TINYINT SIGNED,\n i2 TINYINT UNSIGNED,\n i3 TINYINT ZEROFILL\n);\n \nINSERT INTO zf VALUES (2,2,2);\n \nSELECT * FROM zf;\n \n+------+------+------+\n| i1 | i2 | i3 |\n+------+------+------+\n| 2 | 2 | 002 |\n+------+------+------+\n \nRange\n \nWhen attempting to add a value that is out of the valid\nrange for the numeric type, MariaDB will react depending on\nthe strict SQL_MODE setting.\n \nIf strict_mode has been set (the default from MariaDB\n10.2.4), MariaDB will return an error.\n \nIf strict_mode has not been set (the default until MariaDB\n10.2.3), MariaDB will adjust the number to fit in the field,\nreturning a warning.\n \nExamples\n-------- \nWith strict_mode set:\n \nSHOW VARIABLES LIKE \'sql_mode\';\n \n+---------------+-------------------------------------------------------------------------------------------+\n| Variable_name | Value |\n+---------------+-------------------------------------------------------------------------------------------+\n| sql_mode |\nSTRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION\n|\n+---------------+-------------------------------------------------------------------------------------------+\n \nCREATE TABLE ranges (i1 TINYINT, i2 SMALLINT, i3 TINYINT\nUNSIGNED);\n \nINSERT INTO ranges VALUES (257,257,257);\nERROR 1264 (22003): Out of range value for column \'i1\' at\nrow 1\n \nSELECT * FROM ranges;\n \nEmpty set (0.10 sec)\n \nWith strict_mode unset:\n \nSHOW VARIABLES LIKE \'sql_mode%\';\n \n+---------------+-------+\n| Variable_name | Value |\n+---------------+-------+\n| sql_mode | |\n+---------------+-------+\n \nCREATE TABLE ranges (i1 TINYINT, i2 SMALLINT, i3 TINYINT\nUNSIGNED);\n \nINSERT INTO ranges VALUES (257,257,257);\nQuery OK, 1 row affected, 2 warnings (0.00 sec)\n \nSHOW WARNINGS;\n \n+---------+------+---------------------------------------------+\n| Level | Code | Message |\n+---------+------+---------------------------------------------+\n| Warning | 1264 | Out of range value for column \'i1\' at\nrow 1 |\n| Warning | 1264 | Out of range value for column \'i3\' at\nrow 1 |\n+---------+------+---------------------------------------------+\n2 rows in set (0.00 sec)\n \nSELECT * FROM ranges;\n \n+------+------+------+\n| i1 | i2 | i3 |\n+------+------+------+\n| 127 | 257 | 255 |\n+------+------+------+\n \nAuto_increment\n \nThe AUTO_INCREMENT attribute can be used to generate a\nunique identity for new rows. For more details, see\nauto_increment.\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/numeric-data-type-overview/','','https://mariadb.com/kb/en/library/numeric-data-type-overview/'),(289,'SMALLINT',22,'Syntax\n------ \nSMALLINT[(M)] [SIGNED | UNSIGNED | ZEROFILL]\n \nDescription\n----------- \nA small integer. The signed range is -32768 to 32767. The\nunsigned range is 0 to 65535.\n \nIf a column has been set to ZEROFILL, all values will be\nprepended by zeros so that the SMALLINT value contains a\nnumber of M digits.\n \nNote: If the ZEROFILL attribute has been specified, the\ncolumn will automatically become UNSIGNED.\n \nFor more details on the attributes, see Numeric Data Type\nOverview.\n \nExamples\n-------- \nCREATE TABLE smallints (a SMALLINT,b SMALLINT UNSIGNED,c\nSMALLINT ZEROFILL);\n \nINSERT INTO smallints VALUES (-10,-10,-10);\nQuery OK, 1 row affected, 2 warnings (0.09 sec)\nWarning (Code 1264): Out of range value for column \'b\' at\nrow 1\nWarning (Code 1264): Out of range value for column \'c\' at\nrow 1\n \nINSERT INTO smallints VALUES (-10,10,-10);\nQuery OK, 1 row affected, 1 warning (0.08 sec)\nWarning (Code 1264): Out of range value for column \'c\' at\nrow 1\n \nINSERT INTO smallints VALUES (-10,10,10);\n \nINSERT INTO smallints VALUES (32768,32768,32768);\nQuery OK, 1 row affected, 1 warning (0.04 sec)\nWarning (Code 1264): Out of range value for column \'a\' at\nrow 1\n \nINSERT INTO smallints VALUES (32767,32768,32768);\n \nSELECT * FROM smallints;\n+-------+-------+-------+\n| a | b | c |\n+-------+-------+-------+\n| -10 | 0 | 00000 |\n| -10 | 10 | 00000 |\n| -10 | 10 | 00010 |\n| 32767 | 32768 | 32768 |\n| 32767 | 32768 | 32768 |\n+-------+-------+-------+\n \n\n\nURL: https://mariadb.com/kb/en/library/smallint/','','https://mariadb.com/kb/en/library/smallint/'),(569,'ST_GEOMETRYTYPE',36,'Syntax\n------ \nST_GeometryType(g)\nGeometryType(g)\n \nDescription\n----------- \nReturns as a string the name of the geometry type of which\nthe\ngeometry instance g is a member. The name corresponds to one\nof the\ninstantiable Geometry subclasses.\n \nST_GeometryType() and GeometryType() are synonyms.\n \nExamples\n-------- \nSELECT GeometryType(GeomFromText(\'POINT(1 1)\'));\n+------------------------------------------+\n| GeometryType(GeomFromText(\'POINT(1 1)\')) |\n+------------------------------------------+\n| POINT |\n+------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_geometrytype/','','https://mariadb.com/kb/en/library/st_geometrytype/'),(571,'ST_ISEMPTY',36,'Syntax\n------ \nST_IsEmpty(g)\nIsEmpty(g)\n \nDescription\n----------- \nIsEmpty is a function defined by the OpenGIS specification,\nbut is not fully implemented by MariaDB or MySQL. \n \nSince MariaDB and MySQL do not support GIS EMPTY values such\nas POINT EMPTY, as implemented it simply returns 1 if the\ngeometry value g is invalid, 0 if it is valid, and NULL if\nthe argument is NULL.\n \nST_IsEmpty() and IsEmpty() are synonyms.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_isempty/','','https://mariadb.com/kb/en/library/st_isempty/'),(572,'ST_IsRing',36,'The ST_IsRing function was introduced in MariaDB 10.1.2\n \nSyntax\n------ \nST_IsRing(g)\nIsRing(g)\n \nDescription\n----------- \nReturns true if a given LINESTRING is a ring, that is, both\nST_IsClosed and ST_IsSimple. A simple curve does not pass\nthrough the same point more than once. However, see\nMDEV-7510.\n \nSt_IsRing() and IsRing() are synonyms.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_isring/','','https://mariadb.com/kb/en/library/st_isring/'),(290,'String Literals',22,'Strings are sequences of characters and are enclosed with\nquotes.\n \nThe syntax is:\n \n[_charset_name]\'string\' [COLLATE collation_name]\n \nFor example:\n \n\'The MariaDB Foundation\'\n_utf8 \'Foundation\' COLLATE utf8_unicode_ci;\n \nStrings can either be enclosed in single quotes or in double\nquotes (the same character must be used to both open and\nclose the string).\n \nThe ANSI SQL-standard does not permit double quotes for\nenclosing strings, and although MariaDB does by default, if\nthe MariaDB server has enabled the ANSI_QUOTES_SQL SQL_MODE,\ndouble quotes will be treated as being used for identifiers\ninstead of strings.\n \nStrings that are next to each other are automatically\nconcatenated. For example:\n \n\'The \' \'MariaDB \' \'Foundation\'\n \nand\n \n\'The MariaDB Foundation\'\n \nare equivalent.\n \nThe \\ (backslash character) is used to escape characters.\nFor example:\n \n\'MariaDB\'s new features\'\n \nis not a valid string because of the single quote in the\nmiddle of the string, which is treated as if it closes the\nstring, but is actually meant as part of the string, an\napostrophe. The backslash character helps in situations like\nthis:\n \n\'MariaDB\\\'s new features\'\n \nis now a valid string, and if displayed, will appear without\nthe backslash.\n \nSELECT \'MariaDB\\\'s new features\';\n+------------------------+\n| MariaDB\'s new features |\n+------------------------+\n| MariaDB\'s new features |\n+------------------------+\n \nAnother way to escape the quoting character is repeating it\ntwice:\n \nSELECT \'I\'\'m here\', \"\"\"Double\"\"\";\n+----------+----------+\n| I\'m here | \"Double\" |\n+----------+----------+\n| I\'m here | \"Double\" |\n+----------+----------+\n \nEscape sequences\n \nThere are other escape sequences also. Here is a full list:\n \nEscape sequence | Character | \n \n\\0 | ASCII NUL (0x00). | \n \n\\\' | Single quote (“\'”). | \n \n\\\" | Double quote (“\"”). | \n \n\\b | Backspace. | \n \n\\n | Newline, or linefeed,. | \n \n\\r | Carriage return. | \n \n\\t | Tab. | \n \n\\Z | ASCII 26 (Control+Z). See note following the table. | \n \n\\\\ | Backslash (“\\”). | \n \n\\% | “%” character. See note following the table. | \n \n\\_ | A “_” character. See note following the table. | \n \nEscaping the % and _ characters can be necessary when using\nthe LIKE operator, which treats them as special characters.\n \nThe ASCII 26 character (\\Z) needs to be escaped when\nincluded in a batch file which needs to be executed in\nWindows. The reason is that ASCII 26, in Windows, is the end\nof file (EOF).\n \nBackslash (\\), if not used as an escape character, must\nalways be escaped. When followed by a character that is not\nin the above table, backslashes will simply be ignored.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/string-literals/','','https://mariadb.com/kb/en/library/string-literals/'),(291,'TEXT',22,'Syntax\n------ \nTEXT[(M)] [CHARACTER SET charset_name] [COLLATE\ncollation_name]\n \nDescription\n----------- \nA TEXT column with a maximum length of 65,535 (216 - 1)\ncharacters. The effective maximum length is less if the\nvalue contains\nmulti-byte characters. Each TEXT value is stored using a\ntwo-byte length\nprefix that indicates the number of bytes in the value. If\nyou need a bigger storage, consider using MEDIUMTEXT\ninstead.\n \nAn optional length M can be given for this type. If this is\ndone, MariaDB\ncreates the column as the smallest TEXT type large enough to\nhold values\nM characters long.\n \nBefore MariaDB 10.2, all MariaDB collations were of type\nPADSPACE, meaning that TEXT (as well as VARCHAR and CHAR\nvalues) are compared without regard for trailing spaces.\nThis does not apply to the LIKE pattern-matching operator,\nwhich takes into account trailing spaces.\n \nBefore MariaDB 10.2.1, BLOB and TEXT columns could not be\nassigned a DEFAULT value. This restriction was lifted in\nMariaDB 10.2.1.\n \nExamples\n-------- \nTrailing spaces:\n \nCREATE TABLE strtest (d TEXT(10));\nINSERT INTO strtest VALUES(\'Maria \');\n \nSELECT d=\'Maria\',d=\'Maria \' FROM strtest;\n+-----------+--------------+\n| d=\'Maria\' | d=\'Maria \' |\n+-----------+--------------+\n| 1 | 1 |\n+-----------+--------------+\n \nSELECT d LIKE \'Maria\',d LIKE \'Maria \' FROM strtest;\n+----------------+-------------------+\n| d LIKE \'Maria\' | d LIKE \'Maria \' |\n+----------------+-------------------+\n| 0 | 1 |\n+----------------+-------------------+\n \nDifference between VARCHAR and TEXT\n \nVARCHAR columns can be fully indexed. TEXT columns can only\nbe indexed over a specified length.\nUsing TEXT or BLOB in a SELECT query that uses temporary\ntables for storing intermediate results will force the\ntemporary table to be disk based (using the Aria storage\nengine instead of the memory storage engine, which is a bit\nslower. This is not that bad as the Aria storage engine\ncaches the rows in memory. To get the benefit of this, one\nshould ensure that the aria_pagecache_buffer_size variable\nis big enough to hold most of the row and index data for\ntemporary tables.\n \nFor Storage Engine Developers\n \nInternally the full length of the VARCHAR column is\nallocated inside each TABLE objects record[] structure. As\nthere are three such buffers, each open table will allocate\n3 times max-length-to-store-varchar bytes of memory.\nTEXT and BLOB columns are stored with a pointer (4 or 8\nbytes) + a 1-4 bytes length. The TEXT data is only stored\nonce. This means that internally TEXT uses less memory for\neach open table but instead has the additional overhead that\neach TEXT object needs to be allocated and freed for each\nrow access (with some caching in between).\n \n\n\nURL: https://mariadb.com/kb/en/library/text/','','https://mariadb.com/kb/en/library/text/'),(573,'ST_IsSimple',36,'Syntax\n------ \nST_IsSimple(g)\nIsSimple(g)\n \nDescription\n----------- \nReturns true if the given Geometry has no anomalous\ngeometric points, false if it does, or NULL if given a NULL\nvalue.\n \nST_IsSimple() and IsSimple() are synonyms.\n \nExamples\n-------- \nA POINT is always simple.\n \nSET @g = \'Point(1 2)\';\n \nSELECT ST_ISSIMPLE(GEOMFROMTEXT(@g));\n+-------------------------------+\n| ST_ISSIMPLE(GEOMFROMTEXT(@g)) |\n+-------------------------------+\n| 1 |\n+-------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_issimple/','','https://mariadb.com/kb/en/library/st_issimple/'),(574,'ST_NUMGEOMETRIES',36,'Syntax\n------ \nST_NumGeometries(gc)\nNumGeometries(gc)\n \nDescription\n----------- \nReturns the number of geometries in the GeometryCollection\ngc.\n \nST_NumGeometries() and NumGeometries() are synonyms.\n \nExample\n \nSET @gc = \'GeometryCollection(Point(1 1),LineString(2 2, 3\n3))\';\n \nSELECT NUMGEOMETRIES(GeomFromText(@gc));\n+----------------------------------+\n| NUMGEOMETRIES(GeomFromText(@gc)) |\n+----------------------------------+\n| 2 |\n+----------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_numgeometries/','','https://mariadb.com/kb/en/library/st_numgeometries/'),(575,'ST_RELATE',36,'The ST_RELATE() function was introduced in MariaDB 10.1.2\n \nSyntax\n------ \nST_Relate(g1, g2, i)\n \nDescription\n----------- \nReturns true if Geometry g1 is spatially related to\nGeometryg2 by testing for intersections between the\ninterior, boundary and exterior of the two geometries as\nspecified by the values in intersection matrix pattern i.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_relate/','','https://mariadb.com/kb/en/library/st_relate/'),(576,'ST_SRID',36,'Syntax\n------ \nST_SRID(g)\nSRID(g)\n \nDescription\n----------- \nReturns an integer indicating the Spatial Reference System\nID for the\ngeometry value g.\n \nIn MariaDB, the SRID value is just an integer associated\nwith the\ngeometry value. All calculations are done assuming Euclidean\n(planar)\ngeometry.\n \nST_SRID() and SRID() are synonyms.\n \nExamples\n-------- \nSELECT SRID(GeomFromText(\'LineString(1 1,2 2)\',101));\n+-----------------------------------------------+\n| SRID(GeomFromText(\'LineString(1 1,2 2)\',101)) |\n+-----------------------------------------------+\n| 101 |\n+-----------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_srid/','','https://mariadb.com/kb/en/library/st_srid/'),(292,'TIME',22,'Syntax\n------ \nTIME [()]\n \nDescription\n----------- \nA time. The range is \'-838:59:59.999999\' to\n\'838:59:59.999999\'. Microsecond precision can be from 0-6;\nif not specified 0 is used. Microseconds have been available\nsince MariaDB 5.3. \n \nMariaDB displays TIME values in \'HH:MM:SS.ssssss\' format,\nbut allows assignment of times in looser formats, including\n\'D HH:MM:SS\', \'HH:MM:SS\', \'HH:MM\', \'D HH:MM\', \'D\nHH\', \'SS\', or \'HHMMSS\', as well as permitting dropping\nof any leading zeros when a delimiter is provided, for\nexample \'3:9:10\'. For details, see date and time literals.\n \nMariaDB 10.1.2 introduced the --mysql56-temporal-format\noption, on by default, which allows MariaDB to store TIMEs\nusing the same low-level format MySQL 5.6 uses.\n \nInternal Format\n \nIn MariaDB 10.1.2 a new temporal format was introduced from\nMySQL 5.6 that alters how the TIME, DATETIME and TIMESTAMP\ncolumns operate at lower levels. These changes allow these\ntemporal data types to have fractional parts and negative\nvalues. You can disable this feature using the\nmysql56_temporal_format system variable.\n \nTables that include TIMESTAMP values that were created on an\nolder version of MariaDB or that were created while the\nmysql56_temporal_format system variable was disabled\ncontinue to store data using the older data type format.\n \nIn order to update table columns from the older format to\nthe newer format, execute an ALTER TABLE... MODIFY COLUMN\nstatement that changes the column to the *same* data type.\nThis change may be needed if you want to export the table\'s\ntablespace and import it onto a server that has\nmysql56_temporal_format=ON set (see MDEV-15225).\n \nFor instance, if you have a TIME column in your table: \n \nSHOW VARIABLES LIKE \'mysql56_temporal_format\';\n \n+-------------------------+-------+\n| Variable_name | Value |\n+-------------------------+-------+\n| mysql56_temporal_format | ON |\n+-------------------------+-------+\n \nALTER TABLE example_table MODIFY ts_col TIME;\n \nWhen MariaDB executes the ALTER TABLE statement, it converts\nthe data from the older temporal format to the newer one. \n \nIn the event that you have several tables and columns using\ntemporal data types that you want to switch over to the new\nformat, make sure the system variable is enabled, then\nperform a dump and restore using mysqldump. The columns\nusing relevant temporal data types are restored using the\nnew temporal format.\n \nExamples\n-------- \nINSERT INTO time VALUES (\'90:00:00\'), (\'800:00:00\'),\n(800), (22), (151413), (\'9:6:3\'), (\'12 09\');\n \nSELECT * FROM time;\n+-----------+\n| t |\n+-----------+\n| 90:00:00 |\n| 800:00:00 |\n| 00:08:00 |\n| 00:00:22 |\n| 15:14:13 |\n| 09:06:03 |\n| 297:00:00 |\n+-----------+\n \n\n\nURL: https://mariadb.com/kb/en/library/time/','','https://mariadb.com/kb/en/library/time/'),(295,'TINYINT',22,'Syntax\n------ \nTINYINT[(M)] [SIGNED | UNSIGNED | ZEROFILL]\n \nDescription\n----------- \nA very small integer. The signed range is -128 to 127. The\nunsigned range is 0 to 255. For details on the attributes,\nsee Numeric Data Type Overview.\n \nExamples\n-------- \nCREATE TABLE tinyints (a TINYINT,b TINYINT UNSIGNED,c\nTINYINT ZEROFILL);\nQuery OK, 0 rows affected (0.43 sec)\n \nINSERT INTO tinyints VALUES (-10,-10,-10);\nQuery OK, 1 row affected, 2 warnings (0.08 sec)\nWarning (Code 1264): Out of range value for column \'b\' at\nrow 1\nWarning (Code 1264): Out of range value for column \'c\' at\nrow 1\n \nINSERT INTO tinyints VALUES (-10,10,-10);\nQuery OK, 1 row affected, 1 warning (0.11 sec)\nWarning (Code 1264): Out of range value for column \'c\' at\nrow 1\n \nINSERT INTO tinyints VALUES (-10,10,10);\n \nSELECT * FROM tinyints;\n+------+------+------+\n| a | b | c |\n+------+------+------+\n| -10 | 0 | 000 |\n| -10 | 10 | 000 |\n| -10 | 10 | 010 |\n+------+------+------+\n \nINSERT INTO tinyints VALUES (128,128,128);\nQuery OK, 1 row affected, 1 warning (0.19 sec)\nWarning (Code 1264): Out of range value for column \'a\' at\nrow 1\n \nINSERT INTO tinyints VALUES (127,128,128);\n \nSELECT * FROM tinyints;\n+------+------+------+\n| a | b | c |\n+------+------+------+\n| -10 | 0 | 000 |\n| -10 | 10 | 000 |\n| -10 | 10 | 010 |\n| 127 | 128 | 128 |\n| 127 | 128 | 128 |\n+------+------+------+\n \n\n\nURL: https://mariadb.com/kb/en/library/tinyint/','','https://mariadb.com/kb/en/library/tinyint/'),(297,'VARBINARY',22,'Syntax\n------ \nVARBINARY(M)\n \nDescription\n----------- \nThe VARBINARY type is similar to the VARCHAR type, but\nstores binary byte strings rather than non-binary character\nstrings. M represents the maximum column length in bytes. \n \nIt contains no character set, and comparison and sorting are\nbased on the numeric value of the bytes.\n \nIf the maximum length is exceeded, and SQL strict mode is\nnot enabled , the extra characters will be dropped with a\nwarning. If strict mode is enabled, an error will occur.\n \nUnlike BINARY values, VARBINARYs are not right-padded when\ninserting.\n \nOracle Mode\n \nIn Oracle mode from MariaDB 10.3, RAW is a synonym for\nVARBINARY.\n \nExamples\n-------- \nInserting too many characters, first with strict mode off,\nthen with it on:\n \nCREATE TABLE varbins (a VARBINARY(10));\n \nINSERT INTO varbins VALUES(\'12345678901\');\nQuery OK, 1 row affected, 1 warning (0.04 sec)\n \nSELECT * FROM varbins;\n \n+------------+\n| a |\n+------------+\n| 1234567890 |\n+------------+\n \nSET sql_mode=\'STRICT_ALL_TABLES\';\n \nINSERT INTO varbins VALUES(\'12345678901\');\nERROR 1406 (22001): Data too long for column \'a\' at row 1\n \nSorting is performed with the byte value:\n \nTRUNCATE varbins;\n \nINSERT INTO varbins VALUES(\'A\'),(\'B\'),(\'a\'),(\'b\');\n \nSELECT * FROM varbins ORDER BY a;\n \n+------+\n| a |\n+------+\n| A |\n| B |\n| a |\n| b |\n+------+\n \nUsing CAST to sort as a CHAR instead:\n \nSELECT * FROM varbins ORDER BY CAST(a AS CHAR);\n+------+\n| a |\n+------+\n| a |\n| A |\n| b |\n| B |\n+------+\n \n\n\nURL: https://mariadb.com/kb/en/library/varbinary/','','https://mariadb.com/kb/en/library/varbinary/'),(577,'ASCII',37,'Syntax\n------ \nASCII(str)\n \nDescription\n----------- \nReturns the numeric ASCII value of the leftmost character of\nthe string argument. Returns 0 if the given string is empty\nand NULL if it is NULL.\n \nASCII() works for 8-bit characters.\n \nExamples\n-------- \nSELECT ASCII(9);\n+----------+\n| ASCII(9) |\n+----------+\n| 57 |\n+----------+\n \nSELECT ASCII(\'9\');\n+------------+\n| ASCII(\'9\') |\n+------------+\n| 57 |\n+------------+\n \nSELECT ASCII(\'abc\');\n+--------------+\n| ASCII(\'abc\') |\n+--------------+\n| 97 |\n+--------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/ascii/','','https://mariadb.com/kb/en/library/ascii/'),(578,'BIN',37,'Syntax\n------ \nBIN(N)\n \nDescription\n----------- \nReturns a string representation of the binary value of the\ngiven longlong (that is, BIGINT) number. This is equivalent\nto CONV(N,10,2). The argument should be positive. If it is a\nFLOAT, it will be truncated. Returns NULL if the argument is\nNULL.\n \nExamples\n-------- \nSELECT BIN(12);\n+---------+\n| BIN(12) |\n+---------+\n| 1100 |\n+---------+\n \n\n\nURL: https://mariadb.com/kb/en/library/bin/','','https://mariadb.com/kb/en/library/bin/'),(580,'BIT_LENGTH',37,'Syntax\n------ \nBIT_LENGTH(str)\n \nDescription\n----------- \nReturns the length of the given string argument in bits. If\nthe argument is not a string, it will be converted to\nstring. If the argument is NULL, it returns NULL.\n \nExamples\n-------- \nSELECT BIT_LENGTH(\'text\');\n+--------------------+\n| BIT_LENGTH(\'text\') |\n+--------------------+\n| 32 |\n+--------------------+\n \nSELECT BIT_LENGTH(\'\');\n+----------------+\n| BIT_LENGTH(\'\') |\n+----------------+\n| 0 |\n+----------------+\n \nCompatibility\n \nPostgreSQL and Sybase support BIT_LENGTH().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/bit_length/','','https://mariadb.com/kb/en/library/bit_length/'),(298,'VARCHAR',22,'Syntax\n------ \n[NATIONAL] VARCHAR(M) [CHARACTER SET charset_name] [COLLATE\ncollation_name]\n \nDescription\n----------- \nA variable-length string. M represents the maximum column\nlength in\ncharacters. The range of M is 0 to 65,532. The effective\nmaximum\nlength of a VARCHAR is subject to the maximum row size and\nthe character set used. For\nexample, utf8 characters can require up to three bytes per\ncharacter,\nso a VARCHAR column that uses the utf8 character set can be\ndeclared\nto be a maximum of 21,844 characters.\n \nMariaDB stores VARCHAR values as a one-byte or two-byte\nlength prefix\nplus data. The length prefix indicates the number of bytes\nin the\nvalue. A VARCHAR column uses one length byte if values\nrequire no more\nthan 255 bytes, two length bytes if values may require more\nthan 255\nbytes.\n \nNote: MariaDB 5.1 and later follow the standard SQL\nspecification, \nand do not remove trailing spaces from VARCHAR values.\n \nVARCHAR(0) columns can contain 2 values: an empty string or\nNULL. Such columns cannot be part of an index. The CONNECT\nstorage engine does not support VARCHAR(0).\n \nVARCHAR is shorthand for CHARACTER VARYING. NATIONAL VARCHAR\nis the\nstandard SQL way to define that a VARCHAR column should use\nsome\npredefined character set. MariaDB uses utf8 as this\npredefined character set, as does MySQL 4.1 and up.\nNVARCHAR is shorthand for NATIONAL VARCHAR.\n \nBefore MariaDB 10.2, all MariaDB collations were of type\nPADSPACE, meaning that VARCHAR (as well as CHAR and TEXT\nvalues) are compared without regard for trailing spaces.\nThis does not apply to the LIKE pattern-matching operator,\nwhich takes into account trailing spaces. From MariaDB 10.2,\na number of NO PAD collations are available.\n \nIf a unique index consists of a column where trailing pad\ncharacters are stripped or ignored, inserts into that column\nwhere values differ only by the number of trailing pad\ncharacters will result in a duplicate-key error.\n \nExamples\n-------- \nThe following are equivalent:\n \nVARCHAR(30) CHARACTER SET utf8\nNATIONAL VARCHAR(30)\nNVARCHAR(30)\nNCHAR VARCHAR(30)\nNATIONAL CHARACTER VARYING(30)\nNATIONAL CHAR VARYING(30)\n \nTrailing spaces:\n \nCREATE TABLE strtest (v VARCHAR(10));\nINSERT INTO strtest VALUES(\'Maria \');\n \nSELECT v=\'Maria\',v=\'Maria \' FROM strtest;\n+-----------+--------------+\n| v=\'Maria\' | v=\'Maria \' |\n+-----------+--------------+\n| 1 | 1 |\n+-----------+--------------+\n \nSELECT v LIKE \'Maria\',v LIKE \'Maria \' FROM strtest;\n+----------------+-------------------+\n| v LIKE \'Maria\' | v LIKE \'Maria \' |\n+----------------+-------------------+\n| 0 | 1 |\n+----------------+-------------------+\n \nTruncation\n \nDepending on whether or not strict sql mode is set, you will\neither get a warning or an error if you try to insert a\nstring that is too long into a VARCHAR column. If the extra\ncharacters are spaces, the spaces that can\'t fit will be\nremoved and you will always get a warning, regardless of the\nsql mode setting.\n \nDifference Between VARCHAR and TEXT\n \nVARCHAR columns can be fully indexed. TEXT columns can only\nbe indexed over a specified length.\nUsing TEXT or BLOB in a SELECT query that uses temporary\ntables for storing intermediate results will force the\ntemporary table to be disk based (using the Aria storage\nengine instead of the memory storage engine, which is a bit\nslower. This is not that bad as the Aria storage engine\ncaches the rows in memory. To get the benefit of this, one\nshould ensure that the aria_pagecache_buffer_size variable\nis big enough to hold most of the row and index data for\ntemporary tables.\n \nOracle Mode\n \nIn Oracle mode from MariaDB 10.3, VARCHAR2 is a synonym.\n \nFor Storage Engine Developers\n \nInternally the full length of the VARCHAR column is\nallocated inside each TABLE objects record[] structure. As\nthere are three such buffers, each open table will allocate\n3 times max-length-to-store-varchar bytes of memory.\nTEXT and BLOB columns are stored with a pointer (4 or 8\nbytes) + a 1-4 bytes length. The TEXT data is only stored\nonce. This means that internally TEXT uses less memory for\neach open table but instead has the additional overhead that\neach TEXT object needs to be allocated and freed for each\nrow access (with some caching in between).\n \n\n\nURL: https://mariadb.com/kb/en/library/varchar/','','https://mariadb.com/kb/en/library/varchar/'),(299,'YEAR Data Type',22,'Syntax\n------ \nYEAR[(4)]\n \nDescription\n----------- \nA year in two-digit or four-digit format. The default is\nfour-digit format. Note that the two-digit format has been\ndeprecated since 5.5.27. \n \nIn four-digit format, the allowable values are 1901 to 2155,\nand 0000. In two-digit format, the allowable values are 70\nto 69,\nrepresenting years from 1970 to 2069. MariaDB displays YEAR\nvalues in\nYYYY format, but allows you to assign values to YEAR columns\nusing\neither strings or numbers.\n \nInserting numeric zero has a different result for YEAR(4)\nand YEAR(2). For YEAR(2), the value 00 reflects the year\n2000. For YEAR(4), the value 0000 reflects the year zero.\nThis only applies to numeric zero. String zero always\nreflects the year 2000.\n \nExamples\n-------- \nAccepting a string or a number:\n \nCREATE TABLE y(y YEAR);\n \nINSERT INTO y VALUES (1990),(\'2012\');\n \nSELECT * FROM y;\n+------+\n| y |\n+------+\n| 1990 |\n| 2012 |\n+------+\n \nOut of range:\n \nINSERT INTO y VALUES (1005),(\'3080\');\nQuery OK, 2 rows affected, 2 warnings (0.05 sec)\nRecords: 2 Duplicates: 0 Warnings: 2\n \nSHOW WARNINGS;\n+---------+------+--------------------------------------------+\n| Level | Code | Message |\n+---------+------+--------------------------------------------+\n| Warning | 1264 | Out of range value for column \'y\' at\nrow 1 |\n| Warning | 1264 | Out of range value for column \'y\' at\nrow 2 |\n+---------+------+--------------------------------------------+\n \nSELECT * FROM y;\n+------+\n| y |\n+------+\n| 1990 |\n| 2012 |\n| 0000 |\n| 0000 |\n+------+\n \nTruncating:\n \nINSERT INTO y VALUES (\'2013-12-12\');\nQuery OK, 1 row affected, 1 warning (0.05 sec)\n \nSHOW WARNINGS;\n+---------+------+----------------------------------------+\n| Level | Code | Message |\n+---------+------+----------------------------------------+\n| Warning | 1265 | Data truncated for column \'y\' at row 1\n|\n+---------+------+----------------------------------------+\n \nSELECT * FROM y;\n+------+\n| y |\n+------+\n| 1990 |\n| 2012 |\n| 0000 |\n| 0000 |\n| 2013 |\n+------+\n \nDifference between YEAR(2) and YEAR(4), and string and\nnumeric zero:\n \nCREATE TABLE y2(y YEAR(4), y2 YEAR(2));\nQuery OK, 0 rows affected, 1 warning (0.40 sec)\n \nNote (Code 1287): \'YEAR(2)\' is deprecated and will be\nremoved in a future release. Please use YEAR(4) instead\n \nINSERT INTO y2 VALUES(0,0),(\'0\',\'0\');\n \nSELECT YEAR(y),YEAR(y2) FROM y;\n+---------+----------+\n| YEAR(y) | YEAR(y2) |\n+---------+----------+\n| 0 | 2000 |\n| 2000 | 2000 |\n+---------+----------+\n \n\n\nURL: https://mariadb.com/kb/en/library/year-data-type/','','https://mariadb.com/kb/en/library/year-data-type/'),(583,'CHARACTER_LENGTH',37,'Syntax\n------ \nCHARACTER_LENGTH(str)\n \nDescription\n----------- \nCHARACTER_LENGTH() is a synonym for CHAR_LENGTH().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/character_length/','','https://mariadb.com/kb/en/library/character_length/'),(598,'INSTR',37,'Syntax\n------ \nINSTR(str,substr)\n \nDescription\n----------- \nReturns the position of the first occurrence of substring\nsubstr in\nstring str. This is the same as the two-argument form of\nLOCATE(),\nexcept that the order of the arguments is reversed.\n \nINSTR() performs a case-insensitive search.\n \nIf any argument is NULL, returns NULL.\n \nExamples\n-------- \nSELECT INSTR(\'foobarbar\', \'bar\');\n+---------------------------+\n| INSTR(\'foobarbar\', \'bar\') |\n+---------------------------+\n| 4 |\n+---------------------------+\n \nSELECT INSTR(\'My\', \'Maria\');\n+----------------------+\n| INSTR(\'My\', \'Maria\') |\n+----------------------+\n| 0 |\n+----------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/instr/','','https://mariadb.com/kb/en/library/instr/'),(300,'BEGIN END',23,'Syntax\n------ \n[begin_label:] BEGIN [NOT ATOMIC]\n [statement_list]\nEND [end_label]\n \nNOT ATOMIC is required when used outside of a stored\nprocedure. Inside stored procedures or within an anonymous\nblock, BEGIN alone starts a new anonymous block.\n \nDescription\n----------- \nBEGIN ... END syntax is used for writing compound\nstatements. A compound statement can contain multiple\nstatements, enclosed by the BEGIN and END keywords.\nstatement_list represents a list of one or more statements,\neach\nterminated by a semicolon (i.e., ;) statement delimiter.\nstatement_list is\noptional, which means that the empty compound statement\n(BEGIN END) is\nlegal.\n \nNote that END will perform a commit. If you are running in\nautocommit mode, every statement will be committed\nseparately. If you are not running in autocommit mode, you\nmust execute a COMMIT or ROLLBACK after END to get the\ndatabase up to date.\n \nUse of multiple statements requires that a client is able to\nsend statement strings containing the ; statement delimiter.\nThis is handled in the mysql command-line client with the\nDELIMITER command.\nChanging the ; end-of-statement delimiter (for example, to\n//) allows ; to be used in a program body.\n \nA compound statement within a stored program can be\nlabeled. end_label cannot be given unless begin_label also\nis present. If both are present, they must be the same.\n \nBEGIN ... END constructs can be nested. Each block can\ndefine its own variables, a CONDITION, a HANDLER and a\nCURSOR, which don\'t exist in the outer blocks. The most\nlocal declarations override the outer objects which use the\nsame name (see example below).\n \nThe declarations order is the following:\nDECLARE local variables;\nDECLARE CONDITIONs;\nDECLARE CURSORs;\nDECLARE HANDLERs;\n \nNote that DECLARE HANDLER contains another BEGIN ... END\nconstruct.\n \nHere is an example of a very simple, anonymous block:\n \nBEGIN NOT ATOMIC\nSET @a=1;\n \nCREATE TABLE test.t1(a INT);\nEND|\n \nBelow is an example of nested blocks in a stored procedure:\n \nCREATE PROCEDURE t( )\nBEGIN\n DECLARE x TINYINT UNSIGNED DEFAULT 1;\n \n BEGIN\n DECLARE x CHAR(2) DEFAULT \'02\';\n \n DECLARE y TINYINT UNSIGNED DEFAULT 10;\n \n SELECT x, y;\n \n END;\n \n SELECT x;\n \nEND;\n \nIn this example, a TINYINT variable, x is declared in the\noutter block. But in the inner block x is re-declared as a\nCHAR and an y variable is declared. The inner SELECT shows\nthe \"new\" value of x, and the value of y. But when x is\nselected in the outer block, the \"old\" value is returned.\nThe final SELECT doesn\'t try to read y, because it doesn\'t\nexist in that context.\n \n\n\nURL: https://mariadb.com/kb/en/library/begin-end/','','https://mariadb.com/kb/en/library/begin-end/'),(301,'CASE Statement',23,'Syntax\n------ \nCASE case_value\n WHEN when_value THEN statement_list\n [WHEN when_value THEN statement_list] ...\n [ELSE statement_list]\nEND CASE\n \nOr:\n \nCASE\n WHEN search_condition THEN statement_list\n [WHEN search_condition THEN statement_list] ...\n [ELSE statement_list] \nEND CASE\n \nDescription\n----------- \nThe CASE statement for stored programs implements a complex\nconditional\nconstruct. If a search_condition evaluates to true, the\ncorresponding SQL\nstatement list is executed. If no search condition matches,\nthe statement list\nin the ELSE clause is executed. Each statement_list consists\nof one or\nmore statements.\n \nIf no when_value or search_condition matches the value\ntested and the CASE\nstatement contains no ELSE clause, a Case not found for CASE\nstatement\nerror results.\n \nEach statement_list consists of one or more statements; an\nempty\nstatement_list is not allowed. To handle situations where no\nvalue is\nmatched by any WHEN clause, use an ELSE containing an\nempty BEGIN ... END block, as shown in this example:\n \nDELIMITER |\nCREATE PROCEDURE p()\nBEGIN\n DECLARE v INT DEFAULT 1;\n \n CASE v\n WHEN 2 THEN SELECT v;\n \n WHEN 3 THEN SELECT 0;\n \n ELSE BEGIN END;\n \n END CASE;\n \nEND;\n \n|\n \nThe indentation used here in the ELSE clause is for purposes\nof clarity only,\nand is not otherwise significant. See Delimiters in the\nmysql client for more on the use of the delimiter command.\n \nNote: The syntax of the CASE statement used inside stored\nprograms\ndiffers slightly from that of the SQL CASE expression\ndescribed in\nCASE OPERATOR.\nThe CASE statement cannot have an ELSE NULL clause, and it\nis\nterminated with END CASE instead of END.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/case-statement/','','https://mariadb.com/kb/en/library/case-statement/'),(303,'DECLARE CONDITION',23,'Syntax\n------ \nDECLARE condition_name CONDITION FOR condition_value\n \ncondition_value:\n SQLSTATE [VALUE] sqlstate_value\n | mysql_error_code\n \nDescription\n----------- \nThe DECLARE ... CONDITION statement defines a named error\ncondition.\nIt specifies a condition that needs specific handling and\nassociates a\nname with that condition. Later, the name can be used in a\nDECLARE ... HANDLER, SIGNAL or RESIGNAL statement (as long\nas the statement is located in the same BEGIN ... END\nblock).\n \nConditions must be declared after local variables, but\nbefore CURSORs and HANDLERs.\n \nA condition_value for DECLARE ... CONDITION can be an\nSQLSTATE value (a\n5-character string literal) or a MySQL error code (a\nnumber). You should not\nuse SQLSTATE value \'00000\' or MySQL error code 0, because\nthose indicate sucess\nrather than an error condition. If you try, or if you\nspecify an invalid SQLSTATE value, an error like this is\nproduced:\n \nERROR 1407 (42000): Bad SQLSTATE: \'00000\'\n \nFor a list of SQLSTATE values and MariaDB error\ncodes, see MariaDB Error Codes.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/declare-condition/','','https://mariadb.com/kb/en/library/declare-condition/'),(599,'LCASE',37,'Syntax\n------ \nLCASE(str)\n \nDescription\n----------- \nLCASE() is a synonym for LOWER().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/lcase/','','https://mariadb.com/kb/en/library/lcase/'),(600,'LEFT',37,'Syntax\n------ \nLEFT(str,len)\n \nDescription\n----------- \nReturns the leftmost len characters from the string str, or\nNULL if\nany argument is NULL.\n \nExamples\n-------- \nSELECT LEFT(\'MariaDB\', 5);\n+--------------------+\n| LEFT(\'MariaDB\', 5) |\n+--------------------+\n| Maria |\n+--------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/left/','','https://mariadb.com/kb/en/library/left/'),(602,'LENGTHB',37,'Introduced in MariaDB 10.3.1 as part of the Oracle\ncompatibility enhancements.\n \nSyntax\n------ \nLENGTHB(str)\n \nDescription\n----------- \nLENGTHB() is a synonym for LENGTH().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/lengthb/','','https://mariadb.com/kb/en/library/lengthb/'),(611,'MID',37,'Syntax\n------ \nMID(str,pos,len)\n \nDescription\n----------- \nMID(str,pos,len) is a synonym for SUBSTRING(str,pos,len).\n \nExamples\n-------- \nSELECT MID(\'abcd\',4,1);\n+-----------------+\n| MID(\'abcd\',4,1) |\n+-----------------+\n| d |\n+-----------------+\n \nSELECT MID(\'abcd\',2,2);\n+-----------------+\n| MID(\'abcd\',2,2) |\n+-----------------+\n| bc |\n+-----------------+\n \nA negative starting position:\n \nSELECT MID(\'abcd\',-2,4);\n+------------------+\n| MID(\'abcd\',-2,4) |\n+------------------+\n| cd |\n+------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/mid/','','https://mariadb.com/kb/en/library/mid/'),(612,'NOT LIKE',37,'Syntax\n------ \nexpr NOT LIKE pat [ESCAPE \'escape_char\']\n \nDescription\n----------- \nThis is the same as NOT (expr LIKE pat [ESCAPE\n\'escape_char\']).\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/not-like/','','https://mariadb.com/kb/en/library/not-like/'),(305,'DECLARE HANDLER',23,'Syntax\n------ \nDECLARE handler_type HANDLER\n FOR condition_value [, condition_value] ...\n statement\n \nhandler_type:\n CONTINUE\n | EXIT \n | UNDO\n \ncondition_value:\n SQLSTATE [VALUE] sqlstate_value\n | condition_name\n | SQLWARNING\n | NOT FOUND\n | SQLEXCEPTION\n | mariadb_error_code\n \nDescription\n----------- \nThe DECLARE ... HANDLER statement specifies handlers that\neach may\ndeal with one or more conditions. If one of these conditions\noccurs,\nthe specified statement is executed. statement can be a\nsimple\nstatement (for example, SET var_name = value), or it can be\na compound\nstatement written using BEGIN and END.\n \nHandlers must be declared after local variables, a CONDITION\nand a CURSOR.\n \nFor a CONTINUE handler, execution of the current program\ncontinues\nafter execution of the handler statement. For an EXIT\nhandler,\nexecution terminates for the BEGIN ... END compound\nstatement in which\nthe handler is declared. (This is true even if the condition\noccurs in\nan inner block.) The UNDO handler type statement is not\nsupported.\n \nIf a condition occurs for which no handler has been\ndeclared, the\ndefault action is EXIT.\n \nA condition_value for DECLARE ... HANDLER can be any of the\nfollowing\nvalues:\nAn SQLSTATE value (a 5-character string literal) or a\nMariaDB error\ncode (a number). You should not use SQLSTATE value \'00000\'\nor MariaDB\nerror code 0, because those indicate sucess rather than an\nerror\ncondition. For a list of SQLSTATE values and MariaDB error\ncodes, see\nMariaDB Error Codes.\nA condition name previously specified with DECLARE ...\nCONDITION. It must be in the same stored program. See\nDECLARE CONDITION.\nSQLWARNING is shorthand for the class of SQLSTATE values\nthat begin\nwith \'01\'.\nNOT FOUND is shorthand for the class of SQLSTATE values that\nbegin\nwith \'02\'. This is relevant only the context of cursors\nand is used to\ncontrol what happens when a cursor reaches the end of a data\nset. If\nno more rows are available, a No Data condition occurs with\nSQLSTATE\nvalue 02000. To detect this condition, you can set up a\nhandler for it\n(or for a NOT FOUND condition). An example is shown in\nCursor Overview. This condition also occurs for SELECT ...\nINTO var_list statements that retrieve no\nrows.\nSQLEXCEPTION is shorthand for the class of SQLSTATE values\nthat do\nnot begin with \'00\', \'01\', or \'02\'.\n \nWhen an error raises, in some cases it could be handled by\nmultiple HANDLERs. For example, there may be an handler for\n1050 error, a separate handler for the 42S01 SQLSTATE, and\nanother separate handler for the SQLEXCEPTION class: in\ntheory all occurrences of HANDLER may catch the 1050 error,\nbut MariaDB chooses the HANDLER with the highest precedence.\nHere are the precedence rules:\nHandlers which refer to an error code have the highest\nprecedence.\nHandlers which refer to a SQLSTATE come next.\nHandlers which refer to an error class have the lowest\nprecedence.\n \nIn some cases, a statement could produce multiple errors. If\nthis happens, in some cases multiple handlers could have the\nhighest precedence. In such cases, the choice of the handler\nis indeterminate.\n \nNote that if an error occurs within a CONTINUE HANDLER\nblock, it can be handled by another HANDLER. However, a\nHANDLER which is already in the stack (that is, it has been\ncalled to handle an error and its execution didn\'t finish\nyet) cannot handle new errors—this prevents endless loops.\nFor example, suppose that a stored procedure contains a\nCONTINUE HANDLER for SQLWARNING and another CONTINUE HANDLER\nfor NOT FOUND. At some point, a NOT FOUND error occurs, and\nthe execution enters the NOT FOUND HANDLER. But within that\nhandler, a warning occurs, and the execution enters the\nSQLWARNING HANDLER. If another NOT FOUND error occurs, it\ncannot be handled again by the NOT FOUND HANDLER, because\nits execution is not finished.\n \nWhen a DECLARE HANDLER block can handle more than one error\ncondition, it may be useful to know which errors occurred.\nTo do so, you can use the GET DIAGNOSTICS statement.\n \nAn error that is handled by a DECLARE HANDLER construct can\nbe issued again using the RESIGNAL statement.\n \nBelow is an example using DECLARE HANDLER:\n \nCREATE TABLE test.t (s1 INT, PRIMARY KEY (s1));\n \nDELIMITER //\n \nCREATE PROCEDURE handlerdemo ( )\n BEGIN\n DECLARE CONTINUE HANDLER FOR SQLSTATE \'23000\' SET @x2 =\n1;\n \n SET @x = 1;\n \n INSERT INTO test.t VALUES (1);\n SET @x = 2;\n \n INSERT INTO test.t VALUES (1);\n SET @x = 3;\n \n END;\n \n //\n \nDELIMITER ;\n \nCALL handlerdemo( );\n \nSELECT @x;\n \n+------+\n| @x |\n+------+\n| 3 |\n+------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/declare-handler/','','https://mariadb.com/kb/en/library/declare-handler/'),(306,'DECLARE Variable',23,'Syntax\n------ \nDECLARE var_name [, var_name] ... [[ROW] TYPE OF]] type\n[DEFAULT value]\n \nDescription\n----------- \nThis statement is used to declare local variables within\nstored programs. To\nprovide a default value for the variable, include a DEFAULT\nclause. The\nvalue can be specified as an expression (even subqueries are\npermitted); it need not be a constant. If the\nDEFAULT clause is missing, the initial value is NULL.\n \nLocal variables are treated like stored routine parameters\nwith respect to data\ntype and overflow checking. See CREATE PROCEDURE.\n \nLocal variables must be declared before CONDITIONs, CURSORs\nand HANDLERs.\n \nLocal variable names are not case sensitive.\n \nThe scope of a local variable is within the BEGIN ... END\nblock where it is\ndeclared. The variable can be referred to in blocks nested\nwithin the declaring\nblock, except those blocks that declare a variable with the\nsame name.\n \nTYPE OF / ROW TYPE OF\n \nTYPE OF and ROW TYPE OF anchored data types for stored\nroutines were introduced in MariaDB 10.3.\n \nAnchored data types allow a data type to be defined based on\nanother object, such as a table row, rather than\nspecifically set in the declaration. If the anchor object\nchanges, so will the anchored data type. This can lead to\nroutines being easier to maintain, so that if the data type\nin the table is changed, it will automatically be changed in\nthe routine as well.\n \nVariables declared with ROW TYPE OF will have the same\nfeatures as implicit ROW variables. It is not possible to\nuse ROW TYPE OF variables in a LIMIT clause.\n \nThe real data type of TYPE OF and ROW TYPE OF table_name\nwill become known at the very beginning of the stored\nroutine call. ALTER TABLE or DROP TABLE statements performed\ninside the current routine on the tables that appear in\nanchors won\'t affect the data type of the anchored\nvariables, even if the variable is declared after an ALTER\nTABLE or DROP TABLE statement.\n \nThe real data type of a ROW TYPE OF cursor_name variable\nwill become known when execution enters into the block where\nthe variable is declared. Data type instantiation will\nhappen only once. In a cursor ROW TYPE OF variable that is\ndeclared inside a loop, its data type will become known on\nthe very first iteration and won\'t change on further loop\niterations.\n \nThe tables referenced in TYPE OF and ROW TYPE OF\ndeclarations will be checked for existence at the beginning\nof the stored routine call. CREATE PROCEDURE or CREATE\nFUNCTION will not check the referenced tables for existence.\n \nExamples\n-------- \nTYPE OF and ROW TYPE OF from MariaDB 10.3:\n \nDECLARE tmp TYPE OF t1.a;\n -- Get the data type from the column {{a}} in the table\n{{t1}}\n \nDECLARE rec1 ROW TYPE OF t1;\n -- Get the row data type from the table {{t1}}\n \nDECLARE rec2 ROW TYPE OF cur1;\n -- Get the row data type from the cursor {{cur1}}\n \n\n\nURL: https://mariadb.com/kb/en/library/declare-variable/','','https://mariadb.com/kb/en/library/declare-variable/'),(308,'FOR',23,'FOR loops were introduced in MariaDB 10.3.\n \nSyntax\n------ \nInteger range FOR loop:\n \n[begin_label:]\nFOR var_name IN [ REVERSE ] lower_bound .. upper_bound\nDO statement_list\nEND FOR [ end_label ]\n \nExplicit cursor FOR loop\n \n[begin_label:]\nFOR record_name IN cursor_name [ (\ncursor_actual_parameter_list)]\nDO statement_list\nEND FOR [ end_label ]\n \nExplicit cursor FOR loop (Oracle mode)\n \n[begin_label:]\nFOR record_name IN cursor_name [ (\ncursor_actual_parameter_list)]\nLOOP\n statement_list\nEND LOOP [ end_label ]\n \nImplicit cursor FOR loop\n \n[begin_label:]\nFOR record_name IN ( select_statement )\nDO statement_list\nEND FOR [ end_label ]\n \nDescription\n----------- \nFOR loops allow code to be executed a fixed number of times.\n \nIn an integer range FOR loop, MariaDB will compare the lower\nbound and upper bound values, and assign the lower bound\nvalue to a counter. If REVERSE is not specified, and the\nupper bound value is greater than or equal to the counter,\nthe counter will be incremented and the statement will\ncontinue, after which the loop is entered again. If the\nupper bound value is greater than the counter, the loop will\nbe exited.\n \nIf REVERSE is specified, the counter is decremented, and the\nupper bound value needs to be less than or equal for the\nloop to continue.\n \nExamples\n-------- \nIntger range FOR loop:\n \nCREATE TABLE t1 (a INT);\n \nDELIMITER //\n \nFOR i IN 1..3\nDO\n INSERT INTO t1 VALUES (i);\nEND FOR;\n \n//\n \nDELIMITER ;\n \nSELECT * FROM t1;\n \n+------+\n| a |\n+------+\n| 1 |\n| 2 |\n| 3 |\n+------+\n \nREVERSE integer range FOR loop:\n \nCREATE OR REPLACE TABLE t1 (a INT);\n \nDELIMITER //\nFOR i IN REVERSE 12..4\n DO\n INSERT INTO t1 VALUES (i);\nEND FOR;\n \n//\nQuery OK, 9 rows affected (0.422 sec)\n \nDELIMITER ;\n \nSELECT * FROM t1;\n \n+------+\n| a |\n+------+\n| 12 |\n| 11 |\n| 10 |\n| 9 |\n| 8 |\n| 7 |\n| 6 |\n| 5 |\n| 4 |\n+------+\n \nExplicit cursor in Oracle mode:\n \nSET sql_mode=ORACLE;\n \nCREATE OR REPLACE TABLE t1 (a INT, b VARCHAR(32));\n \nINSERT INTO t1 VALUES (10,\'b0\');\nINSERT INTO t1 VALUES (11,\'b1\');\nINSERT INTO t1 VALUES (12,\'b2\');\n \nDELIMITER //\n \nCREATE OR REPLACE PROCEDURE p1(pa INT) AS \n CURSOR cur(va INT) IS\n SELECT a, b FROM t1 WHERE a=va;\n \nBEGIN\n FOR rec IN cur(pa)\n LOOP\n SELECT rec.a, rec.b;\n \n END LOOP;\n \nEND;\n \n//\n \nDELIMITER ;\n \nCALL p1(10);\n+-------+-------+\n| rec.a | rec.b |\n+-------+-------+\n| 10 | b0 |\n+-------+-------+\n \nCALL p1(11);\n+-------+-------+\n| rec.a | rec.b |\n+-------+-------+\n| 11 | b1 |\n+-------+-------+\n \nCALL p1(12);\n+-------+-------+\n| rec.a | rec.b |\n+-------+-------+\n| 12 | b2 |\n+-------+-------+\n \nCALL p1(13);\nQuery OK, 0 rows affected (0.000 sec)\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/for/','','https://mariadb.com/kb/en/library/for/'),(312,'Labels',23,'Syntax\n------ \nlabel: \n[label]\n \nLabels are MariaDB identifiers which can be used to identify\na BEGIN ... END construct or a loop. They have a maximum\nlength of 16 characters and can be quoted with backticks\n(i.e.., `).\n \nLabels have a start part and an end part. The start part\nmust precede the portion of code it refers to, must be\nfollowed by a colon (:) and can be on the same or different\nline. The end part is optional and adds nothing, but can\nmake the code more readable. If used, the end part must\nprecede the construct\'s delimiter (;). Constructs\nidentified by a label can be nested. Each construct can be\nidentified by only one label.\n \nLabels need not be unique in the stored program they belong\nto. However, a label for an inner loop cannot be identical\nto a label for an outer loop. In this case, the following\nerror would be produced:\n \nERROR 1309 (42000): Redefining label \n \nLEAVE and ITERATE statements can be used to exit or repeat a\nportion of code identified by a label. They must be in the\nsame Stored Routine, Trigger or Event which contains the\ntarget label.\n \nBelow is an example using a simple label that is used to\nexit a LOOP:\n \nCREATE PROCEDURE `test_sp`()\nBEGIN\n `my_label`:\n LOOP\n SELECT \'looping\';\n \n LEAVE `my_label`;\n \n END LOOP;\n \n SELECT \'out of loop\';\n \nEND;\n \nThe following label is used to exit a procedure, and has an\nend part:\n \nCREATE PROCEDURE `test_sp`()\n`my_label`:\nBEGIN\n IF @var = 1 THEN\n LEAVE `my_label`;\n \n END IF;\n \n DO something();\nEND `my_label`;\n \n\n \n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/labels/','','https://mariadb.com/kb/en/library/labels/'),(313,'LEAVE',23,'Syntax\n------ \nLEAVE label\n \nThis statement is used to exit the flow control construct\nthat has the\ngiven label. The label must be in the same stored program,\nnot in a caller procedure. LEAVE can be used within BEGIN\n... END or loop constructs\n(LOOP, REPEAT, WHILE). In Stored Procedures, Triggers and\nEvents, LEAVE can refer to the outmost BEGIN ... END\nconstruct; in that case, the program exits the procedure. In\nStored Functions, RETURN can be used instead.\n \nNote that LEAVE cannot be used to exit a DECLARE HANDLER\nblock.\n \nIf you try to LEAVE a non-existing label, or if you try to\nLEAVE a HANDLER block, the following error will be produced:\n \nERROR 1308 (42000): LEAVE with no matching label: \n \nThe following example uses LEAVE to exit the procedure if a\ncondition is true:\n \nCREATE PROCEDURE proc(IN p TINYINT)\nCONTAINS SQL\n`whole_proc`:\nBEGIN\n SELECT 1;\n \n IF p \n\nURL: https://mariadb.com/kb/en/library/leave/','','https://mariadb.com/kb/en/library/leave/'),(613,'NOT REGEXP',37,'Syntax\n------ \nexpr NOT REGEXP pat, expr NOT RLIKE pat\n \nDescription\n----------- \nThis is the same as NOT (expr REGEXP pat).\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/not-regexp/','','https://mariadb.com/kb/en/library/not-regexp/'),(614,'OCTET_LENGTH',37,'Syntax\n------ \nOCTET_LENGTH(str)\n \nDescription\n----------- \nOCTET_LENGTH() is normally a synonym for LENGTH(). When\nrunning Oracle mode from MariaDB 10.3, they are not\nsynonyms, but OCTET_LENGTH() behaves as LENGTH() would when\nnot in Oracle mode.\n \n\n\nURL: https://mariadb.com/kb/en/library/octet_length/','','https://mariadb.com/kb/en/library/octet_length/'),(615,'ORD',37,'Syntax\n------ \nORD(str)\n \nDescription\n----------- \nIf the leftmost character of the string str is a multi-byte\ncharacter,\nreturns the code for that character, calculated from the\nnumeric\nvalues of its constituent bytes using this formula:\n \n (1st byte code)\n+ (2nd byte code x 256)\n+ (3rd byte code x 256 x 256) ...\n \nIf the leftmost character is not a multi-byte character,\nORD() returns\nthe same value as the ASCII() function.\n \nExamples\n-------- \nSELECT ORD(\'2\');\n+----------+\n| ORD(\'2\') |\n+----------+\n| 50 |\n+----------+\n \n\n\nURL: https://mariadb.com/kb/en/library/ord/','','https://mariadb.com/kb/en/library/ord/'),(616,'POSITION',37,'Syntax\n------ \nPOSITION(substr IN str)\n \nDescription\n----------- \nPOSITION(substr IN str) is a synonym for LOCATE(substr,str).\n \nIt\'s part of ODBC 3.0.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/position/','','https://mariadb.com/kb/en/library/position/'),(617,'QUOTE',37,'Syntax\n------ \nQUOTE(str)\n \nDescription\n----------- \nQuotes a string to produce a result that can be used as a\nproperly escaped data\nvalue in an SQL statement. The string is returned enclosed\nby single quotes and\nwith each instance of single quote (\"\'\"), backslash\n(\"\\\"),\nASCII NUL, and Control-Z preceded by a backslash. If the\nargument\nis NULL, the return value is the word \"NULL\" without\nenclosing single\nquotes.\n \nExamples\n-------- \nSELECT QUOTE(\"Don\'t!\");\n+-----------------+\n| QUOTE(\"Don\'t!\") |\n+-----------------+\n| \'Don\\\'t!\' |\n+-----------------+\n \nSELECT QUOTE(NULL); \n+-------------+\n| QUOTE(NULL) |\n+-------------+\n| NULL |\n+-------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/quote/','','https://mariadb.com/kb/en/library/quote/'),(316,'REPEAT LOOP',23,'Syntax\n------ \n[begin_label:] REPEAT\n statement_list\nUNTIL search_condition\nEND REPEAT [end_label]\n \nThe statement list within a REPEAT statement is repeated\nuntil the\nsearch_condition is true. Thus, a REPEAT always enters the\nloop at\nleast once. statement_list consists of one or more\nstatements, each\nterminated by a semicolon (i.e., ;) statement delimiter.\n \nA REPEAT statement can be labeled. end_label cannot be given\nunless\nbegin_label also is present. If both are present, they must\nbe the\nsame.\n \nSee Delimiters in the mysql client for more on client\ndelimiter usage.\n \nDELIMITER //\n \nCREATE PROCEDURE dorepeat(p1 INT)\n BEGIN\n SET @x = 0;\n \n REPEAT SET @x = @x + 1;\n UNTIL @x > p1 END REPEAT;\n \n END\n//\n \nCALL dorepeat(1000)//\n \nSELECT @x//\n+------+\n| @x |\n+------+\n| 1001 |\n+------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/repeat-loop/','','https://mariadb.com/kb/en/library/repeat-loop/'),(317,'RESIGNAL',23,'SIGNAL and RESIGNAL were both introduced in MariaDB 5.5.\n \nSyntax\n------ \nRESIGNAL [error_condition]\n [SET error_property\n [, error_property] ...]\n \nerror_condition:\n SQLSTATE [VALUE] \'sqlstate_value\'\n | condition_name\n \nerror_property:\n error_property_name = \n \nerror_property_name:\n CLASS_ORIGIN\n | SUBCLASS_ORIGIN\n | MESSAGE_TEXT\n | MYSQL_ERRNO\n | CONSTRAINT_CATALOG\n | CONSTRAINT_SCHEMA\n | CONSTRAINT_NAME\n | CATALOG_NAME\n | SCHEMA_NAME\n | TABLE_NAME\n | COLUMN_NAME\n | CURSOR_NAME\n \nDescription\n----------- \nThe syntax of RESIGNAL and its semantics are very similar to\nSIGNAL. This statement can only be used within an error\nHANDLER. It produces an error, like SIGNAL. RESIGNAL clauses\nare the same as SIGNAL, except that they all are optional,\neven SQLSTATE. All the properties which are not specified in\nRESIGNAL, will be identical to the properties of the error\nthat was received by the error HANDLER. For a description of\nthe clauses, see diagnostics area.\n \nNote that RESIGNAL does not empty the diagnostics area: it\njust appends another error condition.\n \nRESIGNAL, without any clauses, produces an error which is\nidentical to the error that was received by HANDLER.\n \nIf used out of a HANDLER construct, RESIGNAL produces the\nfollowing error:\n \nERROR 1645 (0K000): RESIGNAL when handler not active\n \nIn MariaDB 5.5, if a HANDLER contained a CALL to another\nprocedure, that procedure could use RESIGNAL. Since MariaDB\n10.0, trying to do this raises the above error.\n \nFor a list of SQLSTATE values and MariaDB error codes, see\nMariaDB Error Codes.\n \nThe following procedure tries to query two tables which\ndon\'t exist, producing a 1146 error in both cases. Those\nerrors will trigger the HANDLER. The first time the error\nwill be ignored and the client will not receive it, but the\nsecond time, the error is re-signaled, so the client will\nreceive it.\n \nCREATE PROCEDURE test_error( )\nBEGIN\n DECLARE CONTINUE HANDLER\n FOR 1146\n BEGIN\n IF @hide_errors IS FALSE THEN\n RESIGNAL;\n \n END IF;\n \n END;\n \n SET @hide_errors = TRUE;\n \n SELECT \'Next error will be ignored\' AS msg;\n \n SELECT `c` FROM `temptab_one`;\n \n SELECT \'Next error won\'\'t be ignored\' AS msg;\n \n SET @hide_errors = FALSE;\n \n SELECT `c` FROM `temptab_two`;\n \nEND;\n \nCALL test_error( );\n \n+----------------------------+\n| msg |\n+----------------------------+\n| Next error will be ignored |\n+----------------------------+\n \n+-----------------------------+\n| msg |\n+-----------------------------+\n| Next error won\'t be ignored |\n+-----------------------------+\n \nERROR 1146 (42S02): Table \'test.temptab_two\' doesn\'t\nexist\n \nThe following procedure re-signals an error, modifying only\nthe error message to clarify the cause of the problem.\n \nCREATE PROCEDURE test_error()\nBEGIN\n DECLARE CONTINUE HANDLER\n FOR 1146\n BEGIN\n RESIGNAL SET\n MESSAGE_TEXT = \'`temptab` does not exist\';\n \n END;\n \n SELECT `c` FROM `temptab`;\n \nEND;\n \nCALL test_error( );\nERROR 1146 (42S02): `temptab` does not exist\n \nAs explained above, this works on MariaDB 5.5, but produces\na 1645 error since 10.0.\n \nCREATE PROCEDURE handle_error()\nBEGIN\n RESIGNAL;\n \nEND;\n \nCREATE PROCEDURE p()\nBEGIN\n DECLARE EXIT HANDLER FOR SQLEXCEPTION CALL p();\n SIGNAL SQLSTATE \'45000\';\n \nEND;\n \n\n\nURL: https://mariadb.com/kb/en/library/resignal/','','https://mariadb.com/kb/en/library/resignal/'),(319,'SELECT INTO',23,'Syntax\n------ \nSELECT col_name [, col_name] ...\n INTO var_name [, var_name] ...\n table_expr\n \nDescription\n----------- \nSELECT ... INTO enables selected columns to be stored\ndirectly\ninto variables. No resultset is produced. The query should\nreturn a single row. If the query\nreturns no rows, a warning with error code 1329 occurs (No\ndata), and\nthe variable values remain unchanged. If the query returns\nmultiple\nrows, error 1172 occurs (Result consisted of more than one\nrow). If it\nis possible that the statement may retrieve multiple rows,\nyou can use\nLIMIT 1 to limit the result set to a single row.\n \nThe INTO clause can also be specified at the end of the\nstatement.\n \nIn the context of such statements that occur as part of\nevents\nexecuted by the Event Scheduler, diagnostics messages (not\nonly\nerrors, but also warnings) are written to the error log,\nand, on\nWindows, to the application event log.\n \nThis statement can be used with both local variables and\nuser-defined variables.\n \nFor the complete syntax, see SELECT.\n \nAnother way to set a variable\'s value is the SET statement.\n \nSELECT ... INTO results are not stored in the query cache\neven if SQL_CACHE is specified.\n \nExamples\n-------- \nSELECT id, data INTO @x,@y \nFROM test.t1 LIMIT 1;\n \n\n\nURL: https://mariadb.com/kb/en/library/selectinto/','','https://mariadb.com/kb/en/library/selectinto/'),(621,'REPEAT Function',37,'Syntax\n------ \nREPEAT(str,count)\n \nDescription\n----------- \nReturns a string consisting of the string str repeated count\ntimes. If\ncount is less than 1, returns an empty string. Returns NULL\nif str or\ncount are NULL.\n \nExamples\n-------- \nSELECT QUOTE(REPEAT(\'MariaDB \',4));\n+------------------------------------+\n| QUOTE(REPEAT(\'MariaDB \',4)) |\n+------------------------------------+\n| \'MariaDB MariaDB MariaDB MariaDB \' |\n+------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/repeat-function/','','https://mariadb.com/kb/en/library/repeat-function/'),(622,'REPLACE Function',37,'Syntax\n------ \nREPLACE(str,from_str,to_str)\n \nDescription\n----------- \nReturns the string str with all occurrences of the string\nfrom_str\nreplaced by the string to_str. REPLACE() performs a\ncase-sensitive\nmatch when searching for from_str.\n \nExamples\n-------- \nSELECT REPLACE(\'www.mariadb.org\', \'w\', \'Ww\');\n+---------------------------------------+\n| REPLACE(\'www.mariadb.org\', \'w\', \'Ww\') |\n+---------------------------------------+\n| WwWwWw.mariadb.org |\n+---------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/replace-function/','','https://mariadb.com/kb/en/library/replace-function/'),(623,'REVERSE',37,'Syntax\n------ \nREVERSE(str)\n \nDescription\n----------- \nReturns the string str with the order of the characters\nreversed.\n \nExamples\n-------- \nSELECT REVERSE(\'desserts\');\n+---------------------+\n| REVERSE(\'desserts\') |\n+---------------------+\n| stressed |\n+---------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/reverse/','','https://mariadb.com/kb/en/library/reverse/'),(624,'RIGHT',37,'Syntax\n------ \nRIGHT(str,len)\n \nDescription\n----------- \nReturns the rightmost len characters from the string str, or\nNULL if\nany argument is NULL.\n \nExamples\n-------- \nSELECT RIGHT(\'MariaDB\', 2);\n+---------------------+\n| RIGHT(\'MariaDB\', 2) |\n+---------------------+\n| DB |\n+---------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/right/','','https://mariadb.com/kb/en/library/right/'),(320,'SIGNAL',23,'SIGNAL and RESIGNAL were both introduced in MariaDB 5.5.\n \nSyntax\n------ \nSIGNAL error_condition\n [SET error_property\n [, error_property] ...]\n \nerror_condition:\n SQLSTATE [VALUE] \'sqlstate_value\'\n | condition_name\n \nerror_property:\n error_property_name = \n \nerror_property_name:\n CLASS_ORIGIN\n | SUBCLASS_ORIGIN\n | MESSAGE_TEXT\n | MYSQL_ERRNO\n | CONSTRAINT_CATALOG\n | CONSTRAINT_SCHEMA\n | CONSTRAINT_NAME\n | CATALOG_NAME\n | SCHEMA_NAME\n | TABLE_NAME\n | COLUMN_NAME\n | CURSOR_NAME\n \nSIGNAL empties the diagnostics area and produces a custom\nerror. This statement can be used anywhere, but is generally\nuseful when used inside a stored program. When the error is\nproduced, it can be caught by a HANDLER. If not, the current\nstored program, or the current statement, will terminate\nwith the specified error.\n \nSometimes an error HANDLER just needs to SIGNAL the same\nerror it received, optionally with some changes. Usually the\nRESIGNAL statement is the most convenient way to do this.\n \nerror_condition can be an SQLSTATE value or a named error\ncondition defined via DECLARE CONDITION. SQLSTATE must be a\nconstant string consisting of five characters. These codes\nare standard to ODBC and ANSI SQL. For customized errors,\nthe recommended SQLSTATE is \'45000\'. For a list of\nSQLSTATE values used by MariaDB, see the MariaDB Error Codes\npage. The SQLSTATE can be read via the API method\nmysql_sqlstate( ). \n \nTo specify error properties user-defined variables and local\nvariables can be used, as well as character set conversions\n(but you can\'t set a collation).\n \nThe error properties, their type and their default values\nare explained in the diagnostics area page.\n \nErrors\n \nIf the SQLSTATE is not valid, the following error like this\nwill be produced:\n \nERROR 1407 (42000): Bad SQLSTATE: \'123456\'\n \nIf a property is specified more than once, an error like\nthis will be produced:\n \nERROR 1641 (42000): Duplicate condition information item\n\'MESSAGE_TEXT\'\n \nIf you specify a condition name which is not declared, an\nerror like this will be produced:\n \nERROR 1319 (42000): Undefined CONDITION: cond_name\n \nIf MYSQL_ERRNO is out of range, you will get an error like\nthis:\n \nERROR 1231 (42000): Variable \'MYSQL_ERRNO\' can\'t be set\nto the value of \'0\'\n \nExamples\n-------- \nHere\'s what happens if SIGNAL is used in the client to\ngenerate errors:\n \nSIGNAL SQLSTATE \'01000\';\n \nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n \nSHOW WARNINGS;\n \n+---------+------+------------------------------------------+\n| Level | Code | Message |\n+---------+------+------------------------------------------+\n| Warning | 1642 | Unhandled user-defined warning condition\n|\n+---------+------+------------------------------------------+\n1 row in set (0.06 sec)\n \nSIGNAL SQLSTATE \'02000\';\n \nERROR 1643 (02000): Unhandled user-defined not found\ncondition\n \nHow to specify MYSQL_ERRNO and MESSAGE_TEXT properties:\n \nSIGNAL SQLSTATE \'45000\' SET MYSQL_ERRNO=30001,\nMESSAGE_TEXT=\'H\nello, world!\';\n \nERROR 30001 (45000): Hello, world!\n \nThe following code shows how to use user variables, local\nvariables and character set conversion with SIGNAL:\n \nCREATE PROCEDURE test_error(x INT)\nBEGIN\n DECLARE errno SMALLINT UNSIGNED DEFAULT 31001;\n \n SET @errmsg = \'Hello, world!\';\n \n IF x = 1 THEN\n SIGNAL SQLSTATE \'45000\' SET\n MYSQL_ERRNO = errno,\n MESSAGE_TEXT = @errmsg;\n \n ELSE\n SIGNAL SQLSTATE \'45000\' SET\n MYSQL_ERRNO = errno,\n MESSAGE_TEXT = _utf8\'Hello, world!\';\n \n END IF;\n \nEND;\n \nHow to use named error conditions:\n \nCREATE PROCEDURE test_error(n INT)\nBEGIN\n DECLARE `too_big` CONDITION FOR SQLSTATE \'45000\';\n \n IF n > 10 THEN\n SIGNAL `too_big`;\n \n END IF;\n \nEND;\n \nIn this example, we\'ll define a HANDLER for an error code.\nWhen the error occurs, we SIGNAL a more informative error\nwhich makes sense for our procedure:\n \nCREATE PROCEDURE test_error()\nBEGIN\n DECLARE EXIT HANDLER\n FOR 1146\n BEGIN\n SIGNAL SQLSTATE \'45000\' SET\n MESSAGE_TEXT = \'Temporary tables not found; did you call\ninit() procedure?\';\n \n END;\n \n -- this will produce a 1146 error\n SELECT `c` FROM `temptab`;\n \nEND;\n \n\n\nURL: https://mariadb.com/kb/en/library/signal/','','https://mariadb.com/kb/en/library/signal/'),(325,'LINESTRING',24,'Syntax\n------ \nLineString(pt1,pt2,...)\n \nDescription\n----------- \nConstructs a WKB LineString value from a number of WKB Point\narguments. If any argument is not a WKB Point, the return\nvalue is\nNULL. If the number of Point arguments is less than two, the\nreturn value is NULL.\n \nExamples\n-------- \nSET @ls = \'LineString(1 1,2 2,3 3)\';\n \nSELECT AsText(EndPoint(GeomFromText(@ls)));\n+-------------------------------------+\n| AsText(EndPoint(GeomFromText(@ls))) |\n+-------------------------------------+\n| POINT(3 3) |\n+-------------------------------------+\n \nCREATE TABLE gis_line (g LINESTRING);\nINSERT INTO gis_line VALUES\n (LineFromText(\'LINESTRING(0 0,0 10,10 0)\')),\n (LineStringFromText(\'LINESTRING(10 10,20 10,20 20,10 20,10\n10)\')),\n (LineStringFromWKB(AsWKB(LineString(Point(10, 10),\nPoint(40, 10)))));\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/linestring/','','https://mariadb.com/kb/en/library/linestring/'),(628,'SOUNDS LIKE',37,'Syntax\n------ \nexpr1 SOUNDS LIKE expr2\n \nDescription\n----------- \nThis is the same as SOUNDEX(expr1) = SOUNDEX(expr2).\n \nExample\n \nSELECT givenname, surname FROM users WHERE givenname SOUNDS\nLIKE \"robert\";\n \n+-----------+---------+\n| givenname | surname |\n+-----------+---------+\n| Roberto | Castro |\n+-----------+---------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/sounds-like/','','https://mariadb.com/kb/en/library/sounds-like/'),(629,'SPACE',37,'Syntax\n------ \nSPACE(N)\n \nDescription\n----------- \nReturns a string consisting of N space characters. If N is\nNULL, returns NULL.\n \nExamples\n-------- \nSELECT QUOTE(SPACE(6));\n+-----------------+\n| QUOTE(SPACE(6)) |\n+-----------------+\n| \' \' |\n+-----------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/space/','','https://mariadb.com/kb/en/library/space/'),(630,'STRCMP',37,'Syntax\n------ \nSTRCMP(expr1,expr2)\n \nDescription\n----------- \nSTRCMP() returns 0 if the strings are the same, -1 if the\nfirst\nargument is smaller than the second according to the current\nsort order,\nand 1 otherwise.\n \nExamples\n-------- \nSELECT STRCMP(\'text\', \'text2\');\n+-------------------------+\n| STRCMP(\'text\', \'text2\') |\n+-------------------------+\n| -1 |\n+-------------------------+\n \nSELECT STRCMP(\'text2\', \'text\');\n+-------------------------+\n| STRCMP(\'text2\', \'text\') |\n+-------------------------+\n| 1 |\n+-------------------------+\n \nSELECT STRCMP(\'text\', \'text\');\n+------------------------+\n| STRCMP(\'text\', \'text\') |\n+------------------------+\n| 0 |\n+------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/strcmp/','','https://mariadb.com/kb/en/library/strcmp/'),(631,'SUBSTR',37,'Description\n----------- \nSUBSTR() is a synonym for SUBSTRING().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/substr/','','https://mariadb.com/kb/en/library/substr/'),(636,'UCASE',37,'Syntax\n------ \nUCASE(str)\n \nDescription\n----------- \nUCASE() is a synonym for UPPER().\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/ucase/','','https://mariadb.com/kb/en/library/ucase/'),(639,'UPPER',37,'Syntax\n------ \nUPPER(str)\n \nDescription\n----------- \nReturns the string str with all characters changed to\nuppercase\naccording to the current character set mapping. The default\nis latin1\n(cp1252 West European).\n \nSELECT UPPER(surname), givenname FROM users ORDER BY\nsurname;\n \n+----------------+------------+\n| UPPER(surname) | givenname |\n+----------------+------------+\n| ABEL | Jacinto |\n| CASTRO | Robert |\n| COSTA | Phestos |\n| MOSCHELLA | Hippolytos |\n+----------------+------------+\n \nUPPER() is ineffective when applied to binary strings\n(BINARY,\nVARBINARY, BLOB). The description of \nLOWER() shows how to\nperform lettercase conversion of binary strings.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/upper/','','https://mariadb.com/kb/en/library/upper/'),(328,'MULTIPOLYGON',24,'Syntax\n------ \nMultiPolygon(poly1,poly2,...)\n \nDescription\n----------- \nConstructs a WKB MultiPolygon value from a set of WKB\nPolygon arguments. If any argument is not a WKB Polygon, the\nreturn value is NULL.\n \nExample\n \nCREATE TABLE gis_multi_polygon (g MULTIPOLYGON);\nINSERT INTO gis_multi_polygon VALUES\n (MultiPolygonFromText(\'MULTIPOLYGON(((28 26,28 0,84 0,84\n42,28 26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67\n13,59 13,59 18)))\')),\n (MPolyFromText(\'MULTIPOLYGON(((28 26,28 0,84 0,84 42,28\n26),(52 18,66 23,73 9,48 6,52 18)),((59 18,67 18,67 13,59\n13,59 18)))\')),\n (MPolyFromWKB(AsWKB(MultiPolygon(Polygon(LineString(Point(0,\n3), Point(3, 3), Point(3, 0), Point(0, 3)))))));\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/multipolygon/','','https://mariadb.com/kb/en/library/multipolygon/'),(331,'POLYGON',24,'Syntax\n------ \nPolygon(ls1,ls2,...)\n \nDescription\n----------- \nConstructs a WKB Polygon value from a number of WKB\nLineString\narguments. If any argument does not represent the WKB of a\nLinearRing (that is,\nnot a closed and simple LineString) the return value is\nNULL.\n \nNote that according to the OpenGIS standard, a POLYGON\nshould have exactly one ExteriorRing and all other rings\nshould lie within that ExteriorRing and thus be the\nInteriorRings. Practically, however, some systems, including\nMariaDB\'s, permit polygons to have several\n\'ExteriorRings\'. In the case of there being multiple,\nnon-overlapping exterior rings ST_NUMINTERIORRINGS() will\nreturn 1.\n \nExamples\n-------- \nSET @g = ST_GEOMFROMTEXT(\'POLYGON((1 1,1 5,4 9,6 9,9 3,7\n2,1 1))\');\n \nCREATE TABLE gis_polygon (g POLYGON);\nINSERT INTO gis_polygon VALUES\n (PolygonFromText(\'POLYGON((10 10,20 10,20 20,10 20,10\n10))\')),\n (PolyFromText(\'POLYGON((0 0,50 0,50 50,0 50,0 0), (10\n10,20 10,20 20,10 20,10 10))\')),\n (PolyFromWKB(AsWKB(Polygon(LineString(Point(0, 0),\nPoint(30, 0), Point(30, 30), Point(0, 0))))));\n \nNon-overlapping \'polygon\':\n \nSELECT ST_NumInteriorRings(ST_PolyFromText(\'POLYGON((0 0,10\n0,10 10,0 10,0 0),\n (-1 -1,-5 -1,-5 -5,-1 -5,-1 -1))\')) AS NumInteriorRings;\n \n+------------------+\n| NumInteriorRings |\n+------------------+\n| 1 |\n+------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/polygon/','','https://mariadb.com/kb/en/library/polygon/'),(332,'ST_BUFFER',24,'Syntax\n------ \nST_BUFFER(g1,r)\nBUFFER(g1,r)\n \nDescription\n----------- \nReturns a geometry that represents all points whose distance\nfrom geometry g1 is less than or equal to distance, or\nradius, r.\n \nUses for this function could include creating for example a\nnew geometry representing a buffer zone around an island.\n \nBUFFER() is a synonym.\n \nExamples\n-------- \nDetermining whether a point is within a buffer zone:\n \nSET @g1 = ST_GEOMFROMTEXT(\'POLYGON((10 10, 10 20, 20 20, 20\n10, 10 10))\');\n \nSET @g2 = ST_GEOMFROMTEXT(\'POINT(8 8)\');\n \nSELECT ST_WITHIN(@g2,ST_BUFFER(@g1,5));\n+---------------------------------+\n| ST_WITHIN(@g2,ST_BUFFER(@g1,5)) |\n+---------------------------------+\n| 1 |\n+---------------------------------+\n \nSELECT ST_WITHIN(@g2,ST_BUFFER(@g1,1));\n+---------------------------------+\n| ST_WITHIN(@g2,ST_BUFFER(@g1,1)) |\n+---------------------------------+\n| 0 |\n+---------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_buffer/','','https://mariadb.com/kb/en/library/st_buffer/'),(333,'ST_CONVEXHULL',24,'ST_ConvexHull() was introduced in MariaDB 10.1.2\n \nSyntax\n------ \nST_ConvexHull(g)\nConvexHull(g)\n \nDescription\n----------- \nGiven a geometry, returns a geometry that is the minimum\nconvex geometry enclosing all geometries within the set.\nReturns NULL if the geometry value is NULL or an empty\nvalue.\n \nST_ConvexHull() and ConvexHull() are synonyms.\n \nExamples\n-------- \nThe ConvexHull of a single point is simply the single point:\n \nSET @g = ST_GEOMFROMTEXT(\'Point(0 0)\');\n \nSELECT ST_ASTEXT(ST_CONVEXHULL(@g));\n+------------------------------+\n| ST_ASTEXT(ST_CONVEXHULL(@g)) |\n+------------------------------+\n| POINT(0 0) |\n+------------------------------+\n \nSET @g = ST_GEOMFROMTEXT(\'MultiPoint(0 0, 1 2, 2 3)\');\n \nSELECT ST_ASTEXT(ST_CONVEXHULL(@g));\n+------------------------------+\n| ST_ASTEXT(ST_CONVEXHULL(@g)) |\n+------------------------------+\n| POLYGON((0 0,1 2,2 3,0 0)) |\n+------------------------------+\n \nSET @g = ST_GEOMFROMTEXT(\'MultiPoint( 1 1, 2 2, 5 3, 7 2, 9\n3, 8 4, 6 6, 6 9, 4 9, 1 5 )\');\n \nSELECT ST_ASTEXT(ST_CONVEXHULL(@g));\n+----------------------------------------+\n| ST_ASTEXT(ST_CONVEXHULL(@g)) |\n+----------------------------------------+\n| POLYGON((1 1,1 5,4 9,6 9,9 3,7 2,1 1)) |\n+----------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_convexhull/','','https://mariadb.com/kb/en/library/st_convexhull/'),(336,'ST_SYMDIFFERENCE',24,'Syntax\n------ \nST_SYMDIFFERENCE(g1,g2)\n \nDescription\n----------- \nReturns a geometry that represents the portions of geometry\ng1 and geometry g2 that don\'t intersect.\n \nExamples\n-------- \nSET @g1 = ST_GEOMFROMTEXT(\'LINESTRING(10 20, 10 40)\');\n \nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(10 15, 10 25)\');\n \nSELECT ASTEXT(ST_SYMDIFFERENCE(@g1,@g2));\n+----------------------------------------------+\n| ASTEXT(ST_SYMDIFFERENCE(@g1,@g2)) |\n+----------------------------------------------+\n| MULTILINESTRING((10 15,10 20),(10 25,10 40)) |\n+----------------------------------------------+\n \nSET @g2 = ST_GeomFromText(\'LINESTRING(10 20, 10 41)\');\n \nSELECT ASTEXT(ST_SYMDIFFERENCE(@g1,@g2));\n+-----------------------------------+\n| ASTEXT(ST_SYMDIFFERENCE(@g1,@g2)) |\n+-----------------------------------+\n| LINESTRING(10 40,10 41) |\n+-----------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_symdifference/','','https://mariadb.com/kb/en/library/st_symdifference/'),(644,'ALTER LOGFILE GROUP',39,'Syntax\n------ \nALTER LOGFILE GROUP logfile_group\n ADD UNDOFILE \'file_name\'\n [INITIAL_SIZE [=] size]\n [WAIT]\n ENGINE [=] engine_name\n \nThe ALTER LOGFILE GROUP statement is not supported by\nMariaDB. It was originally inherited from MySQL NDB Cluster.\nSee MDEV-19295 for more information.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/alter-logfile-group/','','https://mariadb.com/kb/en/library/alter-logfile-group/'),(646,'ALTER SERVER',39,'Syntax\n------ \nALTER SERVER server_name\n OPTIONS (option [, option] ...)\n \nDescription\n----------- \nAlters the server information for server_name, adjusting the\nspecified\noptions as per the CREATE SERVER command. The corresponding\nfields in the mysql.servers table are updated accordingly.\nThis statement requires the SUPER privilege.\n \nExamples\n-------- \nALTER SERVER s OPTIONS (USER \'sally\');\n \n\n\nURL: https://mariadb.com/kb/en/library/alter-server/','','https://mariadb.com/kb/en/library/alter-server/'),(647,'ALTER TABLE',39,'Syntax\n------ \nALTER [ONLINE] [IGNORE] TABLE tbl_name\n [WAIT n | NOWAIT]\n alter_specification [, alter_specification] ...\n \nalter_specification:\n table_option ...\n | ADD [COLUMN] [IF NOT EXISTS] col_name column_definition\n [FIRST | AFTER col_name ]\n | ADD [COLUMN] [IF NOT EXISTS] (col_name\ncolumn_definition,...)\n | ADD {INDEX|KEY} [IF NOT EXISTS] [index_name]\n [index_type] (index_col_name,...) [index_option] ...\n | ADD [CONSTRAINT [symbol]] PRIMARY KEY\n [index_type] (index_col_name,...) [index_option] ...\n | ADD [CONSTRAINT [symbol]]\n UNIQUE [INDEX|KEY] [index_name]\n [index_type] (index_col_name,...) [index_option] ...\n | ADD FULLTEXT [INDEX|KEY] [index_name]\n (index_col_name,...) [index_option] ...\n | ADD SPATIAL [INDEX|KEY] [index_name]\n (index_col_name,...) [index_option] ...\n | ADD [CONSTRAINT [symbol]]\n FOREIGN KEY [IF NOT EXISTS] [index_name]\n(index_col_name,...)\n reference_definition\n | ADD PERIOD FOR SYSTEM_TIME (start_column_name,\nend_column_name)\n | ALTER [COLUMN] col_name SET DEFAULT literal\n| (expression)\n | ALTER [COLUMN] col_name DROP DEFAULT\n | CHANGE [COLUMN] [IF EXISTS] old_col_name new_col_name\ncolumn_definition\n [FIRST|AFTER col_name]\n | MODIFY [COLUMN] [IF EXISTS] col_name column_definition\n [FIRST | AFTER col_name]\n | DROP [COLUMN] [IF EXISTS] col_name [RESTRICT|CASCADE]\n | DROP PRIMARY KEY\n | DROP {INDEX|KEY} [IF EXISTS] index_name\n | DROP FOREIGN KEY [IF EXISTS] fk_symbol\n | DROP CONSTRAINT [IF EXISTS] constraint_name\n | DISABLE KEYS\n | ENABLE KEYS\n | RENAME [TO] new_tbl_name\n | ORDER BY col_name [, col_name] ...\n | CONVERT TO CHARACTER SET charset_name [COLLATE\ncollation_name]\n | [DEFAULT] CHARACTER SET [=] charset_name\n | [DEFAULT] COLLATE [=] collation_name\n | DISCARD TABLESPACE\n | IMPORT TABLESPACE\n | ALGORITHM [=] {DEFAULT|INPLACE|COPY|NOCOPY|INSTANT}\n | LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE}\n | FORCE\n | partition_options\n | ADD PARTITION (partition_definition)\n | DROP PARTITION partition_names\n | COALESCE PARTITION number\n | REORGANIZE PARTITION [partition_names INTO\n(partition_definitions)]\n | ANALYZE PARTITION partition_names\n | CHECK PARTITION partition_names\n | OPTIMIZE PARTITION partition_names\n | REBUILD PARTITION partition_names\n | REPAIR PARTITION partition_names\n | EXCHANGE PARTITION partition_name WITH TABLE tbl_name\n | REMOVE PARTITIONING\n | ADD SYSTEM VERSIONING\n | DROP SYSTEM VERSIONING\n \nindex_col_name:\n col_name [(length)] [ASC | DESC]\n \nindex_type:\n USING {BTREE | HASH | RTREE}\n \nindex_option:\n KEY_BLOCK_SIZE [=] value\n | index_type\n | WITH PARSER parser_name\n | COMMENT \'string\'\n | CLUSTERING={YES| NO}\n \ntable_options:\n table_option [[,] table_option] ...\nIn MariaDB 10.0.2 and later, IF EXISTS and IF NOT EXISTS\nclauses have been added for the following:\n \nADD COLUMN [IF NOT EXISTS]\nADD INDEX [IF NOT EXISTS]\nADD FOREIGN KEY [IF NOT EXISTS]\nADD PARTITION [IF NOT EXISTS]\nCREATE INDEX [IF NOT EXISTS]\n \nDROP COLUMN [IF EXISTS]\nDROP INDEX [IF EXISTS]\nDROP FOREIGN KEY [IF EXISTS]\nDROP PARTITION [IF EXISTS]\nCHANGE COLUMN [IF EXISTS]\nMODIFY COLUMN [IF EXISTS]\nDROP INDEX [IF EXISTS]\nWhen IF EXISTS and IF NOT EXISTS are used in clauses,\nqueries will not\nreport errors when the condition is triggered for that\nclause. A warning with\nthe same message text will be issued and the ALTER will move\non to the next\nclause in the statement (or end if finished).\n \nThis was done in MDEV-318.\n \nDescription\n----------- \nALTER TABLE enables you to change the structure of an\nexisting table.\nFor example, you can add or delete columns, create or\ndestroy indexes,\nchange the type of existing columns, or rename columns or\nthe table\nitself. You can also change the comment for the table and\nthe storage engine of the\ntable.\n \nIf another connection is using the table, a metadata lock is\nactive, and this statement will wait until the lock is\nreleased. This is also true for non-transactional tables.\n \nWhen adding a UNIQUE index on a column (or a set of columns)\nwhich have duplicated values, an error will be produced and\nthe statement will be stopped. To suppress the error and\nforce the creation of UNIQUE indexes, discarding duplicates,\nthe IGNORE option can be specified. This can be useful if a\ncolumn (or a set of columns) should be UNIQUE but it\ncontains duplicate values; however, this technique provides\nno control on which rows are preserved and which are\ndeleted. Also, note that IGNORE is accepted but ignored in\nALTER TABLE ... EXCHANGE PARTITION statements.\n \nThis statement can also be used to rename a table. For\ndetails see RENAME TABLE.\n \nWhen an index is created, the storage engine may use a\nconfigurable buffer in the process. Incrementing the buffer\nspeeds up the index creation. Aria and MyISAM allocate a\nbuffer whose size is defined by aria_sort_buffer_size or\nmyisam_sort_buffer_size, also used for REPAIR TABLE.\nInnoDB/XtraDB allocates three buffers whose size is defined\nby innodb_sort_buffer_size.\n \nPrivileges\n \nExecuting the ALTER TABLE statement generally requires at\nleast the ALTER privilege for the table or the database..\n \nIf you are renaming a table, then it also requires the DROP,\nCREATE and INSERT privileges for the table or the database\nas well.\n \nOnline DDL\n \nIn MariaDB 10.0 and later, online DDL is supported with the\nALGORITHM and LOCK clauses.\n \nSee InnoDB Online DDL Overview for more information on\nonline DDL with InnoDB.\n \nALTER ONLINE TABLE\n \nALTER ONLINE TABLE has also worked for partitioned tables\nsince MariaDB 10.0.11.\n \nOnline ALTER TABLE is available by executing the following:\n \nALTER ONLINE TABLE ...;\n \nThis statement has the following semantics:\n \nIn MariaDB 10.0.12 and later, this statement is equivalent\nto the following:\n \nALTER TABLE ... LOCK=NONE;\n \nSee the LOCK alter specification for more information.\n \nIn MariaDB 10.0.11, this statement is equivalent to the\nfollowing:\n \nALTER TABLE ... ALGORITHM=INPLACE;\n \nSee the ALGORITHM alter specification for more information.\n \nMariaDB until 10.0.10\n \nIn MariaDB 10.0.10 and before, this statement ensures that\nthe ALTER TABLE statement does not make a copy of the table.\n \nWAIT/NOWAIT\n \nSet the lock wait timeout. See WAIT and NOWAIT.\n \nColumn Definitions\n \nSee CREATE TABLE: Column Definitions for information about\ncolumn definitions.\n \nIndex Definitions\n \nSee CREATE TABLE: Index Definitions for information about\nindex definitions.\n \nThe CREATE INDEX and DROP INDEX statements can also be used\nto add or remove an index.\n \nCharacter Sets and Collations\n \nCONVERT TO CHARACTER SET charset_name [COLLATE\ncollation_name]\n[DEFAULT] CHARACTER SET [=] charset_name\n[DEFAULT] COLLATE [=] collation_name\nSee Setting Character Sets and Collations for details on\nsetting the character sets and collations.\n \nAlter Specifications\n \nTable Options\n \nSee CREATE TABLE: Table Options for information about table\noptions.\n \nADD COLUMN\n \n... ADD COLUMN [IF NOT EXISTS] (col_name\ncolumn_definition,...)\nAdds a column to the table. The syntax is the same as in\nCREATE TABLE.\nIf you are using IF NOT_EXISTS the column will not be added\nif it was not there already. This is very useful when doing\nscripts to modify tables.\n \nThe FIRST and AFTER clauses affect the physical order of\ncolumns in the datafile. Use FIRST to add a column in the\nfirst (leftmost) position, or AFTER followed by a column\nname to add the new column in any other position. Note that,\nnowadays, the physical position of a column is usually\nirrelevant.\n \nSee also Instant ADD COLUMN for InnoDB.\n \nDROP COLUMN\n \n... DROP COLUMN [IF EXISTS] col_name [CASCADE|RESTRICT]\nDrops the column from the table.\nIf you are using IF EXISTS you will not get an error if the\ncolumn didn\'t exist.\nIf the column is part of any index, the column will be\ndropped from them, except if you add a new column with\nidentical name at the same time. The index will be dropped\nif all columns from the index were dropped.\nIf the column was used in a view or trigger, you will get an\nerror next time the view or trigger is accessed.\n \nDropping a column that is part of a multi-column UNIQUE\nconstraint is not permitted. For example:\n \nCREATE TABLE a (\n a int,\n b int,\n primary key (a,b)\n);\n \nALTER TABLE x DROP COLUMN a;\n[42000][1072] Key column \'A\' doesn\'t exist in table\n \nThe reason is that dropping column a would result in the new\nconstraint that all values in column b be unique. In order\nto drop the column, an explicit DROP PRIMARY KEY and ADD\nPRIMARY KEY would be required. Up until MariaDB 10.2.7, the\ncolumn was dropped and the additional constraint applied,\nresulting in the following structure:\n \nALTER TABLE x DROP COLUMN a;\nQuery OK, 0 rows affected (0.46 sec)\n \nDESC x;\n+-------+---------+------+-----+---------+-------+\n| Field | Type | Null | Key | Default | Extra |\n+-------+---------+------+-----+---------+-------+\n| b | int(11) | NO | PRI | NULL | |\n+-------+---------+------+-----+---------+-------+\n \nMariaDB 10.4.0 supports instant DROP COLUMN. DROP COLUMN of\nan indexed column would imply DROP INDEX (and in the case of\na non-UNIQUE multi-column index, possibly ADD INDEX). These\nwill not be allowed with ALGORITHM=INSTANT, but unlike\nbefore, they can be allowed with ALGORITHM=NOCOPY\n \nRESTRICT and CASCADE are allowed to make porting from other\ndatabase systems easier. In MariaDB, they do nothing.\n \nMODIFY COLUMN\n \nAllows you to modify the type of a column. The column will\nbe at the same place as the original column and all indexes\non the column will be kept. Note that when modifying column,\nyou should specify all attributes for the new column.\n \nCREATE TABLE t1 (a INT UNSIGNED AUTO_INCREMENT, PRIMARY\nKEY((a));\nALTER TABLE t1 MODIFY a BIGINT UNSIGNED AUTO_INCREMENT;\n \nCHANGE COLUMN\n \nWorks like MODIFY COLUMN except that you can also change the\nname of the column. The column will be at the same place as\nthe original column and all index on the column will be\nkept.\n \nCREATE TABLE t1 (a INT UNSIGNED AUTO_INCREMENT, PRIMARY\nKEY(a));\nALTER TABLE t1 CHANGE a b BIGINT UNSIGNED AUTO_INCREMENT;\n \nALTER COLUMN\n \nThis lets you change column options.\n \nCREATE TABLE t1 (a INT UNSIGNED AUTO_INCREMENT, b\nvarchar(50), PRIMARY KEY(a));\nALTER TABLE t1 ALTER b SET DEFAULT \'hello\';\n \nADD PRIMARY KEY\n \nAdd a primary key.\n \nFor PRIMARY KEY indexes, you can specify a name for the\nindex, but it is silently ignored, and the name of the index\nis always PRIMARY.\n \nSee Getting Started with Indexes: Primary Key for more\ninformation.\n \nDROP PRIMARY KEY\n \nDrop a primary key.\n \nFor PRIMARY KEY indexes, you can specify a name for the\nindex, but it is silently ignored, and the name of the index\nis always PRIMARY.\n \nSee Getting Started with Indexes: Primary Key for more\ninformation.\n \nADD FOREIGN KEY\n \nAdd a foreign key.\n \nFor FOREIGN KEY indexes, a reference definition must be\nprovided.\n \nFor FOREIGN KEY indexes, you can specify a name for the\nconstraint, using the CONSTRAINT keyword. That name will be\nused in error messages.\n \nFirst, you have to specify the name of the target (parent)\ntable and a column or a column list which must be indexed\nand whose values must match to the foreign key\'s values.\nThe MATCH clause is accepted to improve the compatibility\nwith other DBMS\'s, but has no meaning in MariaDB. The ON\nDELETE and ON UPDATE clauses specify what must be done when\na DELETE (or a REPLACE) statements attempts to delete a\nreferenced row from the parent table, and when an UPDATE\nstatement attempts to modify the referenced foreign key\ncolumns in a parent table row, respectively. The following\noptions are allowed:\nRESTRICT: The delete/update operation is not performed. The\nstatement terminates with a 1451 error (SQLSTATE \'2300\').\nNO ACTION: Synonym for RESTRICT.\nCASCADE: The delete/update operation is performed in both\ntables.\nSET NULL: The update or delete goes ahead in the parent\ntable, and the corresponding foreign key fields in the child\ntable are set to NULL. (They must not be defined as NOT NULL\nfor this to succeed).\n \nMariaDB until 5.3\nSET DEFAULT: This option is currently implemented only for\nthe PBXT storage engine, which is disabled by default and no\nlonger maintained. It sets the child table\'s foreign key\nfields to their DEFAULT values when the referenced parent\ntable key entries are updated or deleted.\n \nIf either clause is omitted, the default behavior for the\nomitted clause is RESTRICT.\n \nSee Foreign Keys for more information.\n \nDROP FOREIGN KEY\n \nDrop a foreign key.\n \nSee Foreign Keys for more information.\n \nADD INDEX\n \nAdd a plain index.\n \nPlain indexes are regular indexes that are not unique, and\nare not acting as a primary key or a foreign key. They are\nalso not the \"specialized\" FULLTEXT or SPATIAL indexes.\n \nSee Getting Started with Indexes: Plain Indexes for more\ninformation.\n \nDROP INDEX\n \nDrop a plain index.\n \nPlain indexes are regular indexes that are not unique, and\nare not acting as a primary key or a foreign key. They are\nalso not the \"specialized\" FULLTEXT or SPATIAL indexes.\n \nSee Getting Started with Indexes: Plain Indexes for more\ninformation.\n \nADD UNIQUE INDEX\n \nAdd a unique index.\n \nThe UNIQUE keyword means that the index will not accept\nduplicated values, except for NULLs. An error will raise if\nyou try to insert duplicate values in a UNIQUE index.\n \nFor UNIQUE indexes, you can specify a name for the\nconstraint, using the CONSTRAINT keyword. That name will be\nused in error messages.\n \nSee Getting Started with Indexes: Unique Index for more\ninformation.\n \nDROP UNIQUE INDEX\n \nDrop a unique index.\n \nThe UNIQUE keyword means that the index will not accept\nduplicated values, except for NULLs. An error will raise if\nyou try to insert duplicate values in a UNIQUE index.\n \nFor UNIQUE indexes, you can specify a name for the\nconstraint, using the CONSTRAINT keyword. That name will be\nused in error messages.\n \nSee Getting Started with Indexes: Unique Index for more\ninformation.\n \nADD FULLTEXT INDEX\n \nAdd a FULLTEXT index.\n \nSee Full-Text Indexes for more information.\n \nDROP FULLTEXT INDEX\n \nDrop a FULLTEXT index.\n \nSee Full-Text Indexes for more information.\n \nADD SPATIAL INDEX\n \nAdd a SPATIAL index.\n \nSee SPATIAL INDEX for more information.\n \nDROP SPATIAL INDEX\n \nDrop a SPATIAL index.\n \nSee SPATIAL INDEX for more information.\n \nENABLE/ DISABLE KEYS\n \nDISABLE KEYS will disable all non unique keys for the table\nfor storage engines that support this (at least MyISAM and\nAria). This can be used to speed up inserts into empty\ntables.\n \nENABLE KEYS will enable all disabled keys.\n \nRENAME TO\n \nRenames the table. See also RENAME TABLE.\n \nADD CONSTRAINT\n \nModifies the table adding a constraint on a particular\ncolumn or columns.\n \nMariaDB 10.2.1 introduced new ways to define a constraint.\n \nNote: Before MariaDB 10.2.1, constraint expressions were\naccepted in syntax, but ignored.\n \nALTER TABLE table_name \nADD CONSTRAINT [constraint_name] CHECK(expression);\nBefore a row is inserted or updated, all constraints are\nevaluated in the order they are defined. If any constraint\nfails, then the row will not be updated. One can use most\ndeterministic functions in a constraint, including UDF\'s.\n \nCREATE TABLE account_ledger (\n id INT PRIMARY KEY AUTO_INCREMENT,\n transaction_name VARCHAR(100),\n credit_account VARCHAR(100),\n credit_amount INT,\n debit_account VARCHAR(100),\n debit_amount INT);\n \nALTER TABLE account_ledger \nADD CONSTRAINT is_balanced \n CHECK((debit_amount + credit_amount) = 0);\n \nThe constraint_name is optional. If you don\'t provide one\nin the ALTER TABLE statement, MariaDB auto-generates a name\nfor you. This is done so that you can remove it later using\nDROP CONSTRAINT clause.\n \nYou can disable all constraint expression checks by setting\nthe variable check_constraint_checks to OFF. You may find\nthis useful when loading a table that violates some\nconstraints that you want to later find and fix in SQL.\n \nTo view constraints on a table, query\ninformation_schema.TABLE_CONSTRAINTS:\n \nSELECT CONSTRAINT_NAME, TABLE_NAME, CONSTRAINT_TYPE \nFROM information_schema.TABLE_CONSTRAINTS\nWHERE TABLE_NAME = \'account_ledger\';\n \n+-----------------+----------------+-----------------+\n| CONSTRAINT_NAME | TABLE_NAME | CONSTRAINT_TYPE |\n+-----------------+----------------+-----------------+\n| is_balanced | account_ledger | CHECK |\n+-----------------+----------------+-----------------+\n \nDROP CONSTRAINT\n \nDROP CONSTRAINT for UNIQUE and FOREIGN KEY constraints was\nintroduced in MariaDB 10.2.22 and MariaDB 10.3.13.\n \nDROP CONSTRAINT for CHECK constraints was introduced in\nMariaDB 10.2.1\n \nModifies the table, removing the given constraint.\n \nALTER TABLE table_name\nDROP CONSTRAINT constraint_name;\n \nWhen you add a constraint to a table, whether through a\nCREATE TABLE or ALTER TABLE...ADD CONSTRAINT statement, you\ncan either set a constraint_name yourself, or allow MariaDB\nto auto-generate one for you. To view constraints on a\ntable, query information_schema.TABLE_CONSTRAINTS. For\ninstance,\n \nCREATE TABLE t (\n a INT,\n b INT,\n c INT,\n CONSTRAINT CHECK(a > b),\n CONSTRAINT check_equals CHECK(a = c)); \n \nSELECT CONSTRAINT_NAME, TABLE_NAME, CONSTRAINT_TYPE \nFROM information_schema.TABLE_CONSTRAINTS\nWHERE TABLE_NAME = \'t\';\n \n+-----------------+----------------+-----------------+\n| CONSTRAINT_NAME | TABLE_NAME | CONSTRAINT_TYPE |\n+-----------------+----------------+-----------------+\n| check_equals | t | CHECK |\n| CONSTRAINT_1 | t | CHECK |\n+-----------------+----------------+-----------------+\n \nTo remove a constraint from the table, issue an ALTER\nTABLE...DROP CONSTRAINT statement. For example,\n \nALTER TABLE t DROP CONSTRAINT is_unique;\n \nADD SYSTEM VERSIONING\n \nSystem-versioned tables was added in MariaDB 10.3.4.\n \nAdd system versioning.\n \nDROP SYSTEM VERSIONING\n \nSystem-versioned tables was added in MariaDB 10.3.4.\n \nDrop system versioning.\n \nADD PERIOD FOR SYSTEM_TIME\n \nSystem-versioned tables was added in MariaDB 10.3.4.\n \nFORCE\n \nALTER TABLE ... FORCE can force MariaDB to re-build the\ntable.\n \nIn MariaDB 5.5 and before, this could only be done by\nsetting the ENGINE table option to its old value. For\nexample, for an InnoDB table, one could execute the\nfollowing:\n \nALTER TABLE tab_name ENGINE = InnoDB;\n \nIn MariaDB 10.0 and later, the FORCE option can be used\ninstead. For example, :\n \nALTER TABLE tab_name FORCE;\n \nWith InnoDB, the table rebuild will only reclaim unused\nspace (i.e. the space previously used for deleted rows) if\nthe innodb_file_per_table system variable is set to ON. If\nthe system variable is OFF, then the space will not be\nreclaimed, but it will be-re-used for new data that\'s later\nadded.\n \nEXCHANGE PARTITION\n \nALTER TABLE ... EXCHANGE PARTITION was introduced in MariaDB\n10.0.4\n \nThis is used to exchange the tablespace files between a\npartition and another table.\n \nSee copying InnoDB\'s transportable tablespaces for more\ninformation.\n \nDISCARD TABLESPACE\n \nThis is used to discard an InnoDB table\'s tablespace.\n \nSee copying InnoDB\'s transportable tablespaces for more\ninformation.\n \nIMPORT TABLESPACE\n \nThis is used to import an InnoDB table\'s tablespace. The\ntablespace should have been copied from its original server\nafter executing FLUSH TABLES FOR EXPORT.\n \nSee copying InnoDB\'s transportable tablespaces for more\ninformation.\n \nALTER TABLE ... IMPORT only applies to InnoDB tables. Most\nother popular storage engines, such as Aria and MyISAM, will\nrecognize their data files as soon as they\'ve been placed\nin the proper directory under the datadir, and no special\nDDL is required to import them.\n \nALGORITHM\n \nIn MariaDB 5.5 and before, ALTER TABLE operations required\nmaking a temporary copy of the table, which can be slow for\nlarge tables.\n \nIn MariaDB 10.0 and later, the ALTER TABLE statement\nsupports the ALGORITHM clause. This clause is one of the\nclauses that is used to implement online DDL. ALTER TABLE\nsupports several different algorithms. An algorithm can be\nexplicitly chosen for an ALTER TABLE operation by setting\nthe ALGORITHM clause. The supported values are:\nALGORITHM=DEFAULT - This implies the default behavior for\nthe specific statement, such as if no ALGORITHM clause is\nspecified.\nALGORITHM=COPY\nALGORITHM=INPLACE\nALGORITHM=NOCOPY - This was added in MariaDB 10.3.7.\nALGORITHM=INSTANT - This was added in MariaDB 10.3.7.\n \nSee InnoDB Online DDL Overview: ALGORITHM for information on\nhow the ALGORITHM clause affects InnoDB.\n \nALGORITHM=DEFAULT\n \nThe default behavior, which occurs if ALGORITHM=DEFAULT is\nspecified, or if ALGORITHM is not specified at all, usually\nonly makes a copy if the operation doesn\'t support being\ndone in-place at all. In this case, the most efficient\navailable algorithm will usually be used.\n \nHowever, in MariaDB 10.3.6 and before, if the value of the\nold_alter_table system variable is set to ON, then the\ndefault behavior is to perform ALTER TABLE operations by\nmaking a copy of the table using the old algorithm.\n \nIn MariaDB 10.3.7 and later, the old_alter_table system\nvariable is deprecated. Instead, the alter_algorithm system\nvariable defines the default algorithm for ALTER TABLE\noperations.\n \nALGORITHM=COPY\n \nALGORITHM=COPY was introduced in MariaDB 10.0 as the name\nfor the original ALTER TABLE algorithm.\n \nWhen ALGORITHM=INPLACE is set, MariaDB essentially does the\nfollowing operations:\n \n-- Create a temporary table with the new definition\nCREATE TEMPORARY TABLE tmp_tab (\n...\n);\n \n-- Copy the data from the original table\nINSERT INTO tmp_tab\n SELECT * FROM original_tab;\n \n-- Drop the original table\nDROP TABLE original_tab;\n \n-- Rename the temporary table, so that it replaces the\noriginal one\nRENAME TABLE tmp_tab TO original_tab;\n \nThis algorithm is very inefficient, but it is generic, so it\nworks for all storage engines.\n \nIf ALGORITHM=COPY is specified, then the copy algorithm will\nbe used even if it is not necessary. This can result in a\nlengthy table copy. If multiple ALTER TABLE operations are\nrequired that each require the table to be rebuilt, then it\nis best to specify all operations in a single ALTER TABLE\nstatement, so that the table is only rebuilt once.\n \nALGORITHM=INPLACE\n \nALGORITHM=INPLACE was introduced in MariaDB 10.0.\n \nALGORITHM=COPY can be incredibly slow, because the whole\ntable has to be copied and rebuilt. ALGORITHM=INPLACE was\nintroduced as a way to avoid this by performing operations\nin-place and avoiding the table copy and rebuild, when\npossible.\n \nWhen ALGORITHM=INPLACE is set, the underlying storage engine\nuses optimizations to perform the operation while avoiding\nthe table copy and rebuild. However, INPLACE is a bit of a\nmisnomer, since some operations may still require the table\nto be rebuilt for some storage engines. Regardless, several\noperations can be performed without a full copy of the table\nfor some storage engines.\n \nA more accurate name would have been ALGORITHM=ENGINE, where\nENGINE refers to an \"engine-specific\" algorithm.\n \nIf an ALTER TABLE operation supports ALGORITHM=INPLACE, then\nit can be performed using optimizations by the underlying\nstorage engine, but it may rebuilt.\n \nSee InnoDB Online DDL Operations with ALGORITHM=INPLACE for\nmore.\n \nALGORITHM=NOCOPY\n \nALGORITHM=NOCOPY was introduced in MariaDB 10.3.7.\n \nALGORITHM=INPLACE can sometimes be surprisingly slow in\ninstances where it has to rebuild the clustered index,\nbecause when the clustered index has to be rebuilt, the\nwhole table has to be rebuilt. ALGORITHM=NOCOPY was\nintroduced as a way to avoid this. \n \nIf an ALTER TABLE operation supports ALGORITHM=NOCOPY, then\nit can be performed without rebuilding the clustered index.\n \nIf ALGORITHM=NOCOPY is specified for an ALTER TABLE\noperation that does not support ALGORITHM=NOCOPY, then an\nerror will be raised. In this case, raising an error is\npreferable, if the alternative is for the operation to\nrebuild the clustered index, and perform unexpectedly\nslowly.\n \nSee InnoDB Online DDL Operations with ALGORITHM=NOCOPY for\nmore.\n \nALGORITHM=INSTANT\n \nALGORITHM=INSTANT was introduced in MariaDB 10.3.7.\n \nALGORITHM=INPLACE can sometimes be surprisingly slow in\ninstances where it has to modify data files.\nALGORITHM=INSTANT was introduced as a way to avoid this.\n \nIf an ALTER TABLE operation supports ALGORITHM=INSTANT, then\nit can be performed without modifying any data files.\n \nIf ALGORITHM=INSTANT is specified for an ALTER TABLE\noperation that does not support ALGORITHM=INSTANT, then an\nerror will be raised. In this case, raising an error is\npreferable, if the alternative is for the operation to\nmodify data files, and perform unexpectedly slowly.\n \nSee InnoDB Online DDL Operations with ALGORITHM=INSTANT for\nmore.\n \nLOCK\n \nIn MariaDB 10.0 and later, the ALTER TABLE statement\nsupports the LOCK clause. This clause is one of the clauses\nthat is used to implement online DDL. ALTER TABLE supports\nseveral different locking strategies. A locking strategy can\nbe explicitly chosen for an ALTER TABLE operation by setting\nthe LOCK clause. The supported values are:\nDEFAULT: Acquire the least restrictive lock on the table\nthat is supported for the specific operation. Permit the\nmaximum amount of concurrency that is supported for the\nspecific operation.\nNONE: Acquire no lock on the table. Permit all concurrent\nDML. If this locking strategy is not permitted for an\noperation, then an error is raised.\nSHARED: Acquire a read lock on the table. Permit read-only\nconcurrent DML. If this locking strategy is not permitted\nfor an operation, then an error is raised.\nEXCLUSIVE: Acquire a write lock on the table. Do not permit\nconcurrent DML.\n \nDifferent storage engines support different locking\nstrategies for different operations. If a specific locking\nstrategy is chosen for an ALTER TABLE operation, and that\ntable\'s storage engine does not support that locking\nstrategy for that specific operation, then an error will be\nraised.\n \nIf the LOCK clause is not explicitly set, then the operation\nuses LOCK=DEFAULT.\n \nALTER ONLINE TABLE is equivalent to LOCK=NONE. Therefore,\nthe ALTER ONLINE TABLE statement can be used to ensure that\nyour ALTER TABLE operation allows all concurrent DML.\n \nSee InnoDB Online DDL Overview: LOCK for information on how\nthe LOCK clause affects InnoDB.\n \nProgress Reporting\n \nMariaDB provides progress reporting for ALTER TABLE\nstatement for clients\nthat support the new progress reporting protocol. For\nexample, if you were using the mysql client, then the\nprogress report might look like this::\n \nALTER TABLE test ENGINE=Aria;\nStage: 1 of 2 \'copy to tmp table\' 46% of stage\n \nThe progress report is also shown in the output of the SHOW\nPROCESSLIST statement and in the contents of the\ninformation_schema.PROCESSLIST table.\n \nSee Progress Reporting for more information.\n \nAborting ALTER TABLE Operations\n \nIf an ALTER TABLE operation is being performed and the\nconnection is killed, the changes will be rolled back in a\ncontrolled manner. The rollback can be a slow operation as\nthe time it takes is relative to how far the operation has\nprogressed.\n \nAborting ALTER TABLE ... ALGORITHM=COPY was made faster by\nremoving excessive undo logging (MDEV-11415). This\nsignificantly shortens the time it takes to abort a running\nALTER TABLE operation.\n \nExamples\n-------- \nAdding a new column:\n \nALTER TABLE t1 ADD x INT;\n \nDropping a column:\n \nALTER TABLE t1 DROP x;\n \nModifying the type of a column:\n \nALTER TABLE t1 MODIFY x bigint unsigned;\n \nChanging the name and type of a column:\n \nALTER TABLE t1 CHANGE a b bigint unsigned auto_increment;\n \nCombining multiple clauses in a single ALTER TABLE\nstatement, separated by commas:\n \nALTER TABLE t1 DROP x, ADD x2 INT, CHANGE y y2 INT;\n \nChanging the storage engine:\n \nALTER TABLE t1 ENGINE = InnoDB;\n \nRebuilding the table (the previous example will also rebuild\nthe table if it was already InnoDB):\n \nALTER TABLE t1 FORCE;\n \n\n\nURL: https://mariadb.com/kb/en/library/alter-table/','','https://mariadb.com/kb/en/library/alter-table/'),(648,'ALTER TABLESPACE',39,'The ALTER TABLESPACE statement is not supported by MariaDB.\nIt was originally inherited from MySQL NDB Cluster. In MySQL\n5.7 and later, the statement is also supported for InnoDB.\nHowever, MariaDB has chosen not to include that specific\nfeature. See MDEV-19294 for more information.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/alter-tablespace/','','https://mariadb.com/kb/en/library/alter-tablespace/'),(653,'CREATE FUNCTION',39,'Syntax\n------ \nCREATE [OR REPLACE]\n [DEFINER = {user | CURRENT_USER | role | CURRENT_ROLE }]\n [AGGREGATE] FUNCTION [IF NOT EXISTS] func_name\n([func_parameter[,...]])\n RETURNS type\n [characteristic ...]\n RETURN func_body\n \nfunc_parameter:\n param_name type\n \ntype:\n Any valid MariaDB data type\n \ncharacteristic:\n LANGUAGE SQL\n | [NOT] DETERMINISTIC\n | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL\nDATA }\n | SQL SECURITY { DEFINER | INVOKER }\n | COMMENT \'string\'\n \nfunc_body:\n Valid SQL procedure statement\n \nDescription\n----------- \nUse the CREATE FUNCTION statement to create a new stored\nfunction. You must have\nthe CREATE ROUTINE database privilege to use CREATE\nFUNCTION.\nA function takes any number of arguments and returns a value\nfrom the function body. The\nfunction body can be any valid SQL expression as you would\nuse, for example, in any select\nexpression. If you have the appropriate privileges, you can\ncall the function exactly as you\nwould any built-in function. See Security below for details\non privileges.\n \nYou can also use a variant of the CREATE FUNCTION statement\nto install a user-defined\nfunction (UDF) defined by a plugin. See CREATE FUNCTION\n(UDF)\nfor details.\n \nYou can use a SELECT statement for the function body by\nenclosing it in\nparentheses, exactly as you would to use a subselect for any\nother expression. The SELECT\nstatement must return a single value. If more than one\ncolumn is returned when the function is called,\nerror 1241 results. If more than one row is returned when\nthe function is called, error 1242\nresults. Use a LIMIT clause to ensure only one row is\nreturned.\n \nYou can also replace the RETURN clause with a BEGIN...END\ncompound\nstatement. The compound statement must contain a RETURN\nstatement. When the function is\ncalled, the RETURN statement immediately returns its result,\nand any statements after RETURN\nare effectively ignored.\n \nBy default, a function is associated with the default\ndatabase. To associate the function explicitly\nwith a given database, specify the fully-qualified name as\ndb_name.func_name\nwhen you create it. If the function name is the same as the\nname of a built-in function, you must\nuse the fully qualified name when you call it.\n \nThe parameter list enclosed within parentheses must always\nbe present.\nIf there are no parameters, an empty parameter list of ()\nshould be\nused. Parameter names are not case sensitive.\n \nEach parameter can be declared to use any valid data type,\nexcept that\nthe COLLATE attribute cannot be used.\n \nFor valid identifiers to use as function names, see\nIdentifier Names.\n \nAGGREGATE\n \nFrom MariaDB 10.3.3, it is possible to create stored\naggregate functions as well. See Stored Aggregate Functions\nfor details.\n \nRETURNS\n \nThe RETURNS clause specifies the return type of the\nfunction. NULL values are permitted with all return types.\n \nWhat happens if the RETURN clause returns a value of a\ndifferent type? It depends on the SQL_MODE in effect at the\nmoment of the function creation.\n \nIf the SQL_MODE is strict (STRICT_ALL_TABLES or\nSTRICT_TRANS_TABLES flags are specified), a 1366 error will\nbe produced.\n \nOtherwise, the value is coerced to the proper type. For\nexample, if a function\nspecifies an ENUM or SET value in the RETURNS clause, but\nthe RETURN\nclause returns an integer, the value returned from the\nfunction is the string for the corresponding ENUM\nmember of set of SET members.\n \nMariaDB stores the SQL_MODE system variable setting that is\nin effect at the\ntime a routine is created, and always executes the routine\nwith this setting in\nforce, regardless of the server SQL mode in effect when the\nroutine is invoked.\n \nLANGUAGE SQL\n \nLANGUAGE SQL is a standard SQL clause, and it can be used in\nMariaDB for portability. However that clause has no meaning,\nbecause SQL is the only supported language for stored\nfunctions.\n \nA function is deterministic if it can produce only one\nresult for a given list of parameters. If the result may be\naffected by stored data, server variables, random numbers or\nany value that is not explicitly passed, then the function\nis not deterministic. Also, a function is non-deterministic\nif it uses non-deterministic functions like NOW() or\nCURRENT_TIMESTAMP(). The optimizer may choose a faster\nexecution plan if it known that the function is\ndeterministic. In such cases, you should declare the routine\nusing the DETERMINISTIC keyword. If you want to explicitly\nstate that the function is not deterministic (which is the\ndefault) you can use the NOT DETERMINISTIC keywords.\n \nIf you declare a non-deterministic function as\nDETERMINISTIC, you may get incorrect results. If you declare\na deterministic function as NOT DETERMINISTIC, in some cases\nthe queries will be slower.\n \nOR REPLACE\n \nIf the optional OR REPLACE clause is used, it acts as a\nshortcut for:\n \nDROP FUNCTION IF EXISTS function_name;\n \nCREATE FUNCTION function_name ...;\n \nwith the exception that any existing privileges for the\nfunction are not dropped.\n \nIF NOT EXISTS\n \nIf the IF NOT EXISTS clause is used, MariaDB will return a\nwarning instead of an error if the function already exists.\nCannot be used together with OR REPLACE.\n \n[NOT] DETERMINISTIC\n \nThe [NOT] DETERMINISTIC clause also affects binary logging,\nbecause the STATEMENT format can not be used to store or\nreplicate non-deterministic statements.\n \nCONTAINS SQL, NO SQL, READS SQL DATA, and MODIFIES SQL DATA\nare informative clauses that tell the server what the\nfunction does. MariaDB does not check in any way whether the\nspecified clause is correct. If none of these clauses are\nspecified, CONTAINS SQL is used by default.\n \nMODIFIES SQL DATA\n \nMODIFIES SQL DATA means that the function contains\nstatements that may modify data stored in databases. This\nhappens if the function contains statements like DELETE,\nUPDATE, INSERT, REPLACE or DDL.\n \nREADS SQL DATA\n \nREADS SQL DATA means that the function reads data stored in\ndatabases, but does not modify any data. This happens if\nSELECT statements are used, but there no write operations\nare executed.\n \nCONTAINS SQL\n \nCONTAINS SQL means that the function contains at least one\nSQL statement, but it does not read or write any data stored\nin a database. Examples include SET or DO.\n \nNO SQL\n \nNO SQL means nothing, because MariaDB does not currently\nsupport any language other than SQL.\n \nOracle Mode\n \nFrom MariaDB 10.3, a subset of Oracle\'s PL/SQL language has\nbeen supported in addition to the traditional SQL/PSM-based\nMariaDB syntax. See Oracle mode from MariaDB 10.3 for\ndetails on changes when running Oracle mode.\n \nSecurity\n \nYou must have the EXECUTE privilege on a function to call\nit.\nMariaDB automatically grants the EXECUTE and ALTER ROUTINE\nprivileges to the\naccount that called CREATE FUNCTION, even if the DEFINER\nclause was used.\n \nEach function has an account associated as the definer. By\ndefault, the definer is the account\nthat created the function. Use the DEFINER clause to specify\na different account as the\ndefiner. You must have the SUPER privilege to use the\nDEFINER\nclause. See Account Names for details on specifying\naccounts.\n \nThe SQL SECURITY clause specifies what privileges are used\nwhen a function is called.\nIf SQL SECURITY is INVOKER, the function body will be\nevaluated using the privileges\nof the user calling the function. If SQL SECURITY is\nDEFINER, the function body is\nalways evaluated using the privileges of the definer\naccount. DEFINER is the default.\n \nThis allows you to create functions that grant limited\naccess to certain data. For example, say\nyou have a table that stores some employee information, and\nthat you\'ve granted SELECT\nprivileges only on certain columns to the user account\nroger.\n \nCREATE TABLE employees (name TINYTEXT, dept TINYTEXT, salary\nINT);\nGRANT SELECT (name, dept) ON employees TO roger;\n \nTo allow the user the get the maximum salary for a\ndepartment, define a function and grant\nthe EXECUTE privilege:\n \nCREATE FUNCTION max_salary (dept TINYTEXT) RETURNS INT\nRETURN\n (SELECT MAX(salary) FROM employees WHERE employees.dept =\ndept);\nGRANT EXECUTE ON FUNCTION max_salary TO roger;\n \nSince SQL SECURITY defaults to DEFINER, whenever the user\nroger calls\nthis function, the subselect will execute with your\nprivileges. As long as you have privileges to\nselect the salary of each employee, the caller of the\nfunction will be able to get the maximum\nsalary for each department without being able to see\nindividual salaries.\n \nCharacter sets and collations\n \nFunction return types can be declared to use any valid\ncharacter set and collation. If used, the COLLATE attribute\nneeds to be preceded by a CHARACTER SET attribute.\n \nIf the character set and collation are not specifically set\nin the statement, the database defaults at the time of\ncreation will be used. If the database defaults change at a\nlater stage, the stored function character set/collation\nwill not be changed at the same time; the stored function\nneeds to be dropped and recreated to ensure the same\ncharacter set/collation as the database is used.\n \nExamples\n-------- \nThe following example function takes a parameter, performs\nan operation using\nan SQL function, and returns the result.\n \nCREATE FUNCTION hello (s CHAR(20))\n RETURNS CHAR(50) DETERMINISTIC\n RETURN CONCAT(\'Hello, \',s,\'!\');\n \nSELECT hello(\'world\');\n+----------------+\n| hello(\'world\') |\n+----------------+\n| Hello, world! |\n+----------------+\n \nYou can use a compound statement in a function to manipulate\ndata with statements\nlike INSERT and UPDATE. The following example creates a\ncounter function\nthat uses a temporary table to store the current value.\nBecause the compound statement\ncontains statements terminated with semicolons, you have to\nfirst change the statement\ndelimiter with the DELIMITER statement to allow the\nsemicolon to be used in the\nfunction body. See Delimiters in the mysql client for more.\n \nCREATE TEMPORARY TABLE counter (c INT);\nINSERT INTO counter VALUES (0);\nDELIMITER //\nCREATE FUNCTION counter () RETURNS INT\n BEGIN\n UPDATE counter SET c = c + 1;\n \n RETURN (SELECT c FROM counter LIMIT 1);\n END //\nDELIMITER ;\n \nCharacter set and collation:\n \nCREATE FUNCTION hello2 (s CHAR(20))\n RETURNS CHAR(50) CHARACTER SET \'utf8\' COLLATE\n\'utf8_bin\' DETERMINISTIC\n RETURN CONCAT(\'Hello, \',s,\'!\');\n \n\n\nURL: https://mariadb.com/kb/en/library/create-function/','','https://mariadb.com/kb/en/library/create-function/'),(657,'CREATE PROCEDURE',39,'Syntax\n------ \nCREATE\n [OR REPLACE]\n [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]\n PROCEDURE sp_name ([proc_parameter[,...]])\n [characteristic ...] routine_body\n \nproc_parameter:\n [ IN | OUT | INOUT ] param_name type\n \ntype:\n Any valid MariaDB data type\n \ncharacteristic:\n LANGUAGE SQL\n | [NOT] DETERMINISTIC\n | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL\nDATA }\n | SQL SECURITY { DEFINER | INVOKER }\n | COMMENT \'string\'\n \nroutine_body:\n Valid SQL procedure statement\n \nDescription\n----------- \nCreates a stored procedure. By default, a routine is\nassociated with the default database. To associate the\nroutine\nexplicitly with a given database, specify the name as\ndb_name.sp_name\nwhen you create it.\n \nWhen the routine is invoked, an implicit USE db_name is\nperformed (and\nundone when the routine terminates). The causes the routine\nto have\nthe given default database while it executes. USE statements\nwithin\nstored routines are disallowed.\n \nWhen a stored procedure has been created, you invoke it by\nusing the CALL statement (see CALL).\n \nTo execute the CREATE PROCEDURE statement, it is\nnecessary to have the CREATE ROUTINE privilege. By default,\nMariaDB\nautomatically grants the ALTER ROUTINE and EXECUTE\nprivileges to the\nroutine creator. See also Stored Routine Privileges.\n \nThe DEFINER and SQL SECURITY clauses specify the security\ncontext to\nbe used when checking access privileges at routine execution\ntime, as\ndescribed later.\n \nIf the routine name is the same as the name of a built-in\nSQL\nfunction, you must use a space between the name and the\nfollowing\nparenthesis when defining the routine, or a syntax error\noccurs. This\nis also true when you invoke the routine later. For this\nreason, we\nsuggest that it is better to avoid re-using the names of\nexisting SQL\nfunctions for your own stored routines.\n \nThe IGNORE_SPACE SQL mode applies to built-in functions, not\nto stored\nroutines. It is always allowable to have spaces after a\nroutine name,\nregardless of whether IGNORE_SPACE is enabled.\n \nThe parameter list enclosed within parentheses must always\nbe present.\nIf there are no parameters, an empty parameter list of ()\nshould be\nused. Parameter names are not case sensitive.\n \nEach parameter can be declared to use any valid data type,\nexcept that\nthe COLLATE attribute cannot be used.\n \nFor valid identifiers to use as procedure names, see\nIdentifier Names.\n \nIN/OUT/INOUT\n \nEach parameter is an IN parameter by default. To specify\notherwise for\na parameter, use the keyword OUT or INOUT before the\nparameter name.\n \nAn IN parameter passes a value into a procedure. The\nprocedure might\nmodify the value, but the modification is not visible to the\ncaller\nwhen the procedure returns. An OUT parameter passes a value\nfrom the\nprocedure back to the caller. Its initial value is NULL\nwithin the\nprocedure, and its value is visible to the caller when the\nprocedure\nreturns. An INOUT parameter is initialized by the caller,\ncan be\nmodified by the procedure, and any change made by the\nprocedure is\nvisible to the caller when the procedure returns.\n \nFor each OUT or INOUT parameter, pass a user-defined\nvariable in the\nCALL statement that invokes the procedure so that you can\nobtain its\nvalue when the procedure returns. If you are calling the\nprocedure\nfrom within another stored procedure or function, you can\nalso pass a\nroutine parameter or local routine variable as an IN or\nINOUT\nparameter.\n \nDETERMINISTIC/NOT DETERMINISTIC\n \nDETERMINISTIC and NOT DETERMINISTIC apply only to functions.\nSpecifying DETERMINISTC or NON-DETERMINISTIC in procedures\nhas no effect. The default value is NOT DETERMINISTIC.\nFunctions are DETERMINISTIC when they always return the same\nvalue for the same input. For example, a truncate or\nsubstring function. Any function involving data, therefore,\nis always NOT DETERMINISTIC.\n \nCONTAINS SQL/NO SQL/READS SQL DATA/MODIFIES SQL DATA\n \nCONTAINS SQL, NO SQL, READS SQL DATA, and MODIFIES SQL DATA\nare informative clauses that tell the server what the\nfunction does. MariaDB does not check in any way whether the\nspecified clause is correct. If none of these clauses are\nspecified, CONTAINS SQL is used by default.\n \nMODIFIES SQL DATA means that the function contains\nstatements that may modify data stored in databases. This\nhappens if the function contains statements like DELETE,\nUPDATE, INSERT, REPLACE or DDL.\n \nREADS SQL DATA means that the function reads data stored in\ndatabases, but does not modify any data. This happens if\nSELECT statements are used, but there no write operations\nare executed.\n \nCONTAINS SQL means that the function contains at least one\nSQL statement, but it does not read or write any data stored\nin a database. Examples include SET or DO.\n \nNO SQL means nothing, because MariaDB does not currently\nsupport any language other than SQL.\n \nThe routine_body consists of a valid SQL procedure\nstatement. This can\nbe a simple statement such as SELECT or INSERT, or it can be\na\ncompound statement written using BEGIN and END. Compound\nstatements\ncan contain declarations, loops, and other control structure\nstatements. See Programmatic and Compound Statements for\nsyntax details.\n \nMariaDB allows routines to contain DDL statements, such as\nCREATE and\nDROP. MariaDB also allows stored procedures (but not stored\nfunctions)\nto contain SQL transaction statements such as COMMIT.\n \nFor additional information about statements that are not\nallowed in\nstored routines, see Stored Routine Limitations.\n \nInvoking stored procedure from within programs\n \nFor information about invoking stored procedures from within\nprograms written in a language that has a MariaDB/MySQL\ninterface, see CALL.\n \nOR REPLACE\n \nIf the optional OR REPLACE clause is used, it acts as a\nshortcut for:\n \nDROP PROCEDURE IF EXISTS name;\n \nCREATE PROCEDURE name ...;\n \nwith the exception that any existing privileges for the\nprocedure are not dropped.\n \nsql_mode\n \nMariaDB stores the sql_mode system variable setting that is\nin effect at the time a routine is created, and always\nexecutes the routine with this setting in force, regardless\nof the server SQL mode in effect when the routine is\ninvoked.\n \nCharacter Sets and Collations\n \nProcedure parameters can be declared with any character\nset/collation. If the character set and collation are not\nspecifically set, the database defaults at the time of\ncreation will be used. If the database defaults change at a\nlater stage, the stored procedure character set/collation\nwill not be changed at the same time; the stored procedure\nneeds to be dropped and recreated to ensure the same\ncharacter set/collation as the database is used.\n \nOracle Mode\n \nFrom MariaDB 10.3, a subset of Oracle\'s PL/SQL language has\nbeen supported in addition to the traditional SQL/PSM-based\nMariaDB syntax. See Oracle mode from MariaDB 10.3 for\ndetails on changes when running Oracle mode.\n \nExamples\n-------- \nThe following example shows a simple stored procedure that\nuses an OUT\nparameter. It uses the DELIMITER command to set a new\ndelimiter for the duration of the process — see Delimiters\nin the mysql client.\n \nDELIMITER //\n \nCREATE PROCEDURE simpleproc (OUT param1 INT)\n BEGIN\n SELECT COUNT(*) INTO param1 FROM t;\n END;\n//\n \nDELIMITER ;\n \nCALL simpleproc(@a);\n \nSELECT @a;\n+------+\n| @a |\n+------+\n| 1 |\n+------+\n \nCharacter set and collation:\n \nDELIMITER //\n \nCREATE PROCEDURE simpleproc2 (\n OUT param1 CHAR(10) CHARACTER SET \'utf8\' COLLATE\n\'utf8_bin\'\n)\n BEGIN\n SELECT CONCAT(\'a\'),f1 INTO param1 FROM t;\n END;\n//\n \nDELIMITER ;\n \nCREATE OR REPLACE:\n \nDELIMITER //\n \nCREATE PROCEDURE simpleproc2 (\n OUT param1 CHAR(10) CHARACTER SET \'utf8\' COLLATE\n\'utf8_bin\'\n)\n BEGIN\n SELECT CONCAT(\'a\'),f1 INTO param1 FROM t;\n \n END;\n \n//\nERROR 1304 (42000): PROCEDURE simpleproc2 already exists\n \nDELIMITER ;\n \nDELIMITER //\n \nCREATE OR REPLACE PROCEDURE simpleproc2 (\n OUT param1 CHAR(10) CHARACTER SET \'utf8\' COLLATE\n\'utf8_bin\'\n)\n BEGIN\n SELECT CONCAT(\'a\'),f1 INTO param1 FROM t;\n \n END;\n \n//\nERROR 1304 (42000): PROCEDURE simpleproc2 already exists\n \nDELIMITER ;\n \nQuery OK, 0 rows affected (0.03 sec)\n \n\n\nURL: https://mariadb.com/kb/en/library/create-procedure/','','https://mariadb.com/kb/en/library/create-procedure/'),(337,'ST_UNION',24,'Syntax\n------ \nST_UNION(g1,g2)\n \nDescription\n----------- \nReturns a geometry that is the union of the geometry g1 and\ngeometry g2.\n \nExamples\n-------- \nSET @g1 = GEOMFROMTEXT(\'POINT (0 2)\');\n \nSET @g2 = GEOMFROMTEXT(\'POINT (2 0)\');\n \nSELECT ASTEXT(ST_UNION(@g1,@g2));\n+---------------------------+\n| ASTEXT(ST_UNION(@g1,@g2)) |\n+---------------------------+\n| MULTIPOINT(2 0,0 2) |\n+---------------------------+\n \nSET @g1 = GEOMFROMTEXT(\'POLYGON((0 0,0 3,3 3,3 0,0 0))\');\n \nSET @g2 = GEOMFROMTEXT(\'POLYGON((2 2,4 2,4 4,2 4,2 2))\');\n \nSELECT ASTEXT(ST_UNION(@g1,@g2));\n+------------------------------------------------+\n| ASTEXT(ST_UNION(@g1,@g2)) |\n+------------------------------------------------+\n| POLYGON((0 0,0 3,2 3,2 4,4 4,4 2,3 2,3 0,0 0)) |\n+------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_union/','','https://mariadb.com/kb/en/library/st_union/'),(339,'CACHE INDEX',26,'Syntax\n------ \nCACHE INDEX \n tbl_index_list [, tbl_index_list] ...\n IN key_cache_name \n \ntbl_index_list:\n tbl_name [[INDEX|KEY] (index_name[, index_name] ...)]\n \nDescription\n----------- \nThe CACHE INDEX statement assigns table indexes to a\nspecific key\ncache. It is used only for MyISAM tables.\n \nA default key cache exists and cannot be destroyed. To\ncreate more key caches, the key_buffer_size server system\nvariable.\n \nThe associations between tables indexes and key caches are\nlost on server restart. To recreate them automatically, it\nis necessary to configure caches in a configuration file and\ninclude some CACHE INDEX (and optionally LOAD INDEX)\nstatements in the init file.\n \nExamples\n-------- \nThe following statement assigns indexes from the tables t1,\nt2, and t3\nto the key cache named hot_cache:\n \nCACHE INDEX t1, t2, t3 IN hot_cache;\n+---------+--------------------+----------+----------+\n| Table | Op | Msg_type | Msg_text |\n+---------+--------------------+----------+----------+\n| test.t1 | assign_to_keycache | status | OK |\n| test.t2 | assign_to_keycache | status | OK |\n| test.t3 | assign_to_keycache | status | OK |\n+---------+--------------------+----------+----------+\n \nImplementation (for MyISAM)\n \nNormally CACHE INDEX should not take a long time to execute.\nInternally it\'s implemented the following way:\nFind the right key cache (under\nLOCK_global_system_variables)\nOpen the table with a TL_READ_NO_INSERT lock.\nFlush the original key cache for the given file (under key\ncache lock)\nFlush the new key cache for the given file (safety)\nMove the file to the new key cache (under file share lock)\n \nThe only possible long operations are getting the locks for\nthe table and flushing the original key cache, if there were\nmany key blocks for the file in it.\n \nWe plan to also add CACHE INDEX for Aria tables if there is\na need for this.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/cache-index/','','https://mariadb.com/kb/en/library/cache-index/'),(342,'FLUSH TABLES FOR EXPORT',26,'FLUSH TABLES ... FOR EXPORT was introduced in MariaDB\n10.0.8.\n \nSyntax\n------ \nFLUSH TABLES table_name [, table_name] FOR EXPORT\n \nDescription\n----------- \nFLUSH TABLES ... FOR EXPORT flushes changes to the specified\ntables to disk so that binary copies can be made while the\nserver is still running. This works for Archive, Aria, CSV,\nInnoDB, MyISAM, MERGE, and XtraDB tables.\n \nThe table is read locked until one has issued UNLOCK TABLES.\n \nIf a storage engine does not support FLUSH TABLES FOR\nEXPORT, a 1031 error (SQLSTATE \'HY000\') is produced.\n \nIf FLUSH TABLES ... FOR EXPORT is in effect in the session,\nthe following statements will produce an error if attempted:\nFLUSH TABLES WITH READ LOCK\nFLUSH TABLES ... WITH READ LOCK\nFLUSH TABLES ... FOR EXPORT\nAny statement trying to update any table\n \nIf any of the following statements is in effect in the\nsession, attempting FLUSH TABLES ... FOR EXPORT will\nproduce an error.\nFLUSH TABLES ... WITH READ LOCK\nFLUSH TABLES ... FOR EXPORT\nLOCK TABLES ... READ\nLOCK TABLES ... WRITE\n \nFLUSH FOR EXPORT is not written to the binary log.\n \nThis statement requires the RELOAD and the LOCK TABLES\nprivileges.\n \nIf one of the specified tables cannot be locked, none of the\ntables will be locked.\n \nIf a table does not exist, an error like the following will\nbe produced:\n \nERROR 1146 (42S02): Table \'test.xxx\' doesn\'t exist\n \nIf a table is a view, an error like the following will be\nproduced:\n \nERROR 1347 (HY000): \'test.v\' is not BASE TABLE\n \nExample\n \nFLUSH TABLES test.t1 FOR EXPORT;\n# Copy files related to the table (see below)\nUNLOCK TABLES;\n \nFor a full description, please see copying MariaDB tables.\n \n\n\nURL:\nhttps://mariadb.com/kb/en/library/flush-tables-for-export/','','https://mariadb.com/kb/en/library/flush-tables-for-export/'),(343,'HELP Command',26,'Syntax\n------ \nHELP search_string\n \nDescription\n----------- \nThe HELP command can be used in any MariaDB client, such as\nthe mysql command-line client, to get basic syntax help and\na short description for most commands and functions. \n \nIf you provide an argument to the HELP command, the mysql\nclient uses it as a search string to access server-side\nhelp. The proper operation of this command requires that the\nhelp tables in the mysql database be initialized with help\ntopic information.\n \nIf there is no match for the search string, the search\nfails. Use help contents to see a list of the help\ncategories:\n \nHELP contents\nYou asked for help about help category: \"Contents\"\nFor more information, type \'help \', where is one of the\nfollowing\ncategories:\n \n Account Management\n Administration\n Compound Statements\n Data Definition\n Data Manipulation\n Data Types\n Functions\n Functions and Modifiers for Use with GROUP BY\n Geographic Features\n Language Structure\n Plugins\n Table Maintenance\n Transactions\n User-Defined Functions\n Utility\n \nIf a search string matches multiple items, MariaDB shows a\nlist of matching topics:\n \nHELP create\nMany help items for your request exist.\nTo make a more specific request, please type \'help \',\nwhere is one of the following\ntopics:\n CREATE DATABASE\n CREATE EVENT\n CREATE FUNCTION\n CREATE FUNCTION UDF\n CREATE INDEX\n CREATE PROCEDURE\n CREATE SERVER\n CREATE TABLE\n CREATE TABLESPACE\n CREATE TRIGGER\n CREATE USER\n CREATE VIEW\n SHOW\n SHOW CREATE DATABASE\n SHOW CREATE EVENT\n SHOW CREATE FUNCTION\n SHOW CREATE PROCEDURE\n SHOW CREATE TABLE\n SPATIAL\n \nThen you can enter a topic as the search string to see the\nhelp entry for that topic.\n \nThe help is provided with the MariaDB server and makes use\nof four help tables found in the mysql database:\nhelp_relation, help_topic, help_category and help_keyword.\nThese tables are populated by the mysql_install_db or\nfill_help_table.sql scripts which currently contain data\ngenerated from an old version of MySQL.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/help-command/','','https://mariadb.com/kb/en/library/help-command/'),(660,'CREATE TABLE',39,'Syntax\n------ \nCREATE [OR REPLACE] [TEMPORARY] TABLE [IF NOT EXISTS]\ntbl_name\n (create_definition,...) [table_options ]...\n[partition_options]\nCREATE [OR REPLACE] [TEMPORARY] TABLE [IF NOT EXISTS]\ntbl_name\n [(create_definition,...)] [table_options ]...\n[partition_options]\n select_statement\nCREATE [OR REPLACE] [TEMPORARY] TABLE [IF NOT EXISTS]\ntbl_name\n { LIKE old_table_name | (LIKE old_table_name) }\n \nselect_statement:\n [IGNORE | REPLACE] [AS] SELECT ... (Some legal select\nstatement)\n \nDescription\n----------- \nUse the CREATE TABLE statement to create a table with the\ngiven name.\n \nIn its most basic form, the CREATE TABLE statement provides\na table name\nfollowed by a list of columns, indexes, and constraints. By\ndefault, the table\nis created in the default database. Specify a database with\ndb_name.tbl_name.\nIf you quote the table name, you must quote the database\nname and table name\nseparately as `db_name`.`tbl_name`. This is particularly\nuseful for CREATE TABLE ... SELECT, because it allows to\ncreate a table into a database, which contains data from\nother databases. See Identifier Qualifiers.\n \nIf a table with the same name exists, error 1050 results.\nUse IF NOT EXISTS\nto suppress this error and issue a note instead. Use SHOW\nWARNINGS\nto see notes.\n \nThe CREATE TABLE statement automatically commits the current\ntransaction,\nexcept when using the TEMPORARY keyword.\n \nFor valid identifiers to use as table names, see Identifier\nNames.\n \nNote: if the default_storage_engine is set to ColumnStore\nthen it needs setting on all UMs. Otherwise when the tables\nusing the default engine are replicated across UMs they will\nuse the wrong engine. You should therefore not use this\noption as a session variable with ColumnStore.\n \nMicrosecond precision can be between 0-6. If no precision is\nspecified it is assumed to be 0, for backward compatibility\nreasons.\n \nPrivileges\n \nExecuting the CREATE TABLE statement requires the CREATE\nprivilege for the table or the database.\n \nCREATE OR REPLACE TABLE ...\n \nThe OR REPLACE clause was added in MariaDB 10.0.8.\n \nIf the OR REPLACE clause is used and if the table already\nexists, then instead of returning an error, the server will\ndrop the existing table and replace it with the newly\ndefined table.\n \nThis syntax was originally added to make replication more\nrobust if it has to rollback and repeat statements such as\nCREATE ... SELECT on slaves.\n \nCREATE OR REPLACE TABLE table_name (a int);\n \nis basically the same as:\n \nDROP TABLE IF EXISTS table_name;\nCREATE TABLE table_name (a int);\n \nwith the following exceptions:\nIf table_name was locked with LOCK TABLES it will continue\nto be locked after the statement.\nTemporary tables are only dropped if the TEMPORARY keyword\nwas used. (With DROP TABLE, temporary tables are preferred\nto be dropped before normal tables).\n \nThings to be Aware of With CREATE OR REPLACE\n \nThe table is dropped first (if it existed), after that the\nCREATE is done. Because of this, if the CREATE fails, then\nthe table will not exist anymore after the statement. If the\ntable was used with LOCK TABLES it will be unlocked.\nOne can\'t use OR REPLACE together with IF EXISTS.\nSlaves in replication will by default use CREATE OR REPLACE\nwhen replicating CREATE statements that don\'\'t use IF\nEXISTS. This can be changed by setting the variable\nslave-ddl-exec-mode to STRICT.\n \nCREATE TABLE IF NOT EXISTS ...\n \nIf the IF NOT EXISTS clause is used, then the index will\nonly be created if an index with the same name does not\nalready exist. If the index already exists, then a warning\nwill be triggered by default.\n \nCREATE TEMPORARY TABLE ...\n \nUse the TEMPORARY keyword to create a temporary table that\nis only available to your current session. Temporary tables\nare dropped when the your session ends. Temporary table\nnames are specific to your session. They will not conflict\nwith other temporary tables from other session even if they\nshare the same name. They will shadow names of non-temporary\ntables or views, if they are identical. A temporary table\ncan have the same name as a non-temporary table which is\nlocated in the same database. In that case, their name will\nreference the temporary table when used in SQL statements.\nYou must have the CREATE TEMPORARY TABLES privilege on the\ndatabase to create temporary tables. If no storage engine is\nspecified, the default_tmp_storage_engine setting will\ndetermine the engine.\n \nCREATE TABLE ... LIKE\n \nUse the LIKE clause instead of a full table definition to\ncreate a table with the same definition as another table,\nincluding columns, indexes, and table options. Foreign key\ndefinitions, as well as any DATA DIRECTORY or INDEX\nDIRECTORY table options specified on the original table,\nwill not be created.\n \nCREATE TABLE ... SELECT\n \nYou can create a table containing data from other tables\nusing the CREATE ... SELECT statement. Columns will be\ncreated in the table for each field returned by the SELECT\nquery.\n \nYou can also define some columns normally and add other\ncolumns from a SELECT. You can also create columns in the\nnormal way and assign them some values using the query, this\nis done to force a certain type or other field\ncharacteristics. The columns that are not named in the query\nwill be placed before the others. For example:\n \nCREATE TABLE test (a INT NOT NULL, b CHAR(10)) ENGINE=MyISAM\n SELECT 5 AS b, c, d FROM another_table;\n \nRemember that the query just returns data. If you want to\nuse the same indexes, or the same columns attributes ([NOT]\nNULL, DEFAULT, AUTO_INCREMENT) in the new table, you need to\nspecify them manually. Types and sizes are not automatically\npreserved if no data returned by the SELECT requires the\nfull size, and VARCHAR could be converted into CHAR. The\nCAST() function can be used to forcee the new table to use\ncertain types.\n \nAliases (AS) are taken into account, and they should always\nbe used when you SELECT an expression (function,\narithmetical operation, etc).\n \nIf an error occurs during the query, the table will not be\ncreated at all.\n \nIf the new table has a primary key or UNIQUE indexes, you\ncan use the IGNORE or REPLACE keywords to handle duplicate\nkey errors during the query. IGNORE means that the newer\nvalues must not be inserted an identical value exists in the\nindex. REPLACE means that older values must be overwritten.\n \nIf the columns in the new table are more than the rows\nreturned by the query, the columns populated by the query\nwill be placed after other columns. Note that if the strict\nSQL_MODE is on, and the columns that are not names in the\nquery do not have a DEFAULT value, an error will raise and\nno rows will be copied.\n \nConcurrent inserts are not used during the execution of a\nCREATE ... SELECT.\n \nIf the table already exists, an error similar to the\nfollowing will be returned:\n \nERROR 1050 (42S01): Table \'t\' already exists\n \nIf the IF NOT EXISTS clause is used and the table exists, a\nnote will be produced instead of an error.\n \nTo insert rows from a query into an existing table, INSERT\n... SELECT can be used.\n \nColumn Definitions\n \ncreate_definition:\n { col_name column_definition | index_definition |\nperiod_definition | CHECK (expr) }\n \ncolumn_definition:\n data_type\n [NOT NULL | NULL] [DEFAULT default_value | (expression)]\n [AUTO_INCREMENT] [ZEROFILL] [UNIQUE [KEY] | [PRIMARY] KEY]\n [INVISIBLE] [{WITH|WITHOUT} SYSTEM VERSIONING]\n [COMMENT \'string\']\n [COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}]\n [reference_definition]\n | data_type [GENERATED ALWAYS] AS { { ROW {START|END} } | {\n(expression) [VIRTUAL | PERSISTENT | STORED] } }\n [UNIQUE [KEY]] [COMMENT \'string\']\n \nconstraint_definition:\n CONSTRAINT [constraint_name] CHECK (expression)\nNote: MariaDB accepts the REFERENCES clause in ALTER TABLE\nand CREATE TABLE column definitions, but that syntax does\nnothing. MariaDB simply parses it without returning any\nerror or warning, for compatibility with other DBMS\'s.\nBefore MariaDB 10.2.1 this was also true for CHECK\nconstraints. Only the syntax for indexes described below\ncreates foreign keys.\n \nEach definition either creates a column in the table or\nspecifies and index or\nconstraint on one or more columns. See Indexes below for\ndetails\non creating indexes.\n \nCreate a column by specifying a column name and a data type,\noptionally\nfollowed by column options. See Data Types for a full list\nof data types allowed in MariaDB.\n \nNULL and NOT NULL\n \nUse the NULL or NOT NULL options to specify that values in\nthe column\nmay or may not be NULL, respectively. By default, values may\nbe NULL. See also NULL Values in MariaDB.\n \nDEFAULT Column Option\n \nThe DEFAULT clause was enhanced in MariaDB 10.2.1. Some\nenhancements include\nBLOB and TEXT columns now support DEFAULT.\nThe DEFAULT clause can now be used with an expression or\nfunction.\n \nSpecify a default value using the DEFAULT clause. If you\ndon\'t specify DEFAULT then the following rules apply:\nIf the column is not defined with NOT NULL, AUTO_INCREMENT\nor TIMESTAMP, an explicit DEFAULT NULL will be added.\nNote that in MySQL and in MariaDB before 10.1.6, you may get\nan explicit DEFAULT for primary key parts, if not specified\nwith NOT NULL.\n \nThe default value will be used if you INSERT a row without\nspecifying a value for that column, or if you specify\nDEFAULT for that column.\nBefore MariaDB 10.2.1 you couldn\'t usually provide an\nexpression or function to evaluate at\ninsertion time. You had to provide a constant default value\ninstead. The one\nexception is that you may use CURRENT_TIMESTAMP as\nthe default value for a TIMESTAMP column to use the current\ntimestamp at insertion time.\n \nCURRENT_TIMESTAMP may also be used as\nthe default value for a DATETIME\n \nFrom MariaDB 10.2.1 you can use most functions in DEFAULT.\nExpressions should have parentheses around them. If you use\na non deterministic function in DEFAULT then all inserts to\nthe table will be replicated in row mode. You can even refer\nto earlier columns in the DEFAULT expression:\n \nCREATE TABLE t1 (a int DEFAULT (1+1), b int DEFAULT (a+1));\nCREATE TABLE t2 (a bigint primary key DEFAULT UUID_SHORT());\n \nThe DEFAULT clause cannot contain any stored functions or\nsubqueries, and a column used in the clause must already\nhave been defined earlier in the statement.\n \nSince MariaDB 10.2.1, it is possible to assign BLOB or TEXT\ncolumns a DEFAULT value. In earlier versions, assigning a\ndefault to these columns was not possible.\n \nStarting from 10.3.3 you can also use DEFAULT (NEXT VALUE\nFOR sequence)\n \nAUTO_INCREMENT Column Option\n \nUse AUTO_INCREMENT to create a column whose value can\ncan be set automatically from a simple counter. You can only\nuse AUTO_INCREMENT\non a column with an integer type. The column must be a key,\nand there can only be\none AUTO_INCREMENT column in a table. If you insert a row\nwithout specifying\na value for that column (or if you specify 0, NULL, or\nDEFAULT\nas the value), the actual value will be taken from the\ncounter, with each insertion\nincrementing the counter by one. You can still insert a\nvalue explicitly. If you\ninsert a value that is greater than the current counter\nvalue, the counter is\nset based on the new value. An AUTO_INCREMENT column is\nimplicitly NOT NULL.\nUse LAST_INSERT_ID to get the AUTO_INCREMENT value\nmost recently used by an INSERT statement.\n \nZEROFILL Column Option\n \nIf the ZEROFILL column option is specified for a column\nusing a numeric data type, then the column will be set to\nUNSIGNED and the spaces used by default to pad the field are\nreplaced with zeros. ZEROFILL is ignored in expressions or\nas part of a UNION. ZEROFILL is a non-standard MySQL and\nMariaDB enhancement.\n \nPRIMARY KEY Column Option\n \nUse PRIMARY KEY (or just KEY) to make a column a primary\nkey. A primary key is a special type of a unique key. There\ncan be at most one primary key per table, and it is\nimplicitly NOT NULL.\n \nSpecifying a column as a unique key creates a unique index\non that column. See the Index Definitions section below for\nmore information.\n \nUNIQUE KEY Column Option\n \nUse UNIQUE KEY (or just UNIQUE) to specify that all values\nin the column\nmust be distinct from each other. Unless the column is NOT\nNULL, there may be\nmultiple rows with NULL in the column. \n \nSpecifying a column as a unique key creates a unique index\non that column. See the Index Definitions section below for\nmore information.\n \nCOMMENT Column Option\n \nYou can provide a comment for each column using the COMMENT\nclause. The maximum length is 1024 characters (it was 255\ncharacters before MariaDB 5.5). Use\nthe SHOW FULL COLUMNS statement to see column comments.\n \nGenerated Columns\n \nA generated column is a column in a table that cannot\nexplicitly be set to a specific value in a DML query.\nInstead, its value is automatically generated based on an\nexpression. This expression might generate the value based\non the values of other columns in the table, or it might\ngenerate the value by calling built-in functions or\nuser-defined functions (UDFs).\n \nThere are two types of generated columns:\nPERSISTENT or STORED: This type\'s value is actually stored\nin the table.\nVIRTUAL: This type\'s value is not stored at all. Instead,\nthe value is generated dynamically when the table is\nqueried. This type is the default.\n \nGenerated columns are also sometimes called computed columns\nor virtual columns.\n \nFor a complete description about generated columns and their\nlimitations, see Generated (Virtual and Persistent/Stored)\nColumns.\n \nCOLUMN_FORMAT\n \nCOLUMN_FORMAT is only used by MySQL Cluster, and is silently\nignored in MariaDB.\n \nCOMPRESSED\n \nCertain columns may be compressed. See Storage-Engine\nIndependent Column Compression.\n \nINVISIBLE\n \nColumns may be made invisible, and hidden in certain\ncontexts. See Invisible Columns.\n \nWITH SYSTEM VERSIONING Column Option\n \nColumns may be explicitly marked as included from system\nversioning. See System-versioned tables for details.\n \nWITHOUT SYSTEM VERSIONING Column Option\n \nColumns may be explicitly marked as excluded from system\nversioning. See System-versioned tables for details.\n \nIndex Definitions\n \nindex_definition:\n {INDEX|KEY} [index_name] [index_type] (index_col_name,...)\n[index_option] ...\n | {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name]\n(index_col_name,...) [index_option] ...\n | [CONSTRAINT [symbol]] PRIMARY KEY [index_type]\n(index_col_name,...) [index_option] ...\n | [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name]\n[index_type] (index_col_name,...) [index_option] ...\n | [CONSTRAINT [symbol]] FOREIGN KEY [index_name]\n(index_col_name,...) reference_definition\n \nindex_col_name:\n col_name [(length)] [ASC | DESC]\n \nindex_type:\n USING {BTREE | HASH | RTREE}\n \nindex_option:\n KEY_BLOCK_SIZE [=] value\n | index_type\n | WITH PARSER parser_name\n | COMMENT \'string\'\n | CLUSTERING={YES| NO}\n \nreference_definition:\n REFERENCES tbl_name (index_col_name,...)\n [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]\n [ON DELETE reference_option]\n [ON UPDATE reference_option]\n \nreference_option:\n RESTRICT | CASCADE | SET NULL | NO ACTION\nINDEX and KEY are synonyms. \n \nIndex names are optional, if not specified an automatic name\nwill be assigned. Index name are needed to drop indexes and\nappear in error messages when a constraint is violated.\n \nIndex Categories\n \nPlain Indexes\n \nPlain indexes are regular indexes that are not unique, and\nare not acting as a primary key or a foreign key. They are\nalso not the \"specialized\" FULLTEXT or SPATIAL indexes.\n \nSee Getting Started with Indexes: Plain Indexes for more\ninformation.\n \nPRIMARY KEY\n \nFor PRIMARY KEY indexes, you can specify a name for the\nindex, but it is silently ignored, and the name of the index\nis always PRIMARY.\n \nSee Getting Started with Indexes: Primary Key for more\ninformation.\n \nUNIQUE\n \nThe UNIQUE keyword means that the index will not accept\nduplicated values, except for NULLs. An error will raise if\nyou try to insert duplicate values in a UNIQUE index.\n \nFor UNIQUE indexes, you can specify a name for the\nconstraint, using the CONSTRAINT keyword. That name will be\nused in error messages.\n \nSee Getting Started with Indexes: Unique Index for more\ninformation.\n \nFOREIGN KEY\n \nFor FOREIGN KEY indexes, a reference definition must be\nprovided.\n \nFor FOREIGN KEY indexes, you can specify a name for the\nconstraint, using the CONSTRAINT keyword. That name will be\nused in error messages.\n \nFirst, you have to specify the name of the target (parent)\ntable and a column or a column list which must be indexed\nand whose values must match to the foreign key\'s values.\nThe MATCH clause is accepted to improve the compatibility\nwith other DBMS\'s, but has no meaning in MariaDB. The ON\nDELETE and ON UPDATE clauses specify what must be done when\na DELETE (or a REPLACE) statements attempts to delete a\nreferenced row from the parent table, and when an UPDATE\nstatement attempts to modify the referenced foreign key\ncolumns in a parent table row, respectively. The following\noptions are allowed:\nRESTRICT: The delete/update operation is not performed. The\nstatement terminates with a 1451 error (SQLSTATE \'2300\').\nNO ACTION: Synonym for RESTRICT.\nCASCADE: The delete/update operation is performed in both\ntables.\nSET NULL: The update or delete goes ahead in the parent\ntable, and the corresponding foreign key fields in the child\ntable are set to NULL. (They must not be defined as NOT NULL\nfor this to succeed).\nSET DEFAULT: This option is currently implemented only for\nthe PBXT storage engine, which is disabled by default and no\nlonger maintained. It sets the child table\'s foreign key\nfields to their DEFAULT values when the referenced parent\ntable key entries are updated or deleted.\n \nIf either clause is omitted, the default behavior for the\nomitted clause is RESTRICT.\n \nSee Foreign Keys for more information.\n \nFULLTEXT\n \nUse the FULLTEXT keyword to create full-text indexes.\n \nSee Full-Text Indexes for more information.\n \nSPATIAL\n \nUse the SPATIAL keyword to create geometric indexes.\n \nSee SPATIAL INDEX for more information.\n \nIndex Options\n \nKEY_BLOCK_SIZE Index Option\n \nThe KEY_BLOCK_SIZE index option is similar to the\nKEY_BLOCK_SIZE table option.\n \nWith the InnoDB storage engine, if you specify a non-zero\nvalue for the KEY_BLOCK_SIZE table option for the whole\ntable, then the table will implicitly be created with the\nROW_FORMAT table option set to COMPRESSED. However, this\ndoes not happen if you just set the KEY_BLOCK_SIZE index\noption for one or more indexes in the table. The InnoDB\nstorage engine ignores the KEY_BLOCK_SIZE index option.\nHowever, the SHOW CREATE TABLE statement may still report it\nfor the index.\n \nFor information about the KEY_BLOCK_SIZE index option, see\nthe KEY_BLOCK_SIZE table option below.\n \nIndex Types\n \nEach storage engine supports some or all index types. See\nStorage Engine Index Types for details on permitted index\ntypes for each storage engine.\n \nDifferent index types are optimized for different kind of\noperations:\nBTREE is the default type, and normally is the best choice.\nIt is supported by all storage engines. It can be used to\ncompare a column\'s value with a value using the =, >, >=,\n0) ,b int check (b> 0), constraint abc check (a>b));\n \nIf you use the second format and you don\'t give a name to\nthe constraint, then the constraint will get a auto\ngenerated name. This is done so that you can later delete\nthe constraint with ALTER TABLE DROP constraint_name.\n \nOne can disable all constraint expression checks by setting\nthe variable check_constraint_checks to OFF. This is useful\nfor example when loading a table that violates some\nconstraints that you want to later find and fix in SQL.\n \nSee CONSTRAINT for more information.\n \nTable Options\n \nFor each individual table you create (or alter), you can set\nsome table options. The general syntax for setting options\nis:\n \n = , [ = ...]\n \nThe equal sign is optional.\n \nSome options are supported by the server and can be used for\nall tables, no matter what storage engine they use; other\noptions can be specified for all storage engines, but have a\nmeaning only for some engines. Also, engines can extend\nCREATE TABLE with new options.\n \nIf the IGNORE_BAD_TABLE_OPTIONS SQL_MODE is enabled, wrong\ntable options generate a warning; otherwise, they generate\nan error.\n \ntable_option: \n [STORAGE] ENGINE [=] engine_name\n | AUTO_INCREMENT [=] value\n | AVG_ROW_LENGTH [=] value\n | [DEFAULT] CHARACTER SET [=] charset_name\n | CHECKSUM [=] {0 | 1}\n | [DEFAULT] COLLATE [=] collation_name\n | COMMENT [=] \'string\'\n | CONNECTION [=] \'connect_string\'\n | DATA DIRECTORY [=] \'absolute path to directory\'\n | DELAY_KEY_WRITE [=] {0 | 1}\n | ENCRYPTED [=] {YES | NO}\n | ENCRYPTION_KEY_ID [=] value\n | IETF_QUOTES [=] {YES | NO}\n | INDEX DIRECTORY [=] \'absolute path to directory\'\n | INSERT_METHOD [=] { NO | FIRST | LAST }\n | KEY_BLOCK_SIZE [=] value\n | MAX_ROWS [=] value\n | MIN_ROWS [=] value\n | PACK_KEYS [=] {0 | 1 | DEFAULT}\n | PAGE_CHECKSUM [=] {0 | 1}\n | PAGE_COMPRESSED [=] {0 | 1}\n | PAGE_COMPRESSION_LEVEL [=] {0 .. 9}\n | PASSWORD [=] \'string\'\n | ROW_FORMAT [=]\n{DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT|PAGE}\n | SEQUENCE [=] {0|1}\n | STATS_AUTO_RECALC [=] {DEFAULT|0|1}\n | STATS_PERSISTENT [=] {DEFAULT|0|1}\n | STATS_SAMPLE_PAGES [=] {DEFAULT|value}\n | TABLESPACE tablespace_name\n | TRANSACTIONAL [=] {0 | 1}\n | UNION [=] (tbl_name[,tbl_name]...)\n | WITH SYSTEM VERSIONING\n \n[STORAGE] ENGINE\n \n[STORAGE] ENGINE specifies a storage engine for the table.\nIf this option is not used, the default storage engine is\nused instead. That is, the default_storage_engine session option\nvalue if it is set, or the value specified for the\n--default-storage-engine mysqld startup options, or InnoDB.\nIf the specified storage engine is not installed and active,\nthe default value will be used, unless the\nNO_ENGINE_SUBSTITUTION SQL MODE is set (default since\nMariaDB 10.0). This is only true for CREATE TABLE, not for\nALTER TABLE. For a list of storage engines that are present\nin your server, issue a SHOW ENGINES.\n \nAUTO_INCREMENT\n \nAUTO_INCREMENT specifies the initial value for the\nAUTO_INCREMENT primary key. This works for MyISAM, Aria,\nInnoDB/XtraDB, MEMORY, and ARCHIVE tables. You can change\nthis option with ALTER TABLE, but in that case the new value\nmust be higher than the highest value which is present in\nthe AUTO_INCREMENT column. If the storage engine does not\nsupport this option, you can insert (and then delete) a row\nhaving the wanted value - 1 in the AUTO_INCREMENT column.\n \nAVG_ROW_LENGTH\n \nAVG_ROW_LENGTH is the average rows size. It only applies to\ntables using MyISAM and Aria storage engines that have the\nROW_FORMAT table option set to FIXED format.\n \nMyISAM uses MAX_ROWS and AVG_ROW_LENGTH to decide the\nmaximum size of a table (default: 256TB, or the maximum file\nsize allowed by the system).\n \n[DEFAULT] CHARACTER SET/CHARSET\n \n[DEFAULT] CHARACTER SET (or [DEFAULT] CHARSET) is used to\nset a default character set for the table. This is the\ncharacter set used for all columns where an explicit\ncharacter set is not specified. If this option is omitted or\nDEFAULT is specified, database\'s default character set will\nbe used. See Setting Character Sets and Collations for\ndetails on setting the character sets.\n \nCHECKSUM/TABLE_CHECKSUM\n \nCHECKSUM (or TABLE_CHECKSUM) can be set to 1 to maintain a\nlive checksum for all table\'s rows. This makes write\noperations slower, but CHECKSUM TABLE will be very fast.\nThis option is only supported for MyISAM and Aria tables.\n \n[DEFAULT] COLLATE\n \n[DEFAULT] COLLATE is used to set a default collation for the\ntable. This is the collation used for all columns where an\nexplicit character set is not specified. If this option is\nomitted or DEFAULT is specified, database\'s default option\nwill be used. See Setting Character Sets and Collations for\ndetails on setting the collations\n \nCOMMENT\n \nCOMMENT is a comment for the table. Maximum length is 2048\ncharacters (before mariaDB 5.5 it was 60 characters). Also\nused to define table parameters when creating a Spider\ntable.\n \nCONNECTION\n \nCONNECTION is used to specify a server name or a connection\nstring for a Spider, CONNECT, Federated or FederatedX table.\n \nDATA DIRECTORY/INDEX DIRECTORY\n \nDATA DIRECTORY and INDEX DIRECTORY were only supported for\nMyISAM and Aria, before MariaDB 5.5. Since 5.5, DATA\nDIRECTORY has also been supported by InnoDB if the\ninnodb_file_per_table server system variable is enabled, but\nonly in CREATE TABLE, not in ALTER TABLE. So, carefully\nchoose a path for InnoDB tables at creation time, because it\ncannot be changed without dropping and re-creating the\ntable. These options specify the paths for data files and\nindex files, respectively. If these options are omitted, the\ndatabase\'s directory will be used to store data files and\nindex files. Note that these table options do not work for\npartitioned tables (use the partition options instead), or\nif the server has been invoked with the\n--skip-symbolic-links startup option. To avoid the\noverwriting of old files with the same name that could be\npresent in the directories, you can use the\n--keep_files_on_create option (an error will be issued if\nfiles already exist). These options are ignored if the\nNO_DIR_IN_CREATE SQL_MODE is enabled (useful for replication\nslaves). Also note that symbolic links cannot be used for\nInnoDB tables.\n \nDATA DIRECTORY works by creating symlinks from where the\ntable would normally have been (inside the datadir) to where\nthe option specifies. For security reasons, to avoid\nbypassing the privilege system, the server does not permit\nsymlinks inside the datadir. Therefore, DATA DIRECTORY\ncannot be used to specify a location inside the datadir. An\nattempt to do so will result in an error 1210 (HY000)\nIncorrect arguments to DATA DIRECTORY.\n \nDELAY_KEY_WRITE\n \nDELAY_KEY_WRITE is supported by MyISAM and Aria, and can be\nset to 1 to speed up write operations. In that case, when\ndata are modified, the indexes are not updated until the\ntable is closed. Writing the changes to the index file\naltogether can be much faster. However, note that this\noption is applied only if the delay_key_write server\nvariable is set to \'ON\'. If it is \'OFF\' the delayed\nindex writes are always disabled, and if it is \'ALL\' the\ndelayed index writes are always used, disregarding the value\nof DELAY_KEY_WRITE.\n \nENCRYPTED\n \nThe ENCRYPTED table option was added in MariaDB 10.1.4\n \nThe ENCRYPTED table option can be used to manually set the\nencryption status of an InnoDB table. See InnoDB / XtraDB\nEncryption for more information.\n \nAria does not currently support the ENCRYPTED table option.\nSee MDEV-18049 about that.\n \nSee Data-at-Rest Encryption for more information.\n \nENCRYPTION_KEY_ID\n \nThe ENCRYPTION_KEY_ID table option was added in MariaDB\n10.1.4\n \nThe ENCRYPTION_KEY_ID table option can be used to manually\nset the encryption key of an InnoDB table. See InnoDB /\nXtraDB Encryption for more information.\n \nAria does not currently support the ENCRYPTION_KEY_ID table\noption. See MDEV-18049 about that.\n \nSee Data-at-Rest Encryption for more information.\n \nIETF_QUOTES\n \nThe IETF_QUOTES option was added in MariaDB 10.1.8\n \nFor the CSV storage engine, the IETF_QUOTES option, when set\nto YES, enables IETF-compatible parsing of embedded quote\nand comma characters. Enabling this option for a table\nimproves compatibility with other tools that use CSV, but is\nnot compatible with MySQL CSV tables, or MariaDB CSV tables\ncreated without this option. Disabled by default.\n \nINSERT_METHOD\n \nINSERT_METHOD is only used with MERGE tables. This option\ndetermines in which underlying table the new rows should be\ninserted. If you set it to \'NO\' (which is the default) no\nnew rows can be added to the table (but you will still be\nable to perform INSERTs directly against the underlying\ntables). FIRST means that the rows are inserted into the\nfirst table, and LAST means that thet are inserted into the\nlast table.\n \nKEY_BLOCK_SIZE\n \nKEY_BLOCK_SIZE is used to determine the size of key blocks,\nin bytes or kilobytes. However, this value is just a hint,\nand the storage engine could modify or ignore it. If\nKEY_BLOCK_SIZE is set to 0, the storage engine\'s default\nvalue will be used.\n \nWith the InnoDB storage engine, if you specify a non-zero\nvalue for the KEY_BLOCK_SIZE table option for the whole\ntable, then the table will implicitly be created with the\nROW_FORMAT table option set to COMPRESSED.\n \nMIN_ROWS/MAX_ROWS\n \nMIN_ROWS and MAX_ROWS let the storage engine know how many\nrows you are planning to store as a minimum and as a\nmaximum. These values will not be used as real limits, but\nthey help the storage engine to optimize the table. MIN_ROWS\nis only used by MEMORY storage engine to decide the minimum\nmemory that is always allocated. MAX_ROWS is used to decide\nthe minimum size for indexes.\n \nPACK_KEYS\n \nPACK_KEYS can be used to determine whether the indexes will\nbe compressed. Set it to 1 to compress all keys. With a\nvalue of 0, compression will not be used. With the DEFAULT\nvalue, only long strings will be compressed. Uncompressed\nkeys are faster.\n \nPAGE_CHECKSUM\n \nPAGE_CHECKSUM is only applicable to Aria tables, and\ndetermines whether indexes and data should use page\nchecksums for extra safety. \n \nPAGE_COMPRESSED\n \nPAGE_COMPRESSED is used to enable InnoDB page compression\nfor InnoDB tables.\n \nPAGE_COMPRESSION_LEVEL\n \nPAGE_COMPRESSION_LEVEL is used to set the compression level\nfor InnoDB page compression for InnoDB tables. The table\nmust also have the PAGE_COMPRESSED table option set to 1.\n \nValid values for PAGE_COMPRESSION_LEVEL are 1 (the best\nspeed) through 9 (the best compression), .\n \nPASSWORD\n \nPASSWORD is unused.\n \nRAID_TYPE\n \nRAID_TYPE is an obsolete option, as the raid support has\nbeen disabled since MySQL 5.0.\n \nROW_FORMAT\n \nThe ROW_FORMAT table option specifies the row format for the\ndata file. Possible values are engine-dependent.\n \nSupported MyISAM Row Formats\n \nFor MyISAM, the supported row formats are: \nFIXED\nDYNAMIC\nCOMPRESSED\n \nThe COMPRESSED row format can only be set by the myisampack\ncommand line tool.\n \nSee MyISAM Storage Formats for more information.\n \nSupported Aria Row Formats\n \nFor Aria, the supported row formats are:\nPAGE\nFIXED\nDYNAMIC.\n \nSee Aria Storage Formats for more information.\n \nSupported InnoDB Row Formats\n \nFor InnoDB/XtraDB, the supported row formats are:\nCOMPACT\nREDUNDANT\nCOMPRESSED\nDYNAMIC.\n \nIf the ROW_FORMAT table option is set to FIXED for an InnoDB\ntable, then the server will either return an error or a\nwarning depending on the value of the innodb_strict_mode\nsystem variable. If the innodb_strict_mode system variable\nis set to OFF, then a warning is issued, and MariaDB will\ncreate the table using the default row format for the\nspecific MariaDB server version. If the innodb_strict_mode\nsystem variable is set to ON, then an error will be raised.\n \nSee XtraDB/InnoDB Storage Formats for more information.\n \nOther Storage Engines and ROW_FORMAT\n \nOther storage engines do not support the ROW_FORMAT table\noption.\n \nSEQUENCE\n \nIf the table is a sequence, then it will have the SEQUENCE\nset to 1.\n \nSTATS_AUTO_RECALC\n \nSTATS_AUTO_RECALC is available only in MariaDB 10.0+. It\nindicates whether to automatically recalculate persistent\nstatistics (see STATS_PERSISTENT, below) for an InnoDB\ntable.\nIf set to 1, statistics will be recalculated when more than\n10% of the data has changed. When set to 0, stats will be\nrecalculated only when an ANALYZE TABLE is run. If set to\nDEFAULT, or left out, the value set by the\ninnodb_stats_auto_recalc system variable applies. See InnoDB\nPersistent Statistics.\n \nSTATS_PERSISTENT\n \nSTATS_PERSISTENT is available only in MariaDB 10.0+. It\nindicates whether the InnoDB statistics created by ANALYZE\nTABLE will remain on disk or not. It can be set to 1 (on\ndisk), 0 (not on disk, the pre-MariaDB 10 behavior), or\nDEFAULT (the same as leaving out the option), in which case\nthe value set by the innodb_stats_persistent system variable\nwill apply. Persistent statistics stored on disk allow the\nstatistics to survive server restarts, and provide better\nquery plan stability. See InnoDB Persistent Statistics.\n \nSTATS_SAMPLE_PAGES\n \nSTATS_SAMPLE_PAGES is available only in MariaDB 10.0+. It\nindicates how many pages are used to sample index\nstatistics. If 0 or DEFAULT, the default value, the\ninnodb_stats_sample_pages value is used. See InnoDB\nPersistent Statistics.\n \nTRANSACTIONAL\n \nTRANSACTIONAL is only applicable for Aria tables. In future\nAria tables created with this option will be fully\ntransactional, but currently this provides a form of crash\nprotection. See Aria Storage Engine for more details.\n \nUNION\n \nUNION must be specified when you create a MERGE table. This\noption contains a comma-separated list of MyISAM tables\nwhich are accessed by the new table. The list is enclosed\nbetween parenthesis. Example: UNION = (t1,t2)\n \nWITH SYSTEM VERSIONING\n \nWITH SYSTEM VERSIONING is used for creating System-versioned\ntables.\n \nPartitions\n \npartition_options:\n PARTITION BY\n { [LINEAR] HASH(expr)\n | [LINEAR] KEY(column_list)\n | RANGE(expr)\n | LIST(expr)\n | SYSTEM_TIME [INTERVAL time_quantity time_unit] [LIMIT\nnum] }\n [PARTITIONS num]\n [SUBPARTITION BY\n { [LINEAR] HASH(expr)\n | [LINEAR] KEY(column_list) }\n [SUBPARTITIONS num]\n ]\n [(partition_definition [, partition_definition] ...)]\n \npartition_definition:\n PARTITION partition_name\n [VALUES {LESS THAN {(expr) | MAXVALUE} | IN (value_list)}]\n [[STORAGE] ENGINE [=] engine_name]\n [COMMENT [=] \'comment_text\' ]\n [DATA DIRECTORY [=] \'data_dir\']\n [INDEX DIRECTORY [=] \'index_dir\']\n [MAX_ROWS [=] max_number_of_rows]\n [MIN_ROWS [=] min_number_of_rows]\n [TABLESPACE [=] tablespace_name]\n [NODEGROUP [=] node_group_id]\n [(subpartition_definition [, subpartition_definition] ...)]\n \nsubpartition_definition:\n SUBPARTITION logical_name\n [[STORAGE] ENGINE [=] engine_name]\n [COMMENT [=] \'comment_text\' ]\n [DATA DIRECTORY [=] \'data_dir\']\n [INDEX DIRECTORY [=] \'index_dir\']\n [MAX_ROWS [=] max_number_of_rows]\n [MIN_ROWS [=] min_number_of_rows]\n [TABLESPACE [=] tablespace_name]\n [NODEGROUP [=] node_group_id]\nIf the PARTITION BY clause is used, the table will be\npartitioned. A partition method must be explicitly indicated\nfor partitions and subpartitions. Partition methods are:\n[LINEAR] HASH creates a hash key which will be used to read\nand write rows. The partition function can be any valid SQL\nexpression which returns an INTEGER number. Thus, it is\npossible to use the HASH method on an integer column, or on\nfunctions which accept integer columns as an argument.\nHowever, VALUES LESS THAN and VALUES IN clauses can not be\nused with HASH. An example:\n \nCREATE TABLE t1 (a INT, b CHAR(5), c DATETIME)\n PARTITION BY HASH ( YEAR(c) );\n \n [LINEAR] HASH can be used for subpartitions, too.\n[LINEAR] KEY is similar to HASH, but the index has an even\ndistribution of data. Also, the expression can only be a\ncolumn or a list of columns. VALUES LESS THAN and VALUES IN\nclauses can not be used with KEY.\nRANGE partitions the rows using on a range of values, using\nthe VALUES LESS THAN operator. VALUES IN is not allowed with\nRANGE. The partition function can be any valid SQL\nexpression which returns a single value.\nLIST assignes partitions based on a table\'s column with a\nrestricted set of possible values. It is similar to RANGE,\nbut VALUES IN must be used for at least 1 columns, and\nVALUES LESS THAN is disallowed.\nSYSTEM_TIME partitioning is used for System-versioned tables\nto store historical data separately from current data.\n \nOnly HASH and KEY can be used for subpartitions, and they\ncan be [LINEAR].\n \nIt is possible to define up to 1024 partitions and\nsubpartitions.\n \nThe number of defined partitions can be optionally specified\nas PARTITION count. This can be done to avoid specifying all\npartitions individually. But you can also declare each\nindividual partition and, additionally, specify a PARTITIONS\ncount clause; in the case, the number of PARTITIONs must\nequal count.\n \nAlso see Partitioning Types Overview.\n \nSequences\n \nCREATE TABLE can also be used to create a SEQUENCE. See\nCREATE SEQUENCE and Sequence Overview.\n \nExamples\n-------- \ncreate table if not exists test (\na bigint auto_increment primary key,\nname varchar(128) charset utf8,\nkey name (name(32))\n) engine=InnoDB default charset latin1;\n \nThis example shows a couple of things:\nUsage of IF NOT EXISTS; If the table already existed, it\nwill not be created. There will not be any error for the\nclient, just a warning.\nHow to create a PRIMARY KEY that is automatically generated.\nHow to specify a table-specific character set and another\nfor a column.\nHow to create an index (name) that is only partly indexed\n(to save space).\n \nThe following clauses will work from MariaDB 10.2.1 only.\n \nCREATE TABLE t1(\n a int DEFAULT (1+1),\n b int DEFAULT (a+1),\n expires DATETIME DEFAULT(NOW() + INTERVAL 1 YEAR),\n x BLOB DEFAULT USER()\n);\n \n\n\nURL: https://mariadb.com/kb/en/library/create-table/','','https://mariadb.com/kb/en/library/create-table/'),(661,'CREATE TABLESPACE',39,'The CREATE TABLESPACE statement is not supported by MariaDB.\nIt was originally inherited from MySQL NDB Cluster. In MySQL\n5.7 and later, the statement is also supported for InnoDB.\nHowever, MariaDB has chosen not to include that specific\nfeature. See MDEV-19294 for more information.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/create-tablespace/','','https://mariadb.com/kb/en/library/create-tablespace/'),(340,'FLUSH',26,'Syntax\n------ \nFLUSH [NO_WRITE_TO_BINLOG | LOCAL]\n flush_option [, flush_option] ...\n \nor when flushing tables:\n \nFLUSH [NO_WRITE_TO_BINLOG | LOCAL] TABLES [table_list]\n[table_flush_option]\n \nwhere table_list is a list of tables separated by , (comma).\n \nDescription\n----------- \nThe FLUSH statement clears or reloads various internal\ncaches used by\nMariaDB. To execute FLUSH, you must have the RELOAD\nprivilege. See GRANT.\n \nThe RESET statement is similar to FLUSH. See\nRESET.\n \nYou cannot issue a FLUSH statement from within a stored\nfunction or a trigger. Doing so within a stored procedure is\npermitted, as long as it is not called by a stored function\nor trigger. See Stored Routine Limitations, Stored Function\nLimitations and Trigger Limitations.\n \nIf a listed table is a view, an error like the following\nwill be produced:\n \nERROR 1347 (HY000): \'test.v\' is not BASE TABLE\n \nBy default, FLUSH statements are written to the binary log\nand will be replicated. The NO_WRITE_TO_BINLOG keyword\n(LOCAL is an alias) will ensure the statement is not written\nto the binary log. \n \nThe different flush options are:\n \nOption | Description | \n \nCHANGED_PAGE_BITMAPS | Internal command used for backup\npurposes. See the Information Schema CHANGED_PAGE_BITMAPS\nTable. | \n \nCLIENT_STATISTICS | Reset client statistics (see SHOW\nCLIENT_STATISTICS). | \n \nDES_KEY_FILE | Reloads the DES key file (Specified with the\n--des-key-file startup option). | \n \nHOSTS | Flush the hostname cache (used for converting ip to\nhost names and for unblocking blocked hosts. See\nmax_connect_errors) | \n \nINDEX_STATISTICS | Reset index statistics (see SHOW\nINDEX_STATISTICS). | \n \n[ERROR | ENGINE | GENERAL | SLOW | BINARY | RELAY] LOGS |\nClose and reopen the specified log type, or all log types if\nnone are specified. FLUSH RELAY LOGS [connection-name] can\nbe used to flush the relay logs for a specific connection.\nOnly one connection can be specified per FLUSH command. See\nMulti-source replication. FLUSH ENGINE LOGS will delete all\nunneeded Aria redo logs. | \n \nMASTER | Deprecated option, use RESET MASTER instead. | \n \nPRIVILEGES | Reload all privileges from the privilege tables\nin the mysql database. If the server is started with\n--skip-grant-table option, this will activate the privilege\ntables again. | \n \nQUERY CACHE | Defragment the query cache to better utilize\nits memory. If you want to reset the query cache, you can do\nit with RESET QUERY CACHE. | \n \nQUERY_RESPONSE_TIME | See the QUERY_RESPONSE_TIME plugin. | \n \nSLAVE | Deprecated option, use RESET SLAVE instead. | \n \nSSL | Used to dynamically reinitialize the server\'s TLS\ncontext by reloading the files defined by several TLS system\nvariables. See FLUSH SSL for more information. This command\nwas first added in MariaDB 10.4.1. | \n \nSTATUS | Resets all server status variables that can be\nreset to 0. Not all global status variables support this, so\nnot all global values are reset. See FLUSH STATUS for more\ninformation. | \n \nTABLE | Close tables given as options or all open tables if\nno table list was used. From MariaDB 10.4.1, using without\nany table list will only close tables not in use, and tables\nnot locked by the FLUSH TABLES connection. If there are no\nlocked tables, FLUSH TABLES will be instant and will not\ncause any waits, as it no longer waits for tables in use.\nWhen a table list is provided, from MariaDB 10.4.1, the\nserver will wait for the end of any transactions that are\nusing the tables. Previously, FLUSH TABLES only waited for\nthe statements to complete. | \n \nTABLES | Same as FLUSH TABLE. | \n \nTABLES ... FOR EXPORT | For InnoDB tables, flushes table\nchanges to disk to permit binary table copies while the\nserver is running. Introduced in MariaDB 10.0.8. See FLUSH\nTABLES ... FOR EXPORT for more. | \n \nTABLES WITH READ LOCK | Closes all open tables. New tables\nare only allowed to be opened with read locks until an\nUNLOCK TABLES is given. | \n \nTABLES WITH READ LOCK AND DISABLE CHECKPOINT | As TABLES\nWITH READ LOCK but also disable all checkpoint writes by\ntransactional table engines. This is useful when doing a\ndisk snapshot of all tables. | \n \nTABLE_STATISTICS | Reset table statistics (see SHOW\nTABLE_STATISTICS). | \n \nUSER_RESOURCES | Resets all per hour user resources. This\nenables clients that have exhausted their resources to\nconnect again. | \n \nUSER_STATISTICS | Reset user statistics (see SHOW\nUSER_STATISTICS). | \n \nYou can also use the mysqladmin client to flush things. Use\nmysqladmin --help to examine what flush commands it\nsupports.\n \nFLUSH STATUS\n \nServer status variables can be reset by executing the\nfollowing:\n \nFLUSH STATUS;\n \nGlobal Status Variables that Support FLUSH STATUS\n \nNot all global status variables support being reset by FLUSH\nSTATUS. Currently, the following status variables are reset\nby FLUSH STATUS:\nAborted_clients\nAborted_connects\nAria_pagecache_blocks_not_flushed\nAria_pagecache_blocks_unused\nAria_pagecache_blocks_used\nBinlog_cache_disk_use\nBinlog_cache_use\nBinlog_stmt_cache_disk_use\nBinlog_stmt_cache_use\nConnection_errors_accept\nConnection_errors_internal\nConnection_errors_max_connections\nConnection_errors_peer_address\nConnection_errors_select\nConnection_errors_tcpwrap\nCreated_tmp_files\nDelayed_errors\nDelayed_writes\nFeature_check_constraint\nFeature_delay_key_write\nMax_used_connections\nOpened_plugin_libraries\nPerformance_schema_accounts_lost\nPerformance_schema_cond_instances_lost\nPerformance_schema_digest_lost\nPerformance_schema_file_handles_lost\nPerformance_schema_file_instances_lost\nPerformance_schema_hosts_lost\nPerformance_schema_locker_lost\nPerformance_schema_mutex_instances_lost\nPerformance_schema_rwlock_instances_lost\nPerformance_schema_session_connect_attrs_lost\nPerformance_schema_socket_instances_lost\nPerformance_schema_stage_classes_lost\nPerformance_schema_statement_classes_lost\nPerformance_schema_table_handles_lost\nPerformance_schema_table_instances_lost\nPerformance_schema_thread_instances_lost\nPerformance_schema_users_lost\nQcache_hits\nQcache_inserts\nQcache_lowmem_prunes\nQcache_not_cached\nRpl_semi_sync_master_no_times\nRpl_semi_sync_master_no_tx\nRpl_semi_sync_master_timefunc_failures\nRpl_semi_sync_master_wait_pos_backtraverse\nRpl_semi_sync_master_yes_tx\nRpl_transactions_multi_engine\nServer_audit_writes_failed\nSlave_retried_transactions\nSlow_launch_threads\nSsl_accept_renegotiates\nSsl_accepts\nSsl_callback_cache_hits\nSsl_client_connects\nSsl_connect_renegotiates\nSsl_ctx_verify_depth\nSsl_ctx_verify_mode\nSsl_finished_accepts\nSsl_finished_connects\nSsl_session_cache_hits\nSsl_session_cache_misses\nSsl_session_cache_overflows\nSsl_session_cache_size\nSsl_session_cache_timeouts\nSsl_sessions_reused\nSsl_used_session_cache_entries\nSubquery_cache_hit\nSubquery_cache_miss\nTable_locks_immediate\nTable_locks_waited\nTc_log_max_pages_used\nTc_log_page_waits\nTransactions_gtid_foreign_engine\nTransactions_multi_engine\n \nFLUSH SSL\n \nThe FLUSH SSL command was first added in MariaDB 10.4.\n \nIn MariaDB 10.4 and later, the FLUSH SSL command can be used\nto dynamically reinitialize the server\'s TLS context. This\nis most useful if you need to replace a certificate that is\nabout to expire without restarting the server.\n \nThis operation is performed by reloading the files defined\nby the following TLS system variables:\nssl_cert\nssl_key\nssl_ca\nssl_capath\nssl_crl\nssl_crlpath\n \nThese TLS system variables are not dynamic, so their values\ncan not be changed without restarting the server.\n \nIf you want to dynamically reinitialize the server\'s TLS\ncontext, then you need to change the certificate and key\nfiles at the relevant paths defined by these TLS system\nvariables, without actually changing the values of the\nvariables. See MDEV-19341 for more information.\n \nReducing Memory Usage\n \nTo flush some of the global caches that take up memory, you\ncould execute the following command:\n \nFLUSH LOCAL HOSTS,\n QUERY CACHE, \n TABLE_STATISTICS, \n INDEX_STATISTICS, \n USER_STATISTICS;\n \n\n \n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/flush/','','https://mariadb.com/kb/en/library/flush/'),(344,'KILL [CONNECTION | QUERY]',26,'Syntax\n------ \nKILL [HARD | SOFT] [CONNECTION | QUERY [ID] ] [thread_id |\nUSER user_name | query_id]\n \nMariaDB 5.3.2\n \nThe options HARD | SOFT and USER username were introduced in\nMariaDB 5.3.2\n \nMariaDB 10.0.5\n \nKILL QUERY ID query_id, which permits killing a query by\nquery id rather than thread id, was introduced in MariaDB\n10.0.5.\n \nDescription\n----------- \nEach connection to mysqld runs in a separate thread. You can\nsee which threads\nare running with the SHOW PROCESSLIST statement and kill a\nthread with the KILL thread_id statement. \nKILL allows the optional CONNECTION or\nQUERY modifier:\nKILL CONNECTION is the same as KILL with no\n modifier: It terminates the connection associated with the\ngiven thread or query id.\nKILL QUERY terminates the statement that the connection\nthread_id is\n currently executing, but leaves the connection itself\nintact.\nKILL QUERY ID (introduced in MariaDB 10.0.5) terminates the\nquery by query_id, leaving the connection intact.\n \nIf a connection is terminated that has an active\ntransaction, the transaction will be rolled back. If only a\nquery is killed, the current transaction will stay active.\nSee also idle_transaction_timeout.\n \nIf you have the PROCESS privilege, you can see all threads.\nIf\nyou have the SUPER privilege, you can kill all threads and\nstatements. Otherwise, you can see and kill only your own\nthreads and\nstatements.\n \nKilling queries that repair or create indexes on MyISAM and\nAria tables may result in corrupted tables. Use the SOFT\noption to avoid this!\n \nThe HARD option (default) kills a command as soon as\npossible. If you use\nSOFT, then critical operations that may leave a table in an\ninconsistent state will not be interrupted. Such operations\ninclude REPAIR and INDEX creation for MyISAM and Aria tables\n(REPAIR TABLE, OPTIMIZE TABLE).\n \nKILL ... USER username will kill all connections/queries for\na\ngiven user. USER can be specified one of the following ways:\nusername (Kill without regard to hostname)\nusername@hostname\nCURRENT_USER or CURRENT_USER()\n \nIf you specify a thread id and that thread does not exist,\nyou get the following error:\n \nERROR 1094 (HY000): Unknown thread id: \n \nIf you specify a query id that doesn\'t exist, you get the\nfollowing error:\n \nERROR 1957 (HY000): Unknown query id: \n \nHowever, if you specify a user name, no error is issued for\nnon-connected (or even non-existing) users. To check if the\nconnection/query has been killed, you can use the\nROW_COUNT() function.\n \nA client whose connection is killed receives the following\nerror:\n \nERROR 1317 (70100): Query execution was interrupted\n \nTo obtain a list of existing sessions, use the SHOW\nPROCESSLIST statement or query the Information Schema\nPROCESSLIST table.\n \nNote: You cannot use KILL with the Embedded MySQL Server\nlibrary because the embedded server merely runs inside the\nthreads of the host\napplication. It does not create any connection threads of\nits own.\n \nNote: You can also use \nmysqladmin kill thread_id [,thread_id...]\nto kill connections. To get a list of running queries,\nuse mysqladmin processlist. See mysqladmin.\n \nPercona Toolkit contains a program, pt-kill that can be used\nto automatically kill connections that match certain\ncriteria. For example, it can be used to terminate idle\nconnections, or connections that have been busy for more\nthan 60 seconds.\n \n\n\nURL:\nhttps://mariadb.com/kb/en/library/data-manipulation-kill-connection-query/','','https://mariadb.com/kb/en/library/data-manipulation-kill-connection-query/'),(346,'RESET',26,'Syntax\n------ \nRESET reset_option [, reset_option] ...\n \nDescription\n----------- \nThe RESET statement is used to clear the state of various\nserver\noperations. You must have the RELOAD privilege to execute\nRESET.\n \nRESET acts as a stronger version of the FLUSH statement.\n \nThe different RESET options are:\n \nOption | Description | \n \nSLAVE [\"connection_name\"] [ALL] | Deletes all relay logs\nfrom the slave and reset the replication position in the\nmaster binary log. | \n \nMASTER | Deletes all old binary logs, makes the binary index\nfile (--log-bin-index) empty and creates a new binary log\nfile. This is useful when you want to reset the master to an\ninitial state. If you want to just delete old, not used\nbinary logs, you should use the PURGE BINARY LOGS command. |\n\n \nQUERY CACHE | Removes all queries from the query cache. See\nalso FLUSH QUERY CACHE. | \n \n\n \n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/reset/','','https://mariadb.com/kb/en/library/reset/'),(348,'About SHOW',26,'SHOW has many forms that provide information about\ndatabases, tables, columns, or status information about the\nserver. These include:\nSHOW AUTHORS\nSHOW CHARACTER SET [like_or_where]\nSHOW COLLATION [like_or_where]\nSHOW [FULL] COLUMNS FROM tbl_name [FROM db_name]\n[like_or_where]\nSHOW CONTRIBUTORS\nSHOW CREATE DATABASE db_name\nSHOW CREATE EVENT event_name\nSHOW CREATE PACKAGE package_name\nSHOW CREATE PACKAGE BODY package_name\nSHOW CREATE PROCEDURE proc_name\nSHOW CREATE TABLE tbl_name\nSHOW CREATE TRIGGER trigger_name\nSHOW CREATE VIEW view_name\nSHOW DATABASES [like_or_where]\nSHOW ENGINE engine_name {STATUS | MUTEX}\nSHOW [STORAGE] ENGINES\nSHOW ERRORS [LIMIT [offset,] row_count]\nSHOW [FULL] EVENTS\nSHOW FUNCTION CODE func_name\nSHOW FUNCTION STATUS [like_or_where]\nSHOW GRANTS FOR user\nSHOW INDEX FROM tbl_name [FROM db_name]\nSHOW INNODB STATUS\nSHOW OPEN TABLES [FROM db_name] [like_or_where]\nSHOW PLUGINS\nSHOW PROCEDURE CODE proc_name\nSHOW PROCEDURE STATUS [like_or_where]\nSHOW PRIVILEGES\nSHOW [FULL] PROCESSLIST\nSHOW PROFILE [types] [FOR QUERY n] [OFFSET n] [LIMIT n]\nSHOW PROFILES\nSHOW [GLOBAL | SESSION] STATUS [like_or_where]\nSHOW TABLE STATUS [FROM db_name] [like_or_where]\nSHOW TABLES [FROM db_name] [like_or_where]\nSHOW TRIGGERS [FROM db_name] [like_or_where]\nSHOW [GLOBAL | SESSION] VARIABLES [like_or_where]\nSHOW WARNINGS [LIMIT [offset,] row_count]\n \nlike_or_where:\n LIKE \'pattern\'\n | WHERE expr\n \nIf the syntax for a given SHOW statement includes a\nLIKE \'pattern\' part, \'pattern\' is a\nstring that can contain the SQL \"%\" and\n\"_\" wildcard characters. The pattern is useful for\nrestricting statement output to matching values.\n \nSeveral SHOW statements also accept a\nWHERE clause that provides more flexibility in specifying\nwhich rows to display. See Extended Show.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/about-show/','','https://mariadb.com/kb/en/library/about-show/'),(663,'CREATE VIEW',39,'Syntax\n------ \nCREATE\n [OR REPLACE]\n [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]\n [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]\n [SQL SECURITY { DEFINER | INVOKER }]\n VIEW [IF NOT EXISTS] view_name [(column_list)]\n AS select_statement\n [WITH [CASCADED | LOCAL] CHECK OPTION]\n \nDescription\n----------- \nThe CREATE VIEW statement creates a new view, or replaces an\nexisting\none if the OR REPLACE clause is given. If the view does not\nexist, CREATE OR\nREPLACE VIEW is the same as CREATE VIEW. If the view does\nexist, CREATE OR\nREPLACE VIEW is the same as ALTER VIEW.\n \nThe select_statement is a SELECT statement that provides the\ndefinition of\nthe view. (When you select from the view, you select in\neffect using the SELECT\nstatement.) select_statement can select from base tables or\nother views.\n \nThe view definition is \"frozen\" at creation time, so\nchanges to the underlying\ntables afterwards do not affect the view definition. For\nexample, if a view is\ndefined as SELECT * on a table, new columns added to the\ntable later do not\nbecome part of the view. A SHOW CREATE VIEW shows that\nsuch queries are rewritten and column names are included in\nthe view\ndefinition.\n \nThe view definition must be a query that does not return\nerrors at view\ncreation times. However, the base tables used by the views\nmight be altered\nlater and the query may not be valid anymore. In this case,\nquerying the view\nwill result in an error. CHECK TABLE helps in finding this\nkind\nof problems.\n \nThe ALGORITHM clause affects how MariaDB processes the\nview. The DEFINER and SQL SECURITY clauses specify the\nsecurity context to be\nused when checking access privileges at view invocation\ntime. The WITH CHECK\nOPTION clause can be given to constrain inserts or updates\nto rows in tables\nreferenced by the view. These clauses are described later in\nthis section.\n \nThe CREATE VIEW statement requires the CREATE VIEW privilege\nfor the\nview, and some privilege for each column selected by the\nSELECT\nstatement. For columns used elsewhere in the SELECT\nstatement you must\nhave the SELECT privilege. If the OR REPLACE clause is\npresent, you\nmust also have the DROP privilege for the view.\n \nA view belongs to a database. By default, a new view is\ncreated in the\ndefault database. To create the view explicitly in a given\ndatabase,\nspecify the name as db_name.view_name when you create it.\n \nCREATE VIEW test.v AS SELECT * FROM t;\n \nBase tables and views share the same namespace within a\ndatabase, so a\ndatabase cannot contain a base table and a view that have\nthe same\nname.\n \nViews must have unique column names with no duplicates, just\nlike base\ntables. By default, the names of the columns retrieved by\nthe SELECT\nstatement are used for the view column names. To define\nexplicit names\nfor the view columns, the optional column_list clause can be\ngiven as\na list of comma-separated identifiers. The number of names\nin\ncolumn_list must be the same as the number of columns\nretrieved by the\nSELECT statement.\n \nMySQL until 5.1.28\n \nPrior to MySQL 5.1.29, When you modify an existing view, the\ncurrent view definition is backed up and saved. It is stored\nin that\ntable\'s database directory, in a subdirectory named arc.\nThe backup\nfile for a view v is named v.frm-00001. If you alter the\nview again,\nthe next backup is named v.frm-00002. The three latest view\nbackup\ndefinitions are stored. Backed up view definitions are not\npreserved\nby mysqldump, or any other such programs, but you can retain\nthem\nusing a file copy operation. However, they are not needed\nfor anything\nbut to provide you with a backup of your previous view\ndefinition. It\nis safe to remove these backup definitions, but only while\nmysqld is\nnot running. If you delete the arc subdirectory or its files\nwhile\nmysqld is running, you will receive an error the next time\nyou try to\nalter the view: \n \nMariaDB [test]> ALTER VIEW v AS SELECT * FROM t; \nERROR 6 (HY000): Error on delete of\n\'.\\test\\arc/v.frm-0004\' (Errcode: 2)\n \nColumns retrieved by the SELECT statement can be simple\nreferences to\ntable columns. They can also be expressions that use\nfunctions,\nconstant values, operators, and so forth.\n \nUnqualified table or view names in the SELECT statement are\ninterpreted with respect to the default database. A view can\nrefer to\ntables or views in other databases by qualifying the table\nor view\nname with the proper database name.\n \nA view can be created from many kinds of SELECT statements.\nIt can\nrefer to base tables or other views. It can use joins,\nUNION, and\nsubqueries. The SELECT need not even refer to any tables.\nThe\nfollowing example defines a view that selects two columns\nfrom another\ntable, as well as an expression calculated from those\ncolumns:\n \nCREATE TABLE t (qty INT, price INT);\n \nINSERT INTO t VALUES(3, 50);\n \nCREATE VIEW v AS SELECT qty, price, qty*price AS value FROM\nt;\n \nSELECT * FROM v;\n+------+-------+-------+\n| qty | price | value |\n+------+-------+-------+\n| 3 | 50 | 150 |\n+------+-------+-------+\n \nA view definition is subject to the following restrictions:\nThe SELECT statement cannot contain a subquery in the FROM\nclause.\nThe SELECT statement cannot refer to system or user\nvariables.\nWithin a stored program, the definition cannot refer to\nprogram parameters or local variables.\nThe SELECT statement cannot refer to prepared statement\nparameters.\nAny table or view referred to in the definition must exist.\nHowever, after a view has been created, it is possible to\ndrop a table or view that the definition refers to. In this\ncase, use of the view results in an error. To check a view\ndefinition for problems of this kind, use the CHECK TABLE\nstatement.\nThe definition cannot refer to a TEMPORARY table, and you\ncannot create a TEMPORARY view.\nAny tables named in the view definition must exist at\ndefinition time.\nYou cannot associate a trigger with a view.\nFor valid identifiers to use as view names, see Identifier\nNames.\n \nORDER BY is allowed in a view definition, but it is ignored\nif you\nselect from a view using a statement that has its own ORDER\nBY.\n \nFor other options or clauses in the definition, they are\nadded to the\noptions or clauses of the statement that references the\nview, but the\neffect is undefined. For example, if a view definition\nincludes a\nLIMIT clause, and you select from the view using a statement\nthat has\nits own LIMIT clause, it is undefined which limit applies.\nThis same\nprinciple applies to options such as ALL, DISTINCT, or\nSQL_SMALL_RESULT that follow the SELECT keyword, and to\nclauses such\nas INTO, FOR UPDATE, and LOCK IN SHARE MODE.\n \nThe PROCEDURE clause cannot be used in a view definition,\nand it cannot be used if a view is referenced in the FROM\nclause.\n \nIf you create a view and then change the query processing\nenvironment\nby changing system variables, that may affect the results\nthat you get\nfrom the view:\n \nCREATE VIEW v (mycol) AS SELECT \'abc\';\n \nSET sql_mode = \'\';\n \nSELECT \"mycol\" FROM v;\n+-------+\n| mycol |\n+-------+\n| mycol | \n+-------+\n \nSET sql_mode = \'ANSI_QUOTES\';\n \nSELECT \"mycol\" FROM v;\n+-------+\n| mycol |\n+-------+\n| abc | \n+-------+\n \nThe DEFINER and SQL SECURITY clauses determine which MariaDB\naccount to\nuse when checking access privileges for the view when a\nstatement is\nexecuted that references the view. They were added in MySQL\n5.1.2.\nThe legal SQL SECURITY characteristic values are DEFINER and\nINVOKER.\nThese indicate that the required privileges must be held by\nthe user\nwho defined or invoked the view, respectively. The default\nSQL\nSECURITY value is DEFINER.\n \nIf a user value is given for the DEFINER clause, it should\nbe a MariaDB\naccount in \'user_name\'@\'host_name\' format (the same\nformat used in the\nGRANT statement). The user_name and host_name values both\nare\nrequired. The definer can also be given as CURRENT_USER or\nCURRENT_USER(). The default DEFINER value is the user who\nexecutes the\nCREATE VIEW statement. This is the same as specifying\nDEFINER =\nCURRENT_USER explicitly.\n \nIf you specify the DEFINER clause, these rules determine the\nlegal\nDEFINER user values:\nIf you do not have the SUPER privilege, the only legal user\nvalue is your own account, either specified literally or by\nusing CURRENT_USER. You cannot set the definer to some other\naccount.\nIf you have the SUPER privilege, you can specify any\nsyntactically legal account name. If the account does not\nactually exist, a warning is generated.\nIf the SQL SECURITY value is DEFINER but the definer account\ndoes not exist when the view is referenced, an error occurs.\n \nWithin a view definition, CURRENT_USER returns the view\'s\nDEFINER\nvalue by default. Before MySQL 5.1.12, and for views\ndefined with the SQL SECURITY INVOKER characteristic,\nCURRENT_USER\nreturns the account for the view\'s invoker. For information\nabout user\nauditing within views, see\nhttp://dev.mysql.com/doc/refman/5.1/en/account-activity-auditing.html.\n \nWithin a stored routine that is defined with the SQL\nSECURITY DEFINER\ncharacteristic, CURRENT_USER returns the routine\'s DEFINER\nvalue. This\nalso affects a view defined within such a program, if the\nview\ndefinition contains a DEFINER value of CURRENT_USER.\n \nView privileges are checked like this:\nAt view definition time, the view creator must have the\nprivileges needed to use the top-level objects accessed by\nthe view. For example, if the view definition refers to\ntable columns, the creator must have privileges for the\ncolumns, as described previously. If the definition refers\nto a stored function, only the privileges needed to invoke\nthe function can be checked. The privileges required when\nthe function runs can be checked only as it executes: For\ndifferent invocations of the function, different execution\npaths within the function might be taken.\nWhen a view is referenced, privileges for objects accessed\nby the view are checked against the privileges held by the\nview creator or invoker, depending on whether the SQL\nSECURITY characteristic is DEFINER or INVOKER, respectively.\nIf reference to a view causes execution of a stored\nfunction, privilege checking for statements executed within\nthe function depend on whether the function is defined with\na SQL SECURITY characteristic of DEFINER or INVOKER. If the\nsecurity characteristic is DEFINER, the function runs with\nthe privileges of its creator. If the characteristic is\nINVOKER, the function runs with the privileges determined by\nthe view\'s SQL SECURITY characteristic.\n \nMySQL until 5.1.1\n \nPrior to MySQL 5.1.2 (before the DEFINER and SQL SECURITY\nclauses were\nimplemented), privileges required for objects used in a view\nare\nchecked at view creation time.\n \nExample: A view might depend on a stored function, and that\nfunction\nmight invoke other stored routines. For example, the\nfollowing view\ninvokes a stored function f():\n \nCREATE VIEW v AS SELECT * FROM t WHERE t.id = f(t.name);\n \nSuppose that f() contains a statement such as this:\n \nIF name IS NULL then\n CALL p1();\nELSE\n CALL p2();\nEND IF;\n \nThe privileges required for executing statements within f()\nneed to be\nchecked when f() executes. This might mean that privileges\nare needed\nfor p1() or p2(), depending on the execution path within\nf(). Those\nprivileges must be checked at runtime, and the user who must\npossess\nthe privileges is determined by the SQL SECURITY values of\nthe view v\nand the function f().\n \nThe DEFINER and SQL SECURITY clauses for views are\nextensions to\nstandard SQL. In standard SQL, views are handled using the\nrules for\nSQL SECURITY INVOKER.\n \nIf you invoke a view that was created before MySQL 5.1.2, it\nis\ntreated as though it was created with a SQL SECURITY DEFINER\nclause\nand with a DEFINER value that is the same as your account.\nHowever,\nbecause the actual definer is unknown, MySQL issues a\nwarning. To make\nthe warning go away, it is sufficient to re-create the view\nso that\nthe view definition includes a DEFINER clause.\n \nThe optional ALGORITHM clause is an extension to standard\nSQL. It\naffects how MariaDB processes the view. ALGORITHM takes\nthree values:\nMERGE, TEMPTABLE, or UNDEFINED. The default algorithm is\nUNDEFINED if\nno ALGORITHM clause is present. See View Algorithms for more\ninformation.\n \nSome views are updatable. That is, you can use them in\nstatements such\nas UPDATE, DELETE, or INSERT to update the contents of the\nunderlying\ntable. For a view to be updatable, there must be a\none-to-one\nrelationship between the rows in the view and the rows in\nthe\nunderlying table. There are also certain other constructs\nthat make a\nview non-updatable. See Inserting and Updating with Views.\n \nWITH CHECK OPTION\n \nThe WITH CHECK OPTION clause can be given for an updatable\nview to\nprevent inserts or updates to rows except those for which\nthe WHERE\nclause in the select_statement is true.\n \nIn a WITH CHECK OPTION clause for an updatable view, the\nLOCAL and\nCASCADED keywords determine the scope of check testing when\nthe view\nis defined in terms of another view. The LOCAL keyword\nrestricts the\nCHECK OPTION only to the view being defined. CASCADED causes\nthe\nchecks for underlying views to be evaluated as well. When\nneither\nkeyword is given, the default is CASCADED.\n \nFor more information about updatable views and the WITH\nCHECK OPTION\nclause, see\nInserting and Updating with Views.\n \nIF NOT EXISTS\n \nThe IF NOT EXISTS clause was added in MariaDB 10.1.3\n \nWhen the IF NOT EXISTS clause is used, MariaDB will return a\nwarning instead of an error if the specified view already\nexists. Cannot be used together with the OR REPLACE clause.\n \nExamples\n-------- \nCREATE TABLE t (a INT, b INT) ENGINE = InnoDB;\n \nINSERT INTO t VALUES (1,1), (2,2), (3,3);\n \nCREATE VIEW v AS SELECT a, a*2 AS a2 FROM t;\n \nSELECT * FROM v;\n \n+------+------+\n| a | a2 |\n+------+------+\n| 1 | 2 |\n| 2 | 4 |\n| 3 | 6 |\n+------+------+\n \nOR REPLACE and IF NOT EXISTS:\n \nCREATE VIEW v AS SELECT a, a*2 AS a2 FROM t;\n \nERROR 1050 (42S01): Table \'v\' already exists\n \nCREATE OR REPLACE VIEW v AS SELECT a, a*2 AS a2 FROM t;\n \nQuery OK, 0 rows affected (0.04 sec)\n \nCREATE VIEW IF NOT EXISTS v AS SELECT a, a*2 AS a2 FROM t;\n \nQuery OK, 0 rows affected, 1 warning (0.01 sec)\n \nSHOW WARNINGS;\n \n+-------+------+--------------------------+\n| Level | Code | Message |\n+-------+------+--------------------------+\n| Note | 1050 | Table \'v\' already exists |\n+-------+------+--------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/create-view/','','https://mariadb.com/kb/en/library/create-view/'),(668,'DROP PACKAGE',39,'Oracle-style packages were introduced in MariaDB 10.3.5.\n \nSyntax\n------ \nDROP PACKAGE [IF EXISTS] [ db_name . ] package_name\n \nDescription\n----------- \nThe DROP PACKAGE statement can be used when Oracle SQL_MODE\nis set.\n \nThe DROP PACKAGE statement drops a stored package entirely:\nDrops the package specification (earlier created using the\nCREATE PACKAGE statement).\nDrops the package implementation, if the implementation was\nalready created using the CREATE PACKAGE BODY statement.\n \n\n\nURL: https://mariadb.com/kb/en/library/drop-package/','','https://mariadb.com/kb/en/library/drop-package/'),(669,'DROP PACKAGE BODY',39,'Oracle-style packages were introduced in MariaDB 10.3.5.\n \nSyntax\n------ \nDROP PACKAGE BODY [IF EXISTS] [ db_name . ] package_name\n \nDescription\n----------- \nThe DROP PACKAGE BODY statement can be used when Oracle\nSQL_MODE is set.\n \nThe DROP PACKAGE BODY statement drops the package body (i.e\nthe implementation), previously created using the CREATE\nPACKAGE BODY statement.\n \nNote, DROP PACKAGE BODY drops only the package\nimplementation, but does not drop the package specification.\nUse DROP PACKAGE to drop the package entirely (i.e. both\nimplementation and specification).\n \n\n\nURL: https://mariadb.com/kb/en/library/drop-package-body/','','https://mariadb.com/kb/en/library/drop-package-body/'),(347,'SET',26,'Syntax\n------ \nSET variable_assignment [, variable_assignment] ...\n \nvariable_assignment:\n user_var_name = expr\n | [GLOBAL | SESSION] system_var_name = expr\n | [@@global. | @@session. | @@]system_var_name = expr\n \nOne can also set a user variable in any expression with this\nsyntax:\n \nuser_var_name:= expr\n \nDescription\n----------- \nThe SET statement assigns values to different types of\nvariables that affect the operation of the server or your\nclient. Older\nversions of MySQL employed SET OPTION, but this syntax was\ndeprecated in favor of SET without OPTION, and was removed\nin MariaDB 10.0.\n \nChanging a system variable by using the SET statement does\nnot make the change permanently. To do so, the change must\nbe made in a configuration file.\n \nFor setting variables on a per-query basis (from MariaDB\n10.1.2), see SET STATEMENT.\n \nSee SHOW VARIABLES for documentation on viewing server\nsystem variables.\n \nSee Server System Variables for a list of all the system\nvariables.\n \nGLOBAL / SESSION\n \nWhen setting a system variable, the scope can be specified\nas either GLOBAL or SESSION.\n \nA global variable change affects all new sessions. It does\nnot affect any currently open sessions, including the one\nthat made the change. \n \nA session variable change affects the current session only.\n \nIf the variable has a session value, not specifying either\nGLOBAL or SESSION will be the same as specifying SESSION. If\nthe variable only has a global value, not specifying GLOBAL\nor SESSION will apply to the change to the global value.\n \nDEFAULT\n \nSetting a global variable to DEFAULT will restore it to the\nserver default, and setting a session variable to DEFAULT\nwill restore it to the current global value.\n \nExamples\n-------- \ninnodb_sync_spin_loops is a global variable.\nskip_parallel_replication is a session variable.\nmax_error_count is both global and session.\n \nSELECT VARIABLE_NAME, SESSION_VALUE, GLOBAL_VALUE FROM\n INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE \n VARIABLE_NAME LIKE \'max_error_count\' OR \n VARIABLE_NAME LIKE \'skip_parallel_replication\' OR \n VARIABLE_NAME LIKE \'innodb_sync_spin_loops\';\n \n+---------------------------+---------------+--------------+\n| VARIABLE_NAME | SESSION_VALUE | GLOBAL_VALUE |\n+---------------------------+---------------+--------------+\n| MAX_ERROR_COUNT | 64 | 64 |\n| SKIP_PARALLEL_REPLICATION | OFF | NULL |\n| INNODB_SYNC_SPIN_LOOPS | NULL | 30 |\n+---------------------------+---------------+--------------+\n \nSetting the session values:\n \nSET max_error_count=128;\nQuery OK, 0 rows affected (0.000 sec)\n \nSET skip_parallel_replication=ON;\nQuery OK, 0 rows affected (0.000 sec)\n \nSET innodb_sync_spin_loops=60;\n \nERROR 1229 (HY000): Variable \'innodb_sync_spin_loops\' is a\nGLOBAL variable \n and should be set with SET GLOBAL\n \nSELECT VARIABLE_NAME, SESSION_VALUE, GLOBAL_VALUE FROM\n INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE \n VARIABLE_NAME LIKE \'max_error_count\' OR \n VARIABLE_NAME LIKE \'skip_parallel_replication\' OR \n VARIABLE_NAME LIKE \'innodb_sync_spin_loops\';\n \n+---------------------------+---------------+--------------+\n| VARIABLE_NAME | SESSION_VALUE | GLOBAL_VALUE |\n+---------------------------+---------------+--------------+\n| MAX_ERROR_COUNT | 128 | 64 |\n| SKIP_PARALLEL_REPLICATION | ON | NULL |\n| INNODB_SYNC_SPIN_LOOPS | NULL | 30 |\n+---------------------------+---------------+--------------+\n \nSetting the global values:\n \nSET GLOBAL max_error_count=256;\n \nSET GLOBAL skip_parallel_replication=ON;\n \nERROR 1228 (HY000): Variable \'skip_parallel_replication\'\nis a SESSION variable \n and can\'t be used with SET GLOBAL\n \nSET GLOBAL innodb_sync_spin_loops=120;\n \nSELECT VARIABLE_NAME, SESSION_VALUE, GLOBAL_VALUE FROM\n INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE \n VARIABLE_NAME LIKE \'max_error_count\' OR \n VARIABLE_NAME LIKE \'skip_parallel_replication\' OR \n VARIABLE_NAME LIKE \'innodb_sync_spin_loops\';\n \n+---------------------------+---------------+--------------+\n| VARIABLE_NAME | SESSION_VALUE | GLOBAL_VALUE |\n+---------------------------+---------------+--------------+\n| MAX_ERROR_COUNT | 128 | 256 |\n| SKIP_PARALLEL_REPLICATION | ON | NULL |\n| INNODB_SYNC_SPIN_LOOPS | NULL | 120 |\n+---------------------------+---------------+--------------+\n \nSHOW VARIABLES will by default return the session value\nunless the variable is global only.\n \nSHOW VARIABLES LIKE \'max_error_count\';\n \n+-----------------+-------+\n| Variable_name | Value |\n+-----------------+-------+\n| max_error_count | 128 |\n+-----------------+-------+\n \nSHOW VARIABLES LIKE \'skip_parallel_replication\';\n \n+---------------------------+-------+\n| Variable_name | Value |\n+---------------------------+-------+\n| skip_parallel_replication | ON |\n+---------------------------+-------+\n \nSHOW VARIABLES LIKE \'innodb_sync_spin_loops\';\n \n+------------------------+-------+\n| Variable_name | Value |\n+------------------------+-------+\n| innodb_sync_spin_loops | 120 |\n+------------------------+-------+\n \nUsing the inplace syntax:\n \nSELECT (@a:=1);\n+---------+\n| (@a:=1) |\n+---------+\n| 1 |\n+---------+\n \nSELECT @a;\n \n+------+\n| @a |\n+------+\n| 1 |\n+------+\n \n\n\nURL: https://mariadb.com/kb/en/library/set/','','https://mariadb.com/kb/en/library/set/'),(674,'DROP TABLESPACE',39,'The DROP TABLESPACE statement is not supported by MariaDB.\nIt was originally inherited from MySQL NDB Cluster. In MySQL\n5.7 and later, the statement is also supported for InnoDB.\nHowever, MariaDB has chosen not to include that specific\nfeature. See MDEV-19294 for more information.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/drop-tablespace/','','https://mariadb.com/kb/en/library/drop-tablespace/'),(680,'LASTVAL',40,'LASTVAL is a synonym for PREVIOUS VALUE for sequence_name.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/lastval/','','https://mariadb.com/kb/en/library/lastval/'),(682,'NEXTVAL',40,'NEXTVAL is a synonym for NEXT VALUE for sequence_name.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/nextval/','','https://mariadb.com/kb/en/library/nextval/'),(686,'JSON_ARRAY',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_ARRAY([value[, value2] ...])\n \nDescription\n----------- \nReturns a JSON array containing the listed values. The list\ncan be empty.\n \nExample\n \nSELECT Json_Array(56, 3.1416, \'My name is \"Foo\"\', NULL);\n+--------------------------------------------------+\n| Json_Array(56, 3.1416, \'My name is \"Foo\"\', NULL) |\n+--------------------------------------------------+\n| [56, 3.1416, \"My name is \\\"Foo\\\"\", null] |\n+--------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_array/','','https://mariadb.com/kb/en/json_array/'),(689,'JSON_COMPACT',41,'This function was added in MariaDB 10.2.4.\n \nSyntax\n------ \nJSON_COMPACT(json_doc)\n \nDescription\n----------- \nRemoves all unnecessary spaces so the json document is as\nshort as possible.\n \nExample\n \nSET @j = \'{ \"A\": 1, \"B\": [2, 3]}\';\n \nSELECT JSON_COMPACT(@j), @j;\n+-------------------+------------------------+\n| JSON_COMPACT(@j) | @j |\n+-------------------+------------------------+\n| {\"A\":1,\"B\":[2,3]} | { \"A\": 1, \"B\": [2, 3]} |\n+-------------------+------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_compact/','','https://mariadb.com/kb/en/json_compact/'),(693,'JSON_DETAILED',41,'This function was added in MariaDB 10.2.4.\n \nSyntax\n------ \nJSON_DETAILED(json_doc[, tab_size])\n \nDescription\n----------- \nRepresents JSON in the most understandable way emphasizing\nnested structures.\n \nExample\n \nSET @j = \'{ \"A\":1,\"B\":[2,3]}\';\n \nSELECT @j;\n+--------------------+\n| @j |\n+--------------------+\n| { \"A\":1,\"B\":[2,3]} |\n+--------------------+\n \nSELECT JSON_DETAILED(@j);\n+------------------------------------------------------------+\n| JSON_DETAILED(@j) |\n+------------------------------------------------------------+\n| {\n \"A\": 1,\n \"B\": \n [\n 2,\n 3\n ]\n} |\n+------------------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_detailed/','','https://mariadb.com/kb/en/json_detailed/'),(349,'SHOW AUTHORS',26,'Syntax\n------ \nSHOW AUTHORS\n \nDescription\n----------- \nThe SHOW AUTHORS statement displays information about the\npeople who work on MariaDB. For each author, it displays\nName, Location, and\nComment values. All columns are encoded as latin1.\n \nIn MariaDB 5.5 this is in somewhat random order.\n \nIn MariaDB 10.0.5 and later you have:\nFirst the active people in MariaDB are listed.\nThen the active people in MySQL.\nLast the people that has contributed to MariaDB/MySQL in the\npast.\n \nThe order is somewhat related to importance of the\ncontribution given to the MariaDB project, but this is not\n100% accurate. There is still room for improvements and\ndebate...\n \nExample\n \nSHOW AUTHORS;\n+--------------------------------+---------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+\n| Name | Location | Comment |\n+--------------------------------+---------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+\n| Michael (Monty) Widenius | Tusby, Finland | Lead developer\nand main author |\n| Sergei Golubchik | Kerpen, Germany | Architect, Full-text\nsearch, precision math, plugin framework, merges etc |\n| Igor Babaev | Bellevue, USA | Optimizer, keycache, core\nwork |\n| Sergey Petrunia | St. Petersburg, Russia | Optimizer |\n| Oleksandr Byelkin | Lugansk, Ukraine | Query Cache (4.0),\nSubqueries (4.1), Views (5.0) |\n| Timour Katchaounov | Sofia , Bulgaria | Optimizer |\n| Kristian Nielsen | Copenhagen, Denmark | Replication,\nAsync client prototocol, General buildbot stuff |\n| Alexander (Bar) Barkov | Izhevsk, Russia | Unicode and\ncharacter sets |\n| Alexey Botchkov (Holyfoot) | Izhevsk, Russia | GIS\nextensions, embedded server, precision math |\n| Daniel Bartholomew | Raleigh, USA | MariaDB documentation\n|\n| Colin Charles | Selangor, Malesia | MariaDB documentation,\ntalks at a LOT of conferences |\n| Sergey Vojtovich | Izhevsk, Russia | initial\nimplementation of plugin architecture, maintained native\nstorage engines (MyISAM, MEMORY, ARCHIVE, etc), rewrite of\ntable cache |\n| Vladislav Vaintroub | Mannheim, Germany | MariaDB Java\nconnector, new thread pool, Windows optimizations |\n| Elena Stepanova | Sankt Petersburg, Russia | QA, test\ncases |\n| Georg Richter | Heidelberg, Germany | New LGPL C\nconnector, PHP connector |\n| Jan Lindström | Ylämylly, Finland | Working on InnoDB |\n| Lixun Peng | Hangzhou, China | Multi Source replication |\n| Percona | CA, USA | XtraDB, microslow patches, extensions\nto slow log \n...\n \nSee Also\n \nSHOW CONTRIBUTORS. This list all members and sponsors of the\nMariaDB Foundation and other sponsors.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-authors/','','https://mariadb.com/kb/en/library/show-authors/'),(350,'SHOW BINARY LOGS',26,'Syntax\n------ \nSHOW BINARY LOGS\nSHOW MASTER LOGS\n \nDescription\n----------- \nLists the binary log files on the server. This statement is\nused as part of the\nprocedure described in \nPURGE BINARY LOGS, that shows how to\ndetermine which logs can be purged.\n \nExamples\n-------- \nSHOW BINARY LOGS;\n+--------------------+-----------+\n| Log_name | File_size |\n+--------------------+-----------+\n| mariadb-bin.000001 | 19039 |\n| mariadb-bin.000002 | 717389 |\n| mariadb-bin.000003 | 300 |\n| mariadb-bin.000004 | 333 |\n| mariadb-bin.000005 | 899 |\n| mariadb-bin.000006 | 125 |\n| mariadb-bin.000007 | 18907 |\n| mariadb-bin.000008 | 19530 |\n| mariadb-bin.000009 | 151 |\n| mariadb-bin.000010 | 151 |\n| mariadb-bin.000011 | 125 |\n| mariadb-bin.000012 | 151 |\n| mariadb-bin.000013 | 151 |\n| mariadb-bin.000014 | 125 |\n| mariadb-bin.000015 | 151 |\n| mariadb-bin.000016 | 314 |\n+--------------------+-----------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-binary-logs/','','https://mariadb.com/kb/en/library/show-binary-logs/'),(351,'SHOW BINLOG EVENTS',26,'Syntax\n------ \nSHOW BINLOG EVENTS\n [IN \'log_name\'] [FROM pos] [LIMIT [offset,] row_count]\n \nDescription\n----------- \nShows the events in the binary log. If you do not specify\n\'log_name\',\nthe first binary log is displayed.\n \nExample\n \nSHOW BINLOG EVENTS IN \'mysql_sandbox10019-bin.000002\';\n+-------------------------------+-----+-------------------+-----------+-------------+------------------------------------------------+\n| Log_name | Pos | Event_type | Server_id | End_log_pos |\nInfo |\n+-------------------------------+-----+-------------------+-----------+-------------+------------------------------------------------+\n| mysql_sandbox10019-bin.000002 | 4 | Format_desc | 1 | 248\n| Server ver: 10.0.19-MariaDB-log, Binlog ver: 4 |\n| mysql_sandbox10019-bin.000002 | 248 | Gtid_list | 1 | 273\n| [] |\n| mysql_sandbox10019-bin.000002 | 273 | Binlog_checkpoint |\n1 | 325 | mysql_sandbox10019-bin.000002 |\n| mysql_sandbox10019-bin.000002 | 325 | Gtid | 1 | 363 |\nGTID 0-1-1 |\n| mysql_sandbox10019-bin.000002 | 363 | Query | 1 | 446 |\nCREATE DATABASE blog |\n| mysql_sandbox10019-bin.000002 | 446 | Gtid | 1 | 484 |\nGTID 0-1-2 |\n| mysql_sandbox10019-bin.000002 | 484 | Query | 1 | 571 |\nuse `blog`; CREATE TABLE bb (id INT) |\n+-------------------------------+-----+-------------------+-----------+-------------+------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-binlog-events/','','https://mariadb.com/kb/en/library/show-binlog-events/'),(699,'JSON_LOOSE',41,'This function was added in MariaDB 10.2.4.\n \nSyntax\n------ \nJSON_LOOSE(json_doc)\n \nDescription\n----------- \nAdds spaces to a JSON document to make it look more\nreadable.\n \nExample\n \nSET @j = \'{ \"A\":1,\"B\":[2,3]}\';\n \nSELECT JSON_LOOSE(@j), @j;\n+-----------------------+--------------------+\n| JSON_LOOSE(@j) | @j |\n+-----------------------+--------------------+\n| {\"A\": 1, \"B\": [2, 3]} | { \"A\":1,\"B\":[2,3]} |\n+-----------------------+--------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_loose/','','https://mariadb.com/kb/en/json_loose/'),(700,'JSON_MERGE',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_MERGE(json_doc, json_doc[, json_doc] ...)\n \nDescription\n----------- \nMerges the given JSON documents.\n \nReturns the merged result,or NULL if any argument is NULL.\n \nAn error occurs if any of the arguments are not valid JSON\ndocuments.\n \nExample\n \nSET @json1 = \'[1, 2]\';\n \nSET @json2 = \'[3, 4]\';\n \nSELECT JSON_MERGE(@json1,@json2);\n+---------------------------+\n| JSON_MERGE(@json1,@json2) |\n+---------------------------+\n| [1, 2, 3, 4] |\n+---------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_merge/','','https://mariadb.com/kb/en/json_merge/'),(701,'JSON_OBJECT',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_OBJECT([key, value[, key, value] ...])\n \nDescription\n----------- \nReturns a JSON object containing the given key/value pairs.\nThe key/value list can be empty.\n \nAn error will occur if there are an odd number of arguments,\nor any key name is NULL.\n \nExample\n \nSELECT JSON_OBJECT(\"id\", 1, \"name\", \"Monty\");\n+---------------------------------------+\n| JSON_OBJECT(\"id\", 1, \"name\", \"Monty\") |\n+---------------------------------------+\n| {\"id\": 1, \"name\": \"Monty\"} |\n+---------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_object/','','https://mariadb.com/kb/en/json_object/'),(352,'SHOW CHARACTER SET',26,'Syntax\n------ \nSHOW CHARACTER SET\n [LIKE \'pattern\' | WHERE expr]\n \nDescription\n----------- \nThe SHOW CHARACTER SET statement shows all available\ncharacter sets. The LIKE clause, if present on its own,\nindicates which character\nset names to match. The WHERE and LIKE clauses can be given\nto select rows using more general conditions, as discussed\nin Extended SHOW.\n \nThe same information can be queried from the\ninformation_schema.CHARACTER_SETS table.\n \nSee Setting Character Sets and Collations for details on\nspecifying the character set at the server, database, table\nand column levels.\n \nExamples\n-------- \nSHOW CHARACTER SET LIKE \'latin%\';\n+---------+-----------------------------+-------------------+--------+\n| Charset | Description | Default collation | Maxlen |\n+---------+-----------------------------+-------------------+--------+\n| latin1 | cp1252 West European | latin1_swedish_ci | 1 |\n| latin2 | ISO 8859-2 Central European | latin2_general_ci |\n1 |\n| latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 |\n| latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 |\n+---------+-----------------------------+-------------------+--------+\n \nSHOW CHARACTER SET WHERE Maxlen LIKE \'2\';\n+---------+---------------------------+-------------------+--------+\n| Charset | Description | Default collation | Maxlen |\n+---------+---------------------------+-------------------+--------+\n| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |\n| sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 |\n| euckr | EUC-KR Korean | euckr_korean_ci | 2 |\n| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2\n|\n| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |\n| ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |\n| cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2\n|\n+---------+---------------------------+-------------------+--------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-character-set/','','https://mariadb.com/kb/en/library/show-character-set/'),(353,'SHOW CLIENT_STATISTICS',26,'MariaDB 5.2 introduced the User Statistics feature.\n \nSyntax\n------ \nSHOW CLIENT_STATISTICS\n \nDescription\n----------- \nThe SHOW CLIENT_STATISTICS statement was introduced in\nMariaDB 5.2 as part of the User Statistics feature. It was\nremoved as a separate statement in MariaDB 10.1.1, but\neffectively replaced by the generic SHOW\ninformation_schema_table statement. The\ninformation_schema.CLIENT_STATISTICS table holds statistics\nabout client connections.\n \nThe userstat system variable must be set to 1 to activate\nthis feature. See the User Statistics and\ninformation_schema.CLIENT_STATISTICS articles for more\ninformation.\n \nExample\n \nFrom MariaDB 10.0:\n \nSHOW CLIENT_STATISTICS\\G\n*************************** 1. row\n***************************\n Client: localhost\n Total_connections: 35\nConcurrent_connections: 0\n Connected_time: 708\n Busy_time: 2.5557979999999985\n Cpu_time: 0.04123740000000002\n Bytes_received: 3883\n Bytes_sent: 21595\n Binlog_bytes_written: 0\n Rows_read: 18\n Rows_sent: 115\n Rows_deleted: 0\n Rows_inserted: 0\n Rows_updated: 0\n Select_commands: 70\n Update_commands: 0\n Other_commands: 0\n Commit_transactions: 1\n Rollback_transactions: 0\n Denied_connections: 0\n Lost_connections: 0\n Access_denied: 0\n Empty_queries: 35\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/show-client-statistics/','','https://mariadb.com/kb/en/library/show-client-statistics/'),(354,'SHOW COLLATION',26,'Syntax\n------ \nSHOW COLLATION\n [LIKE \'pattern\' | WHERE expr]\n \nDescription\n----------- \nThe output from SHOW COLLATION includes all available\ncollations. The LIKE clause, if present on its own,\nindicates which collation names to match. The WHERE and LIKE\nclauses can be given to select rows using more general\nconditions, as discussed in Extended SHOW.\n \nThe same information can be queried from the\ninformation_schema.COLLATIONS table.\n \nSee Setting Character Sets and Collations for details on\nspecifying the collation at the server, database, table and\ncolumn levels.\n \nExamples\n-------- \nSHOW COLLATION LIKE \'latin1%\';\n+-------------------+---------+----+---------+----------+---------+\n| Collation | Charset | Id | Default | Compiled | Sortlen |\n+-------------------+---------+----+---------+----------+---------+\n| latin1_german1_ci | latin1 | 5 | | Yes | 1 |\n| latin1_swedish_ci | latin1 | 8 | Yes | Yes | 1 |\n| latin1_danish_ci | latin1 | 15 | | Yes | 1 |\n| latin1_german2_ci | latin1 | 31 | | Yes | 2 |\n| latin1_bin | latin1 | 47 | | Yes | 1 |\n| latin1_general_ci | latin1 | 48 | | Yes | 1 |\n| latin1_general_cs | latin1 | 49 | | Yes | 1 |\n| latin1_spanish_ci | latin1 | 94 | | Yes | 1 |\n+-------------------+---------+----+---------+----------+---------+\n \nSHOW COLLATION WHERE Sortlen LIKE \'8\' AND Charset LIKE\n\'utf8\';\n+--------------------+---------+-----+---------+----------+---------+\n| Collation | Charset | Id | Default | Compiled | Sortlen |\n+--------------------+---------+-----+---------+----------+---------+\n| utf8_unicode_ci | utf8 | 192 | | Yes | 8 |\n| utf8_icelandic_ci | utf8 | 193 | | Yes | 8 |\n| utf8_latvian_ci | utf8 | 194 | | Yes | 8 |\n| utf8_romanian_ci | utf8 | 195 | | Yes | 8 |\n| utf8_slovenian_ci | utf8 | 196 | | Yes | 8 |\n| utf8_polish_ci | utf8 | 197 | | Yes | 8 |\n| utf8_estonian_ci | utf8 | 198 | | Yes | 8 |\n| utf8_spanish_ci | utf8 | 199 | | Yes | 8 |\n| utf8_swedish_ci | utf8 | 200 | | Yes | 8 |\n| utf8_turkish_ci | utf8 | 201 | | Yes | 8 |\n| utf8_czech_ci | utf8 | 202 | | Yes | 8 |\n| utf8_danish_ci | utf8 | 203 | | Yes | 8 |\n| utf8_lithuanian_ci | utf8 | 204 | | Yes | 8 |\n| utf8_slovak_ci | utf8 | 205 | | Yes | 8 |\n| utf8_spanish2_ci | utf8 | 206 | | Yes | 8 |\n| utf8_roman_ci | utf8 | 207 | | Yes | 8 |\n| utf8_persian_ci | utf8 | 208 | | Yes | 8 |\n| utf8_esperanto_ci | utf8 | 209 | | Yes | 8 |\n| utf8_hungarian_ci | utf8 | 210 | | Yes | 8 |\n| utf8_sinhala_ci | utf8 | 211 | | Yes | 8 |\n| utf8_croatian_ci | utf8 | 213 | | Yes | 8 |\n+--------------------+---------+-----+---------+----------+---------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-collation/','','https://mariadb.com/kb/en/library/show-collation/'),(707,'JSON_SET',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_SET(json_doc, path, val[, path, val] ...)\n \nDescription\n----------- \nUpdates or inserts data into a JSON document, returning the\nresult, or NULL if any of the arguments are NULL or the\noptional path fails to find an object.\n \nAn error will occur if the JSON document is invalid, the\npath is invalid or if the path contains a * or wildcard.\n \nJSON_SET can update or insert data, while JSON_REPLACE can\nonly update, and JSON_INSERT only insert. \n \nExamples\n-------- \n\n \n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_set/','','https://mariadb.com/kb/en/json_set/'),(712,'CUME_DIST',42,'The CUME_DIST() function was first introduced with window\nfunctions in MariaDB 10.2.0.\n \nSyntax\n------ \nCUME_DIST() OVER ( \n [ PARTITION BY partition_expression ] \n [ ORDER BY order_list ]\n)\n \nDescription\n----------- \nCUME_DIST() is a window function that returns the cumulative\ndistribution of a given row. The following formula is used\nto calculate the value:\n \n(number of rows \n\nURL: https://mariadb.com/kb/en/cume_dist/','','https://mariadb.com/kb/en/cume_dist/'),(718,'NTH_VALUE',42,'The NTH_VALUE() function was first introduced with other\nwindow functions in MariaDB 10.2.\n \nSyntax\n------ \nNTH_VALUE (expr[, num_row]) OVER ( \n [ PARTITION BY partition_expression ] \n [ ORDER BY order_list ]\n)\n \nDescription\n----------- \nThe NTH_VALUE function returns the value evaluated at row\nnumber num_row of the window frame, starting from 1, or NULL\nif the row does not exist.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/nth_value/','','https://mariadb.com/kb/en/nth_value/'),(355,'SHOW COLUMNS',26,'Syntax\n------ \nSHOW [FULL] {COLUMNS | FIELDS} FROM tbl_name [FROM db_name]\n [LIKE \'pattern\' | WHERE expr]\n \nDescription\n----------- \nSHOW COLUMNS displays information about the columns in a\ngiven table. It also works for views. The LIKE clause, if\npresent on its own, indicates which column names to match.\nThe WHERE and LIKE clauses can be given to select rows using\nmore general conditions, as discussed in Extended SHOW.\n \nIf the data types differ from what you expect them to be\nbased on a\nCREATE TABLE statement, note that MariaDB sometimes changes\ndata types when you create or alter a table. The conditions\nunder which this\noccurs are described in the Silent Column Changes article.\n \nThe FULL keyword causes the output to include the column\ncollation and comments, as well as the privileges you have\nfor each column.\n \nYou can use db_name.tbl_name as an alternative to the\ntbl_name FROM db_name syntax. In other words, these two\nstatements are equivalent:\n \nSHOW COLUMNS FROM mytable FROM mydb;\nSHOW COLUMNS FROM mydb.mytable;\n \nSHOW COLUMNS displays the following values for each table\ncolumn:\n \nField indicates the column name.\n \nType indicates the column data type.\n \nCollation indicates the collation for non-binary string\ncolumns, or\nNULL for other columns. This value is displayed only if you\nuse the\nFULL keyword.\n \nThe Null field contains YES if NULL values can be stored in\nthe column,\nNO if not.\n \nThe Key field indicates whether the column is indexed:\nIf Key is empty, the column either is not indexed or is\nindexed only as a\n secondary column in a multiple-column, non-unique index.\nIf Key is PRI, the column is a PRIMARY KEY or\n is one of the columns in a multiple-column PRIMARY KEY.\nIf Key is UNI, the column is the first column of a\nunique-valued\n index that cannot contain NULL values.\nIf Key is MUL, multiple occurrences of a given value are\nallowed\n within the column. The column is the first column of a\nnon-unique index or a\n unique-valued index that can contain NULL values.\n \nIf more than one of the Key values applies to a given column\nof a\ntable, Key displays the one with the highest priority, in\nthe order\nPRI, UNI, MUL.\n \nA UNIQUE index may be displayed as PRI if\nit cannot contain NULL values and there is no\nPRIMARY KEY in the table. A UNIQUE index\nmay display as MUL if several columns form a composite\nUNIQUE index; although the combination of the columns is\nunique, each column can still hold multiple occurrences of a\ngiven value.\n \nThe Default field indicates the default value that is\nassigned to the\ncolumn.\n \nThe Extra field contains any additional information that is\navailable about a given column.\n \nValue | Description | \n \nAUTO_INCREMENT | The column was created with the\nAUTO_INCREMENT keyword. | \n \nPERSISTENT | The column was created with the PERSISTENT\nkeyword. (New in 5.3) | \n \nVIRTUAL | The column was created with the VIRTUAL keyword.\n(New in 5.3) | \n \non update CURRENT_TIMESTAMP | The column is a TIMESTAMP\ncolumn that is automatically updated on INSERT and UPDATE. |\n\n \nPrivileges indicates the privileges you have for the column.\nThis\nvalue is displayed only if you use the FULL keyword.\n \nComment indicates any comment the column has. This value is\ndisplayed\nonly if you use the FULL keyword.\n \nSHOW FIELDS is a synonym for\nSHOW COLUMNS. Also DESCRIBE and EXPLAIN can be used as\nshortcuts.\n \nYou can also list a table\'s columns with: \n \nmysqlshow db_name tbl_name\n \nSee the mysqlshow command for more details.\n \nThe DESCRIBE statement provides information similar to SHOW\nCOLUMNS. The information_schema.COLUMNS table provides\nsimilar, but more complete, information.\n \nThe SHOW CREATE TABLE, SHOW TABLE STATUS, and SHOW INDEX\nstatements also provide information about tables.\n \nExamples\n-------- \nSHOW COLUMNS FROM city;\n+------------+----------+------+-----+---------+----------------+\n| Field | Type | Null | Key | Default | Extra |\n+------------+----------+------+-----+---------+----------------+\n| Id | int(11) | NO | PRI | NULL | auto_increment |\n| Name | char(35) | NO | | | |\n| Country | char(3) | NO | UNI | | |\n| District | char(20) | YES | MUL | | |\n| Population | int(11) | NO | | 0 | |\n+------------+----------+------+-----+---------+----------------+\n \nSHOW COLUMNS FROM employees WHERE Type LIKE \'Varchar%\';\n+---------------+-------------+------+-----+---------+-------+\n| Field | Type | Null | Key | Default | Extra |\n+---------------+-------------+------+-----+---------+-------+\n| first_name | varchar(30) | NO | MUL | NULL | |\n| last_name | varchar(40) | NO | | NULL | |\n| position | varchar(25) | NO | | NULL | |\n| home_address | varchar(50) | NO | | NULL | |\n| home_phone | varchar(12) | NO | | NULL | |\n| employee_code | varchar(25) | NO | UNI | NULL | |\n+---------------+-------------+------+-----+---------+-------+\n \n\n\nURL: https://mariadb.com/kb/en/library/show-columns/','','https://mariadb.com/kb/en/library/show-columns/'),(728,'SPIDER_FLUSH_TABLE_MON_CACHE',43,'Syntax\n------ \nSPIDER_FLUSH_TABLE_MON_CACHE()\n \nDescription\n----------- \nA UDF installed with the Spider Storage Engine, this\nfunction is used for refreshing monitoring server\ninformation. It returns a value of 1.\n \nExamples\n-------- \nSELECT SPIDER_FLUSH_TABLE_MON_CACHE();\n+--------------------------------+\n| SPIDER_FLUSH_TABLE_MON_CACHE() |\n+--------------------------------+\n| 1 |\n+--------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/spider_flush_table_mon_cache/','','https://mariadb.com/kb/en/spider_flush_table_mon_cache/'),(730,'COLUMN_CHECK',44,'The COLUMN_CHECK function was added in MariaDB 10.0.1.\n \nSyntax\n------ \nCOLUMN_CHECK(dyncol_blob);\n \nDescription\n----------- \nCheck if dyncol_blob is a valid packed dynamic columns blob.\nReturn value of 1 means the blob is valid, return value of 0\nmeans it is not.\n \nRationale:\nNormally, one works with valid dynamic column blobs.\nFunctions like COLUMN_CREATE, COLUMN_ADD, COLUMN_DELETE\nalways return valid dynamic column blobs. However, if a\ndynamic column blob is accidentally truncated, or transcoded\nfrom one character set to another, it will be corrupted.\nThis function can be used to check if a value in a blob\nfield is a valid dynamic column blob.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/column_check/','','https://mariadb.com/kb/en/column_check/'),(732,'COLUMN_DELETE',44,'The Dynamic columns feature was introduced in MariaDB 5.3.\n \nSyntax\n------ \nCOLUMN_DELETE(dyncol_blob, column_nr, column_nr...);\nCOLUMN_DELETE(dyncol_blob, column_name, column_name...);\n \nDescription\n----------- \nDeletes a dynamic column with the specified name. Multiple\nnames can be given. The return value is a dynamic column\nblob after the modification.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/column_delete/','','https://mariadb.com/kb/en/column_delete/'),(733,'COLUMN_EXISTS',44,'The Dynamic columns feature was introduced in MariaDB 5.3.\n \nSyntax\n------ \nCOLUMN_EXISTS(dyncol_blob, column_nr);\nCOLUMN_EXISTS(dyncol_blob, column_name);\n \nDescription\n----------- \nChecks if a column with name column_name exists in\ndyncol_blob. If yes, return 1, otherwise return 0. See\ndynamic columns for more information.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/column_exists/','','https://mariadb.com/kb/en/column_exists/'),(736,'COLUMN_LIST',44,'The Dynamic columns feature was introduced in MariaDB 5.3.\n \nSyntax\n------ \nCOLUMN_LIST(dyncol_blob);\n \nDescription\n----------- \nSince MariaDB 10.0.1, this function returns a\ncomma-separated list of column names. The names are quoted\nwith backticks.\n \nBefore MariaDB 10.0.1, it returned a comma-separated list of\ncolumn numbers, not names.\n \nSee dynamic columns for more information.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/column_list/','','https://mariadb.com/kb/en/column_list/'),(356,'SHOW CONTRIBUTORS',26,'Syntax\n------ \nSHOW CONTRIBUTORS\n \nDescription\n----------- \nThe SHOW CONTRIBUTORS statement displays information about\nthe companies and people who financially contribute to\nMariaDB. For each contributor, it displays Name, Location,\nand Comment values. All columns are encoded as latin1.\n \nIn MariaDB 5.5 this is in somewhat random order, and the\nfeature was deprecated.\n \nIn MariaDB 10.0.5 it was un-deprecated, and since then\ndisplays all members and sponsors of the MariaDB Foundation\nas well as other financial contributors.\n \nExample\n \nSHOW CONTRIBUTORS;\n+---------------------+-------------------------------+-------------------------------------------------------------+\n| Name | Location | Comment |\n+---------------------+-------------------------------+-------------------------------------------------------------+\n| Booking.com | https://www.booking.com | Founding member,\nPlatinum Sponsor of the MariaDB Foundation |\n| Alibaba Cloud | https://www.alibabacloud.com/ | Platinum\nSponsor of the MariaDB Foundation |\n| Tencent Cloud | https://cloud.tencent.com | Platinum\nSponsor of the MariaDB Foundation |\n| Microsoft | https://microsoft.com/ | Platinum Sponsor of\nthe MariaDB Foundation |\n| MariaDB Corporation | https://mariadb.com | Founding\nmember, Platinum Sponsor of the MariaDB Foundation |\n| Visma | https://visma.com | Gold Sponsor of the MariaDB\nFoundation |\n| DBS | https://dbs.com | Gold Sponsor of the MariaDB\nFoundation |\n| IBM | https://www.ibm.com | Gold Sponsor of the MariaDB\nFoundation |\n| Tencent Games | http://game.qq.com/ | Gold Sponsor of the\nMariaDB Foundation |\n| Nexedi | https://www.nexedi.com | Silver Sponsor of the\nMariaDB Foundation |\n| Acronis | https://www.acronis.com | Silver Sponsor of the\nMariaDB Foundation |\n| Verkkokauppa.com | https://www.verkkokauppa.com | Bronze\nSponsor of the MariaDB Foundation |\n| Virtuozzo | https://virtuozzo.com | Bronze Sponsor of the\nMariaDB Foundation |\n| Tencent Game DBA | http://tencentdba.com/about | Bronze\nSponsor of the MariaDB Foundation |\n| Tencent TDSQL | http://tdsql.org | Bronze Sponsor of the\nMariaDB Foundation |\n| Percona | https://www.percona.com/ | Bronze Sponsor of the\nMariaDB Foundation |\n| Google | USA | Sponsoring encryption, parallel replication\nand GTID |\n| Facebook | USA | Sponsoring non-blocking API, LIMIT ROWS\nEXAMINED etc |\n| Ronald Bradford | Brisbane, Australia | EFF contribution\nfor UC2006 Auction |\n| Sheeri Kritzer | Boston, Mass. USA | EFF contribution for\nUC2006 Auction |\n| Mark Shuttleworth | London, UK. | EFF contribution for\nUC2006 Auction |\n+---------------------+-------------------------------+-------------------------------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/show-contributors/','','https://mariadb.com/kb/en/library/show-contributors/'),(357,'SHOW CREATE DATABASE',26,'Syntax\n------ \nSHOW CREATE {DATABASE | SCHEMA} db_name\n \nDescription\n----------- \nShows the CREATE DATABASE statement that\ncreates the given database. SHOW CREATE SCHEMA is a synonym\nfor SHOW CREATE DATABASE. SHOW CREATE DATABASE quotes\ndatabase names according to the value of the\nsql_quote_show_create server system variable.\n \nExamples\n-------- \nSHOW CREATE DATABASE test;\n+----------+-----------------------------------------------------------------+\n| Database | Create Database |\n+----------+-----------------------------------------------------------------+\n| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER\nSET latin1 */ |\n+----------+-----------------------------------------------------------------+\n \nSHOW CREATE SCHEMA test;\n+----------+-----------------------------------------------------------------+\n| Database | Create Database |\n+----------+-----------------------------------------------------------------+\n| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER\nSET latin1 */ |\n+----------+-----------------------------------------------------------------+\n \nWith sql_quote_show_create off:\n \nSHOW CREATE DATABASE test;\n+----------+---------------------------------------------------------------+\n| Database | Create Database |\n+----------+---------------------------------------------------------------+\n| test | CREATE DATABASE test /*!40100 DEFAULT CHARACTER SET\nlatin1 */ |\n+----------+---------------------------------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/show-create-database/','','https://mariadb.com/kb/en/library/show-create-database/'),(358,'SHOW CREATE EVENT',26,'Syntax\n------ \nSHOW CREATE EVENT event_name\n \nDescription\n----------- \nThis statement displays the CREATE EVENT\nstatement needed to re-create a given event, as well as the\nSQL_MODE that was used when the trigger has been created and\nthe character set used by the connection.. To find out which\nevents are present, use SHOW EVENTS.\n \nThe output of this statement is unreliably affected by the\nsql_quote_show_create server system variable - see\nhttp://bugs.mysql.com/bug.php?id=12719\n \nThe information_schema.EVENTS table provides similar, but\nmore complete, information.\n \nExamples\n-------- \nSHOW CREATE EVENT test.e_daily\\G\n*************************** 1. row\n***************************\n Event: e_daily\n sql_mode: \n time_zone: SYSTEM\n Create Event: CREATE EVENT `e_daily`\n ON SCHEDULE EVERY 1 DAY\n STARTS CURRENT_TIMESTAMP + INTERVAL 6 HOUR\n ON COMPLETION NOT PRESERVE\n ENABLE\n COMMENT \'Saves total number of sessions then\n clears the table each day\'\n DO BEGIN\n INSERT INTO site_activity.totals (time, total)\n SELECT CURRENT_TIMESTAMP, COUNT(*) \n FROM site_activity.sessions;\n DELETE FROM site_activity.sessions;\n END\ncharacter_set_client: latin1\ncollation_connection: latin1_swedish_ci\n Database Collation: latin1_swedish_ci\n \n\n\nURL: https://mariadb.com/kb/en/library/show-create-event/','','https://mariadb.com/kb/en/library/show-create-event/'),(359,'SHOW CREATE FUNCTION',26,'Syntax\n------ \nSHOW CREATE FUNCTION func_name\n \nDescription\n----------- \nThis statement is similar to \nSHOW CREATE PROCEDURE but for\nstored functions.\n \nThe output of this statement is unreliably affected by the\nsql_quote_show_create server system variable - see\nhttp://bugs.mysql.com/bug.php?id=12719\n \nExample\n \nMariaDB [test]> SHOW CREATE FUNCTION VatCents\\G\n*************************** 1. row\n***************************\n Function: VatCents\n sql_mode: \n Create Function: CREATE DEFINER=`root`@`localhost` FUNCTION\n`VatCents`(price DECIMAL(10,2)) RETURNS int(11)\n DETERMINISTIC\nBEGIN\n DECLARE x INT;\n SET x = price * 114;\n RETURN x;\nEND\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n \n\n\nURL: https://mariadb.com/kb/en/library/show-create-function/','','https://mariadb.com/kb/en/library/show-create-function/'),(360,'SHOW CREATE PACKAGE',26,'Oracle-style packages were introduced in MariaDB 10.3.5.\n \nSyntax\n------ \nSHOW CREATE PACKAGE [ db_name . ] package_name\n \nDescription\n----------- \nThe SHOW CREATE PACKAGE statement can be used when Oracle\nSQL_MODE is set.\n \nShows the CREATE statement that creates the given package\nspecification.\n \nExamples\n-------- \nSHOW CREATE PACKAGE employee_tools\\G\n*************************** 1. row\n***************************\n Package: employee_tools\n sql_mode:\nPIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER\n Create Package: CREATE DEFINER=\"root\"@\"localhost\"\nPACKAGE \"employee_tools\" AS\n FUNCTION getSalary(eid INT) RETURN DECIMAL(10,2);\n PROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2));\n PROCEDURE raiseSalaryStd(eid INT);\n PROCEDURE hire(ename TEXT, esalary DECIMAL(10,2));\nEND\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n \n\n\nURL: https://mariadb.com/kb/en/library/show-create-package/','','https://mariadb.com/kb/en/library/show-create-package/'),(361,'SHOW CREATE PACKAGE BODY',26,'Oracle-style packages were introduced in MariaDB 10.3.5.\n \nSyntax\n------ \nSHOW CREATE PACKAGE BODY [ db_name . ] package_name\n \nDescription\n----------- \nThe SHOW CREATE PACKAGE BODY statement can be used when\nOracle SQL_MODE is set.\n \nShows the CREATE statement that creates the given package\nbody (i.e. the implementation).\n \nExamples\n-------- \nSHOW CREATE PACKAGE BODY employee_tools\\G\n*************************** 1. row\n***************************\n Package body: employee_tools\n sql_mode:\nPIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER\n Create Package Body: CREATE DEFINER=\"root\"@\"localhost\"\nPACKAGE BODY \"employee_tools\" AS\n \n stdRaiseAmount DECIMAL(10,2):=500;\n \n PROCEDURE log (eid INT, ecmnt TEXT) AS\n BEGIN\n INSERT INTO employee_log (id, cmnt) VALUES (eid, ecmnt);\n END;\n \n PROCEDURE hire(ename TEXT, esalary DECIMAL(10,2)) AS\n eid INT;\n BEGIN\n INSERT INTO employee (name, salary) VALUES (ename,\nesalary);\n eid:= last_insert_id();\n log(eid, \'hire \' || ename);\n END;\n \n FUNCTION getSalary(eid INT) RETURN DECIMAL(10,2) AS\n nSalary DECIMAL(10,2);\n BEGIN\n SELECT salary INTO nSalary FROM employee WHERE id=eid;\n log(eid, \'getSalary id=\' || eid || \' salary=\' ||\nnSalary);\n RETURN nSalary;\n END;\n \n PROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2)) AS\n BEGIN\n UPDATE employee SET salary=salary+amount WHERE id=eid;\n log(eid, \'raiseSalary id=\' || eid || \' amount=\' ||\namount);\n END;\n \n PROCEDURE raiseSalaryStd(eid INT) AS\n BEGIN\n raiseSalary(eid, stdRaiseAmount);\n log(eid, \'raiseSalaryStd id=\' || eid);\n END;\n \nBEGIN \n log(0, \'Session \' || connection_id() || \' \' ||\ncurrent_user || \' started\');\nEND\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n \n\n\nURL:\nhttps://mariadb.com/kb/en/library/show-create-package-body/','','https://mariadb.com/kb/en/library/show-create-package-body/'),(362,'SHOW CREATE PROCEDURE',26,'Syntax\n------ \nSHOW CREATE PROCEDURE proc_name\n \nDescription\n----------- \nThis statement is a MariaDB extension. It returns the exact\nstring that\ncan be used to re-create the named stored procedure, as well\nas the SQL_MODE that was used when the trigger has been\ncreated and the character set used by the connection.. A\nsimilar\nstatement, SHOW CREATE FUNCTION,\ndisplays information about stored functions.\n \nBoth statements require that you are the owner of the\nroutine or have the SELECT privilege on the mysql.proc\ntable. When neither is true, the statements display NULL for\nthe Create Procedure or Create Function field.\n \nWarning Users with SELECT privileges on mysql.proc or USAGE\nprivileges on *.* can view the text of routines, even when\nthey do not have privileges for the function or procedure\nitself.\n \nThe output of these statements is unreliably affected by the\nsql_quote_show_create server system variable - see\nhttp://bugs.mysql.com/bug.php?id=12719\n \nExamples\n-------- \nHere\'s a comparison of the SHOW CREATE PROCEDURE and SHOW\nCREATE FUNCTION statements.\n \nSHOW CREATE PROCEDURE test.simpleproc\\G\n*************************** 1. row\n***************************\n Procedure: simpleproc\n sql_mode: \n Create Procedure: CREATE PROCEDURE `simpleproc`(OUT param1\nINT)\n BEGIN\n SELECT COUNT(*) INTO param1 FROM t;\n END\ncharacter_set_client: latin1\ncollation_connection: latin1_swedish_ci\n Database Collation: latin1_swedish_ci\n \nSHOW CREATE FUNCTION test.hello\\G\n*************************** 1. row\n***************************\n Function: hello\n sql_mode:\n Create Function: CREATE FUNCTION `hello`(s CHAR(20))\n RETURNS CHAR(50)\n RETURN CONCAT(\'Hello, \',s,\'!\')\ncharacter_set_client: latin1\ncollation_connection: latin1_swedish_ci\n Database Collation: latin1_swedish_ci\n \nWhen the user issuing the statement does not have privileges\non the routine, attempting to CALL the procedure raises\nError 1370.\n \nCALL test.prc1();\nError 1370 (42000): execute command denieed to user\n\'test_user\'@\'localhost\' for routine \'test\'.\'prc1\'\n \nIf the user neither has privilege to the routine nor the\nSELECT privilege on mysql.proc table, it raises Error 1305,\ninforming them that the procedure does not exist.\n \nSHOW CREATE TABLES test.prc1\\G\nError 1305 (42000): PROCEDURE prc1 does not exist\n \n\n\nURL:\nhttps://mariadb.com/kb/en/library/show-create-procedure/','','https://mariadb.com/kb/en/library/show-create-procedure/'),(363,'SHOW CREATE SEQUENCE',26,'Sequences were introduced in MariaDB 10.3.\n \nSyntax\n------ \nSHOW CREATE SEQUENCE sequence_name;\n \nDescription\n----------- \nShows the CREATE SEQUENCE statement that created the given\nsequence. The statement requires the SELECT privilege for\nthe table.\n \nExample\n \nCREATE SEQUENCE s1 START WITH 50;\n \nSHOW CREATE SEQUENCE s1\\G;\n \n*************************** 1. row\n***************************\n Table: t1\nCreate Table: CREATE SEQUENCE `s1` start with 50 minvalue 1\nmaxvalue 9223372036854775806\nincrement by 1 cache 1000 nocycle ENGINE=Aria\n \nNotes\n \nIf you want to see the underlying table structure used for\nthe SEQUENCE\nyou can use SHOW CREATE TABLE on the SEQUENCE. You can also\nuse SELECT to read the current recorded state of the\nSEQUENCE:\n \nCREATE SEQUENCE t1;\n \nSHOW CREATE TABLE s1\\G\n*************************** 1. row\n***************************\n Table: s1\nCreate Table: CREATE TABLE `s1` (\n `next_value` bigint(21) NOT NULL COMMENT \'next not cached\nvalue\',\n `min_value` bigint(21) NOT NULL COMMENT \'min value\',\n `max_value` bigint(21) NOT NULL COMMENT \'max value\',\n `start` bigint(21) NOT NULL COMMENT \'start value\',\n `increment` bigint(21) NOT NULL COMMENT \'increment\nvalue\',\n `cache` bigint(21) NOT NULL COMMENT \'cache size\',\n `cycle` tinyint(1) unsigned NOT NULL COMMENT \'cycle\nstate\',\n `round` bigint(21) NOT NULL COMMENT \'How many cycles has\nbeen done\'\n) ENGINE=Aria SEQUENCE=1\n \nSELECT * FROM s1;\n \n+------------+-----------+---------------------+-------+-----------+-------+-------+-------+\n| next_value | min_value | max_value | start | increment |\ncache | cycle | round |\n+------------+-----------+---------------------+-------+-----------+-------+-------+-------+\n| 1 | 1 | 9223372036854775806 | 1 | 1 | 1000 | 0 | 0 |\n+------------+-----------+---------------------+-------+-----------+-------+-------+-------+\n \n\n\nURL: https://mariadb.com/kb/en/library/show-create-sequence/','','https://mariadb.com/kb/en/library/show-create-sequence/'),(364,'SHOW CREATE TABLE',26,'Syntax\n------ \nSHOW CREATE TABLE tbl_name\n \nDescription\n----------- \nShows the CREATE TABLE statement that created the given\ntable. The statement requires the SELECT privilege for the\ntable. This statement also works with views and SEQUENCE.\n \nSHOW CREATE TABLE quotes table and\ncolumn names according to the value of the\nsql_quote_show_create server system variable.\n \nMariaDB and MySQL-specific table options, column options,\nand index options are not included in the output of this\nstatement if the NO_TABLE_OPTIONS, NO_FIELD_OPTIONS and\nNO_KEY_OPTIONS SQL_MODE flags are used.\n \nInvalid table options, column options and index options are\nnormally commented out (note, that it is possible to create\na table with invalid options, by altering a table of a\ndifferent engine, where these options were valid). To have\nthem uncommented, enable IGNORE_BAD_TABLE_OPTIONS SQL_MODE.\nRemember that replaying a CREATE TABLE statement with\nuncommented invalid options will fail with an error, unless\nIGNORE_BAD_TABLE_OPTIONS SQL_MODE is in effect.\n \nNote that SHOW CREATE TABLE is not meant to provide metadata\nabout a table. It provides information about how the table\nwas declared, but the real table structure could differ a\nbit. For example, if an index has been declared as HASH, the\nCREATE TABLE statement returned by SHOW CREATE TABLE will\ndeclare that index as HASH; however, it is possible that the\nindex is in fact a BTREE, because the storage engine does\nnot support HASH.\n \nMariaDB 10.2.1 permits TEXT and BLOB data types to be\nassigned a DEFAULT value. As a result, from MariaDB 10.2.1,\nSHOW CREATE TABLE will append a DEFAULT NULL to nullable\nTEXT or BLOB fields if no specific default is provided. \n \nFrom MariaDB 10.2.2, numbers are no longer quoted in the\nDEFAULT clause in SHOW CREATE statement. Previously, MariaDB\nquoted numbers. \n \nExamples\n-------- \nSHOW CREATE TABLE t\\G\n*************************** 1. row\n***************************\n Table: t\nCreate Table: CREATE TABLE `t` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `s` char(60) DEFAULT NULL,\n PRIMARY KEY (`id`)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\n \nWith sql_quote_show_create off:\n \nSHOW CREATE TABLE t\\G\n*************************** 1. row\n***************************\n Table: t\nCreate Table: CREATE TABLE t (\n id int(11) NOT NULL AUTO_INCREMENT,\n s char(60) DEFAULT NULL,\n PRIMARY KEY (id)\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\n \nUnquoted numeric DEFAULTs, from MariaDB 10.2.2:\n \nCREATE TABLE td (link TINYINT DEFAULT 1);\n \nSHOW CREATE TABLE td\\G\n*************************** 1. row\n***************************\n Table: td\nCreate Table: CREATE TABLE `td` (\n `link` tinyint(4) DEFAULT 1\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\n \nQuoted numeric DEFAULTs, until MariaDB 10.2.1:\n \nCREATE TABLE td (link TINYINT DEFAULT 1);\n \nSHOW CREATE TABLE td\\G\n*************************** 1. row\n***************************\n Table: td\nCreate Table: CREATE TABLE `td` (\n `link` tinyint(4) DEFAULT \'1\'\n) ENGINE=InnoDB DEFAULT CHARSET=latin1\n \n\n\nURL: https://mariadb.com/kb/en/library/show-create-table/','','https://mariadb.com/kb/en/library/show-create-table/'),(365,'SHOW CREATE TRIGGER',26,'Syntax\n------ \nSHOW CREATE TRIGGER trigger_name\n \nDescription\n----------- \nThis statement shows a CREATE TRIGGER\nstatement that creates the given trigger, as well as the\nSQL_MODE that was used when the trigger has been created and\nthe character set used by the connection.\n \nThe output of this statement is unreliably affected by the\nsql_quote_show_create server system variable - see\nhttp://bugs.mysql.com/bug.php?id=12719\n \nExamples\n-------- \nSHOW CREATE TRIGGER example\\G\n*************************** 1. row\n***************************\n Trigger: example\n sql_mode:\nONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,STRICT_ALL_TABLES\n,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_\nENGINE_SUBSTITUTION\nSQL Original Statement: CREATE DEFINER=`root`@`localhost`\nTRIGGER example BEFORE\n INSERT ON t FOR EACH ROW\nBEGIN\n SET NEW.c = NEW.c * 2;\nEND\n character_set_client: cp850\n collation_connection: cp850_general_ci\n Database Collation: utf8_general_ci\n Created: 2016-09-29 13:53:34.35\n \nThe Created column was added in MySQL 5.7 and MariaDB 10.2.3\nas part of introducing multiple trigger events per action.\n \n\n\nURL: https://mariadb.com/kb/en/library/show-create-trigger/','','https://mariadb.com/kb/en/library/show-create-trigger/'),(366,'SHOW CREATE USER',26,'SHOW CREATE USER was introduced in MariaDB 10.2.0\n \nSyntax\n------ \nSHOW CREATE USER user_name\n \nDescription\n----------- \nShows the CREATE USER statement that created the given\nuser. The statement requires the SELECT privilege for the\nmysql database, except for the current user.\n \nExamples\n-------- \nCREATE USER foo4@test require cipher \'text\' \n issuer \'foo_issuer\' subject \'foo_subject\';\n \nSHOW CREATE USER foo4@test\\G\n*************************** 1. row\n***************************\nCREATE USER \'foo4\'@\'test\' \n REQUIRE ISSUER \'foo_issuer\' \n SUBJECT \'foo_subject\' \n CIPHER \'text\'\n \nUser Password Expiry:\n \nCREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE INTERVAL\n120 DAY;\n \nSHOW CREATE USER \'monty\'@\'localhost\';\n \n+------------------------------------------------------------------+\n| CREATE USER for monty@localhost |\n+------------------------------------------------------------------+\n| CREATE USER \'monty\'@\'localhost\' PASSWORD EXPIRE\nINTERVAL 120 DAY |\n+------------------------------------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/show-create-user/','','https://mariadb.com/kb/en/library/show-create-user/'),(367,'SHOW CREATE VIEW',26,'Syntax\n------ \nSHOW CREATE VIEW view_name\n \nDescription\n----------- \nThis statement shows a CREATE VIEW statement that creates\nthe given view, as well as the character set used by the\nconnection when the view was created. This statement\nalso works with views.\n \nSHOW CREATE VIEW quotes table, column and stored function\nnames according to the value of the sql_quote_show_create\nserver system variable.\n \nExamples\n-------- \nSHOW CREATE VIEW example\\G\n*************************** 1. row\n***************************\n View: example\n Create View: CREATE ALGORITHM=UNDEFINED\nDEFINER=`root`@`localhost` SQL\nSECURITY DEFINER VIEW `example` AS (select `t`.`id` AS\n`id`,`t`.`s` AS `s` from\n`t`)\ncharacter_set_client: cp850\ncollation_connection: cp850_general_ci\n \nWith sql_quote_show_create off:\n \nSHOW CREATE VIEW example\\G\n*************************** 1. row\n***************************\n View: example\n Create View: CREATE ALGORITHM=UNDEFINED\nDEFINER=root@localhost SQL SECU\nRITY DEFINER VIEW example AS (select t.id AS id,t.s AS s\nfrom t)\ncharacter_set_client: cp850\ncollation_connection: cp850_general_ci\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-create-view/','','https://mariadb.com/kb/en/library/show-create-view/'),(368,'SHOW DATABASES',26,'Syntax\n------ \nSHOW {DATABASES | SCHEMAS}\n [LIKE \'pattern\' | WHERE expr]\n \nDescription\n----------- \nSHOW DATABASES lists the databases on the MariaDB server\nhost.\nSHOW SCHEMAS is a synonym for \nSHOW DATABASES. The LIKE clause, if\npresent on its own, indicates which database names to match.\nThe WHERE and LIKE clauses can be given to select rows using\nmore general conditions, as discussed in Extended SHOW.\n \nYou see only those databases for which you have some kind of\nprivilege, unless you have the global \nSHOW DATABASES privilege. You\ncan also get this list using the mysqlshow command.\n \nIf the server was started with the --skip-show-database\noption, you cannot use this statement at all unless you have\nthe\nSHOW DATABASES privilege.\n \nExample\n \nSHOW DATABASES;\n+--------------------+\n| Database |\n+--------------------+\n| information_schema |\n| mysql |\n| performance_schema |\n| test |\n+--------------------+\n \nSHOW DATABASES LIKE \'m%\';\n+---------------+\n| Database (m%) |\n+---------------+\n| mysql |\n+---------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-databases/','','https://mariadb.com/kb/en/library/show-databases/'),(371,'SHOW ENGINES',26,'Syntax\n------ \nSHOW [STORAGE] ENGINES\n \nDescription\n----------- \nSHOW ENGINES displays status information about the server\'s\nstorage engines. This is particularly useful for checking\nwhether a storage\nengine is supported, or to see what the default engine is. \nSHOW TABLE TYPES is a deprecated synonym.\n \nThe information_schema.ENGINES table provides the same\ninformation.\n \nSince storage engines are plugins, different information\nabout them is also shown in the information_schema.PLUGINS\ntable and by the SHOW PLUGINS statement.\n \nNote that both MySQL\'s InnoDB and Percona\'s XtraDB\nreplacement are labeled as InnoDB. However, if XtraDB is in\nuse, it will be specified in the COMMENT field. See XtraDB\nand InnoDB. The same applies to FederatedX.\n \nThe output consists of the following columns:\nEngine indicates the engine\'s name.\nSupport indicates whether the engine is installed, and\nwhether it is the default engine for the current session.\nComment is a brief description.\nTransactions, XA and Savepoints indicate whether\ntransactions, XA transactions and transaction savepoints are\nsupported by the engine.\n \nExamples\n-------- \nSHOW ENGINES\\G\n*************************** 1. row\n***************************\n Engine: InnoDB\n Support: DEFAULT\n Comment: Supports transactions, row-level locking, and\nforeign keys\nTransactions: YES\n XA: YES\n Savepoints: YES\n*************************** 2. row\n***************************\n Engine: CSV\n Support: YES\n Comment: CSV storage engine\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 3. row\n***************************\n Engine: MyISAM\n Support: YES\n Comment: MyISAM storage engine\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 4. row\n***************************\n Engine: BLACKHOLE\n Support: YES\n Comment: /dev/null storage engine (anything you write to it\ndisappears)\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 5. row\n***************************\n Engine: FEDERATED\n Support: YES\n Comment: FederatedX pluggable storage engine\nTransactions: YES\n XA: NO\n Savepoints: YES\n*************************** 6. row\n***************************\n Engine: MRG_MyISAM\n Support: YES\n Comment: Collection of identical MyISAM tables\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 7. row\n***************************\n Engine: ARCHIVE\n Support: YES\n Comment: Archive storage engine\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 8. row\n***************************\n Engine: MEMORY\n Support: YES\n Comment: Hash based, stored in memory, useful for temporary\ntables\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 9. row\n***************************\n Engine: PERFORMANCE_SCHEMA\n Support: YES\n Comment: Performance Schema\nTransactions: NO\n XA: NO\n Savepoints: NO\n*************************** 10. row\n***************************\n Engine: Aria\n Support: YES\n Comment: Crash-safe tables with MyISAM heritage\nTransactions: NO\n XA: NO\n Savepoints: NO\n10 rows in set (0.00 sec)\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-engines/','','https://mariadb.com/kb/en/library/show-engines/'),(369,'SHOW ENGINE',26,'Syntax\n------ \nSHOW ENGINE engine_name {STATUS | MUTEX}\n \nDescription\n----------- \nSHOW ENGINE displays operational information about a storage\nengine. The following statements currently are supported:\n \nSHOW ENGINE INNODB STATUS\nSHOW ENGINE INNODB MUTEX\nSHOW ENGINE PERFORMANCE_SCHEMA STATUS\n \nIf the Sphinx Storage Engine is installed, the following is\nalso supported:\n \nSHOW ENGINE SPHINX STATUS\n \nSee SHOW ENGINE SPHINX STATUS.\n \nOlder (and now removed) synonyms were SHOW INNODB STATUS\nfor SHOW ENGINE INNODB STATUS and \nSHOW MUTEX STATUS for \nSHOW ENGINE INNODB MUTEX.\n \nSHOW ENGINE BDB LOGS formerly displayed status information\nabout BDB log files. It was deprecated in MySQL 5.1.12 and\nremoved in MariaDB and MySQL 5.5, so now produces an error.\n \nSHOW ENGINE INNODB STATUS\n \nSHOW ENGINE INNODB STATUS displays extensive information\nfrom the standard InnoDB Monitor about the state of the\nInnoDB storage engine.\nSee SHOW ENGINE INNODB STATUS for more.\n \nSHOW ENGINE INNODB MUTEX\n \nSHOW ENGINE INNODB MUTEX displays InnoDB mutex statistics.\n \nThe statement displays the following output fields:\nType: Always InnoDB.\nName: The source file where the mutex is implemented, and\nthe line number\n in the file where the mutex is created. The line number is\ndependent on the MariaDB version.\nStatus: This field displays the following values if\nUNIV_DEBUG was defined at compilation time (for example, in\ninclude/univ.h in the InnoDB part of the source tree). Only\nthe os_waits value is displayed if UNIV_DEBUG was not\ndefined. Without UNIV_DEBUG, the information on which the\noutput is based is insufficient to distinguish regular\nmutexes and mutexes that protect\n rw-locks (which allow multiple readers or a single writer).\nConsequently, the\n output may appear to contain multiple rows for the same\nmutex.\ncount indicates how many times the mutex was requested.\nspin_waits indicates how many times the spinlock had to run.\nspin_rounds indicates the number of spinlock rounds.\n(spin_rounds divided by\n spin_waits provides the average round count.)\nos_waits indicates the number of operating system waits.\nThis occurs when\n the spinlock did not work (the mutex was not locked during\nthe spinlock and\n it was necessary to yield to the operating system and\nwait).\nos_yields indicates the number of times a the thread trying\nto lock a mutex\n gave up its timeslice and yielded to the operating system\n(on the\n presumption that allowing other threads to run will free\nthe mutex so that\n it can be locked).\nos_wait_times indicates the amount of time (in ms) spent in\noperating system\n waits, if the timed_mutexes system variable is 1 (ON). If\ntimed_mutexes is 0\n (OFF), timing is disabled, so os_wait_times is 0.\ntimed_mutexes is off by\n default.\n \nInformation from this statement can be used to diagnose\nsystem problems. For\nexample, large values of spin_waits and spin_rounds may\nindicate scalability\nproblems.\n \nThe information_schema.INNODB_MUTEXES table provides similar\ninformation.\n \nSHOW ENGINE PERFORMANCE_SCHEMA STATUS\n \nThis statement shows how much memory is used for\nperformance_schema tables and internal buffers.\n \nThe output contains the following fields:\nType: Always performance_schema.\nName: The name of a table, the name of an internal buffer,\nor the performance_schema word, followed by a dot and an\nattribute. Internal buffers names are enclosed by\nparenthesis. performance_schema means that the attribute\nrefers to the whole database (it is a total). \nStatus: The value for the attribute.\n \nThe following attributes are shown, in this order, for all\ntables:\nrow_size: The memory used for an individual record. This\nvalue will never change.\nrow_count: The number of rows in the table or buffer. For\nsome tables, this value depends on a server system variable.\nmemory: For tables and performance_schema, this is the\nresult of row_size * row_count.\n \nFor internal buffers, the attributes are:\ncount\nsize\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-engine/','','https://mariadb.com/kb/en/library/show-engine/'),(372,'SHOW ERRORS',26,'Syntax\n------ \nSHOW ERRORS [LIMIT [offset,] row_count]\nSHOW ERRORS [LIMIT row_count OFFSET offset]\nSHOW COUNT(*) ERRORS\n \nDescription\n----------- \nThis statement is similar to SHOW WARNINGS, except that\ninstead of\ndisplaying errors, warnings, and notes, it displays only\nerrors.\n \nThe LIMIT clause has the same syntax as for the\nSELECT statement.\n \nThe SHOW COUNT(*) ERRORS statement displays the number of\nerrors. You can also retrieve this number from the\nerror_count variable.\n \nSHOW COUNT(*) ERRORS;\nSELECT @@error_count;\n \nThe value of error_count might be greater than the number of\nmessages displayed by SHOW WARNINGS if the max_error_count\nsystem variable is set so low that not all messages are\nstored.\n \nFor a list of MariaDB error codes, see MariaDB Error Codes.\n \nExamples\n-------- \nSELECT f();\nERROR 1305 (42000): FUNCTION f does not exist\n \nSHOW COUNT(*) ERRORS;\n \n+-----------------------+\n| @@session.error_count |\n+-----------------------+\n| 1 |\n+-----------------------+\n \nSHOW ERRORS;\n \n+-------+------+---------------------------+\n| Level | Code | Message |\n+-------+------+---------------------------+\n| Error | 1305 | FUNCTION f does not exist |\n+-------+------+---------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-errors/','','https://mariadb.com/kb/en/library/show-errors/'),(370,'SHOW ENGINE INNODB STATUS',26,'SHOW ENGINE INNODB STATUS is a specific form of the SHOW\nENGINE statement that displays the InnoDB Monitor output,\nwhich is extensive InnoDB information which can be useful in\ndiagnosing problems.\n \nThe following sections are displayed\nStatus: Shows the timestamp, monitor name and the number of\nseconds, or the elapsed time between the current time and\nthe time the InnoDB Monitor output was last displayed. The\nper-second averages are based upon this time.\nBACKGROUND THREAD: srv_master_thread lines show work\nperformed by the main background thread.\nSEMAPHORES: Threads waiting for a semaphore and stats on how\nthe number of times threads have needed a spin or a wait on\na mutex or rw-lock semaphore. If this number of threads is\nlarge, there may be I/O or contention issues. Reducing the\nsize of the innodb_thread_concurrency system variable may\nhelp if contention is related to thread scheduling. Spin\nrounds per wait shows the number of spinlock rounds per OS\nwait for a mutex. \nLATEST FOREIGN KEY ERROR: Only shown if there has been a\nforeign key constraint error, it displays the failed\nstatement and information about the constraint and the\nrelated tables.\nLATEST DETECTED DEADLOCK: Only shown if there has been a\ndeadlock, it displays the transactions involved in the\ndeadlock and the statements being executed, held and\nrequired locked and the transaction rolled back to.\nTRANSACTIONS: The output of this section can help identify\nlock contention, as well as reasons for the deadlocks.\nFILE I/O: InnoDB thread information as well as pending I/O\noperations and I/O performance statistics.\nINSERT BUFFER AND ADAPTIVE HASH INDEX: InnoDB insert buffer\nand adaptive hash index status information, including the\nnumber of each type of operation performed, and adaptive\nhash index performance.\nLOG: InnoDB log information, including current log sequence\nnumber, how far the log has been flushed to disk, the\nposition at which InnoDB last took a checkpoint, pending\nwrites and write performance statistics.\nBUFFER POOL AND MEMORY: Information on buffer pool pages\nread and written, which allows you to see the number of data\nfile I/O operations performed by your queries. See InnoDB\nBuffer Pool for more. Similar information is also available\nfrom the INFORMATION_SCHEMA.INNODB_BUFFER_POOL_STATS table.\nROW OPERATIONS:Information about the main thread, including\nthe number and performance rate for each type of row\noperation. \n \nIf the innodb_status_output_locks system variable is set to\n1, extended lock information will be displayed.\n \nExample output:\n \n=====================================\n2016-09-12 04:42:15 7f226145fb00 INNODB MONITOR OUTPUT\n=====================================\nPer second averages calculated from the last 29 seconds\n-----------------\nBACKGROUND THREAD\n-----------------\nsrv_master_thread loops: 0 srv_active, 0 srv_shutdown, 527\nsrv_idle\nsrv_master_thread log flush and writes: 527\n----------\nSEMAPHORES\n----------\nOS WAIT ARRAY INFO: reservation count 4\nOS WAIT ARRAY INFO: signal count 4\nMutex spin waits 2, rounds 60, OS waits 2\nRW-shared spins 2, rounds 60, OS waits 2\nRW-excl spins 0, rounds 0, OS waits 0\nSpin rounds per wait: 30.00 mutex, 30.00 RW-shared, 0.00\nRW-excl\n------------\nTRANSACTIONS\n------------\nTrx id counter 2308\nPurge done for trx\'s n:o < 0 undo n:o < 0 state: running\nbut idle\nHistory list length 0\nLIST OF TRANSACTIONS FOR EACH SESSION:\n---TRANSACTION 0, not started\nMySQL thread id 3, OS thread handle 0x7f226145fb00, query id\n4 localhost root init\nSHOW ENGINE INNODB STATUS\n--------\nFILE I/O\n--------\nI/O thread 0 state: waiting for completed aio requests\n(insert buffer thread)\nI/O thread 1 state: waiting for completed aio requests (log\nthread)\nI/O thread 2 state: waiting for completed aio requests (read\nthread)\nI/O thread 3 state: waiting for completed aio requests (read\nthread)\nI/O thread 4 state: waiting for completed aio requests (read\nthread)\nI/O thread 5 state: waiting for completed aio requests (read\nthread)\nI/O thread 6 state: waiting for completed aio requests\n(write thread)\nI/O thread 7 state: waiting for completed aio requests\n(write thread)\nI/O thread 8 state: waiting for completed aio requests\n(write thread)\nI/O thread 9 state: waiting for completed aio requests\n(write thread)\nPending normal aio reads: 0 [0, 0, 0, 0] , aio writes: 0 [0,\n0, 0, 0] ,\n ibuf aio reads: 0, log i/o\'s: 0, sync i/o\'s: 0\nPending flushes (fsync) log: 0; buffer pool: 0\n172 OS file reads, 5 OS file writes, 5 OS fsyncs\n0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s\n-------------------------------------\nINSERT BUFFER AND ADAPTIVE HASH INDEX\n-------------------------------------\nIbuf: size 1, free list len 0, seg size 2, 0 merges\nmerged operations:\n insert 0, delete mark 0, delete 0\ndiscarded operations:\n insert 0, delete mark 0, delete 0\n0.00 hash searches/s, 0.00 non-hash searches/s\n---\nLOG\n---\nLog sequence number 1616829\nLog flushed up to 1616829\nPages flushed up to 1616829\nLast checkpoint at 1616829\nMax checkpoint age 80826164\nCheckpoint age target 78300347\nModified age 0\nCheckpoint age 0\n0 pending log writes, 0 pending chkp writes\n8 log i/o\'s done, 0.00 log i/o\'s/second\n----------------------\nBUFFER POOL AND MEMORY\n----------------------\nTotal memory allocated 140771328; in additional pool\nallocated 0\nTotal memory allocated by read views 88\nInternal hash tables (constant factor + variable factor)\n Adaptive hash index 2217568 (2213368 + 4200)\n Page hash 139112 (buffer pool 0 only)\n Dictionary cache 630703 (554768 + 75935)\n File system 817648 (812272 + 5376)\n Lock system 333232 (332872 + 360)\n Recovery system 0 (0 + 0)\nDictionary memory allocated 75935\nBuffer pool size 8191\nBuffer pool size, bytes 134201344\nFree buffers 8037\nDatabase pages 154\nOld database pages 0\nModified db pages 0\nPercent of dirty pages(LRU & free pages): 0.000\nMax dirty pages percent: 75.000\nPending reads 0\nPending writes: LRU 0, flush list 0, single page 0\nPages made young 0, not young 0\n0.00 youngs/s, 0.00 non-youngs/s\nPages read 154, created 0, written 1\n0.00 reads/s, 0.00 creates/s, 0.00 writes/s\nNo buffer pool page gets since the last printout\nPages read ahead 0.00/s, evicted without access 0.00/s,\nRandom read ahead 0.00/s\nLRU len: 154, unzip_LRU len: 0\nI/O sum[0]:cur[0], unzip sum[0]:cur[0]\n--------------\nROW OPERATIONS\n--------------\n0 queries inside InnoDB, 0 queries in queue\n0 read views open inside InnoDB\n0 RW transactions active inside InnoDB\n0 RO transactions active inside InnoDB\n0 out of 1000 descriptors used\nMain thread process no. 3337, id 139784957703936, state:\nsleeping\nNumber of rows inserted 0, updated 0, deleted 0, read 0\n0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s\nNumber of system rows inserted 0, updated 0, deleted 0, read\n0\n0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s\n----------------------------\nEND OF INNODB MONITOR OUTPUT\n============================\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/show-engine-innodb-status/','','https://mariadb.com/kb/en/library/show-engine-innodb-status/'),(373,'SHOW EVENTS',26,'Syntax\n------ \nSHOW EVENTS [{FROM | IN} schema_name]\n [LIKE \'pattern\' | WHERE expr]\n \nDescription\n----------- \nShows information about Event Manager events (created with\nCREATE EVENT). Requires the EVENT privilege. Without any\narguments, SHOW EVENTS lists all of the events in the\ncurrent schema:\n \nSELECT CURRENT_USER(), SCHEMA();\n+----------------+----------+\n| CURRENT_USER() | SCHEMA() |\n+----------------+----------+\n| jon@ghidora | myschema |\n+----------------+----------+\n \nSHOW EVENTS\\G\n*************************** 1. row\n***************************\n Db: myschema\n Name: e_daily\n Definer: jon@ghidora\n Time zone: SYSTEM\n Type: RECURRING\n Execute at: NULL\n Interval value: 10\n Interval field: SECOND\n Starts: 2006-02-09 10:41:23\n Ends: NULL\n Status: ENABLED\n Originator: 0\ncharacter_set_client: latin1\ncollation_connection: latin1_swedish_ci\n Database Collation: latin1_swedish_ci\n \nTo see the event action, use SHOW CREATE EVENT instead, or\nlook at the information_schema.EVENTS table.\n \nTo see events for a specific schema, use the FROM clause.\nFor example, to see events for the test schema, use the\nfollowing statement:\n \nSHOW EVENTS FROM test;\n \nThe LIKE clause, if present, indicates which event names to\nmatch. The WHERE clause can be given to select rows using\nmore general conditions, as discussed in Extended Show.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-events/','','https://mariadb.com/kb/en/library/show-events/'),(374,'SHOW EXPLAIN',26,'The SHOW EXPLAIN command is a new feature in MariaDB 10.0.0.\n \nCommand description\n \nThe SHOW EXPLAIN command allows one to get an EXPLAIN (that\nis, a\ndescription of a query plan) of a query running in a certain\nthread.\n \nThe syntax is:\n \nSHOW EXPLAIN FOR ;\n \nwhich will produce an EXPLAIN output for the query that\nthread number thread_id is running. The thread id can be\nobtained with SHOW PROCESSLIST.\n \nSHOW EXPLAIN FOR 1;\n \n+------+-------------+-------+-------+---------------+------+---------+------+---------+-------------+\n| id | select_type | table | type | possible_keys | key |\nkey_len | ref | rows | Extra |\n+------+-------------+-------+-------+---------------+------+---------+------+---------+-------------+\n| 1 | SIMPLE | tbl | index | NULL | a | 5 | NULL | 1000107 |\nUsing index |\n+------+-------------+-------+-------+---------------+------+---------+------+---------+-------------+\n1 row in set, 1 warning (0.00 sec)\n \nThe output is always accompanied with a warning which shows\nthe query the\ntarget thread is running (this shows what the EXPLAIN is\nfor):\n \nSHOW WARNINGS;\n \n+-------+------+------------------------+\n| Level | Code | Message |\n+-------+------+------------------------+\n| Note | 1003 | select sum(a) from tbl |\n+-------+------+------------------------+\n1 row in set (0.00 sec)\n \nPossible errors\n \nThe output can be only produced if the target thread is\ncurrently running a\nquery, which has a ready query plan. If this is not the\ncase, the output will\nbe:\n \nSHOW EXPLAIN FOR 2;\n \nERROR 1932 (HY000): Target is not running an EXPLAINable\ncommand\n \nYou will get this error when:\nthe target thread is not running a command for which one can\nrun EXPLAIN\nthe target thread is running a command for which one can run\nEXPLAIN, but\nthere is no query plan yet (for example, tables are open and\nlocks are\n acquired before the query plan is produced)\n \n\nDifferences between SHOW EXPLAIN and EXPLAIN outputs\n \nBackground\n \nIn MySQL, EXPLAIN execution takes a slightly different route\nfrom the way\nthe real query (typically the SELECT) is optimized. This is\nunfortunate,\nand has caused a number of bugs in EXPLAIN. (For example,\nsee\nMDEV-326, MDEV-410, and\nlp:1013343.\nlp:992942 is not directly\nabout EXPLAIN, but it also would not have existed if MySQL\ndidn\'t try to delete\nparts of a query plan in the middle of the query) \n \nSHOW EXPLAIN examines a running SELECT, and hence its output\nmay be\nslightly different from what EXPLAIN SELECT would produce.\nWe did our best\nto make sure that either the difference is negligible, or\nSHOW EXPLAIN\'s\noutput is closer to reality than EXPLAIN\'s output.\n \nList of recorded differences\n \nSHOW EXPLAIN may have Extra=\'no matching row in const\ntable\', where EXPLAIN would produce Extra=\'Impossible\nWHERE ...\'\nFor queries with subqueries, SHOW EXPLAIN may print\nselect_type==PRIMARY where regular EXPLAIN used to print\nselect_type==SIMPLE, or vice versa.\n \nRequired permissions\n \nRunning SHOW EXPLAIN requires the same permissions as\nrunning SHOW PROCESSLIST would.\n \n\n\nURL: https://mariadb.com/kb/en/library/show-explain/','','https://mariadb.com/kb/en/library/show-explain/'),(376,'SHOW FUNCTION STATUS',26,'Syntax\n------ \nSHOW FUNCTION STATUS\n [LIKE \'pattern\' | WHERE expr]\n \nDescription\n----------- \nThis statement is similar to \nSHOW PROCEDURE STATUS but for\nstored functions.\n \nThe LIKE clause, if present on its own, indicates which\nfunction names to match. \n \nThe WHERE and LIKE clauses can be given to select rows using\nmore general conditions, as discussed in Extended SHOW.\n \nThe information_schema.ROUTINES table contains more detailed\ninformation.\n \nExamples\n-------- \nShowing all stored functions:\n \nSHOW FUNCTION STATUS\\G\n*************************** 1. row\n***************************\n Db: test\n Name: VatCents\n Type: FUNCTION\n Definer: root@localhost\n Modified: 2013-06-01 12:40:31\n Created: 2013-06-01 12:40:31\n Security_type: DEFINER\n Comment: \ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n \nStored functions whose name starts with \'V\': \n \nSHOW FUNCTION STATUS LIKE \'V%\' \\G\n*************************** 1. row\n***************************\n Db: test\n Name: VatCents\n Type: FUNCTION\n Definer: root@localhost\n Modified: 2013-06-01 12:40:31\n Created: 2013-06-01 12:40:31\n Security_type: DEFINER\n Comment: \ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n \nStored functions with a security type of \'DEFINER\':\n \nSHOW FUNCTION STATUS WHERE Security_type LIKE \'DEFINER\'\n\\G\n*************************** 1. row\n***************************\n Db: test\n Name: VatCents\n Type: FUNCTION\n Definer: root@localhost\n Modified: 2013-06-01 12:40:31\n Created: 2013-06-01 12:40:31\n Security_type: DEFINER\n Comment: \ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-function-status/','','https://mariadb.com/kb/en/library/show-function-status/'),(377,'SHOW GRANTS',26,'Users\n \nSyntax\n------ \nSHOW GRANTS [FOR user]\n \nDescription\n----------- \nThis statement lists the GRANT statement or\nstatements that must be issued to duplicate the privileges\nthat are granted to\na MariaDB user account. The account is named using the same\nformat as for the\nGRANT statement; for example,\n\'jeffrey\'@\'localhost\'. If you specify only the user name\npart\nof the account name, a host name part of \'%\' is used. For\nadditional information about specifying account names, see\nGRANT.\n \nSHOW GRANTS FOR \'root\'@\'localhost\';\n+---------------------------------------------------------------------+\n| Grants for root@localhost |\n+---------------------------------------------------------------------+\n| GRANT ALL PRIVILEGES ON *.* TO \'root\'@\'localhost\' WITH\nGRANT OPTION |\n+---------------------------------------------------------------------+\n \nTo list the privileges granted to the account that you are\nusing to\nconnect to the server, you can use any of the following\nstatements:\n \nSHOW GRANTS;\n \nSHOW GRANTS FOR CURRENT_USER;\n \nSHOW GRANTS FOR CURRENT_USER();\n \nIf SHOW GRANTS FOR CURRENT_USER (or any\nof the equivalent syntaxes) is used in DEFINER context (such\nas within a stored procedure that is defined with \n SQL SECURITY DEFINER), the grants displayed are those of\nthe\ndefiner and not the invoker.\n \nNote that the DELETE HISTORY privilege, introduced in\nMariaDB 10.3.4, is displayed as DELETE VERSIONING ROWS when\nrunning SHOW GRANTS (MDEV-17655).\n \nRoles\n \nRoles were introduced in MariaDB 10.0.5.\n \nSyntax\n------ \nSHOW GRANTS [FOR role]\n \nDescription\n----------- \nFrom MariaDB 10.0.5, SHOW GRANTS can also be used to view\nthe privileges granted to a role.\n \nExample\n \nSHOW GRANTS FOR journalist;\n+------------------------------------------+\n| Grants for journalist |\n+------------------------------------------+\n| GRANT USAGE ON *.* TO \'journalist\' |\n| GRANT DELETE ON `test`.* TO \'journalist\' |\n+------------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/show-grants/','','https://mariadb.com/kb/en/library/show-grants/'),(378,'SHOW INDEX',26,'Syntax\n------ \nSHOW {INDEX | INDEXES | KEYS} \n FROM tbl_name [FROM db_name]\n [WHERE expr]\n \nDescription\n----------- \nSHOW INDEX returns table index information. The format\nresembles that of the SQLStatistics call in ODBC.\n \nYou can use db_name.tbl_name as an alternative to the\n tbl_name FROM db_name syntax. These two statements are\n equivalent:\n \nSHOW INDEX FROM mytable FROM mydb;\nSHOW INDEX FROM mydb.mytable;\n \nSHOW KEYS and SHOW INDEXES are synonyms for SHOW INDEX.\n \nYou can also list a table\'s indexes with the following\ncommand: \n \nmysqlshow -k db_name tbl_name\n \nSee mysqlshow for more details.\n \nThe information_schema.STATISTICS table stores similar\ninformation.\n \nThe following fields are returned by SHOW INDEX.\n \nField | Description | \n \nTable | Table name | \n \nNon_unique | 1 if the index permits duplicate values, 0 if\nvalues must be unique. | \n \nKey_name | Index name. The primary key is always named\nPRIMARY. | \n \nSeq_in_index | The column\'s sequence in the index,\nbeginning with 1. | \n \nColumn_name | Column name. | \n \nCollation | Either A, if the column is sorted in ascending\norder in the index, or NULL if it\'s not sorted. | \n \nCardinality | Estimated number of unique values in the\nindex. The cardinality statistics are calculated at various\ntimes, and can help the optimizer make improved decisions. |\n\n \nSub_part | NULL if the entire column is included in the\nindex, or the number of included characters if not. | \n \nPacked | NULL if the index is not packed, otherwise how the\nindex is packed. | \n \nNull | NULL if NULL values are permitted in the column, an\nempty string if NULL\'s are not permitted. | \n \nIndex_type | The index type, which can be BTREE, FULLTEXT,\nHASH or RTREE. See Storage Engine Index Types. | \n \nComment | Other information, such as whether the index is\ndisabled. | \n \nIndex_comment | Contents of the COMMENT attribute when the\nindex was created. | \n \nThe WHERE and LIKE clauses can be given to select rows using\nmore general conditions, as discussed in Extended SHOW.\n \nExamples\n-------- \nCREATE TABLE IF NOT EXISTS `employees_example` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `first_name` varchar(30) NOT NULL,\n `last_name` varchar(40) NOT NULL,\n `position` varchar(25) NOT NULL,\n `home_address` varchar(50) NOT NULL,\n `home_phone` varchar(12) NOT NULL,\n `employee_code` varchar(25) NOT NULL,\n PRIMARY KEY (`id`),\n UNIQUE KEY `employee_code` (`employee_code`),\n KEY `first_name` (`first_name`,`last_name`)\n) ENGINE=Aria;\n \nINSERT INTO `employees_example` (`first_name`, `last_name`,\n`position`, `home_address`, `home_phone`, `employee_code`)\n VALUES\n (\'Mustapha\', \'Mond\', \'Chief Executive Officer\', \'692\nPromiscuous Plaza\', \'326-555-3492\', \'MM1\'),\n (\'Henry\', \'Foster\', \'Store Manager\', \'314 Savage\nCircle\', \'326-555-3847\', \'HF1\'),\n (\'Bernard\', \'Marx\', \'Cashier\', \'1240 Ambient\nAvenue\', \'326-555-8456\', \'BM1\'),\n (\'Lenina\', \'Crowne\', \'Cashier\', \'281 Bumblepuppy\nBoulevard\', \'328-555-2349\', \'LC1\'),\n (\'Fanny\', \'Crowne\', \'Restocker\', \'1023 Bokanovsky\nLane\', \'326-555-6329\', \'FC1\'),\n (\'Helmholtz\', \'Watson\', \'Janitor\', \'944 Soma\nCourt\', \'329-555-2478\', \'HW1\');\n \nSHOW INDEXES FROM employees_example;\n \n+-------------------+------------+---------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+\n| Table | Non_unique | Key_name | Seq_in_index | Column_name\n| Collation | Cardinality | Sub_part | Packed | Null |\nIndex_type | Comment | Index_comment |\n+-------------------+------------+---------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+\n| employees_example | 0 | PRIMARY | 1 | id | A | 7 | NULL |\nNULL | | BTREE | | |\n| employees_example | 0 | employee_code | 1 | employee_code\n| A | 7 | NULL | NULL | | BTREE | | |\n| employees_example | 1 | first_name | 1 | first_name | A |\nNULL | NULL | NULL | | BTREE | | |\n| employees_example | 1 | first_name | 2 | last_name | A |\nNULL | NULL | NULL | | BTREE | | |\n+-------------------+------------+---------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-index/','','https://mariadb.com/kb/en/library/show-index/'),(379,'SHOW LOCALES',26,'SHOW LOCALES was introduced as part of the Information\nSchema plugin extension in MariaDB 10.1.1.\n \nSHOW LOCALES is used to return locales information as part\nof the Locales plugin. While the information_schema.LOCALES\ntable has 8 columns, the SHOW LOCALES statement will only\ndisplay 4 of them:\n \nExample\n \nSHOW LOCALES;\n+-----+-------+-------------------------------------+------------------------+\n| Id | Name | Description | Error_Message_Language |\n+-----+-------+-------------------------------------+------------------------+\n| 0 | en_US | English - United States | english |\n| 1 | en_GB | English - United Kingdom | english |\n| 2 | ja_JP | Japanese - Japan | japanese |\n| 3 | sv_SE | Swedish - Sweden | swedish |\n...\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-locales/','','https://mariadb.com/kb/en/library/show-locales/'),(380,'SHOW MASTER STATUS',26,'Syntax\n------ \nSHOW MASTER STATUS\n \nDescription\n----------- \nProvides status information about the binary log files of\nthe master.\n \nThis statement requires the SUPER or the REPLICATION_CLIENT\nprivilege.\n \nTo see information about the current GTIDs in the binary\nlog, use the\ngtid_binlog_pos variable.\n \nExample\n \nSHOW MASTER STATUS;\n+--------------------+----------+--------------+------------------+\n| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |\n+--------------------+----------+--------------+------------------+\n| mariadb-bin.000016 | 475 | | |\n+--------------------+----------+--------------+------------------+\nSELECT @@global.gtid_binlog_pos;\n+--------------------------+\n| @@global.gtid_binlog_pos |\n+--------------------------+\n| 0-1-2 |\n+--------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/show-master-status/','','https://mariadb.com/kb/en/library/show-master-status/'),(381,'SHOW OPEN TABLES',26,'Syntax\n------ \nSHOW OPEN TABLES [FROM db_name]\n [LIKE \'pattern\' | WHERE expr]\n \nDescription\n----------- \n SHOW OPEN TABLES lists the non-TEMPORARY\ntables that are currently open in the table cache. See\nhttp://dev.mysql.com/doc/refman/5.1/en/table-cache.html.\n \nThe FROM and LIKE clauses may be used.\n \nThe FROM\nclause, if present, restricts the tables shown to those\npresent in the\ndb_name database. \n \nThe LIKE clause, if\npresent on its own, indicates which table names to match.\nThe WHERE and LIKE clauses can be given to select rows using\nmore general conditions, as discussed in Extended SHOW.\n \nThe following information is returned:\n \nColumn | Description | \n \nDatabase | Database name. | \n \nName | Table name. | \n \nIn_use | Number of table instances being used. | \n \nName_locked | 1 if the table is name-locked, e.g. if it is\nbeing dropped or renamed, otherwise 0. | \n \nBefore MariaDB 5.5, each use of, for example, LOCK TABLE ...\nWRITE would increment In_use for that table. With the\nimplementation of the metadata locking improvements in\nMariaDB 5.5, LOCK TABLE... WRITE acquires a strong MDL lock,\nand concurrent connections will wait on this MDL lock, so\nany subsequent LOCK TABLE... WRITE will not increment\nIn_use.\n \nExample\n \nSHOW OPEN TABLES;\n \n+----------+---------------------------+--------+-------------+\n| Database | Table | In_use | Name_locked |\n+----------+---------------------------+--------+-------------+\n...\n| test | xjson | 0 | 0 |\n| test | jauthor | 0 | 0 |\n| test | locks | 1 | 0 |\n...\n+----------+---------------------------+--------+-------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-open-tables/','','https://mariadb.com/kb/en/library/show-open-tables/'),(382,'SHOW PACKAGE BODY STATUS',26,'Oracle-style packages were introduced in MariaDB 10.3.5.\n \nSyntax\n------ \nSHOW PACKAGE BODY STATUS\n [LIKE \'pattern\' | WHERE expr]\n \nDescription\n----------- \nThe SHOW PACKAGE BODY STATUS statement returns\ncharacteristics of stored package bodies (implementations),\nsuch as the database, name, type, creator, creation and\nmodification dates, and character set information. A similar\nstatement, SHOW PACKAGE STATUS, displays information about\nstored package specifications.\n \nThe LIKE clause, if present, indicates which package names\nto match. The WHERE and LIKE clauses can be given to select\nrows using more general conditions, as discussed in Extended\nSHOW.\n \nThe ROUTINES table in the INFORMATION_SCHEMA database\ncontains more detailed information.\n \nExamples\n-------- \nSHOW PACKAGE BODY STATUS LIKE \'pkg1\'\\G\n*************************** 1. row\n***************************\n Db: test\n Name: pkg1\n Type: PACKAGE BODY\n Definer: root@localhost\n Modified: 2018-02-27 14:44:14\n Created: 2018-02-27 14:44:14\n Security_type: DEFINER\n Comment: This is my first package body\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n \n\n\nURL:\nhttps://mariadb.com/kb/en/library/show-package-body-status/','','https://mariadb.com/kb/en/library/show-package-body-status/'),(383,'SHOW PACKAGE STATUS',26,'Oracle-style packages were introduced in MariaDB 10.3.5.\n \nSyntax\n------ \nSHOW PACKAGE STATUS\n [LIKE \'pattern\' | WHERE expr]\n \nDescription\n----------- \nThe SHOW PACKAGE STATUS statement returns characteristics of\nstored package specifications, such as the database, name,\ntype, creator, creation and modification dates, and\ncharacter set information. A similar statement, SHOW PACKAGE\nBODY STATUS, displays information about stored package\nbodies (i.e. implementations).\n \nThe LIKE clause, if present, indicates which package names\nto match. The WHERE and LIKE clauses can be given to select\nrows using more general conditions, as discussed in Extended\nSHOW.\n \nThe ROUTINES table in the INFORMATION_SCHEMA database\ncontains more detailed information.\n \nExamples\n-------- \nSHOW PACKAGE STATUS LIKE \'pkg1\'\\G\n*************************** 1. row\n***************************\n Db: test\n Name: pkg1\n Type: PACKAGE\n Definer: root@localhost\n Modified: 2018-02-27 14:38:15\n Created: 2018-02-27 14:38:15\n Security_type: DEFINER\n Comment: This is my first package\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n \n\n\nURL: https://mariadb.com/kb/en/library/show-package-status/','','https://mariadb.com/kb/en/library/show-package-status/'),(384,'SHOW PLUGINS',26,'Syntax\n------ \nSHOW PLUGINS;\n \nDescription\n----------- \n SHOW PLUGINS displays information about installed plugins.\nThe Library column indicates the plugin library - if it is\nNULL, the plugin is built-in and cannot be uninstalled.\n \nThe PLUGINS table in the information_schema database\ncontains more detailed information.\n \nFor specific information about storage engines (a particular\ntype of plugin), see the information_schema.ENGINES table\nand the SHOW ENGINES statement.\n \nExamples\n-------- \nSHOW PLUGINS;\n+----------------------------+----------+--------------------+-------------+---------+\n| Name | Status | Type | Library | License |\n+----------------------------+----------+--------------------+-------------+---------+\n| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |\n| mysql_native_password | ACTIVE | AUTHENTICATION | NULL |\nGPL |\n| mysql_old_password | ACTIVE | AUTHENTICATION | NULL | GPL\n|\n| MRG_MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |\n| MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |\n| CSV | ACTIVE | STORAGE ENGINE | NULL | GPL |\n| MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL |\n| FEDERATED | ACTIVE | STORAGE ENGINE | NULL | GPL |\n| PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL\n|\n| Aria | ACTIVE | STORAGE ENGINE | NULL | GPL |\n| InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL |\n| INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |\n...\n| INNODB_SYS_FOREIGN | ACTIVE | INFORMATION SCHEMA | NULL |\nGPL |\n| INNODB_SYS_FOREIGN_COLS | ACTIVE | INFORMATION SCHEMA |\nNULL | GPL |\n| SPHINX | ACTIVE | STORAGE ENGINE | NULL | GPL |\n| ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL |\n| BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL |\n| FEEDBACK | DISABLED | INFORMATION SCHEMA | NULL | GPL |\n| partition | ACTIVE | STORAGE ENGINE | NULL | GPL |\n| pam | ACTIVE | AUTHENTICATION | auth_pam.so | GPL |\n+----------------------------+----------+--------------------+-------------+---------+\n \n\n\nURL: https://mariadb.com/kb/en/library/show-plugins/','','https://mariadb.com/kb/en/library/show-plugins/'),(385,'SHOW PLUGINS SONAME',26,'MariaDB 10.0.2\n \nSHOW PLUGINS SONAME was introduced in MariaDB 10.0.2\n \nSyntax\n------ \nSHOW PLUGINS SONAME { library | LIKE \'pattern\' | WHERE\nexpr };\n \nDescription\n----------- \nSHOW PLUGINS SONAME displays information about compiled-in\nand all server plugins in the plugin_dir directory,\nincluding plugins that haven\'t been installed.\n \nExamples\n-------- \nSHOW PLUGINS SONAME \'ha_example.so\';\n+----------+---------------+----------------+---------------+---------+\n| Name | Status | Type | Library | License |\n+----------+---------------+----------------+---------------+---------+\n| EXAMPLE | NOT INSTALLED | STORAGE ENGINE | ha_example.so |\nGPL |\n| UNUSABLE | NOT INSTALLED | DAEMON | ha_example.so | GPL |\n+----------+---------------+----------------+---------------+---------+\n \nThere is also a corresponding information_schema table,\ncalled ALL_PLUGINS, which contains more complete\ninformation.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-plugins-soname/','','https://mariadb.com/kb/en/library/show-plugins-soname/'),(386,'SHOW PRIVILEGES',26,'Syntax\n------ \nSHOW PRIVILEGES\n \nDescription\n----------- \n SHOW PRIVILEGES shows the list of system privileges that\nthe MariaDB server supports. The exact list of privileges\ndepends on the version of your server.\n \nExamples\n-------- \nSHOW PRIVILEGES;\n+-------------------------+---------------------------------------+-------------------------------------------------------+\n| Privilege | Context | Comment |\n+-------------------------+---------------------------------------+-------------------------------------------------------+\n| Alter | Tables | To alter the table |\n| Alter routine | Functions,Procedures | To alter or drop\nstored functions/procedures |\n| Create | Databases,Tables,Indexes | To create new\ndatabases and tables |\n| Create routine | Databases | To use CREATE\nFUNCTION/PROCEDURE |\n| Create temporary tables | Databases | To use CREATE\nTEMPORARY TABLE |\n| Create view | Tables | To create new views |\n| Create user | Server Admin | To create new users |\n| Delete | Tables | To delete existing rows |\n| Drop | Databases,Tables | To drop databases, tables, and\nviews |\n| Event | Server Admin | To create, alter, drop and execute\nevents |\n| Execute | Functions,Procedures | To execute stored\nroutines |\n| File | File access on server | To read and write files on\nthe server |\n| Grant option | Databases,Tables,Functions,Procedures | To\ngive to other users those privileges you possess |\n| Index | Tables | To create or drop indexes |\n| Insert | Tables | To insert data into tables |\n| Lock tables | Databases | To use LOCK TABLES (together\nwith SELECT privilege) |\n| Process | Server Admin | To view the plain text of\ncurrently executing queries |\n| Proxy | Server Admin | To make proxy user possible |\n| References | Databases,Tables | To have references on\ntables |\n| Reload | Server Admin | To reload or refresh tables, logs\nand privileges |\n| Replication client | Server Admin | To ask where the slave\nor master servers are |\n| Replication slave | Server Admin | To read binary log\nevents from the master |\n| Select | Tables | To retrieve rows from table |\n| Show databases | Server Admin | To see all databases with\nSHOW DATABASES |\n| Show view | Tables | To see views with SHOW CREATE VIEW |\n| Shutdown | Server Admin | To shut down the server |\n| Super | Server Admin | To use KILL thread, SET GLOBAL,\nCHANGE MASTER, etc. |\n| Trigger | Tables | To use triggers |\n| Create tablespace | Server Admin | To create/alter/drop\ntablespaces |\n| Update | Tables | To update existing rows |\n| Usage | Server Admin | No privileges - allow connect only\n|\n+-------------------------+---------------------------------------+-------------------------------------------------------+\n31 rows in set (0.07 sec)\n \n\n\nURL: https://mariadb.com/kb/en/library/show-privileges/','','https://mariadb.com/kb/en/library/show-privileges/'),(387,'SHOW PROCEDURE CODE',26,'Syntax\n------ \nSHOW PROCEDURE CODE proc_name\n \nDescription\n----------- \nThis statement is a MariaDB extension that is available only\nfor servers that\nhave been built with debugging support. It displays a\nrepresentation of the\ninternal implementation of the named stored procedure. A\nsimilar statement,\n SHOW FUNCTION CODE, displays\ninformation about stored functions.\n \nBoth statements require that you be the owner of the routine\nor have\n SELECT access to the mysql.proc table.\n \nIf the named routine is available, each statement produces a\nresult\nset. Each row in the result set corresponds to one\n\"instruction\" in\nthe routine. The first column is Pos, which is an ordinal\nnumber\nbeginning with 0. The second column is Instruction, which\ncontains an\nSQL statement (usually changed from the original source), or\na\ndirective which has meaning only to the stored-routine\nhandler.\n \nExamples\n-------- \nDELIMITER //\n \nCREATE PROCEDURE p1 ()\n BEGIN\n DECLARE fanta INT DEFAULT 55;\n DROP TABLE t2;\n LOOP\n INSERT INTO t3 VALUES (fanta);\n END LOOP;\n END//\nQuery OK, 0 rows affected (0.00 sec)\n \nSHOW PROCEDURE CODE p1//\n+-----+----------------------------------------+\n| Pos | Instruction |\n+-----+----------------------------------------+\n| 0 | set fanta@0 55 |\n| 1 | stmt 9 \"DROP TABLE t2\" |\n| 2 | stmt 5 \"INSERT INTO t3 VALUES (fanta)\" |\n| 3 | jump 2 |\n+-----+----------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/show-procedure-code/','','https://mariadb.com/kb/en/library/show-procedure-code/'),(388,'SHOW PROCEDURE STATUS',26,'Syntax\n------ \nSHOW PROCEDURE STATUS\n [LIKE \'pattern\' | WHERE expr]\n \nDescription\n----------- \nThis statement is a MariaDB extension. It returns\ncharacteristics of a stored\nprocedure, such as the database, name, type, creator,\ncreation and modification\ndates, and character set information. A similar statement, \n SHOW FUNCTION STATUS, displays\ninformation about stored functions.\n \nThe LIKE clause, if present, indicates which procedure or\nfunction names to match. The WHERE and LIKE clauses can be\ngiven to select rows using more general conditions, as\ndiscussed in Extended SHOW.\n \nThe ROUTINES table in the INFORMATION_SCHEMA database\ncontains more detailed information.\n \nExamples\n-------- \nSHOW PROCEDURE STATUS LIKE \'p1\'\\G\n*************************** 1. row\n***************************\n Db: test\n Name: p1\n Type: PROCEDURE\n Definer: root@localhost\n Modified: 2010-08-23 13:23:03\n Created: 2010-08-23 13:23:03\n Security_type: DEFINER\n Comment: \ncharacter_set_client: latin1\ncollation_connection: latin1_swedish_ci\n Database Collation: latin1_swedish_ci\n \n\n\nURL:\nhttps://mariadb.com/kb/en/library/show-procedure-status/','','https://mariadb.com/kb/en/library/show-procedure-status/'),(393,'SHOW RELAYLOG EVENTS',26,'Syntax\n------ \nSHOW RELAYLOG [\'connection_name\'] EVENTS\n [IN \'log_name\'] [FROM pos] [LIMIT [offset,] row_count]\n \nDescription\n----------- \nOn replication slaves this command shows the events in the\nrelay log. If \'log_name\' is not specified, the first relay\nlog is shown.\n \nSyntax for the LIMIT clause is the same as for SELECT ...\nLIMIT.\n \nUsing the LIMIT clause is highly recommended because the\nSHOW RELAYLOG EVENTS command returns the complete contents\nof the relay log, which can be quite large.\n \nThis command does not return events related to setting user\nand system variables. If you need those, use mysqlbinlog.\n \nOn the replication master, this command does nothing.\n \nconnection_name\n \nconnection_name was added as part of multi-source\nreplication added in MariaDB 10.0.1\n \nIf there is only one nameless master, or the default master\n(as specified by the default_master_connection system\nvariable) is intended, connection_name can be omitted. If\nprovided, the SHOW RELAYLOG statement will apply to the\nspecified master. connection_name is case-insensitive.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-relaylog-events/','','https://mariadb.com/kb/en/library/show-relaylog-events/'),(394,'SHOW SLAVE HOSTS',26,'Syntax\n------ \nSHOW SLAVE HOSTS\n \nDescription\n----------- \nThis command is run on the master and displays a list of\nreplication slaves that are currently registered with it.\nOnly slaves started with the --report-host=host_name option\nare visible in this list.\n \nThe list is displayed on any server (not just the master\nserver). The output\nlooks like this:\n \nSHOW SLAVE HOSTS;\n+------------+-----------+------+-----------+\n| Server_id | Host | Port | Master_id |\n+------------+-----------+------+-----------+\n| 192168010 | iconnect2 | 3306 | 192168011 |\n| 1921680101 | athena | 3306 | 192168011 |\n+------------+-----------+------+-----------+\nServer_id: The unique server ID of the slave server, as\nconfigured in the server\'s option file, or on the command\nline with --server-id=value.\nHost: The host name of the slave server, as configured in\nthe server\'s option file, or on the command line with\n--report-host=host_name. Note that this can differ from the\nmachine name as configured in the operating system.\nPort: The port the slave server is listening on.\nMaster_id: The unique server ID of the master server that\nthe slave server is replicating from.\n \nSome MariaDB and MySQL versions report another variable,\nrpl_recovery_rank. This\nvariable was never used, and was eventually removed in\nMariaDB 10.1.2 and MySQL 5.6.\n \n\n\nURL: https://mariadb.com/kb/en/library/show-slave-hosts/','','https://mariadb.com/kb/en/library/show-slave-hosts/'),(389,'SHOW PROCESSLIST',26,'Syntax\n------ \nSHOW [FULL] PROCESSLIST\n \nDescription\n----------- \n SHOW PROCESSLIST shows you which threads are running. You\ncan also get this information from the\ninformation_schema.PROCESSLIST table or the mysqladmin\nprocesslist command. If you have the \nPROCESS privilege, you can see all threads.\nOtherwise, you can see only your own threads (that is,\nthreads associated with\nthe MariaDB account that you are using). If you do not use\nthe\nFULL keyword, only the first 100 characters of each\nstatement are shown in the Info field.\n \nThe columns shown in SHOW PROCESSLIST\n are:\n \nName | Description | Introduced | \n \nID | The client\'s process ID. | | \n \nUSER | The username associated with the process. | | \n \nHOST | The host the client is connected to. | | \n \nDB | The default database of the process (NULL if no\ndefault). | | \n \nCOMMAND | The command type. See Thread Command Values. | | \n \nTIME | The amount of time, in seconds, the process has been\nin its current state. For a slave SQL thread before MariaDB\n10.1, this is the time in seconds between the last\nreplicated event\'s timestamp and the slave machine\'s real\ntime. | | \n \nSTATE | See Thread States. | | \n \nINFO | The statement being executed. | | \n \nPROGRESS | The total progress of the process (0-100%) (see\nProgress Reporting). | MariaDB 5.3 | \n \nSee TIME_MS column in information_schema.PROCESSLIST for\ndifferences in the TIME column between MariaDB and MySQL.\n \nThe information_schema.PROCESSLIST table contains the\nfollowing additional columns:\n \nName | Description | Introduced | \n \nTIME_MS | The amount of time, in milliseconds, the process\nhas been in its current state. | MariaDB 5.1 | \n \nSTAGE | The stage the process is currently in. |\nMariaDB 5.3 | \n \nMAX_STAGE | The maximum number of stages. | MariaDB 5.3 | \n \nPROGRESS | The progress of the process within the current\nstage (0-100%). | MariaDB 5.3 | \n \nMEMORY_USED | The amount of memory used by the process. |\nMariaDB 10.0.1 | \n \nEXAMINED_ROWS | The number of rows the process has examined.\n| MariaDB 10.0.1 | \n \nQUERY_ID | Query ID. | MariaDB 10.0.5 | \n \nNote that the PROGRESS field from the information schema,\nand the PROGRESS field from SHOW PROCESSLIST display\ndifferent results. SHOW PROCESSLIST shows the total\nprogress, while the information schema shows the progress\nfor the current stage only.\n \nThreads can be killed using their thread_id, or, since\nMariaDB 10.0.5, their query_id, with the KILL statement.\n \nSince queries on this table are locking, if the\nperformance_schema is enabled, you may want to query the\nTHREADS table instead.\n \nExamples\n-------- \nFrom MariaDB 5.1.x\n \nSHOW FULL PROCESSLIST;\n+---------+-------+-----------+------+---------+------+-------+-----------------------+\n| Id | User | Host | db | Command | Time | State | Info |\n+---------+-------+-----------+------+---------+------+-------+-----------------------+\n| 1988880 | dbart | localhost | NULL | Query | 0 | NULL |\nSHOW FULL PROCESSLIST |\n+---------+-------+-----------+------+---------+------+-------+-----------------------+\n \nSELECT * FROM information_schema.processlist;\n+---------+-------+-----------+------+---------+------+-----------+----------------------------------------------+---------+\n| ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO |\nTIME_MS |\n+---------+-------+-----------+------+---------+------+-----------+----------------------------------------------+---------+\n| 1988880 | dbart | localhost | NULL | Query | 0 | executing\n| SELECT * FROM information_schema.processlist | 0.444 |\n+---------+-------+-----------+------+---------+------+-----------+----------------------------------------------+---------+\n \nFrom MariaDB 5.5.x\n \nSHOW FULL PROCESSLIST;\n+-----+------+-----------+------+---------+------+-------+-----------------------+----------+\n| Id | User | Host | db | Command | Time | State | Info |\nProgress |\n+-----+------+-----------+------+---------+------+-------+-----------------------+----------+\n| 126 | root | localhost | NULL | Query | 0 | NULL | SHOW\nFULL PROCESSLIST | 0.000 |\n+-----+------+-----------+------+---------+------+-------+-----------------------+----------+\n \nSELECT * FROM information_schema.processlist;\n+-----+--------+-----------+------+---------+------+-----------+----------------------------------------------+---------+-------+-----------+----------+\n| ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO |\nTIME_MS | STAGE | MAX_STAGE | PROGRESS |\n+-----+--------+-----------+------+---------+------+-----------+----------------------------------------------+---------+-------+-----------+----------+\n| 126 | root | localhost | NULL | Query | 0 | executing |\nSELECT * FROM information_schema.processlist | 344.718 | 0 |\n0 | 0.000 |\n+-----+--------+-----------+------+---------+------+-----------+----------------------------------------------+---------+-------+-----------+----------+\n \nFrom MariaDB 10.0.x\n \nSHOW PROCESSLIST;\n+----+-----------------+-----------+------+---------+------+------------------------+------------------+----------+\n| Id | User | Host | db | Command | Time | State | Info |\nProgress |\n+----+-----------------+-----------+------+---------+------+------------------------+------------------+----------+\n| 2 | event_scheduler | localhost | NULL | Daemon | 2693 |\nWaiting on empty queue | NULL | 0.000 |\n| 4 | root | localhost | NULL | Query | 0 | Table lock |\nSHOW PROCESSLIST | 0.000 |\n+----+-----------------+-----------+------+---------+------+------------------------+------------------+----------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-processlist/','','https://mariadb.com/kb/en/library/show-processlist/'),(390,'SHOW PROFILE',26,'Syntax\n------ \nSHOW PROFILE [type [, type] ... ]\n [FOR QUERY n]\n [LIMIT row_count [OFFSET offset]]\n \ntype:\n ALL\n | BLOCK IO\n | CONTEXT SWITCHES\n | CPU\n | IPC\n | MEMORY\n | PAGE FAULTS\n | SOURCE\n | SWAPS\n \nDescription\n----------- \nThe SHOW PROFILE and \nSHOW PROFILES statements display profiling\ninformation that indicates resource usage for statements\nexecuted during the\ncourse of the current session.\n \nProfiling is controlled by the profiling session variable,\nwhich has a default value of 0 (OFF). Profiling is enabled\nby setting profiling to 1 or ON:\n \nSET profiling = 1;\n \nSHOW PROFILES displays a list of the most recent statements\nsent to the master. The size of the list is controlled by\nthe\nprofiling_history_size session variable, which has a default\nvalue of 15. The maximum value is 100. Setting the value to\n0 has the practical effect of disabling profiling.\n \nAll statements are profiled except SHOW PROFILES and \nSHOW PROFILE, so you will find neither of those statements\nin the profile list. Malformed statements are profiled. For\nexample, \n SHOW PROFILING is an illegal statement, and a syntax error\noccurs if you try to execute it, but it will show up in the\nprofiling list.\n \n SHOW PROFILE displays detailed information about a single\nstatement. Without the FOR QUERY n clause, the output\npertains to the most recently executed statement. If \n FOR QUERY n is included,\n SHOW PROFILE displays information for statement n. The\nvalues of n correspond to\nthe Query_ID values displayed by SHOW PROFILES.\n \nThe LIMIT row_count clause may be given to limit the\noutput to row_count rows. If LIMIT is given, \n OFFSET offset may be added to begin the output offset\nrows into the full set of rows.\n \nBy default, SHOW PROFILE displays Status and Duration\ncolumns. The Status values are like the State values\ndisplayed by \nSHOW PROCESSLIST,\nalthough there might be some minor differences in\ninterpretation for\nthe two statements for some status values (see\nhttp://dev.mysql.com/doc/refman/5.6/en/thread-information.html).\n \nOptional type values may be specified to display specific\nadditional\ntypes of information:\nALL displays all information\nBLOCK IO displays counts for block input and output\noperations\nCONTEXT SWITCHES displays counts for voluntary and\ninvoluntary context switches\nCPU displays user and system CPU usage times\nIPC displays counts for messages sent and received\nMEMORY is not currently implemented\nPAGE FAULTS displays counts for major and minor page faults\nSOURCE displays the names of functions from the source code,\ntogether with the name and line number of the file in which\nthe function occurs\nSWAPS displays swap counts\n \nProfiling is enabled per session. When a session ends, its\nprofiling information is lost.\n \nThe information_schema.PROFILING table contains similar\ninformation.\n \nExamples\n-------- \nSELECT @@profiling;\n+-------------+\n| @@profiling |\n+-------------+\n| 0 |\n+-------------+\n \nSET profiling = 1;\n \nUSE test;\n \nDROP TABLE IF EXISTS t1;\n \nCREATE TABLE T1 (id INT);\n \nSHOW PROFILES;\n+----------+------------+--------------------------+\n| Query_ID | Duration | Query |\n+----------+------------+--------------------------+\n| 1 | 0.00009200 | SELECT DATABASE() |\n| 2 | 0.00023800 | show databases |\n| 3 | 0.00018900 | show tables |\n| 4 | 0.00014700 | DROP TABLE IF EXISTS t1 |\n| 5 | 0.24476900 | CREATE TABLE T1 (id INT) |\n+----------+------------+--------------------------+\n \nSHOW PROFILE;\n+----------------------+----------+\n| Status | Duration |\n+----------------------+----------+\n| starting | 0.000042 |\n| checking permissions | 0.000044 |\n| creating table | 0.244645 |\n| After create | 0.000013 |\n| query end | 0.000003 |\n| freeing items | 0.000016 |\n| logging slow query | 0.000003 |\n| cleaning up | 0.000003 |\n+----------------------+----------+\n \nSHOW PROFILE FOR QUERY 4;\n+--------------------+----------+\n| Status | Duration |\n+--------------------+----------+\n| starting | 0.000126 |\n| query end | 0.000004 |\n| freeing items | 0.000012 |\n| logging slow query | 0.000003 |\n| cleaning up | 0.000002 |\n+--------------------+----------+\n \nSHOW PROFILE CPU FOR QUERY 5;\n+----------------------+----------+----------+------------+\n| Status | Duration | CPU_user | CPU_system |\n+----------------------+----------+----------+------------+\n| starting | 0.000042 | 0.000000 | 0.000000 |\n| checking permissions | 0.000044 | 0.000000 | 0.000000 |\n| creating table | 0.244645 | 0.000000 | 0.000000 |\n| After create | 0.000013 | 0.000000 | 0.000000 |\n| query end | 0.000003 | 0.000000 | 0.000000 |\n| freeing items | 0.000016 | 0.000000 | 0.000000 |\n| logging slow query | 0.000003 | 0.000000 | 0.000000 |\n| cleaning up | 0.000003 | 0.000000 | 0.000000 |\n+----------------------+----------+----------+------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-profile/','','https://mariadb.com/kb/en/library/show-profile/'),(397,'SHOW TABLE STATUS',26,'Syntax\n------ \nSHOW TABLE STATUS [{FROM | IN} db_name]\n [LIKE \'pattern\' | WHERE expr]\n \nDescription\n----------- \n SHOW TABLE STATUS works like \n SHOW TABLES, but provides more extensive information about\neach non-TEMPORARY table.\n \nThe LIKE clause, if present on its own, indicates which\ntable names to\nmatch. The WHERE and LIKE clauses can be given to select\nrows using more general conditions, as discussed in Extended\nSHOW.\n \nThe following information is returned:\n \nColumn | Description | \n \nName | Table name. | \n \nEngine | Table storage engine. | \n \nVersion | Version number from the table\'s .frm file. | \n \nRow_format | Row format (see InnoDB, Aria and MyISAM row\nformats). | \n \nRows | Number of rows in the table. Some engines, such as\nXtraDB and InnoDB may store an estimate. | \n \nAvg_row_length | Average row length in the table. | \n \nData_length | For InnoDB/XtraDB, the index size, in pages,\nmultiplied by the page size. For Aria and MyISAM, length of\nthe data file, in bytes. For MEMORY, the approximate\nallocated memory. | \n \nMax_data_length | Maximum length of the data file, ie the\ntotal number of bytes that could be stored in the table. Not\nused in XtraDB and InnoDB. | \n \nIndex_length | Length of the index file. | \n \nData_free | Bytes allocated but unused. For InnoDB tables in\na shared tablespace, the free space of the shared tablespace\nwith small safety margin. An estimate in the case of\npartitioned tables - see the PARTITIONS table. | \n \nAuto_increment | Next AUTO_INCREMENT value. | \n \nCreate_time | Time the table was created. | \n \nUpdate_time | Time the table was last updated. On Windows,\nthe timestamp is not updated on update, so MyISAM values\nwill be inaccurate. In InnoDB, if shared tablespaces are\nused, will be NULL, while buffering can also delay the\nupdate, so the value will differ from the actual time of the\nlast UPDATE, INSERT or DELETE. | \n \nCheck_time | Time the table was last checked. Not kept by\nall storage engines, in which case will be NULL. | \n \nCollation | Character set and collation. | \n \nChecksum | Live checksum value, if any. | \n \nCreate_options | Extra CREATE TABLE options. | \n \nComment | Table comment provided when MariaDB created the\ntable. | \n \nSimilar information can be found in the\ninformation_schema.TABLES table as well as by using\nmysqlshow:\n \nmysqlshow --status db_name\n \nExample\n \nshow table status\\G\n*************************** 1. row\n***************************\n Name: bus_routes\n Engine: InnoDB\n Version: 10\n Row_format: Dynamic\n Rows: 5\n Avg_row_length: 3276\n Data_length: 16384\nMax_data_length: 0\n Index_length: 0\n Data_free: 0\n Auto_increment: NULL\n Create_time: 2017-05-24 11:17:46\n Update_time: NULL\n Check_time: NULL\n Collation: latin1_swedish_ci\n Checksum: NULL\n Create_options: \n Comment:\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-table-status/','','https://mariadb.com/kb/en/library/show-table-status/'),(398,'SHOW TABLES',26,'Syntax\n------ \nSHOW [FULL] TABLES [FROM db_name]\n [LIKE \'pattern\' | WHERE expr]\n \nDescription\n----------- \nSHOW TABLES lists the non-TEMPORARY tables, sequences and\nviews in a given database. \n \nThe LIKE clause, if present on its own, indicates which\ntable names to match. The WHERE and LIKE clauses can be\ngiven to select rows using more general conditions, as\ndiscussed in Extended SHOW. For example, when searching for\ntables in the test database, the column name for use in the\nWHERE and LIKE clauses will be Tables_in_test\n \nThe FULL modifier is supported such that SHOW FULL TABLES\ndisplays a second output column. Values for the second\ncolumn. Table_type, are BASE TABLE for a table, VIEW for a\nview and SEQUENCE for a sequence.\n \nYou can also get this information using:\n \nmysqlshow db_name\n \nSee mysqlshow for more details.\n \nIf you have no privileges for a base table or view, it does\nnot show up in the output from SHOW TABLES or mysqlshow\ndb_name.\n \nThe information_schema.TABLES table, as well as the SHOW\nTABLE STATUS statement, provide extended information about\ntables.\n \nExamples\n-------- \nSHOW TABLES;\n+----------------------+\n| Tables_in_test |\n+----------------------+\n| animal_count |\n| animals |\n| are_the_mooses_loose |\n| aria_test2 |\n| t1 |\n| view1 |\n+----------------------+\n \nShowing the tables beginning with a only.\n \nSHOW TABLES WHERE Tables_in_test LIKE \'a%\';\n+----------------------+\n| Tables_in_test |\n+----------------------+\n| animal_count |\n| animals |\n| are_the_mooses_loose |\n| aria_test2 |\n+----------------------+\n \nShowing tables and table types:\n \nSHOW FULL TABLES;\n+----------------+------------+\n| Tables_in_test | Table_type |\n+----------------+------------+\n| s1 | SEQUENCE |\n| student | BASE TABLE |\n| v1 | VIEW |\n+----------------+------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/show-tables/','','https://mariadb.com/kb/en/library/show-tables/'),(399,'SHOW TABLE_STATISTICS',26,'MariaDB 5.2 introduced the User Statistics feature.\n \nSyntax\n------ \nSHOW TABLE_STATISTICS\n \nDescription\n----------- \nThe SHOW TABLE_STATISTICS statement was introduced in\nMariaDB 5.2 as part of the User Statistics feature. It was\nremoved as a separate statement in MariaDB 10.1.1, but\neffectively replaced by the generic SHOW\ninformation_schema_table statement. The\ninformation_schema.TABLE_STATISTICS table shows statistics\non table usage\n \nThe userstat system variable must be set to 1 to activate\nthis feature. See the User Statistics and\ninformation_schema.TABLE_STATISTICS articles for more\ninformation.\n \nExample\n \nFrom MariaDB 10.0\n \nSHOW TABLE_STATISTICS\\G\n*************************** 1. row\n***************************\n Table_schema: mysql\n Table_name: proxies_priv\n Rows_read: 2\n Rows_changed: 0\nRows_changed_x_#indexes: 0\n*************************** 2. row\n***************************\n Table_schema: test\n Table_name: employees_example\n Rows_read: 7\n Rows_changed: 0\nRows_changed_x_#indexes: 0\n*************************** 3. row\n***************************\n Table_schema: mysql\n Table_name: user\n Rows_read: 16\n Rows_changed: 0\nRows_changed_x_#indexes: 0\n*************************** 4. row\n***************************\n Table_schema: mysql\n Table_name: db\n Rows_read: 2\n Rows_changed: 0\nRows_changed_x_#indexes: 0\n \n\n \n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/show-table-statistics/','','https://mariadb.com/kb/en/library/show-table-statistics/'),(400,'SHOW TRIGGERS',26,'Syntax\n------ \nSHOW TRIGGERS [FROM db_name]\n [LIKE \'pattern\' | WHERE expr]\n \nDescription\n----------- \n SHOW TRIGGERS lists the triggers currently defined for\ntables in a database (the default database unless a FROM\nclause is given). This statement requires the\nTRIGGER privilege (prior to MySQL\n5.1.22, it required the SUPER privilege). \n \nThe LIKE clause, if present on its own, indicates which\ntable names to\nmatch and causes the statement to display triggers for those\ntables. The WHERE and LIKE clauses can be given to select\nrows using more general conditions, as discussed in Extended\nSHOW.\n \nSimilar information is stored in the\ninformation_schema.TRIGGERS table.\n \nIf there are multiple triggers for the same action, then the\ntriggers are shown in action order.\n \nExamples\n-------- \nFor the trigger defined at Trigger Overview:\n \nSHOW triggers Like \'animals\' \\G\n*************************** 1. row\n***************************\n Trigger: the_mooses_are_loose\n Event: INSERT\n Table: animals\n Statement: BEGIN\n IF NEW.name = \'Moose\' THEN\n UPDATE animal_count SET animal_count.animals =\nanimal_count.animals+100;\n ELSE \n UPDATE animal_count SET animal_count.animals =\nanimal_count.animals+1;\n END IF;\nEND\n Timing: AFTER\n Created: 2016-09-29 13:53:34.35\n sql_mode: \n Definer: root@localhost\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n \nListing all triggers associated with a certain table:\n \nSHOW TRIGGERS FROM test WHERE `Table` = \'user\' \\G\n*************************** 1. row\n***************************\n Trigger: user_ai\n Event: INSERT\n Table: user\n Statement: BEGIN END\n Timing: AFTER\n Created: 2016-09-29 13:53:34.35\n sql_mode: \n Definer: root@%\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\n \nSHOW triggers WHERE Event Like \'Insert\' \\G\n*************************** 1. row\n***************************\n Trigger: the_mooses_are_loose\n Event: INSERT\n Table: animals\n Statement: BEGIN\n IF NEW.name = \'Moose\' THEN\n UPDATE animal_count SET animal_count.animals =\nanimal_count.animals+100;\n ELSE \n UPDATE animal_count SET animal_count.animals =\nanimal_count.animals+1;\n END IF;\nEND\n Timing: AFTER\n Created: 2016-09-29 13:53:34.35\n sql_mode: \n Definer: root@localhost\ncharacter_set_client: utf8\ncollation_connection: utf8_general_ci\n Database Collation: latin1_swedish_ci\ncharacter_set_client is the session value of the\ncharacter_set_client system variable when the trigger was\ncreated. \ncollation_connection is the session value of the\ncollation_connection system variable when the trigger was\n created. \nDatabase Collation is the collation of the database \n with which the trigger is associated.\n \nThese columns were added in MariaDB/MySQL 5.1.21.\n \nOld triggers created before MySQL 5.7 and MariaDB 10.2.3 has\nNULL in the Created column.\n \n\n\nURL: https://mariadb.com/kb/en/library/show-triggers/','','https://mariadb.com/kb/en/library/show-triggers/'),(401,'SHOW USER_STATISTICS',26,'MariaDB 5.2 introduced the User Statistics feature.\n \nSyntax\n------ \nSHOW USER_STATISTICS\n \nDescription\n----------- \nThe SHOW USER_STATISTICS statement was introduced in MariaDB\n5.2 as part of the User Statistics feature. It was removed\nas a separate statement in MariaDB 10.1.1, but effectively\nreplaced by the generic SHOW information_schema_table\nstatement. The information_schema.USER_STATISTICS table\nholds statistics about user activity. You can use this table\nto find out such things as which user is causing the most\nload and which users are being abusive. You can also use\nthis table to measure how close to capacity the server may\nbe.\n \nThe userstat system variable must be set to 1 to activate\nthis feature. See the User Statistics and\ninformation_schema.USER_STATISTICS table for more\ninformation.\n \nExample\n \nFrom MariaDB 10.0:\n \nSHOW USER_STATISTICS\\G\n*************************** 1. row\n***************************\n User: root\n Total_connections: 1\nConcurrent_connections: 0\n Connected_time: 3297\n Busy_time: 0.14113400000000006\n Cpu_time: 0.017637000000000003\n Bytes_received: 969\n Bytes_sent: 22355\n Binlog_bytes_written: 0\n Rows_read: 10\n Rows_sent: 67\n Rows_deleted: 0\n Rows_inserted: 0\n Rows_updated: 0\n Select_commands: 7\n Update_commands: 0\n Other_commands: 0\n Commit_transactions: 1\n Rollback_transactions: 0\n Denied_connections: 0\n Lost_connections: 0\n Access_denied: 0\n Empty_queries: 7\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-user-statistics/','','https://mariadb.com/kb/en/library/show-user-statistics/'),(404,'SHOW WSREP_MEMBERSHIP',26,'MariaDB 10.1.2\n \nSHOW WSREP_MEMBERSHIP was introduced with the WSREP_INFO\nplugin in MariaDB 10.1.2.\n \nSyntax\n------ \nSHOW WSREP_MEMBERSHIP\n \nDescription\n----------- \nThe SHOW WSREP_MEMBERSHIP statement returns Galera node\ncluster membership information. It returns the same\ninformation as found in the\ninformation_schema.WSREP_MEMBERSHIP table. Only users with\nthe SUPER privilege can access this information.\n \nExamples\n-------- \nSHOW WSREP_MEMBERSHIP;\n+-------+--------------------------------------+----------+-----------------+\n| Index | Uuid | Name | Address |\n+-------+--------------------------------------+----------+-----------------+\n| 0 | 19058073-8940-11e4-8570-16af7bf8fced | my_node1 |\n10.0.2.15:16001 |\n| 1 | 19f2b0e0-8942-11e4-9cb8-b39e8ee0b5dd | my_node3 |\n10.0.2.15:16003 |\n| 2 | d85e62db-8941-11e4-b1ef-4bc9980e476d | my_node2 |\n10.0.2.15:16002 |\n+-------+--------------------------------------+----------+-----------------+\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/show-wsrep_membership/','','https://mariadb.com/kb/en/library/show-wsrep_membership/'),(402,'SHOW VARIABLES',26,'Syntax\n------ \nSHOW [GLOBAL | SESSION] VARIABLES\n [LIKE \'pattern\' | WHERE expr]\n \nDescription\n----------- \nSHOW VARIABLES shows the values of MariaDB system variables.\nThis\ninformation also can be obtained using the mysqladmin\nvariables\ncommand. The LIKE clause, if present, indicates which\nvariable names\nto match. The WHERE clause can be given to select rows using\nmore\ngeneral conditions.\n \nWith the GLOBAL modifier, SHOW VARIABLES displays the values\nthat are\nused for new connections to MariaDB. With SESSION, it\ndisplays the\nvalues that are in effect for the current connection. If no\nmodifier\nis present, the default is SESSION. LOCAL is a synonym for\nSESSION.\nWith a LIKE clause, the statement displays only rows for\nthose\nvariables with names that match the pattern. To obtain the\nrow for a\nspecific variable, use a LIKE clause as shown:\n \nSHOW VARIABLES LIKE \'maria_group_commit\';\n \nSHOW SESSION VARIABLES LIKE \'maria_group_commit\';\n \nTo get a list of variables whose name match a pattern, use\nthe \"%\"\nwildcard character in a LIKE clause:\n \nSHOW VARIABLES LIKE \'%maria%\';\n \nSHOW GLOBAL VARIABLES LIKE \'%maria%\';\n \nWildcard characters can be used in any position within the\npattern to\nbe matched. Strictly speaking, because \"_\" is a wildcard\nthat matches\nany single character, you should escape it as \"\\_\" to\nmatch it\nliterally. In practice, this is rarely necessary.\n \nThe WHERE and LIKE clauses can be given to select rows using\nmore general conditions, as discussed in Extended SHOW.\n \nSee SET for information on setting server system variables.\n \nSee Server System Variables for a list of all the variables\nthat can be set.\n \nYou can also see the server variables by querying the\nInformation Schema GLOBAL_VARIABLES and SESSION_VARIABLES\ntables.\n \nExamples\n-------- \nSHOW VARIABLES LIKE \'aria%\';\n \n+------------------------------------------+---------------------+\n| Variable_name | Value |\n+------------------------------------------+---------------------+\n| aria_block_size | 8192 |\n| aria_checkpoint_interval | 30 |\n| aria_checkpoint_log_activity | 1048576 |\n| aria_force_start_after_recovery_failures | 0 |\n| aria_group_commit | none |\n| aria_group_commit_interval | 0 |\n| aria_log_file_size | 1073741824 |\n| aria_log_purge_type | immediate |\n| aria_max_sort_file_size | 9223372036853727232 |\n| aria_page_checksum | ON |\n| aria_pagecache_age_threshold | 300 |\n| aria_pagecache_buffer_size | 134217728 |\n| aria_pagecache_division_limit | 100 |\n| aria_recover | NORMAL |\n| aria_repair_threads | 1 |\n| aria_sort_buffer_size | 134217728 |\n| aria_stats_method | nulls_unequal |\n| aria_sync_log_dir | NEWFILE |\n| aria_used_for_temp_tables | ON |\n+------------------------------------------+---------------------+\n \nSELECT VARIABLE_NAME, SESSION_VALUE, GLOBAL_VALUE FROM\n INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE\n VARIABLE_NAME LIKE \'max_error_count\' OR\n VARIABLE_NAME LIKE \'innodb_sync_spin_loops\';\n \n+---------------------------+---------------+--------------+\n| VARIABLE_NAME | SESSION_VALUE | GLOBAL_VALUE |\n+---------------------------+---------------+--------------+\n| MAX_ERROR_COUNT | 64 | 64 |\n| INNODB_SYNC_SPIN_LOOPS | NULL | 30 |\n+---------------------------+---------------+--------------+\n \nSET GLOBAL max_error_count=128;\n \nSELECT VARIABLE_NAME, SESSION_VALUE, GLOBAL_VALUE FROM\n INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE\n VARIABLE_NAME LIKE \'max_error_count\' OR\n VARIABLE_NAME LIKE \'innodb_sync_spin_loops\';\n \n+---------------------------+---------------+--------------+\n| VARIABLE_NAME | SESSION_VALUE | GLOBAL_VALUE |\n+---------------------------+---------------+--------------+\n| MAX_ERROR_COUNT | 64 | 128 |\n| INNODB_SYNC_SPIN_LOOPS | NULL | 30 |\n+---------------------------+---------------+--------------+\n \nSET GLOBAL max_error_count=128;\n \nSHOW VARIABLES LIKE \'max_error_count\';\n \n+-----------------+-------+\n| Variable_name | Value |\n+-----------------+-------+\n| max_error_count | 64 |\n+-----------------+-------+\n \nSHOW GLOBAL VARIABLES LIKE \'max_error_count\';\n \n+-----------------+-------+\n| Variable_name | Value |\n+-----------------+-------+\n| max_error_count | 128 |\n+-----------------+-------+\n \nBecause the following variable only has a global scope, the\nglobal value is returned even when specifying SESSION (in\nthis case by default):\n \nSHOW VARIABLES LIKE \'innodb_sync_spin_loops\';\n \n+------------------------+-------+\n| Variable_name | Value |\n+------------------------+-------+\n| innodb_sync_spin_loops | 30 |\n+------------------------+-------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-variables/','','https://mariadb.com/kb/en/library/show-variables/'),(405,'SHOW WSREP_STATUS',26,'MariaDB 10.1.2\n \nSHOW WSREP_STATUS was introduced with the WSREP_INFO plugin\nin MariaDB 10.1.2.\n \nSyntax\n------ \nSHOW WSREP_STATUS\n \nDescription\n----------- \nThe SHOW WSREP_STATUS statement returns Galera node and\ncluster status information. It returns the same information\nas found in the information_schema.WSREP_STATUS table. Only\nusers with the SUPER privilege can access this information.\n \nExamples\n-------- \nSHOW WSREP_STATUS;\n+------------+-------------+----------------+--------------+\n| Node_Index | Node_Status | Cluster_Status | Cluster_Size |\n+------------+-------------+----------------+--------------+\n| 0 | Synced | Primary | 3 |\n+------------+-------------+----------------+--------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/show-wsrep_status/','','https://mariadb.com/kb/en/library/show-wsrep_status/'),(403,'SHOW WARNINGS',26,'Syntax\n------ \nSHOW WARNINGS [LIMIT [offset,] row_count]\nSHOW ERRORS [LIMIT row_count OFFSET offset]\nSHOW COUNT(*) WARNINGS\n \nDescription\n----------- \n SHOW WARNINGS shows the error, warning, and note messages\nthat resulted from the last statement that generated\nmessages in the\ncurrent session. It shows nothing if the last statement used\na table\nand generated no messages. (That is, a statement that uses a\ntable but\ngenerates no messages clears the message list.) Statements\nthat do not\nuse tables and do not generate messages have no effect on\nthe message\nlist.\n \nA note is different to a warning in that it only appears if\nthe sql_notes variable is set to 1 (the default), and is not\nconverted to an error if strict mode is enabled.\n \nA related statement, SHOW ERRORS, shows only the errors.\n \nThe SHOW COUNT(*) WARNINGS statement displays the total\nnumber of errors, warnings, and notes. You can also retrieve\nthis number from\nthe warning_count variable:\n \nSHOW COUNT(*) WARNINGS;\nSELECT @@warning_count;\n \nThe value of warning_count might be greater than the number\nof messages displayed by SHOW WARNINGS if the\nmax_error_count system variable is set so low that not all\nmessages are stored.\n \nThe LIMIT clause has the same syntax as for the\n SELECT statement.\n \nSHOW WARNINGS can be used after EXPLAIN EXTENDED to see how\na query is internally rewritten by MariaDB.\n \nIf the sql_notes server variable is set to 1, Notes are\nincluded in the output of SHOW WARNINGS; if it is set to 0,\nthis statement will not show (or count) Notes.\n \nThe results of SHOW WARNINGS and SHOW COUNT(*) WARNINGS are\ndirectly sent to the client. If you need to access those\ninformation in a stored program, you can use the GET\nDIAGNOSTICS statement instead.\n \nFor a list of MariaDB error codes, see MariaDB Error Codes.\n \nThe mysql client also has a number of options related to\nwarnings. The \\W command will show warnings after every\nstatement, while \\w will disable this. Starting the client\nwith the --show-warnings option will show warnings after\nevery statement.\n \nMariaDB 10.3.1 implements a stored routine error stack\ntrace. SHOW WARNINGS can also be used to show more\ninformation. See the example below.\n \nExamples\n-------- \nSELECT 1/0;\n+------+\n| 1/0 |\n+------+\n| NULL |\n+------+\n \nSHOW COUNT(*) WARNINGS;\n+-------------------------+\n| @@session.warning_count |\n+-------------------------+\n| 1 |\n+-------------------------+\n \nSHOW WARNINGS;\n+---------+------+---------------+\n| Level | Code | Message |\n+---------+------+---------------+\n| Warning | 1365 | Division by 0 |\n+---------+------+---------------+\n \nStack Trace\n \nFrom MariaDB 10.3.1, displaying a stack trace:\n \nDELIMITER $$\nCREATE OR REPLACE PROCEDURE p1()\n BEGIN\n DECLARE c CURSOR FOR SELECT * FROM not_existing;\n OPEN c;\n CLOSE c;\n END;\n$$\nCREATE OR REPLACE PROCEDURE p2()\n BEGIN\n CALL p1;\n END;\n$$\nDELIMITER ;\nCALL p2;\nERROR 1146 (42S02): Table \'test.not_existing\' doesn\'t\nexist\n \nSHOW WARNINGS;\n+-------+------+-----------------------------------------+\n| Level | Code | Message |\n+-------+------+-----------------------------------------+\n| Error | 1146 | Table \'test.not_existing\' doesn\'t exist\n|\n| Note | 4091 | At line 6 in test.p1 |\n| Note | 4091 | At line 4 in test.p2 |\n+-------+------+-----------------------------------------+\n \nSHOW WARNINGS displays a stack trace, showing where the\nerror actually happened:\nLine 4 in test.p1 is the OPEN command which actually raised\nthe error\nLine 3 in test.p2 is the CALL statement, calling p1 from p2.\n \n\n\nURL: https://mariadb.com/kb/en/library/show-warnings/','','https://mariadb.com/kb/en/library/show-warnings/'),(406,'CALL',27,'Syntax\n------ \nCALL sp_name([parameter[,...]])\nCALL sp_name[()]\n \nDescription\n----------- \nThe CALL statement invokes a stored procedure that was\ndefined previously with CREATE PROCEDURE. \n \nStored procedure names can be specified as\ndatabase_name.procedure_name. Procedure names and database\nnames can be quoted with backticks (). This is necessary if\nthey are reserved words, or contain special characters. See\nidentifier qualifiers for details.\n \nBefore MySQL 5.1.13, stored procedures that take no\narguments required parentheses. In current releases of\nMariaDB, CALL p() and CALL p are equivalent.\n \nIf parentheses are used, any number of spaces, tab\ncharacters and new line characters is allowed between the\nprocedure\'s name and the open parenthesis.\n \nCALL can pass back values to its caller using parameters\nthat are declared as OUT or INOUT\nparameters. If no value is assigned to an OUT parameter,\nNULL is assigned (and its former value is lost). To pass\nsuch values from another stored program you can use\nuser-defined variables, local variables or routine\'s\nparameters; in other contexts, you can only use user-defined\nvariables. \n \nCALL can also be executed as a prepared statement.\nPlaceholders can be used for IN parameters in all versions\nof MariaDB; for OUT and INOUT parameters, placeholders can\nbe used since MariaDB 5.5.\n \nWhen the procedure returns, a client program can also obtain\nthe\nnumber of rows affected for the final statement executed\nwithin the routine: At\nthe SQL level, call the ROW_COUNT() function; from the C\nAPI, call the mysql_affected_rows() function.\n \nIf the CLIENT_MULTI_RESULTS API flag is set, CALL can return\nany number of resultsets and the called stored procedure can\nexecute prepared statements. If it is not set, at most one\nresultset can be returned and prepared statements cannot be\nused within procedures.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/call/','','https://mariadb.com/kb/en/library/call/'),(407,'Concurrent Inserts',27,'The MyISAM storage engine supports concurrent inserts. This\nfeature allows SELECT statements to be executed during\nINSERT operations, reducing contention.\n \nWhether concurrent inserts can be used or not depends on the\nvalue of the concurrent_insert server system variable:\nNEVER (0) disables concurrent inserts.\nAUTO (1) allows concurrent inserts only when the target\ntable has no free blocks (no data in the middle of the table\nhas been deleted after the last OPTIMIZE TABLE). This is the\ndefault.\nALWAYS (2) always enables concurrent inserts.\n \nIf the binary log is used, CREATE TABLE ... SELECT and\nINSERT ... SELECT statements cannot use concurrent inserts.\nThese statements acquire a read lock on the table, so\nconcurrent inserts will need to wait. This way the log can\nbe safely used to restore data.\n \nConcurrent inserts is not used by slaves with the row based\nreplication (see binary log formats).\n \nIf an INSERT statement contain the HIGH_PRIORITY clause,\nconcurrent inserts cannot be used. INSERT ... DELAYED is\nusually unneeded if concurrent inserts are enabled.\n \nLOAD DATA INFILE uses concurrent inserts if the CONCURRENT\nkeyword is specified and concurrent_insert is not NEVER.\nThis makes the statement slower (even if no other sessions\naccess the table) but reduces contention.\n \nLOCK TABLES allows non-conflicting concurrent inserts if a\nREAD LOCAL lock is used. Concurrent inserts are not allowed\nif the LOCAL keyword is omitted.\n \nNotes\n \nThe decision to enable concurrent insert for a table is done\nwhen the table is opened. If you change the value of\nconcurrent_insert it will only affect new opened tables. If\nyou want it to work for also for tables in use or cached,\nyou should do FLUSH TABLES after setting the variable.\n \n\n\nURL: https://mariadb.com/kb/en/library/concurrent-inserts/','','https://mariadb.com/kb/en/library/concurrent-inserts/'),(408,'DELETE',27,'Syntax\n------ \nSingle-table syntax:\n \nDELETE [LOW_PRIORITY] [QUICK] [IGNORE] \n FROM tbl_name [PARTITION (partition_list)]\n [WHERE where_condition]\n [ORDER BY ...]\n [LIMIT row_count]\n [RETURNING select_expr \n [, select_expr ...]]\n \nMultiple-table syntax:\n \nDELETE [LOW_PRIORITY] [QUICK] [IGNORE]\n tbl_name[.*] [, tbl_name[.*]] ...\n FROM table_references\n [WHERE where_condition]\n \nOr:\n \nDELETE [LOW_PRIORITY] [QUICK] [IGNORE]\n FROM tbl_name[.*] [, tbl_name[.*]] ...\n USING table_references\n [WHERE where_condition]\n \nTrimming history:\n \nDELETE HISTORY\n FROM tbl_name [PARTITION (partition_list)]\n [BEFORE SYSTEM_TIME [TIMESTAMP|TRANSACTION] expression]\n \nDescription\n----------- \nOption | Description | \n \nLOW_PRIORITY | Wait until all SELECT\'s are done before\nstarting the statement. Used with storage engines that uses\ntable locking (MyISAM, Aria etc). See HIGH_PRIORITY and\nLOW_PRIORITY clauses for details. | \n \nQUICK | Signal the storage engine that it should expect that\na lot of rows are deleted. The storage engine engine can do\nthings to speed up the DELETE like ignoring merging of data\nblocks until all rows are deleted from the block (instead of\nwhen a block is half full). This speeds up things at the\nexpanse of lost space in data blocks. At least MyISAM and\nAria support this feature. | \n \nIGNORE | Don\'t stop the query even if a not-critical error\noccurs (like data overflow). See How IGNORE works for a full\ndescription. | \n \nFor the single-table syntax, the DELETE statement deletes\nrows\nfrom tbl_name and returns a count of the number of deleted\nrows. This count can\nbe obtained by calling the ROW_COUNT() function. The\nWHERE clause, if given, specifies the conditions that\nidentify\nwhich rows to delete. With no WHERE clause, all rows are\ndeleted. If the ORDER BY clause is specified, the rows are\ndeleted in the order that is specified. The LIMIT clause\nplaces a limit on the number of rows that can be deleted.\n \nFor the multiple-table syntax, DELETE deletes from each\ntbl_name the rows that satisfy the conditions. In this case,\nORDER BY and LIMIT> cannot be used. A DELETE can also\nreference tables which are located in different databases;\nsee Identifier Qualifiers for the syntax.\n \nwhere_condition is an expression that evaluates to true for\neach row to be deleted. It is specified as described in\nSELECT.\n \nCurrently, you cannot delete from a table and select from\nthe same\ntable in a subquery.\n \nYou need the DELETE privilege on a table to delete rows from\nit. You need only the SELECT privilege for any columns that\nare only read, such as those named in the WHERE clause. See\nGRANT.\n \nThe PARTITION clause was introduced in MariaDB 10.0. See\nPartition Pruning and Selection for details.\n \nAs stated, a DELETE statement with no WHERE\nclause deletes all rows. A faster way to do this, when you\ndo not need to know\nthe number of deleted rows, is to use TRUNCATE TABLE.\nHowever,\nwithin a transaction or if you have a lock on the table, \nTRUNCATE TABLE cannot be used whereas DELETE\ncan. See TRUNCATE TABLE, and\nLOCK.\n \nFrom MariaDB 10.0.5, it is possible to return a resultset of\nthe deleted rows for a single table to the client by using\nthe syntax DELETE ... RETURNING select_expr [, select_expr2\n...]]\n \nAny of SQL expression that can be calculated from a single\nrow fields is allowed. Subqueries are allowed. The AS\nkeyword is allowed, so it is possible to use aliases.\n \nThe use of aggregate functions is not allowed. RETURNING\ncannot be used in multi-table DELETEs.\n \nSame Source and Target Table\n \nUntil MariaDB 10.3.1, deleting from a table with the same\nsource and target was not possible. From MariaDB 10.3.1,\nthis is now possible. For example:\n \nDELETE FROM t1 WHERE c1 IN (SELECT b.c1 FROM t1 b WHERE\nb.c2=0);\n \nOne can use DELETE HISTORY to delete historical information\nfrom System-versioned tables.\n \nExamples\n-------- \nHow to use the ORDER BY and LIMIT clauses:\n \nDELETE FROM page_hit ORDER BY timestamp LIMIT 1000000;\n \nHow to use the RETURNING clause:\n \nDELETE FROM t RETURNING f1;\n \n+------+\n| f1 |\n+------+\n| 5 |\n| 50 |\n| 500 |\n+------+ \n \nThe following statement joins two tables: one is only used\nto satisfy a WHERE condition, but no row is deleted from it;\nrows from the other table are deleted, instead.\n \nDELETE post FROM blog INNER JOIN post WHERE blog.id =\npost.blog_id;\n \nDeleting from the Same Source and Target\n \nCREATE TABLE t1 (c1 INT, c2 INT);\nDELETE FROM t1 WHERE c1 IN (SELECT b.c1 FROM t1 b WHERE\nb.c2=0);\n \nUntil MariaDB 10.3.1, this returned:\n \nERROR 1093 (HY000): Table \'t1\' is specified twice, both as\na target for \'DELETE\' \n and as a separate source for\n \nFrom MariaDB 10.3.1:\n \nQuery OK, 0 rows affected (0.00 sec)\n \n\n\nURL: https://mariadb.com/kb/en/library/delete/','','https://mariadb.com/kb/en/library/delete/'),(411,'EXCEPT',27,'EXCEPT was introduced in MariaDB 10.3.0.\n \nThe result of EXCEPT is all records of the left SELECT\nresult set except records which are in right SELECT result\nset, i.e. it is subtraction of two result sets.\n \nSyntax\n------ \nSELECT ...\n(INTERSECT | EXCEPT | UNION [ALL | DISTINCT]) SELECT ...\n[(INTERSECT | EXCEPT | UNION [ALL | DISTINCT]) SELECT ...]\n[ORDER BY [column [, column ...]]]\n[LIMIT {[offset,] row_count | row_count OFFSET offset}]\n \nPlease note:\nALL is not supported by EXCEPT (and it is difficult to make\nsense of ALL with EXCEPT).\nBrackets for explicit operation precedence are not\nsupported; use a subquery in the FROM clause as a\nworkaround).\n \nDescription\n----------- \nMariaDB has supported EXCEPT and INTERSECT in addition to\nUNION since MariaDB 10.3.\n \nAll behavior for naming columns, ORDER BY and LIMIT is the\nsame as for UNION.\n \nEXCEPT implicitly supposes a DISTINCT operation.\n \nThe result of EXCEPT is all records of the left SELECT\nresult except records which are in right SELECT result set,\ni.e. it is subtraction of two result sets.\n \nEXCEPT and UNION have the same operation precedence.\n \n\nParentheses\n \nFrom MariaDB 10.4.0, parentheses can be used to specify\nprecedence. Before this, a syntax error would be returned.\n \nExamples\n-------- \nShow customers which are not employees:\n \n(SELECT e_name AS name, email FROM customers)\nEXCEPT\n(SELECT c_name AS name, email FROM employees);\n \nDifference between UNION, EXCEPT and INTERSECT:\n \nCREATE TABLE seqs (i INT);\nINSERT INTO seqs VALUES (1),(2),(3),(4),(5),(6);\n \nSELECT i FROM seqs WHERE i =3;\n \n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 3 |\n| 4 |\n| 5 |\n| 6 |\n+------+\n \nSELECT i FROM seqs WHERE i =3;\n \n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n+------+\n \nSELECT i FROM seqs WHERE i =3;\n \n+------+\n| i |\n+------+\n| 3 |\n+------+\n \nParentheses for specifying precedence, from MariaDB 10.4.0\n \nCREATE OR REPLACE TABLE t1 (a INT);\nCREATE OR REPLACE TABLE t2 (b INT);\nCREATE OR REPLACE TABLE t3 (c INT);\n \nINSERT INTO t1 VALUES (1),(2),(3),(4);\nINSERT INTO t2 VALUES (5),(6);\nINSERT INTO t3 VALUES (1),(6);\n \n((SELECT a FROM t1) UNION (SELECT b FROM t2)) EXCEPT (SELECT\nc FROM t3);\n+------+\n| a |\n+------+\n| 2 |\n| 3 |\n| 4 |\n| 5 |\n+------+\n \n(SELECT a FROM t1) UNION ((SELECT b FROM t2) EXCEPT (SELECT\nc FROM t3));\n+------+\n| a |\n+------+\n| 1 |\n| 2 |\n| 3 |\n| 4 |\n| 5 |\n+------+\n \n\n\nURL: https://mariadb.com/kb/en/library/except/','','https://mariadb.com/kb/en/library/except/'),(415,'HIGH_PRIORITY and LOW_PRIORITY',27,'The XtraDB/InnoDB storage engine uses row-level locking to\nensure data integrity. However some storage engines (such as\nMEMORY, MyISAM, Aria and MERGE) lock the whole table to\nprevent conflicts. These storage engines use two separate\nqueues to remember pending statements; one is for SELECTs\nand the other one is for write statements (INSERT, DELETE,\nUPDATE). By default, the latter has a higher priority.\n \nTo give write operations a lower priority, the\nlow_priority_updates server system variable can be set to\nON. The option is available on both the global and session\nlevels, and it can be set at startup or via the SET\nstatement.\n \nWhen too many table locks have been set by write statements,\nsome pending SELECTs are executed. The maximum number of\nwrite locks that can be acquired before this happens is\ndetermined by the max_write_lock_count server system\nvariable, which is dynamic.\n \nIf write statements have a higher priority (default), the\npriority of individual write statements (INSERT, REPLACE,\nUPDATE, DELETE) can be changed via the LOW_PRIORITY\nattribute, and the priority of a SELECT statement can be\nraised via the HIGH_PRIORITY attribute. Also, LOCK TABLES\nsupports a LOW_PRIORITY attribute for WRITE locks.\n \nIf read statements have a higher priority, the priority of\nan INSERT can be changed via the HIGH_PRIORITY attribute.\nHowever, the priority of other write statements cannot be\nraised individually.\n \nThe use of LOW_PRIORITY or HIGH_PRIORITY for an INSERT\nprevents Concurrent Inserts from being used.\n \n\n\nURL:\nhttps://mariadb.com/kb/en/library/high_priority-and-low_priority/','','https://mariadb.com/kb/en/library/high_priority-and-low_priority/'),(416,'IGNORE',27,'The IGNORE option tells the server to ignore some common\nerrors.\n \nIGNORE can be used with the following statements:\nDELETE\nINSERT (see also INSERT IGNORE)\nLOAD DATA INFILE\nUPDATE\nALTER TABLE\nCREATE TABLE ... SELECT\nINSERT ... SELECT\n \nThe logic used:\nVariables out of ranges are replaced with the\nmaximum/minimum value.\n \nSQL_MODEs STRICT_TRANS_TABLES, STRICT_ALL_TABLES,\nNO_ZERO_IN_DATE, NO_ZERO_DATE are ignored.\n \nInserting NULL in a NOT NULL field will insert 0 ( in a\nnumerical\n field), 0000-00-00 ( in a date field) or an empty string (\nin a character\n field).\n \nRows that cause a duplicate key error or break a foreign key\nconstraint are\n not inserted, updated, or deleted.\n \nThe following errors are ignored:\n \nError number | Symbolic error name | Description | \n \n1022 | ER_DUP_KEY | Can\'t write; duplicate key in table\n\'%s\' | \n \n1048 | ER_BAD_NULL_ERROR | Column \'%s\' cannot be null | \n \n1062 | ER_DUP_ENTRY | Duplicate entry \'%s\' for key %d | \n \n1242 | ER_SUBQUERY_NO_1_ROW | Subquery returns more than 1\nrow | \n \n1264 | ER_WARN_DATA_OUT_OF_RANGE | Out of range value for\ncolumn \'%s\' at row %ld | \n \n1265 | WARN_DATA_TRUNCATED | Data truncated for column\n\'%s\' at row %ld | \n \n1292 | ER_TRUNCATED_WRONG_VALUE | Truncated incorrect %s\nvalue: \'%s\' | \n \n1366 | ER_TRUNCATED_WRONG_VALUE_FOR_FIELD | Incorrect\ninteger value | \n \n1369 | ER_VIEW_CHECK_FAILED | CHECK OPTION failed \'%s.%s\'\n| \n \n1451 | ER_ROW_IS_REFERENCED_2 | Cannot delete or update a\nparent row | \n \n1452 | ER_NO_REFERENCED_ROW_2 | Cannot add or update a child\nrow: a foreign key constraint fails (%s) | \n \n1526 | ER_NO_PARTITION_FOR_GIVEN_VALUE | Table has no\npartition for value %s | \n \n1586 | ER_DUP_ENTRY_WITH_KEY_NAME | Duplicate entry \'%s\'\nfor key \'%s\' | \n \n1591 | ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT | Table has no\npartition for some existing values | \n \n1748 | ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET | Found a\nrow not matching the given partition set | \n \nIgnored errors normally generate a warning.\n \nA property of the IGNORE clause consists in causing\ntransactional engines and non-transactional engines (like\nXtraDB and Aria) to behave the same way. For example,\nnormally a multi-row insert which tries to violate a UNIQUE\ncontraint is completely rolled back on XtraDB/InnoDB, but\nmight be partially executed on Aria. With the IGNORE clause,\nthe statement will be partially executed in both engines.\n \nStarting from MariaDB 5.5.28 duplicate key errors also\ngenerate warnings. The OLD_MODE server variable can be used\nto prevent this.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/ignore/','','https://mariadb.com/kb/en/library/ignore/'),(413,'GROUP BY',27,'Use the GROUP BY clause in a SELECT statement to group rows\ntogether that have the same value in one or more column, or\nthe same computed value using expressions with any\nfunctions and operators except\ngrouping functions. When you\nuse a GROUP BY clause, you will get a single result row for\neach group of rows\nthat have the same value for the expression given in GROUP\nBY.\n \nWhen grouping rows, grouping values are compared as if by\nthe = operator.\nFor string values, the = operator ignores trailing\nwhitespace and may normalize\ncharacters and ignore case, depending on the collation in\nuse.\n \nYou can use any of the grouping functions in your select\nexpression. Their values will\nbe calculated based on all the rows that have been grouped\ntogether for each result\nrow. If you select a non-grouped column or a value computed\nfrom a non-grouped\ncolumn, it is undefined which row the returned value is\ntaken from. This is not permitted if the ONLY_FULL_GROUP_BY\nSQL_MODE is used.\n \nYou can use multiple expressions in the GROUP BY clause,\nseparated by commas.\nRows are grouped together if they match on each of the\nexpressions.\n \nYou can also use a single integer as the grouping\nexpression. If you use an integer n,\nthe results will be grouped by the nth column in the select\nexpression.\n \nThe WHERE clause is applied before the GROUP BY clause. It\nfilters non-aggregated\nrows before the rows are grouped together. To filter grouped\nrows based on aggregate values,\nuse the HAVING clause. The HAVING clause takes any\nexpression and evaluates it as\na boolean, just like the WHERE clause. You can use grouping\nfunctions in the HAVING\nclause. As with the select expression, if you reference\nnon-grouped columns in the HAVING\nclause, the behavior is undefined.\n \nBy default, if a GROUP BY clause is present, the rows in the\noutput will be sorted by the expressions used in the GROUP\nBY. You can also specify ASC or DESC (ascending, descending)\nafter those expressions, like in ORDER BY. The default is\nASC.\n \nIf you want the rows to be sorted by another field, you can\nadd an explicit ORDER BY. If you don\'t want the result to\nbe ordered, you can add ORDER BY NULL.\n \nWITH ROLLUP\n \nThe WITH ROLLUP modifer adds extra rows to the resultset\nthat represent super-aggregate summaries. For a full\ndescription with examples, see SELECT WITH ROLLUP.\n \nGROUP BY Examples\n \nConsider the following table that records how many times\neach user has played and won a game:\n \nCREATE TABLE plays (name VARCHAR(16), plays INT, wins INT);\nINSERT INTO plays VALUES \n (\"John\", 20, 5), \n (\"Robert\", 22, 8), \n (\"Wanda\", 32, 8), \n (\"Susan\", 17, 3);\n \nGet a list of win counts along with a count:\n \nSELECT wins, COUNT(*) FROM plays GROUP BY wins;\n \n+------+----------+\n| wins | COUNT(*) |\n+------+----------+\n| 3 | 1 |\n| 5 | 1 |\n| 8 | 2 |\n+------+----------+\n3 rows in set (0.00 sec)\n \nThe GROUP BY expression can be a computed value, and can\nrefer back to an identifer\nspecified with AS. Get a list of win averages along with a\ncount:\n \nSELECT (wins / plays) AS winavg, COUNT(*) FROM plays GROUP\nBY winavg;\n \n+--------+----------+\n| winavg | COUNT(*) |\n+--------+----------+\n| 0.1765 | 1 |\n| 0.2500 | 2 |\n| 0.3636 | 1 |\n+--------+----------+\n3 rows in set (0.00 sec)\n \nYou can use any grouping function\nin the select expression. For each win average as above, get\na list of the average play\ncount taken to get that average:\n \nSELECT (wins / plays) AS winavg, AVG(plays) FROM plays \n GROUP BY winavg;\n \n+--------+------------+\n| winavg | AVG(plays) |\n+--------+------------+\n| 0.1765 | 17.0000 |\n| 0.2500 | 26.0000 |\n| 0.3636 | 22.0000 |\n+--------+------------+\n3 rows in set (0.00 sec)\n \nYou can filter on aggregate information using the HAVING\nclause. The HAVING\nclause is applied after GROUP BY and allows you to filter on\naggregate data that is\nnot available to the WHERE clause. Restrict the above\nexample to results that involve\nan average number of plays over 20:\n \nSELECT (wins / plays) AS winavg, AVG(plays) FROM plays \n GROUP BY winavg HAVING AVG(plays) > 20;\n \n+--------+------------+\n| winavg | AVG(plays) |\n+--------+------------+\n| 0.2500 | 26.0000 |\n| 0.3636 | 22.0000 |\n+--------+------------+\n2 rows in set (0.00 sec)\n \nSee Also\n \nSELECT\nJoins and Subqueries\nLIMIT\nORDER BY\nCommon Table Expressions\nSELECT WITH ROLLUP\nSELECT INTO OUTFILE\nSELECT INTO DUMPFILE\nFOR UPDATE\nLOCK IN SHARE MODE\nOptimizer Hints\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/group-by/','','https://mariadb.com/kb/en/library/group-by/'),(418,'INSERT - Default & Duplicate Values',27,'Default Values\n \nIf the SQL_MODE contains STRICT_TRANS_TABLES and you are\ninserting into a transactional table (like InnoDB), or if\nthe SQL_MODE contains STRICT_ALL_TABLES, all NOT NULL\ncolumns which does not have a DEFAULT value (and is not\nAUTO_INCREMENT) must be explicitly referenced in INSERT\nstatements. If not, an error like this is produced:\n \nERROR 1364 (HY000): Field \'col\' doesn\'t have a default\nvalue\n \nIn all other cases, if a NOT NULL column without a DEFAULT\nvalue is not referenced, an empty value will be inserted\n(for example, 0 for INTEGER columns and \'\' for CHAR\ncolumns). See NULL Values in MariaDB:Inserting for examples.\n \nIf a NOT NULL column having a DEFAULT value is not\nreferenced, NULL will be inserted.\n \nIf a NULL column having a DEFAULT value is not referenced,\nits default value will be inserted. It is also possible to\nexplicitly assign the default value using the DEFAULT\nkeyword or the DEFAULT() function.\n \nIf the DEFAULT keyword is used but the column does not have\na DEFAULT value, an error like this is produced:\n \nERROR 1364 (HY000): Field \'col\' doesn\'t have a default\nvalue\n \nDuplicate Values\n \nBy default, if you try to insert a duplicate row and there\nis a UNIQUE index, INSERT stops and an error like this is\nproduced:\n \nERROR 1062 (23000): Duplicate entry \'dup_value\' for key\n\'col\'\n \nTo handle duplicates you can use the IGNORE clause, INSERT\nON DUPLICATE KEY UPDATE or the REPLACE statement. Note that\nthe IGNORE and DELAYED options are ignored when you use ON\nDUPLICATE KEY UPDATE.\n \n\n\nURL:\nhttps://mariadb.com/kb/en/library/insert-default-duplicate-values/','','https://mariadb.com/kb/en/library/insert-default-duplicate-values/'),(417,'INSERT',27,'Syntax\n------ \nINSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n {VALUES | VALUE} ({expr | DEFAULT},...),(...),...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ]\n \nOr:\n \nINSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)]\n SET col={expr | DEFAULT}, ...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ]\n \nOr:\n \nINSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n SELECT ...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ]\n \nThe INSERT statement is used to insert new rows into an\nexisting table. The INSERT ... VALUES\nand INSERT ... SET forms of the statement insert rows based\non explicitly specified values. The INSERT ... SELECT form\ninserts rows selected from another table or tables. INSERT\n... SELECT is discussed further in the INSERT ... SELECT\narticle.\n \nThe table name can be specified in the form db_name.tbl_name\nor, if a default database is selected, in the form tbl_name\n(see Identifier Qualifiers). This allows to use INSERT ...\nSELECT to copy rows between different databases.\n \nThe PARTITION clause was introduced in MariaDB 10.0. It can\nbe used in both the INSERT and the SELECT part. See\nPartition Pruning and Selection for details.\n \nThe columns list is optional. It specifies which values are\nexplicitly inserted, and in which order. If this clause is\nnot specified, all values must be explicitly specified, in\nthe same order they are listed in the table definition.\n \nThe list of value follow the VALUES or VALUE keyword (which\nare interchangeable, regardless how much values you want to\ninsert), and is wrapped by parenthesis. The values must be\nlisted in the same order as the columns list. It is possible\nto specify more than one list to insert more than one rows\nwith a single statement. If many rows are inserted, this is\na speed optimization.\n \nFor one-row statements, the SET clause may be more simple,\nbecause you don\'t need to remember the columns order. All\nvalues are specified in the form col = expr.\n \nValues can also be specified in the form of a SQL expression\nor subquery. However, the subquery cannot access the same\ntable that is named in the INTO clause.\n \nIf you use the LOW_PRIORITY keyword, execution of the INSERT\nis delayed until no other clients are reading from the\ntable. If you use the HIGH_PRIORITY keyword, the statement\nhas the same priority as SELECTs. This affects only storage\nengines that use only table-level locking (MyISAM, MEMORY,\nMERGE). However, if one of these keywords is specified,\nconcurrent inserts cannot be used. See HIGH_PRIORITY and\nLOW_PRIORITY clauses for details.\n \nINSERT DELAYED\n \nFor more details on the DELAYED option, see INSERT DELAYED.\n \nHIGH PRIORITY and LOW PRIORITY\n \nSee HIGH_PRIORITY and LOW_PRIORITY.\n \nDefaults and Duplicate Values\n \nSee INSERT - Default & Duplicate Values for details..\n \nINSERT IGNORE\n \nSee INSERT IGNORE.\n \nINSERT ON DUPLICATE KEY UPDATE\n \nSee INSERT ON DUPLICATE KEY UPDATE.\n \nExamples\n-------- \nSpecifying the column names:\n \nINSERT INTO person (first_name, last_name) VALUES (\'John\',\n\'Doe\');\n \nInserting more than 1 row at a time:\n \nINSERT INTO tbl_name VALUES (1, \"row 1\"), (2, \"row 2\");\n \nUsing the SET clause:\n \nINSERT INTO person SET first_name = \'John\', last_name =\n\'Doe\';\n \nSELECTing from another table:\n \nINSERT INTO contractor SELECT * FROM person WHERE status =\n\'c\';\n \nSee INSERT ON DUPLICATE KEY UPDATE and INSERT IGNORE for\nfurther examples.\n \n\n\nURL: https://mariadb.com/kb/en/library/insert/','','https://mariadb.com/kb/en/library/insert/'),(420,'INSERT IGNORE',27,'Ignoring Errors\n \nNormally INSERT stops and rolls back when it encounters an\nerror.\n \nBy using the IGNORE keyword all errors are converted to\nwarnings, which will not stop inserts of additional rows.\n \nThe IGNORE and DELAYED options are ignored when you use ON\nDUPLICATE KEY UPDATE.\n \nIncompatibilities\n \nMariaDB until 5.5.28\nMySQL and MariaDB before 5.5.28 didn\'t give warnings for\nduplicate key errors when using IGNORE.\nYou can get the old behaviour if you set OLD_MODE to\nNO_DUP_KEY_WARNINGS_WITH_IGNORE\n \nExamples\n-------- \nCREATE TABLE t1 (x INT UNIQUE);\n \nINSERT INTO t1 VALUES(1),(2);\n \nINSERT INTO t1 VALUES(2),(3);\nERROR 1062 (23000): Duplicate entry \'2\' for key \'x\'\nSELECT * FROM t1;\n \n+------+\n| x |\n+------+\n| 1 |\n| 2 |\n+------+\n2 rows in set (0.00 sec)\n \nINSERT IGNORE INTO t1 VALUES(2),(3);\nQuery OK, 1 row affected, 1 warning (0.04 sec)\n \nSHOW WARNINGS;\n \n+---------+------+---------------------------------+\n| Level | Code | Message |\n+---------+------+---------------------------------+\n| Warning | 1062 | Duplicate entry \'2\' for key \'x\' |\n+---------+------+---------------------------------+\n \nSELECT * FROM t1;\n \n+------+\n| x |\n+------+\n| 1 |\n| 2 |\n| 3 |\n+------+\n \nSee INSERT ON DUPLICATE KEY UPDATE for further examples\nusing that syntax.\n \n\n\nURL: https://mariadb.com/kb/en/library/insert-ignore/','','https://mariadb.com/kb/en/library/insert-ignore/'),(419,'INSERT DELAYED',27,'Syntax\n------ \nINSERT DELAYED ...\n \nDescription\n----------- \nThe DELAYED option for the INSERT\nstatement is a MariaDB/MySQL extension to standard SQL that\nis very useful if you have\nclients that cannot or need not wait for the INSERT to\ncomplete. This is a common situation when you use MariaDB\nfor logging and you\nalso periodically run SELECT and UPDATE\nstatements that take a long time to complete.\n \nWhen a client uses INSERT DELAYED, it gets an okay from the\nserver at once, and the row is queued to be inserted when\nthe table is not in\nuse by any other thread.\n \nAnother major benefit of using INSERT DELAYED is that\ninserts from many clients are bundled together and written\nin one block. This\nis much faster than performing many separate inserts.\n \nNote that INSERT DELAYED is slower than a normal\n INSERT if the table is not otherwise in use. There is also\nthe additional overhead for the server to handle a separate\nthread for each\ntable for which there are delayed rows. This means that you\nshould use\nINSERT DELAYED only when you are really sure that you need\nit.\n \nThe queued rows are held only in memory until they are\ninserted into the table.\nThis means that if you terminate mysqld forcibly (for\nexample, with kill -9) or\nif mysqld dies unexpectedly, any queued rows that have not\nbeen written to disk\nare lost.\n \nThe number of concurrent INSERT DELAYED threads is limited\nby the max_delayed_threads server system variables. If it is\nset to 0, INSERT DELAYED is disabled. The session value can\nbe equal to the global value, or 0 to disable this statement\nfor the current session. If this limit has been reached, the\nDELAYED clause will be silently ignore for subsequent\nstatements (no error will be produced).\n \nThere are some constraints on the use of DELAYED:\nINSERT DELAYED works only with MyISAM, MEMORY, ARCHIVE,\n and BLACKHOLE tables. If you execute INSERT DELAYED with\nanother storage engine, you will get an error like this:\nERROR 1616 (HY000): DELAYED option not supported for table\n\'tab_name\'\nFor MyISAM tables, if there are no free blocks in the middle\nof the data\n file, concurrent SELECT and INSERT statements are\nsupported. Under these\n circumstances, you very seldom need to use INSERT DELAYED\n with MyISAM.\nINSERT DELAYED should be used only for\n INSERT statements that specify value lists. The server\n ignores DELAYED for INSERT ... SELECT\n or INSERT ... ON DUPLICATE KEY UPDATE statements.\nBecause the INSERT DELAYED statement returns immediately,\n before the rows are inserted, you cannot use\n LAST_INSERT_ID() to get the\n AUTO_INCREMENT value that the statement might generate.\nDELAYED rows are not visible to SELECT\n statements until they actually have been inserted.\nAfter INSERT DELAYED, ROW_COUNT() returns the number of the\nrows you tried to insert, not the number of the successful\nwrites.\nDELAYED is ignored on slave replication servers, so that \n INSERT DELAYED is treated as a normal\n INSERT on slaves. This is because\n DELAYED could cause the slave to have different data than\n the master. INSERT DELAYED statements are not safe for\nreplication.\nPending INSERT DELAYED statements are lost if a table is\n write locked and ALTER TABLE is used to modify the table\nstructure.\nINSERT DELAYED is not supported for views. If you try, you\nwill get an error like this: ERROR 1347 (HY000):\n\'view_name\' is not BASE TABLE\nINSERT DELAYED is not supported for partitioned tables.\nINSERT DELAYED is not supported within stored programs.\n \n\n\nURL: https://mariadb.com/kb/en/library/insert-delayed/','','https://mariadb.com/kb/en/library/insert-delayed/'),(422,'INSERT SELECT',27,'Syntax\n------ \nINSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [(col_name,...)]\n SELECT ...\n [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]\n \nDescription\n----------- \nWith INSERT ... SELECT, you can quickly insert many rows\ninto a table from one or more other tables. For example:\n \nINSERT INTO tbl_temp2 (fld_id)\n SELECT tbl_temp1.fld_order_id\n FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;\n \ntbl_name can also be specified in the form db_name.tbl_name\n(see Identifier Qualifiers). This allows to copy rows\nbetween different databases.\n \nIf the new table has a primary key or UNIQUE indexes, you\ncan use IGNORE to handle duplicate key errors during the\nquery. The newer values will not be inserted if an identical\nvalue already exists.\n \nREPLACE can be used instead of INSERT to prevent duplicates\non UNIQUE indexes by deleting old values. In that case, ON\nDUPLICATE KEY UPDATE cannot be used.\n \nINSERT ... SELECT works for tables which already exist. To\ncreate a table for a given resultset, you can use CREATE\nTABLE ... SELECT.\n \n\n\nURL: https://mariadb.com/kb/en/library/insert-select/','','https://mariadb.com/kb/en/library/insert-select/'),(423,'INTERSECT',27,'INTERSECT was introduced in MariaDB 10.3.0.\n \nThe result of an intersect is the intersection of right and\nleft SELECT results, i.e. only records that are present in\nboth result sets will be included in the result of the\noperation.\n \nSyntax\n------ \nSELECT ...\n(INTERSECT | EXCEPT | UNION [ALL | DISTINCT]) SELECT ...\n[(INTERSECT | EXCEPT | UNION [ALL | DISTINCT]) SELECT ...]\n[ORDER BY [column [, column ...]]]\n[LIMIT {[offset,] row_count | row_count OFFSET offset}]\n \nPlease note:\nALL is not supported by INTERSECT (and it is difficult to\nmake sense of ALL with INTERSECT).\nBrackets for explicit operation precedence are not\nsupported; use a subquery in the FROM clause as a\nworkaround).\n \nDescription\n----------- \nMariaDB has supported INTERSECT (as well as EXCEPT) in\naddition to UNION since MariaDB 10.3.\n \nAll behavior for naming columns, ORDER BY and LIMIT is the\nsame as for UNION.\n \nINTERSECT implicitly supposes a DISTINCT operation.\n \nThe result of an intersect is the intersection of right and\nleft SELECT results, i.e. only records that are present in\nboth result sets will be included in the result of the\noperation.\n \nINTERSECT has higher precedence than UNION and EXCEPT. If\npossible it will be executed linearly but if not it will be\ntranslated to a subquery in the FROM clause:\n \n(select a,b from t1)\nunion\n(select c,d from t2)\nintersect\n(select e,f from t3)\nunion\n(select 4,4);\n \nwill be translated to:\n \n(select a,b from t1)\nunion\nselect c,d from\n ((select c,d from t2)\n intersect\n (select e,f from t3)) dummy_subselect\nunion\n(select 4,4)\n \n\n \nParentheses\n \nFrom MariaDB 10.4.0, parentheses can be used to specify\nprecedence. Before this, a syntax error would be returned.\n \nExamples\n-------- \nShow customers which are employees:\n \n(SELECT e_name AS name, email FROM employees)\nINTERSECT\n(SELECT c_name AS name, email FROM customers);\n \nDifference between UNION, EXCEPT and INTERSECT:\n \nCREATE TABLE seqs (i INT);\nINSERT INTO seqs VALUES (1),(2),(3),(4),(5),(6);\n \nSELECT i FROM seqs WHERE i =3;\n \n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 3 |\n| 4 |\n| 5 |\n| 6 |\n+------+\n \nSELECT i FROM seqs WHERE i =3;\n \n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n+------+\n \nSELECT i FROM seqs WHERE i =3;\n \n+------+\n| i |\n+------+\n| 3 |\n+------+\n \nParentheses for specifying precedence, from MariaDB 10.4.0\n \nCREATE OR REPLACE TABLE t1 (a INT);\nCREATE OR REPLACE TABLE t2 (b INT);\nCREATE OR REPLACE TABLE t3 (c INT);\n \nINSERT INTO t1 VALUES (1),(2),(3),(4);\nINSERT INTO t2 VALUES (5),(6);\nINSERT INTO t3 VALUES (1),(6);\n \n((SELECT a FROM t1) UNION (SELECT b FROM t2)) INTERSECT\n(SELECT c FROM t3);\n+------+\n| a |\n+------+\n| 1 |\n| 6 |\n+------+\n \n(SELECT a FROM t1) UNION ((SELECT b FROM t2) INTERSECT\n(SELECT c FROM t3));\n+------+\n| a |\n+------+\n| 1 |\n| 2 |\n| 3 |\n| 4 |\n| 6 |\n+------+\n \n\n\nURL: https://mariadb.com/kb/en/library/intersect/','','https://mariadb.com/kb/en/library/intersect/'),(421,'INSERT ON DUPLICATE KEY UPDATE',27,'Syntax\n------ \nINSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n {VALUES | VALUE} ({expr | DEFAULT},...),(...),...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ]\n \nOr:\n \nINSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)]\n SET col={expr | DEFAULT}, ...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ]\n \nOr:\n \nINSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n SELECT ...\n [ ON DUPLICATE KEY UPDATE\n col=expr\n [, col=expr] ... ]\n \nDescription\n----------- \nINSERT ... ON DUPLICATE KEY UPDATE is a MariaDB/MySQL\nextension to the INSERT statement that, if it finds a\nduplicate unique or primary key, will instead perform an\nUPDATE.\n \nThe row/s affected value is reported as 1 if a row is\ninserted, and 2 if a row is updated, unless the API\'s\nCLIENT_FOUND_ROWS flag is set.\n \nIf more than one unique index is matched, only the first is\nupdated. It is not recommended to use this statement on\ntables with more than one unique index.\n \nIf the table has an AUTO_INCREMENT primary key and the\nstatement inserts or updates a row, the LAST_INSERT_ID()\nfunction returns its AUTO_INCREMENT value.\n \nThe VALUES() function can only be used in a ON DUPLICATE KEY\nUPDATE clause and has no meaning in any other context. It\nreturns the column values from the INSERT portion of the\nstatement. This function is particularly useful for\nmulti-rows inserts.\n \nThe IGNORE and DELAYED options are ignored when you use ON\nDUPLICATE KEY UPDATE.\n \nThe PARTITION clause was introduced in MariaDB 10.0. See\nPartition Pruning and Selection for details.\n \nThis statement activates INSERT and UPDATE triggers. See\nTrigger Overview for details.\n \nSee also a similar statement, REPLACE.\n \nExamples\n-------- \nCREATE TABLE ins_duplicate (id INT PRIMARY KEY, animal\nVARCHAR(30));\nINSERT INTO ins_duplicate VALUES (1,\'Aardvark\'),\n(2,\'Cheetah\'), (3,\'Zebra\');\n \nIf there is no existing key, the statement runs as a regular\nINSERT:\n \nINSERT INTO ins_duplicate VALUES (4,\'Gorilla\') ON\nDUPLICATE KEY UPDATE animal=\'Gorilla\';\nQuery OK, 1 row affected (0.07 sec)\n \nSELECT * FROM ins_duplicate;\n+----+----------+\n| id | animal |\n+----+----------+\n| 1 | Aardvark |\n| 2 | Cheetah |\n| 3 | Zebra |\n| 4 | Gorilla |\n+----+----------+\n \nA regular INSERT with a primary key value of 1 will fail,\ndue to the existing key:\n \nINSERT INTO ins_duplicate VALUES (1,\'Antelope\');\nERROR 1062 (23000): Duplicate entry \'1\' for key\n\'PRIMARY\'\n \nHowever, we can use an INSERT ON DUPLICATE KEY UPDATE\ninstead:\n \nINSERT INTO ins_duplicate VALUES (1,\'Antelope\') ON\nDUPLICATE KEY UPDATE animal=\'Antelope\';\nQuery OK, 2 rows affected (0.09 sec)\n \nNote that there are two rows reported as affected, but this\nrefers only to the UPDATE.\n \nSELECT * FROM ins_duplicate;\n+----+----------+\n| id | animal |\n+----+----------+\n| 1 | Antelope |\n| 2 | Cheetah |\n| 3 | Zebra |\n| 4 | Gorilla |\n+----+----------+\n \nAdding a second unique column:\n \nALTER TABLE ins_duplicate ADD id2 INT;\nUPDATE ins_duplicate SET id2=id+10;\nALTER TABLE ins_duplicate ADD UNIQUE KEY(id2);\n \nWhere two rows match the unique keys match, only the first\nis updated. This can be unsafe and is not recommended unless\nyou are certain what you are doing. Note that the warning\nshown below appears in MariaDB 5.5 and before, but has been\nremoved in MariaDB 10.0, as MariaDB now assumes that the\nkeys are checked in order, as shown in SHOW CREATE TABLE.\n \nINSERT INTO ins_duplicate VALUES (2,\'Lion\',13) ON\nDUPLICATE KEY UPDATE animal=\'Lion\';\nQuery OK, 2 rows affected, 1 warning (0.06 sec)\n \nSHOW WARNINGS;\n+-------+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n| Level | Code | Message |\n+-------+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n| Note | 1592 | Unsafe statement written to the binary log\nusing statement format since BINLOG_FORMAT = STATEMENT.\nINSERT... ON DUPLICATE KEY UPDATE on a table with more than\none UNIQUE KEY is unsafe |\n+-------+------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n \nSELECT * FROM ins_duplicate;\n+----+----------+------+\n| id | animal | id2 |\n+----+----------+------+\n| 1 | Antelope | 11 |\n| 2 | Lion | 12 |\n| 3 | Zebra | 13 |\n| 4 | Gorilla | 14 |\n+----+----------+------+\n \nAlthough the third row with an id of 3 has an id2 of 13,\nwhich also matched, it was not updated.\n \nChanging id to an auto_increment field. If a new row is\nadded, the auto_increment is moved forward. If the row is\nupdated, it remains the same.\n \nALTER TABLE `ins_duplicate` CHANGE `id` `id` INT( 11 ) NOT\nNULL AUTO_INCREMENT;\nALTER TABLE ins_duplicate DROP id2;\nSELECT Auto_increment FROM INFORMATION_SCHEMA.TABLES WHERE\nTABLE_NAME=\'ins_duplicate\';\n+----------------+\n| Auto_increment |\n+----------------+\n| 5 |\n+----------------+\n \nINSERT INTO ins_duplicate VALUES (2,\'Leopard\') ON\nDUPLICATE KEY UPDATE animal=\'Leopard\';\nQuery OK, 2 rows affected (0.00 sec)\n \nSELECT Auto_increment FROM INFORMATION_SCHEMA.TABLES WHERE\nTABLE_NAME=\'ins_duplicate\';\n+----------------+\n| Auto_increment |\n+----------------+\n| 5 |\n+----------------+\n \nINSERT INTO ins_duplicate VALUES (5,\'Wild Dog\') ON\nDUPLICATE KEY UPDATE animal=\'Wild Dog\';\nQuery OK, 1 row affected (0.09 sec)\n \nSELECT * FROM ins_duplicate;\n+----+----------+\n| id | animal |\n+----+----------+\n| 1 | Antelope |\n| 2 | Leopard |\n| 3 | Zebra |\n| 4 | Gorilla |\n| 5 | Wild Dog |\n+----+----------+\n \nSELECT Auto_increment FROM INFORMATION_SCHEMA.TABLES WHERE\nTABLE_NAME=\'ins_duplicate\';\n+----------------+\n| Auto_increment |\n+----------------+\n| 6 |\n+----------------+\n \nRefering to column values from the INSERT portion of the\nstatement: \n \nINSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)\n ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);\n \nSee the VALUES() function for more.\n \n\n\nURL:\nhttps://mariadb.com/kb/en/library/insert-on-duplicate-key-update/','','https://mariadb.com/kb/en/library/insert-on-duplicate-key-update/'),(424,'JOIN Syntax',27,'Description\n----------- \nMariaDB supports the following JOIN syntaxes for\nthe table_references part of SELECT statements and\nmultiple-table DELETE and UPDATE statements:\n \ntable_references:\n table_reference [, table_reference] ...\n \ntable_reference:\n table_factor\n | join_table\n \ntable_factor:\n tbl_name [PARTITION (partition_list)]\n [query_system_time_period_specification] [[AS] alias]\n[index_hint_list]\n | table_subquery [query_system_time_period_specification]\n[AS] alias\n | ( table_references )\n | { ON table_reference LEFT OUTER JOIN table_reference\n ON conditional_expr }\n \njoin_table:\n table_reference [INNER | CROSS] JOIN table_factor\n[join_condition]\n | table_reference STRAIGHT_JOIN table_factor\n | table_reference STRAIGHT_JOIN table_factor ON\nconditional_expr\n | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference\njoin_condition\n | table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN\ntable_factor\n \njoin_condition:\n ON conditional_expr\n | USING (column_list)\n \nquery_system_time_period_specification:\n FOR SYSTEM_TIME AS OF point_in_time\n | FOR SYSTEM_TIME BETWEEN point_in_time AND point_in_time\n | FOR SYSTEM_TIME FROM point_in_time TO point_in_time\n | FOR SYSTEM_TIME ALL\n \npoint_in_time:\n [TIMESTAMP] expression\n | TRANSACTION expression\n \nindex_hint_list:\n index_hint [, index_hint] ...\n \nindex_hint:\n USE {INDEX|KEY}\n [{FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])\n | IGNORE {INDEX|KEY}\n [{FOR {JOIN|ORDER BY|GROUP BY}] (index_list)\n | FORCE {INDEX|KEY}\n [{FOR {JOIN|ORDER BY|GROUP BY}] (index_list)\n \nindex_list:\n index_name [, index_name] ...\n \nA table reference is also known as a join expression.\n \nEach table can also be specified as db_name.tabl_name. This\nallows to write queries which involve multiple databases.\nSee Identifier Qualifiers for syntax details.\n \nThe syntax of table_factor is extended in comparison with\nthe\nSQL Standard. The latter accepts only table_reference, not a\nlist of them inside a pair of parentheses.\n \nThis is a conservative extension if we consider each comma\nin a list of\ntable_reference items as equivalent to an inner join. For\nexample:\n \nSELECT * FROM t1 LEFT JOIN (t2, t3, t4)\n ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)\n \nis equivalent to:\n \nSELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4)\n ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)\n \nIn MariaDB, CROSS JOIN is a syntactic equivalent to\nINNER JOIN (they can replace each other). In standard SQL,\nthey are not equivalent. INNER JOIN is used with an\nON clause, CROSS JOIN is used otherwise.\n \nIn general, parentheses can be ignored in join expressions\ncontaining only\ninner join operations. MariaDB also supports nested joins\n(see\nhttp://dev.mysql.com/doc/refman/5.1/en/nested-join-optimization.html).\n \nSee System-versioned tables for more information\nabout FOR SYSTEM_TIME syntax.\n \nIndex hints can be specified to affect how the MariaDB\noptimizer makes\nuse of indexes. For more information, see How to force query\nplans.\n \nExamples\n-------- \nSELECT left_tbl.*\n FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id =\nright_tbl.id\n WHERE right_tbl.id IS NULL;\n \n\n \n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/join-syntax/','','https://mariadb.com/kb/en/library/join-syntax/'),(427,'LOAD XML',27,'Syntax\n------ \nLOAD XML [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE\n\'file_name\'\n [REPLACE | IGNORE]\n INTO TABLE [db_name.]tbl_name\n [CHARACTER SET charset_name]\n [ROWS IDENTIFIED BY \'\']\n [IGNORE number {LINES | ROWS}]\n [(column_or_user_var,...)]\n [SET col_name = expr,...]\n \nDescription\n----------- \nThe LOAD XML statement reads data from an XML file into a\ntable. The\nfile_name must be given as a literal string. The tagname in\nthe\noptional ROWS IDENTIFIED BY clause must also be given as a\nliteral\nstring, and must be surrounded by angle brackets (< and >).\n \nLOAD XML acts as the complement of running the mysql client\nin XML\noutput mode (that is, starting the client with the --xml\noption). To\nwrite data from a table to an XML file, use a command such\nas the\nfollowing one from the system shell:\n \nshell> mysql --xml -e \'SELECT * FROM mytable\' > file.xml\n \nTo read the file back into a table, use LOAD XML INFILE. By\ndefault,\nthe element is considered to be the equivalent of a\ndatabase\ntable row; this can be changed using the ROWS IDENTIFIED BY\nclause.\n \nThis statement supports three different XML formats:\nColumn names as attributes and column values as attribute\nvalues:\n \nColumn names as tags and column values as the content of\nthese tags:\n \n value1\n value2\n \nColumn names are the name attributes of tags, and values\nare\n the contents of these tags:\n \n value1\n value2\n \n This is the format used by other tools, such as mysqldump.\n \nAll 3 formats can be used in the same XML file; the import\nroutine\nautomatically detects the format for each row and interprets\nit\ncorrectly. Tags are matched based on the tag or attribute\nname and the\ncolumn name.\n \nThe following clauses work essentially the same way for LOAD\nXML as\nthey do for LOAD DATA:\nLOW_PRIORITY or CONCURRENT\nLOCAL\nREPLACE or IGNORE\nCHARACTER SET\n(column_or_user_var,...)\nSET\n \nSee LOAD DATA for more information about these clauses.\n \nThe IGNORE number LINES or IGNORE number ROWS clause causes\nthe first\nnumber rows in the XML file to be skipped. It is analogous\nto the LOAD\nDATA statement\'s IGNORE ... LINES clause.\n \nIf the LOW_PRIORITY keyword is used, insertions are delayed\nuntil no other clients are reading from the table. The\nCONCURRENT keyword allowes the use of concurrent inserts.\nThese clauses cannot be specified together.\n \nThis statement activates INSERT triggers.\n \n\n\nURL: https://mariadb.com/kb/en/library/load-xml/','','https://mariadb.com/kb/en/library/load-xml/'),(425,'LIMIT',27,'Description\n----------- \nUse the LIMIT clause to restrict the number of returned\nrows. When you use a single\ninteger n with LIMIT, the first n rows will be returned. Use\nthe ORDER BY\nclause to control which rows come first. You can also select\na number of rows after an offset\nusing either of the following:\n \nLIMIT offset, row_count\nLIMIT row_count OFFSET offset\n \nWhen you provide an offset m with a limit n, the first m\nrows will be ignored, and the\nfollowing n rows will be returned.\n \nExecuting an UPDATE with the LIMIT clause is not safe for\nreplication.\n \nSince MariaDB 10.0.11, LIMIT 0 has been an exception to this\nrule (see MDEV-6170).\n \nBeginning in MariaDB 5.5.21, there is a LIMIT ROWS EXAMINED\noptimization which provides the\nmeans to terminate the execution of SELECT statements which\nexamine too\nmany rows, and thus use too many resources. See LIMIT ROWS\nEXAMINED.\n \nMulti-Table Updates\n \nUntil MariaDB 10.3.1, it was not possible to use LIMIT (or\nORDER BY) in a multi-table UPDATE statement. This\nrestriction was lifted in MariaDB 10.3.2.\n \nGROUP_CONCAT\n \nStarting from MariaDB 10.3.3, it is possible to use LIMIT\nwith GROUP_CONCAT().\n \nExamples\n-------- \nCREATE TABLE members (name VARCHAR(20));\nINSERT INTO members\nVALUES(\'Jagdish\'),(\'Kenny\'),(\'Rokurou\'),(\'Immaculada\');\n \nSELECT * FROM members;\n \n+------------+\n| name |\n+------------+\n| Jagdish |\n| Kenny |\n| Rokurou |\n| Immaculada |\n+------------+\n \nSelect the first two names (no ordering specified):\n \nSELECT * FROM members LIMIT 2;\n \n+---------+\n| name |\n+---------+\n| Jagdish |\n| Kenny |\n+---------+\n \nAll the names in alphabetical order:\n \nSELECT * FROM members ORDER BY name;\n \n+------------+\n| name |\n+------------+\n| Immaculada |\n| Jagdish |\n| Kenny |\n| Rokurou |\n+------------+\n \nThe first two names, ordered alphabetically:\n \nSELECT * FROM members ORDER BY name LIMIT 2;\n \n+------------+\n| name |\n+------------+\n| Immaculada |\n| Jagdish |\n+------------+\n \nThe third name, ordered alphabetically (the first name would\nbe offset zero, so the third is offset two):\n \nSELECT * FROM members ORDER BY name LIMIT 2,1;\n \n+-------+\n| name |\n+-------+\n| Kenny |\n+-------+\n \nFrom MariaDB 10.3.2, LIMIT can be used in a multi-table\nupdate:\n \nCREATE TABLE warehouse (product_id INT, qty INT);\nINSERT INTO warehouse VALUES\n(1,100),(2,100),(3,100),(4,100);\n \nCREATE TABLE store (product_id INT, qty INT);\nINSERT INTO store VALUES (1,5),(2,5),(3,5),(4,5);\n \nUPDATE warehouse,store SET warehouse.qty = warehouse.qty-2,\nstore.qty = store.qty+2 \n WHERE (warehouse.product_id = store.product_id AND\nstore.product_id >= 1) \n ORDER BY store.product_id DESC LIMIT 2;\n \nSELECT * FROM warehouse;\n \n+------------+------+\n| product_id | qty |\n+------------+------+\n| 1 | 100 |\n| 2 | 100 |\n| 3 | 98 |\n| 4 | 98 |\n+------------+------+\n \nSELECT * FROM store;\n \n+------------+------+\n| product_id | qty |\n+------------+------+\n| 1 | 5 |\n| 2 | 5 |\n| 3 | 7 |\n| 4 | 7 |\n+------------+------+\n \nFrom MariaDB 10.3.3, LIMIT can be used with GROUP_CONCAT,\nso, for example, given the following table:\n \nCREATE TABLE d (dd DATE, cc INT);\n \nINSERT INTO d VALUES (\'2017-01-01\',1);\nINSERT INTO d VALUES (\'2017-01-02\',2);\nINSERT INTO d VALUES (\'2017-01-04\',3);\n \nthe following query:\n \nSELECT SUBSTRING_INDEX(GROUP_CONCAT(CONCAT_WS(\":\",dd,cc)\nORDER BY cc DESC),\",\",1) FROM d;\n \n+----------------------------------------------------------------------------+\n| SUBSTRING_INDEX(GROUP_CONCAT(CONCAT_WS(\":\",dd,cc) ORDER\nBY cc DESC),\",\",1) |\n+----------------------------------------------------------------------------+\n| 2017-01-04:3 |\n+----------------------------------------------------------------------------+\n \ncan be more simply rewritten as:\n \nSELECT GROUP_CONCAT(CONCAT_WS(\":\",dd,cc) ORDER BY cc DESC\nLIMIT 1) FROM d;\n \n+-------------------------------------------------------------+\n| GROUP_CONCAT(CONCAT_WS(\":\",dd,cc) ORDER BY cc DESC LIMIT\n1) |\n+-------------------------------------------------------------+\n| 2017-01-04:3 |\n+-------------------------------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/limit/','','https://mariadb.com/kb/en/library/limit/'),(429,'Non-Recursive Common Table Expressions Overview',27,'Common Table Expressions (CTEs) are a standard SQL feature,\nand are essentially temporary named result sets. There are\ntwo kinds of CTEs: Non-Recursive, which this article covers;\nand Recursive.\n \nCommon table expressions were introduced in MariaDB 10.2.1.\n \nNon-Recursive CTEs\n \nThe WITH keyword signifies a CTE. It is given a name,\nfollowed by a body (the main query) as follows:\n \nCTEs are similar to derived tables. For example\n \nWITH engineers AS \n ( SELECT * FROM employees\n WHERE dept = \'Engineering\' )\n \nSELECT * FROM engineers\nWHERE ...\n \nSELECT * FROM\n ( SELECT * FROM employees\n WHERE dept = \'Engineering\' ) AS engineers\nWHERE\n...\n \nA non-recursive CTE is basically a query-local VIEW. There\nare several advantages and caveats to them. The syntax is\nmore readable than nested FROM (SELECT ...).\nA CTE can refer to another and it can be referenced from\nmultiple places.\n \nA CTE referencing Another CTE\n \nUsing this format makes for a more readable SQL than a\nnested FROM(SELECT ...) clause. Below is an example of this:\n \nWITH engineers AS (\nSELECT * FROM employees\nWHERE dept IN(\'Development\',\'Support\') ),\neu_engineers AS ( SELECT * FROM engineers WHERE country\nIN(\'NL\',...) )\nSELECT\n...\nFROM eu_engineers;\n \nMultiple Uses of a CTE\n \nThis can be an \'anti-self join\', for example:\n \nWITH engineers AS (\nSELECT * FROM employees\nWHERE dept IN(\'Development\',\'Support\') )\n \nSELECT * FROM engineers E1\nWHERE NOT EXISTS\n (SELECT 1 FROM engineers E2\n WHERE E2.country=E1.country\n AND E2.name E1.name );\n \nOr, for year-over-year comparisons, for example:\n \nWITH sales_product_year AS (\nSELECT product, YEAR(ship_date) AS year,\nSUM(price) AS total_amt\nFROM item_sales\nGROUP BY product, year )\n \nSELECT *\nFROM sales_product_year CUR,\nsales_product_year PREV,\nWHERE CUR.product=PREV.product \nAND CUR.year=PREV.year + 1 \nAND CUR.total_amt > PREV.total_amt\n \nAnother use is to compare individuals against their group.\nBelow is an example of how this might be executed:\n \nWITH sales_product_year AS (\nSELECT product,\nYEAR(ship_date) AS year,\nSUM(price) AS total_amt\nFROM item_sales\nGROUP BY product, year\n)\n \nSELECT * \nFROM sales_product_year S1\nWHERE\ntotal_amt > \n (SELECT 0.1 * SUM(total_amt)\n FROM sales_product_year S2\n WHERE S2.year = S1.year)\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/non-recursive-common-table-expressions-overview/','','https://mariadb.com/kb/en/library/non-recursive-common-table-expressions-overview/'),(426,'LOAD DATA INFILE',27,'Syntax\n------ \nLOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE\n\'file_name\'\n [REPLACE | IGNORE]\n INTO TABLE tbl_name\n [CHARACTER SET charset_name]\n [{FIELDS | COLUMNS}\n [TERMINATED BY \'string\']\n [[OPTIONALLY] ENCLOSED BY \'char\']\n [ESCAPED BY \'char\']\n ]\n [LINES\n [STARTING BY \'string\']\n [TERMINATED BY \'string\']\n ]\n [IGNORE number LINES]\n [(col_name_or_user_var,...)]\n [SET col_name = expr,...]\n \nDescription\n----------- \nReads rows from a text file into the designated table on the\ndatabase at a very high speed. The file name must be given\nas a literal string. \n \nFiles are written to disk using the SELECT INTO OUTFILE\nstatement. You can then read the files back into a table\nusing the LOAD DATA INFILE statement. The FIELDS and LINES\nclauses are the same in both statements. These clauses are\noptional, but if both are specified then the FIELDS clause\nmust precede LINES.\n \nIn releases after MariaDB 5.5, LOAD DATA INFILE is unsafe\nfor statement-based replication.\n \nExecuting this statement activates INSERT triggers.\n \nREPLACE and IGNORE\n \nIn cases where you load data from a file into a table that\nalready contains data and has a Primary Key, you may\nencounter issues where the statement attempts to insert a\nrow with a Primary Key that already exists. When this\nhappens, the statement fails with Error 1064, protecting the\ndata already on the table. In cases where you want MariaDB\nto overwrite duplicates, use the REPLACE keyword.\n \nThe REPLACE keyword works like the REPLACE statement. Here,\nthe statement attempts to load the data from the file. If\nthe row does not exist, it adds it to the table. If the row\ncontains an existing Primary Key, it replaces the table\ndata. That is, in the event of a conflict, it assumes the\nfile contains the desired row. \n \nThis operation can cause a degradation in load speed by a\nfactor of 20 or more if the part that has already been\nloaded is larger than the capacity of the InnoDB Buffer\nPool. This happens because it causes a lot of turnaround in\nthe Buffer Pool.\n \nUse the IGNORE keyword when you want to skip any rows that\ncontain a conflicting Primary Key. Here, the statement\nattempts to load the data from the file. If the row does not\nexist, it adds it to the table. If the row contains an\nexisting Primary Key, it ignores the addition request and\nmoves on to the next. That is, in the event of a conflict,\nit assumes the table contains the desired row.\n \nLOCAL\n \nWhen you issue this statement, the Server attempts to read\nfiles from the host file system. Using the LOCAL keyword,\nthe statement instead attempts to read files from the\nclient. This allows you to insert files from the client\'s\nlocal file system into the database.\n \nIn the event that you don\'t want the server to permit this\noperation, (such as for security reasons), you can disable\nsupport using local_infile. When this system variable is set\nto 0, MariaDB rejects LOAD DATA LOCAL INFILE statements,\nfailing with an error message.\n \nCharacter-sets\n \nWhen the statement opens the file, it attempts to read the\ncontents using the default character-set, as defined by the\ncharacter_set_database system variable. \n \nIn the cases where the file was written using a\ncharacter-set other than the default, you can specify the\ncharacter-set to use with the CHARACTER SET clause in the\nstatement. It ignores character-sets specified by the SET\nNAMES statement and by the character_set_client system\nvariable. Setting the CHARACTER SET clause to a value of\nbinary indicates \"no conversion.\"\n \nThe statement interprets all fields in the file as having\nthe same character-set, regardless of the column data type.\nTo properly interpret file contents, you must ensure that it\nwas written with the correct character-set. If you write a\ndata file with mysqldump -T or with the SELECT INTO OUTFILE\nstatement with the mysql client, be sure to use the\n--default-character-set option, so that the output is\nwritten with the desired character-set.\n \nWhen using mixed character sets, use the CHARACTER SET\nclause in both SELECT INTO OUTFILE and LOAD DATA INFILE to\nensure that MariaDB correctly interprets the escape\nsequences.\n \nThe character_set_filesystem system variable controls the\ninterpretation of the filename.\n \nIt is currently not possible to load data files that use the\nucs2 character set.\n \nPriority and Concurrency\n \nIn loading data from a file, there\'s a risk that the\nstatement will attempt insertions concurrent with reads from\nanother client, which can result in the read serving a\nresult-set that contains only part of the update from the\nLOAD DATA INFILE statement.\n \nUsing the LOW_PRIORITY keyword, MariaDB delays insertions\nuntil no other clients are reading from the table.\nAlternatively, you can use the CONCURRENT keyword to perform\nconcurrent insertion.\n \nThe LOW_PRIORITY and CONCURRENT keywords are mutually\nexclusive. They cannot be used in the same statement.\n \nProgress Reporting\n \nSince MariaDB 5.3, the LOAD DATA INFILE statement supports\nprogress reporting. You may find this useful when dealing\nwith long-running operations. Using another client you can\nissue a SHOW PROCESSLIST query to check the progress of the\ndata load.\n \nUsing mysqlimport\n \nMariaDB ships with a separate utility for loading data from\nfiles: mysqlimport. It operates by sending LOAD DATA INFILE\nstatements to the server.\n \nUsing mysqlimport you can compress the file using the\n--compress option, to get better performance over slow\nnetworks, providing both the client and server support the\ncompressed protocol. Use the --local option to load from the\nlocal file system.\n \nIndexing\n \nIn cases where the storage engine supports ALTER TABLE...\nDISABLE KEYS statements, the LOAD DATA INFILE statement\nautomatically disables indexes during the execution.\n \n\n\nURL: https://mariadb.com/kb/en/library/load-data-infile/','','https://mariadb.com/kb/en/library/load-data-infile/'),(430,'ORDER BY',27,'Description\n----------- \nUse the ORDER BY clause to order a resultset, such as that\nare returned from a SELECT\nstatement. You can specify just a column or use any\nexpression with functions. If you are\nusing the GROUP BY clause, you can use grouping functions in\nORDER BY.\nOrdering is done after grouping.\n \nYou can use multiple ordering expressions, separated by\ncommas. Rows will be sorted by\nthe first expression, then by the second expression if they\nhave the same value for the\nfirst, and so on.\n \nYou can use the keywords ASC and DESC after each ordering\nexpression to\nforce that ordering to be ascending or descending,\nrespectively. Ordering is ascending\nby default.\n \nYou can also use a single integer as the ordering\nexpression. If you use an integer n,\nthe results will be ordered by the nth column in the select\nexpression.\n \nWhen string values are compared, they are compared as if by\nthe STRCMP\nfunction. STRCMP ignores trailing whitespace and may\nnormalize\ncharacters and ignore case, depending on the collation in\nuse.\n \nStarting from MariaDB 5.5.35 duplicated entries in the ORDER\nBY clause are removed. MySQL 5.6 also removes duplicated\nfields.\n \nORDER BY can also be used to order the activities of a\nDELETE or UPDATE statement (usually with the LIMIT clause). \n \nUntil MariaDB 10.3.1, it was not possible to use ORDER BY\n(or LIMIT) in a multi-table UPDATE statement. This\nrestriction was lifted in MariaDB 10.3.2.\n \nExamples\n-------- \nCREATE TABLE seq (i INT, x VARCHAR(1));\nINSERT INTO seq VALUES (1,\'a\'), (2,\'b\'), (3,\'b\'),\n(4,\'f\'), (5,\'e\');\n \nSELECT * FROM seq ORDER BY i;\n \n+------+------+\n| i | x |\n+------+------+\n| 1 | a |\n| 2 | b |\n| 3 | b |\n| 4 | f |\n| 5 | e |\n+------+------+\n \nSELECT * FROM seq ORDER BY i DESC;\n \n+------+------+\n| i | x |\n+------+------+\n| 5 | e |\n| 4 | f |\n| 3 | b |\n| 2 | b |\n| 1 | a |\n+------+------+\n \nSELECT * FROM seq ORDER BY x,i;\n \n+------+------+\n| i | x |\n+------+------+\n| 1 | a |\n| 2 | b |\n| 3 | b |\n| 5 | e |\n| 4 | f |\n+------+------+\n \nORDER BY in an UPDATE statement, in conjunction with LIMIT:\n \nUPDATE seq SET x=\'z\' WHERE x=\'b\' ORDER BY i DESC LIMIT\n1;\n \nSELECT * FROM seq;\n \n+------+------+\n| i | x |\n+------+------+\n| 1 | a |\n| 2 | b |\n| 3 | z |\n| 4 | f |\n| 5 | e |\n+------+------+\n \nFrom MariaDB 10.3.2, ORDER BY can be used in a multi-table\nupdate:\n \nCREATE TABLE warehouse (product_id INT, qty INT);\nINSERT INTO warehouse VALUES\n(1,100),(2,100),(3,100),(4,100);\n \nCREATE TABLE store (product_id INT, qty INT);\nINSERT INTO store VALUES (1,5),(2,5),(3,5),(4,5);\n \nUPDATE warehouse,store SET warehouse.qty = warehouse.qty-2,\nstore.qty = store.qty+2 \n WHERE (warehouse.product_id = store.product_id AND\nstore.product_id >= 1) \n ORDER BY store.product_id DESC LIMIT 2;\n \nSELECT * FROM warehouse;\n \n+------------+------+\n| product_id | qty |\n+------------+------+\n| 1 | 100 |\n| 2 | 100 |\n| 3 | 98 |\n| 4 | 98 |\n+------------+------+\n \nSELECT * FROM store;\n \n+------------+------+\n| product_id | qty |\n+------------+------+\n| 1 | 5 |\n| 2 | 5 |\n| 3 | 7 |\n| 4 | 7 |\n+------------+------+\n \n\n\nURL: https://mariadb.com/kb/en/library/order-by/','','https://mariadb.com/kb/en/library/order-by/'),(433,'REPLACE',27,'Syntax\n------ \nREPLACE [LOW_PRIORITY | DELAYED]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n {VALUES | VALUE} ({expr | DEFAULT},...),(...),...\n \nOr:\n \nREPLACE [LOW_PRIORITY | DELAYED]\n [INTO] tbl_name [PARTITION (partition_list)]\n SET col={expr | DEFAULT}, ...\n \nOr:\n \nREPLACE [LOW_PRIORITY | DELAYED]\n [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]\n SELECT ...\n \nDescription\n----------- \n REPLACE works exactly like\n INSERT, except that if an old row in the table\n has the same value as a new row for a PRIMARY KEY or a\n UNIQUE index, the old row is deleted before the new row is\n inserted. If the table has more than one UNIQUE keys, it is\npossible that the new row conflicts with more than one row.\nIn this case, all conflicting rows will be deleted.\n \nThe table name can be specified in the form db_name.tbl_name\nor, if a default database is selected, in the form tbl_name\n(see Identifier Qualifiers). This allows to use REPLACE ...\nSELECT to copy rows between different databases.\n \nBasically it works like this:\n \nBEGIN;\nSELECT 1 FROM t1 WHERE key=# FOR UPDATE;\nIF found-row\n DELETE FROM t1 WHERE key=# ;\n INSERT INTO t1 VALUES (...);\nENDIF\nEND;\n \nThe above can be replaced with:\n \nREPLACE INTO t1 VALUES (...)\n \n REPLACE is a MariaDB/MySQL extension to the SQL standard.\nIt\n either inserts, or deletes and inserts. For other\nMariaDB/MySQL extensions to\n standard SQL --- that also handle duplicate values --- see\nIGNORE and INSERT ON DUPLICATE KEY UPDATE.\n \nNote that unless the table has a PRIMARY KEY or\n UNIQUE index, using a REPLACE statement\nmakes no sense. It becomes equivalent to INSERT, because\nthere is no index to be used to determine whether a new row\nduplicates another.\n \nValues for all columns are taken from the values specified\nin the\n REPLACE statement. Any missing columns are set to their\ndefault values, just as happens for INSERT. You cannot refer\nto values from the current row and use them in the new row.\nIf you use an\nassignment such as \'SET col = col + 1\', the\nreference to the column name on the right hand side is\ntreated as\n DEFAULT(col), so the assignment is equivalent to\n \'SET col = DEFAULT(col) + 1\'.\n \nTo use REPLACE, you must have both the\n INSERT and DELETE privileges\nfor the table.\n \nThere are some gotchas you should be aware of, before using\nREPLACE:\nIf there is an AUTO_INCREMENT field, a new value will be\ngenerated.\nIf there are foreign keys, ON DELETE action will be\nactivated by REPLACE.\nTriggers on DELETE and INSERT will be activated by REPLACE.\n \nTo avoid some of these behaviors, you can use INSERT ... ON\nDUPLICATE KEY UPDATE.\n \nThe PARTITION clause was introduced in MariaDB 10.0. See\nPartition Pruning and Selection for details.\n \nThis statement activates INSERT and DELETE triggers. See\nTrigger Overview for details.\n \n\n\nURL: https://mariadb.com/kb/en/library/replace/','','https://mariadb.com/kb/en/library/replace/'),(432,'Recursive Common Table Expressions Overview',27,'Recursive Common Table Expressions have been supported since\nMariaDB 10.2.2.\n \nCommon Table Expressions (CTEs) are a standard SQL feature,\nand are essentially temporary named result sets. CTEs first\nappeared in the SQL standard in 1999, and the first\nimplementations began appearing in 2007.\n \nThere are two kinds of CTEs:\nNon-recursive\nRecursive, which this article covers.\n \nSQL is generally poor at recursive structures.\n \nCTEs permit a query to reference itself. A recursive CTE\nwill repeatedly execute subsets of the data until it obtains\nthe complete result set. This makes it particularly useful\nfor handing hierarchical or tree-structured data.\n \nSyntax example\n \nWITH RECURSIVE signifies a recursive CTE. It is given a\nname, followed by a body (the main query) as follows:\n \n\nComputation\n \nGiven the following structure:\n \nFirst execute the anchor part of the query:\n \nNext, execute the recursive part of the query:\n \n\n \n\nSummary so far\n \nwith recursive R as (\n select anchor_data\n union [all]\n select recursive_part\n from R, ...\n)\nselect ...\nCompute anchor_data\nCompute recursive_part to get the new data\nif (new data is non-empty) goto 2;\n \nCAST to avoid truncating data\n \nAs currently implemented by MariaDB and by the SQL Standard,\ndata may be truncated if not correctly cast. It is necessary\nto CAST the column to the correct width if the CTE\'s\nrecursive part produces wider values for a column than the\nCTE\'s nonrecursive part. Some other DBMS give an error in\nthis situation, and MariaDB\'s behavior may change in future\n- see MDEV-12325. See the examples below.\n \nExamples\n-------- \nTransitive closure - determining bus destinations\n \nSample data:\n \nCREATE TABLE bus_routes (origin varchar(50), dst\nvarchar(50));\nINSERT INTO bus_routes VALUES \n (\'New York\', \'Boston\'), \n (\'Boston\', \'New York\'), \n (\'New York\', \'Washington\'), \n (\'Washington\', \'Boston\'), \n (\'Washington\', \'Raleigh\');\n \nNow, we want to return the bus destinations with New York as\nthe origin:\n \nWITH RECURSIVE bus_dst as ( \n SELECT origin as dst FROM bus_routes WHERE origin=\'New\nYork\' \n UNION\n SELECT bus_routes.dst FROM bus_routes, bus_dst WHERE\nbus_dst.dst= bus_routes.origin \n) \nSELECT * FROM bus_dst;\n \n+------------+\n| dst |\n+------------+\n| New York |\n| Boston |\n| Washington |\n| Raleigh |\n+------------+\n \nThe above example is computed as follows:\n \nFirst, the anchor data is calculated:\nStarting from New York\nBoston and Washington are added\n \nNext, the recursive part:\nStarting from Boston and then Washington\nRaleigh is added\nUNION excludes nodes that are already present.\n \nComputing paths - determining bus routes\n \nThis time, we are trying to get bus routes such as “New\nYork -> Washington -> Raleigh”.\n \nUsing the same sample data as the previous example:\n \nWITH RECURSIVE paths (cur_path, cur_dest) AS (\n SELECT origin, origin FROM bus_routes WHERE origin=\'New\nYork\' \n UNION\n SELECT CONCAT(paths.cur_path, \',\', bus_routes.dst),\nbus_routes.dst \n FROM paths, bus_routes \n WHERE paths.cur_dest = bus_routes.origin AND \n LOCATE(bus_routes.dst, paths.cur_path)=0 \n) \nSELECT * FROM paths;\n \n+-----------------------------+------------+\n| cur_path | cur_dest |\n+-----------------------------+------------+\n| New York | New York |\n| New York,Boston | Boston |\n| New York,Washington | Washington |\n| New York,Washington,Boston | Boston |\n| New York,Washington,Raleigh | Raleigh |\n+-----------------------------+------------+\n \nCAST to avoid data truncation\n \nIn the following example, data is truncated because the\nresults are not specifically cast to a wide enough type:\n \nWITH RECURSIVE tbl AS (\n SELECT NULL AS col\n UNION\n SELECT \"THIS NEVER SHOWS UP\" AS col FROM tbl\n)\n+------+\n| col |\n+------+\n| NULL |\n| |\n+------+\n \nExplicitly use CAST to overcome this:\n \nWITH RECURSIVE tbl AS (\n SELECT CAST(NULL AS CHAR(50)) AS col\n UNION SELECT \"THIS NEVER SHOWS UP\" AS col FROM tbl\n) \nSELECT * FROM tbl;\n \n+---------------------+\n| col |\n+---------------------+\n| NULL |\n| THIS NEVER SHOWS UP |\n+---------------------+\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/recursive-common-table-expressions-overview/','','https://mariadb.com/kb/en/library/recursive-common-table-expressions-overview/'),(435,'SELECT INTO DUMPFILE',27,'Syntax\n------ \nSELECT ... INTO DUMPFILE \'file_path\'\n \nDescription\n----------- \nSELECT ... INTO DUMPFILE is a SELECT clause which writes the\nresultset into a single unformatted row, without any\nseparators, in a file. The results will not be returned to\nthe client.\n \nfile_path can be an absolute path, or a relative path\nstarting from the data directory. It can only be specified\nas a string literal, not as a variable. However, the\nstatement can be dynamically composed and executed as a\nprepared statement to work around this limitation.\n \nThis statement is binary-safe and so is particularly useful\nfor writing BLOB values to file. It can be used, for\nexample, to copy an image or an audio document from the\ndatabase to a file. SELECT ... INTO FILE can be used to save\na text file.\n \nThe file must not exist. It cannot be overwritten. A user\nneeds the FILE privilege to run this statement. Also,\nMariaDB needs permission to write files in the specified\nlocation. If the secure_file_priv system variable is set to\na non-empty directory name, the file can only be written to\nthat directory.\n \nSince MariaDB 5.1, the character_set_filesystem system\nvariable has controlled interpretation of file names that\nare given as literal strings.\n \nExample\n \nSELECT _utf8\'Hello world!\' INTO DUMPFILE \'/tmp/world\';\n \nSELECT LOAD_FILE(\'/tmp/world\') AS world;\n \n+--------------+\n| world |\n+--------------+\n| Hello world! |\n+--------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/select-into-dumpfile/','','https://mariadb.com/kb/en/library/select-into-dumpfile/'),(434,'SELECT',27,'Syntax\n------ \nSELECT\n [ALL | DISTINCT | DISTINCTROW]\n [HIGH_PRIORITY]\n [STRAIGHT_JOIN]\n [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]\n [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]\n select_expr [, select_expr ...]\n [ FROM table_references\n [WHERE where_condition]\n [GROUP BY {col_name | expr | position} [ASC | DESC], ...\n[WITH ROLLUP]]\n [HAVING where_condition]\n [ORDER BY {col_name | expr | position} [ASC | DESC], ...]\n [LIMIT {[offset,] row_count | row_count OFFSET offset}]\n [PROCEDURE procedure_name(argument_list)]\n [INTO OUTFILE \'file_name\' [CHARACTER SET charset_name]\n[export_options]\n \nINTO DUMPFILE \'file_name\' | INTO var_name [, var_name] ] |\n\n \n [[FOR UPDATE | LOCK IN SHARE MODE] [WAIT n | NOWAIT] ] ]\n \nexport_options:\n [{FIELDS | COLUMNS}\n [TERMINATED BY \'string\']\n [[OPTIONALLY] ENCLOSED BY \'char\']\n [ESCAPED BY \'char\']\n ]\n [LINES\n [STARTING BY \'string\']\n [TERMINATED BY \'string\']\n ]\n \nDescription\n----------- \nSELECT is used to retrieve rows selected from one or more\ntables, and can include UNION statements and subqueries.\nEach select_expr expression indicates a column or data that\nyou want to retrieve. You\nmust have at least one select expression. See Select\nExpressions below.\n \nThe FROM clause indicates the table or tables from which to\nretrieve rows.\nUse either a single table name or a JOIN expression. See\nJOIN\nfor details. If no table is involved, FROM DUAL can be\nspecified.\n \nThe PARTITION clause was introduced in MariaDB 10.0. See\nPartition Pruning and Selection for details.\nEach table can also be specified as db_name.tabl_name. Each\ncolumn can also be specified as tbl_name.col_name or even\ndb_name.tbl_name.col_name. This allows to write queries\nwhich involve multiple databases. See Identifier Qualifiers\nfor syntax details.\n \nThe WHERE clause, if given, indicates the condition or\n conditions that rows must satisfy to be selected.\n where_condition is an expression that evaluates to true for\n each row to be selected. The statement selects all rows if\nthere is no WHERE\n clause.\nIn the WHERE clause, you can use any of the functions and\n operators that MariaDB supports, except for aggregate\n(summary) functions. See Functions and Operators and\nFunctions and Modifiers for use with GROUP BY (aggregate).\n \nUse the ORDER BY clause to order the results.\n \nUse the LIMIT clause allows you to restrict the results to\nonly\na certain number of rows, optionally with an offset.\n \nUse the GROUP BY and HAVING clauses to group\nrows together when they have columns or computed values in\ncommon.\n \nSELECT can also be used to retrieve rows computed without\nreference to\nany table.\n \nSelect Expressions\n \nA SELECT statement must contain one or more select\nexpressions, separated\nby commas. Each select expression can be one of the\nfollowing:\nThe name of a column.\nAny expression using functions and operators.\n* to select all columns from all tables in the FROM clause.\ntbl_name.* to select all columns from just the table\ntbl_name.\n \nWhen specifying a column, you can either use just the column\nname or qualify the column\nname with the name of the table using tbl_name.col_name. The\nqualified form is\nuseful if you are joining multiple tables in the FROM\nclause. If you do not qualify the\ncolumn names when selecting from multiple tables, MariaDB\nwill try to find the column in\neach table. It is an error if that column name exists in\nmultiple tables.\n \nYou can quote column names using backticks. If you are\nqualifying column names\nwith table names, quote each part separately as\n`tbl_name`.`col_name`.\n \nIf you use any grouping functions\nin any of the select expressions, all rows in your results\nwill be implicitly grouped, as if\nyou had used GROUP BY NULL.\n \nDISTINCT\n \nA query may produce some identical rows. By default, all\nrows are retrieved, even when their values are the same. To\nexplicitly specify that you want to retrieve identical rows,\nuse the ALL option. If you want duplicates to be removed\nfrom the resultset, use the DISTINCT option. DISTINCTROW is\na synonym for DISTINCT. See also COUNT DISTINCT and SELECT\nUNIQUE in Oracle mode.\n \nINTO\n \nThe INTO clause is used to specify that the query results\nshould be written to a file or variable.\nSELECT INTO OUTFILE - formatting and writing the result to\nan external file.\nSELECT INTO DUMPFILE - binary-safe writing of the\nunformatted results to an external file.\nSELECT INTO Variable - selecting and setting variables.\n \nThe reverse of SELECT INTO OUTFILE is LOAD DATA.\n \nWAIT/NOWAIT\n \nSet the lock wait timeout. See WAIT and NOWAIT.\n \n\nmax_statement_time clause\n \nBy using max_statement_time in conjunction with SET\nSTATEMENT, it is possible to limit the execution time of\nindividual queries. For example:\n \nSET STATEMENT max_statement_time=100 FOR \n SELECT field1 FROM table_name ORDER BY field1;\n \n\n\nURL: https://mariadb.com/kb/en/library/select/','','https://mariadb.com/kb/en/library/select/'),(436,'SELECT INTO OUTFILE',27,'Syntax\n------ \nSELECT ... INTO OUTFILE \'file_name\'\n [CHARACTER SET charset_name]\n [export_options]\n \nexport_options:\n [{FIELDS | COLUMNS}\n [TERMINATED BY \'string\']\n [[OPTIONALLY] ENCLOSED BY \'char\']\n [ESCAPED BY \'char\']\n ]\n [LINES\n [STARTING BY \'string\']\n [TERMINATED BY \'string\']\n ]\n \nDescription\n----------- \nSELECT INTO OUTFILE writes the resulting rows to a file, and\nallows the use of column and row terminators to specify a\nparticular output format. The default is to terminate fields\nwith tabs (\\t) and lines with newlines (\\n).\n \nThe file must not exist. It cannot be overwritten. A user\nneeds the FILE privilege to run this statement. Also,\nMariaDB needs permission to write files in the specified\nlocation. If the secure_file_priv system variable is set to\na non-empty directory name, the file can only be written to\nthat directory.\n \nThe LOAD DATA INFILE statement complements SELECT INTO\nOUTFILE.\n \nCharacter-sets\n \nThe CHARACTER SET clause specifies the character set in\nwhich the results are to be written. Without the clause, no\nconversion takes place (the binary character set). In this\ncase, if there are multiple character sets, the output will\ncontain these too, and may not easily be able to be\nreloaded.\n \nIn cases where you have two servers using different\ncharacter-sets, using SELECT INTO OUTFILE to transfer data\nfrom one to the other can have unexpected results. To ensure\nthat MariaDB correctly interprets the escape sequences, use\nthe CHARACTER SET clause on both the SELECT INTO OUTFILE\nstatement and the subsequent LOAD DATA INFILE statement.\n \nExample\n \nThe following example produces a file in the CSV format:\n \nSELECT customer_id, firstname, surname INTO OUTFILE\n\'/exportdata/customers.txt\'\n FIELDS TERMINATED BY \',\' OPTIONALLY ENCLOSED BY \'\"\'\n LINES TERMINATED BY \'\\n\'\n FROM customers;\n \n\n\nURL: https://mariadb.com/kb/en/library/select-into-outfile/','','https://mariadb.com/kb/en/library/select-into-outfile/'),(437,'SELECT WITH ROLLUP',27,'Syntax\n------ \nSee SELECT for the full syntax.\n \nDescription\n----------- \nThe WITH ROLLUP modifier adds extra rows to the resultset\nthat represent super-aggregate summaries. The\nsuper-aggregated column is represented by a NULL value.\nMultiple aggregates over different columns will be added if\nthere are multiple GROUP BY columns.\n \nThe LIMIT clause can be used at the same time, and is\napplied after the WITH ROLLUP rows have been added.\n \nWITH ROLLUP cannot be used with ORDER BY. Some sorting is\nstill possible by using ASC or DESC clauses with the GROUP\nBY column, although the super-aggregate rows will always be\nadded last.\n \nExamples\n-------- \nThese examples use the following sample table\n \nCREATE TABLE booksales ( \n country VARCHAR(35), genre\nENUM(\'fiction\',\'non-fiction\'), year YEAR, sales INT);\n \nINSERT INTO booksales VALUES\n (\'Senegal\',\'fiction\',2014,12234),\n(\'Senegal\',\'fiction\',2015,15647),\n (\'Senegal\',\'non-fiction\',2014,64980),\n(\'Senegal\',\'non-fiction\',2015,78901),\n (\'Paraguay\',\'fiction\',2014,87970),\n(\'Paraguay\',\'fiction\',2015,76940),\n (\'Paraguay\',\'non-fiction\',2014,8760),\n(\'Paraguay\',\'non-fiction\',2015,9030);\n \nThe addition of the WITH ROLLUP modifier in this example\nadds an extra row that aggregates both years:\n \nSELECT year, SUM(sales) FROM booksales GROUP BY year;\n \n+------+------------+\n| year | SUM(sales) |\n+------+------------+\n| 2014 | 173944 |\n| 2015 | 180518 |\n+------+------------+\n2 rows in set (0.08 sec)\n \nSELECT year, SUM(sales) FROM booksales GROUP BY year WITH\nROLLUP;\n \n+------+------------+\n| year | SUM(sales) |\n+------+------------+\n| 2014 | 173944 |\n| 2015 | 180518 |\n| NULL | 354462 |\n+------+------------+\n \nIn the following example, each time the genre, the year or\nthe country change, another super-aggregate row is added:\n \nSELECT country, year, genre, SUM(sales) \n FROM booksales GROUP BY country, year, genre;\n \n+----------+------+-------------+------------+\n| country | year | genre | SUM(sales) |\n+----------+------+-------------+------------+\n| Paraguay | 2014 | fiction | 87970 |\n| Paraguay | 2014 | non-fiction | 8760 |\n| Paraguay | 2015 | fiction | 76940 |\n| Paraguay | 2015 | non-fiction | 9030 |\n| Senegal | 2014 | fiction | 12234 |\n| Senegal | 2014 | non-fiction | 64980 |\n| Senegal | 2015 | fiction | 15647 |\n| Senegal | 2015 | non-fiction | 78901 |\n+----------+------+-------------+------------+\n \nSELECT country, year, genre, SUM(sales) \n FROM booksales GROUP BY country, year, genre WITH ROLLUP;\n \n+----------+------+-------------+------------+\n| country | year | genre | SUM(sales) |\n+----------+------+-------------+------------+\n| Paraguay | 2014 | fiction | 87970 |\n| Paraguay | 2014 | non-fiction | 8760 |\n| Paraguay | 2014 | NULL | 96730 |\n| Paraguay | 2015 | fiction | 76940 |\n| Paraguay | 2015 | non-fiction | 9030 |\n| Paraguay | 2015 | NULL | 85970 |\n| Paraguay | NULL | NULL | 182700 |\n| Senegal | 2014 | fiction | 12234 |\n| Senegal | 2014 | non-fiction | 64980 |\n| Senegal | 2014 | NULL | 77214 |\n| Senegal | 2015 | fiction | 15647 |\n| Senegal | 2015 | non-fiction | 78901 |\n| Senegal | 2015 | NULL | 94548 |\n| Senegal | NULL | NULL | 171762 |\n| NULL | NULL | NULL | 354462 |\n+----------+------+-------------+------------+\n \nThe LIMIT clause, applied after WITH ROLLUP:\n \nSELECT country, year, genre, SUM(sales) \n FROM booksales GROUP BY country, year, genre WITH ROLLUP\nLIMIT 4;\n \n+----------+------+-------------+------------+\n| country | year | genre | SUM(sales) |\n+----------+------+-------------+------------+\n| Paraguay | 2014 | fiction | 87970 |\n| Paraguay | 2014 | non-fiction | 8760 |\n| Paraguay | 2014 | NULL | 96730 |\n| Paraguay | 2015 | fiction | 76940 |\n+----------+------+-------------+------------+\n \nSorting by year descending:\n \nSELECT country, year, genre, SUM(sales) \n FROM booksales GROUP BY country, year DESC, genre WITH\nROLLUP;\n \n+----------+------+-------------+------------+\n| country | year | genre | SUM(sales) |\n+----------+------+-------------+------------+\n| Paraguay | 2015 | fiction | 76940 |\n| Paraguay | 2015 | non-fiction | 9030 |\n| Paraguay | 2015 | NULL | 85970 |\n| Paraguay | 2014 | fiction | 87970 |\n| Paraguay | 2014 | non-fiction | 8760 |\n| Paraguay | 2014 | NULL | 96730 |\n| Paraguay | NULL | NULL | 182700 |\n| Senegal | 2015 | fiction | 15647 |\n| Senegal | 2015 | non-fiction | 78901 |\n| Senegal | 2015 | NULL | 94548 |\n| Senegal | 2014 | fiction | 12234 |\n| Senegal | 2014 | non-fiction | 64980 |\n| Senegal | 2014 | NULL | 77214 |\n| Senegal | NULL | NULL | 171762 |\n| NULL | NULL | NULL | 354462 |\n+----------+------+-------------+------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/select-with-rollup/','','https://mariadb.com/kb/en/library/select-with-rollup/'),(438,'UNION',27,'UNION is used to combine the results from multiple SELECT\nstatements into a single result set.\n \nSyntax\n------ \nSELECT ...\nUNION [ALL | DISTINCT] SELECT ...\n[UNION [ALL | DISTINCT] SELECT ...]\n[ORDER BY [column [, column ...]]]\n[LIMIT {[offset,] row_count | row_count OFFSET offset}]\n \nDescription\n----------- \nUNION is used to combine the results from multiple SELECT\nstatements into a single result set.\n \nThe column names from the first SELECT statement are used as\nthe column names for the results returned. Selected columns\nlisted in corresponding positions of each SELECT statement\nshould have the same data type. (For example, the first\ncolumn selected by the first statement should have the same\ntype as the first column selected by the other statements.)\n \nIf they don\'t, the type and length of the columns in the\nresult take into account the values returned by all of the\nSELECTs, so there is no need for explicit casting. Note that\ncurrently this is not the case for recursive CTEs - see\nMDEV-12325.\n \nTable names can be specified as db_name.tbl_name. This\npermits writing UNIONs which involve multiple databases. See\nIdentifier Qualifiers for syntax details.\n \nUNION queries cannot be used with aggregate functions.\n \nALL/DISTINCT\n \nThe ALL keyword causes duplicate rows to be preserved. The\nDISTINCT keyword (the default if the keyword is omitted)\ncauses duplicate rows to be removed by the results.\n \nUNION ALL and UNION DISTINCT can both be present in a query.\nIn this case, UNION DISTINCT will override any UNION ALLs to\nits left.\n \nUntil MariaDB 10.1.1, all UNION ALL statements required the\nserver to create a temporary table. Since MariaDB 10.1.1,\nthe server can in most cases execute UNION ALL without\ncreating a temporary table, improving performance (see\nMDEV-334).\n \nORDER BY and LIMIT\n \nIndividual SELECTs can contain their own ORDER BY and LIMIT\nclauses. In this case, the individual queries need to be\nwrapped between parentheses. However, this does not affect\nthe order of the UNION, so they only are useful to limit the\nrecord read by one SELECT.\n \nThe UNION can have global ORDER BY and LIMIT clauses, which\naffect the whole resultset. If the columns retrieved by\nindividual SELECT statements have an alias (AS), the ORDER\nBY must use that alias, not the real column names.\n \nHIGH_PRIORITY\n \nSpecifying a query as HIGH_PRIORITY will not work inside a\nUNION. If applied to the first SELECT, it will be ignored.\nApplying to a later SELECT results in a syntax error:\n \nERROR 1234 (42000): Incorrect usage/placement of\n\'HIGH_PRIORITY\'\n \nSELECT ... INTO ...\n \nIndividual SELECTs cannot be written INTO DUMPFILE or INTO\nOUTFILE. If the last SELECT statement specifies INTO\nDUMPFILE or INTO OUTFILE, the entire result of the UNION\nwill be written. Placing the clause after any other SELECT\nwill result in a syntax error.\n \nIf the result is a single row, SELECT ... INTO @var_name can\nalso be used.\n \n\nParentheses\n \nFrom MariaDB 10.4.0, parentheses can be used to specify\nprecedence. Before this, a syntax error would be returned.\n \nExamples\n-------- \nUNION between tables having different column names:\n \n(SELECT e_name AS name, email FROM employees)\nUNION\n(SELECT c_name AS name, email FROM customers);\n \nSpecifying the UNION\'s global order and limiting total\nrows:\n \n(SELECT name, email FROM employees)\nUNION\n(SELECT name, email FROM customers)\nORDER BY name LIMIT 10;\n \nAdding a constant row:\n \n(SELECT \'John Doe\' AS name, \'john.doe@example.net\' AS\nemail)\nUNION\n(SELECT name, email FROM customers);\n \nDiffering types:\n \nSELECT CAST(\'x\' AS CHAR(1)) UNION SELECT REPEAT(\'y\',4);\n+----------------------+\n| CAST(\'x\' AS CHAR(1)) |\n+----------------------+\n| x |\n| yyyy |\n+----------------------+\n \nReturning the results in order of each individual SELECT by\nuse of a sort column:\n \n(SELECT 1 AS sort_column, e_name AS name, email FROM\nemployees)\nUNION\n(SELECT 2, c_name AS name, email FROM customers) ORDER BY\nsort_column;\n \nDifference between UNION, EXCEPT and INTERSECT:\n \nCREATE TABLE seqs (i INT);\nINSERT INTO seqs VALUES (1),(2),(3),(4),(5),(6);\n \nSELECT i FROM seqs WHERE i =3;\n \n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n| 3 |\n| 4 |\n| 5 |\n| 6 |\n+------+\n \nSELECT i FROM seqs WHERE i =3;\n \n+------+\n| i |\n+------+\n| 1 |\n| 2 |\n+------+\n \nSELECT i FROM seqs WHERE i =3;\n \n+------+\n| i |\n+------+\n| 3 |\n+------+\n \nParentheses for specifying precedence, from MariaDB 10.4.0\n \nCREATE OR REPLACE TABLE t1 (a INT);\nCREATE OR REPLACE TABLE t2 (b INT);\nCREATE OR REPLACE TABLE t3 (c INT);\n \nINSERT INTO t1 VALUES (1),(2),(3),(4);\nINSERT INTO t2 VALUES (5),(6);\nINSERT INTO t3 VALUES (1),(6);\n \n((SELECT a FROM t1) UNION (SELECT b FROM t2)) INTERSECT\n(SELECT c FROM t3);\n+------+\n| a |\n+------+\n| 1 |\n| 6 |\n+------+\n \n(SELECT a FROM t1) UNION ((SELECT b FROM t2) INTERSECT\n(SELECT c FROM t3));\n+------+\n| a |\n+------+\n| 1 |\n| 2 |\n| 3 |\n| 4 |\n| 6 |\n+------+\n \n\n\nURL: https://mariadb.com/kb/en/library/union/','','https://mariadb.com/kb/en/library/union/'),(439,'UPDATE',27,'Syntax\n------ \nSingle-table syntax:\n \nUPDATE [LOW_PRIORITY] [IGNORE] table_reference \n [PARTITION (partition_list)]\n SET col1={expr1|DEFAULT} [,col2={expr2|DEFAULT}] ...\n [WHERE where_condition]\n [ORDER BY ...]\n [LIMIT row_count]\n \nMultiple-table syntax:\n \nUPDATE [LOW_PRIORITY] [IGNORE] table_references\n SET col1={expr1|DEFAULT} [, col2={expr2|DEFAULT}] ...\n [WHERE where_condition]\n \nDescription\n----------- \nFor the single-table syntax, the UPDATE statement updates\ncolumns of existing rows in the named table with new values.\nThe\nSET clause indicates which columns to modify and the values\nthey should be given. Each value can be given as an\nexpression, or the keyword\nDEFAULT to set a column explicitly to its default value. The\nWHERE clause, if given, specifies the conditions that\nidentify\nwhich rows to update. With no WHERE clause, all rows are\nupdated. If the ORDER BY clause is specified, the rows are\nupdated in the order that is specified. The LIMIT clause\nplaces a limit on the number of rows that can be updated.\n \nThe PARTITION clause was introduced in MariaDB 10.0. See\nPartition Pruning and Selection for details.\n \nUntil MariaDB 10.3.2, for the multiple-table syntax, UPDATE\nupdates rows in each\ntable named in table_references that satisfy the conditions.\nIn this case,\nORDER BY and LIMIT cannot be used. This restriction was\nlifted in MariaDB 10.3.2 and both clauses can be used with\nmultiple-table updates. An UPDATE can also reference tables\nwhich are located in different databases; see Identifier\nQualifiers for the syntax.\n \nwhere_condition is an expression that evaluates to true for\neach row to be updated.\n \ntable_references and where_condition are as\nspecified as described in SELECT.\n \nAssignments are evaluated in left-to-right order, unless the\nSIMULTANEOUS_ASSIGNMENT sql_mode (available from MariaDB\n10.3.5) is set, in which case the UPDATE statement evaluates\nall assignments simultaneously. \n \nYou need the UPDATE privilege only for columns referenced in\nan UPDATE that are actually updated. You need only the\nSELECT privilege for any columns that are read but\nnot modified. See GRANT.\n \nThe UPDATE statement supports the following modifiers:\nIf you use the LOW_PRIORITY keyword, execution of\n the UPDATE is delayed until no other clients are reading\nfrom\n the table. This affects only storage engines that use only\ntable-level\n locking (MyISAM, MEMORY, MERGE). See HIGH_PRIORITY and\nLOW_PRIORITY clauses for details.\nIf you use the IGNORE keyword, the update statement does \n not abort even if errors occur during the update. Rows for\nwhich\n duplicate-key conflicts occur are not updated. Rows for\nwhich columns are\n updated to values that would cause data conversion errors\nare updated to the\n closest valid values instead.\n \nUPDATE Statements With the Same Source and Target\n \nFrom MariaDB 10.3.2, UPDATE statements may have the same\nsource and target.\n \nFor example, given the following table:\n \nDROP TABLE t1;\n \nCREATE TABLE t1 (c1 INT, c2 INT);\nINSERT INTO t1 VALUES (10,10), (20,20);\n \nUntil MariaDB 10.3.1, the following UPDATE statement would\nnot work:\n \nUPDATE t1 SET c1=c1+1 WHERE c2=(SELECT MAX(c2) FROM t1);\nERROR 1093 (HY000): Table \'t1\' is specified twice, \n both as a target for \'UPDATE\' and as a separate source\nfor data\n \nFrom MariaDB 10.3.2, the statement executes successfully:\n \nUPDATE t1 SET c1=c1+1 WHERE c2=(SELECT MAX(c2) FROM t1);\n \nSELECT * FROM t1;\n \n+------+------+\n| c1 | c2 |\n+------+------+\n| 10 | 10 |\n| 21 | 20 |\n+------+------+\n \nExample\n \nSingle-table syntax:\n \nUPDATE table_name SET column1 = value1, column2 = value2\nWHERE id=100;\n \nMultiple-table syntax:\n \nUPDATE tab1, tab2 SET tab1.column1 = value1, tab1.column2 =\nvalue2 WHERE tab1.id = tab2.id;\n \n\n\nURL: https://mariadb.com/kb/en/library/update/','','https://mariadb.com/kb/en/library/update/'),(440,'WITH',27,'The WITH keyword signifies a Common Table Expression (CTE).\nIt allows you to refer to a subquery expression many times\nin a query, as if having a temporary table that only exists\nfor the duration of a query.\n \nThere are two kinds of CTEs:\nNon-Recursive\nRecursive\n \nCommon Table Expression WITH was introduced in MariaDB\n10.2.1.\n \nRecursive WITH has been supported since MariaDB 10.2.2.\n \nSyntax\n------ \nWITH [RECURSIVE] table_reference as (SELECT ...)\n SELECT ...\n \nYou can use table_reference as any normal table in the\nexternal SELECT part. You can also use WITH in sub queries.\nWITH can also be used with EXPLAIN and SELECT.\n \nBelow is an example with the WITH at the top level:\n \nWITH t AS (SELECT a FROM t1 WHERE b >= \'c\') \n SELECT * FROM t2, t WHERE t2.c = t.a;\n \nThe example below uses WITH in a subquery:\n \nSELECT t1.a, t1.b FROM t1, t2\n WHERE t1.a > t2.c \n AND t2.c IN(WITH t AS (SELECT * FROM t1 WHERE t1.a \n\nURL: https://mariadb.com/kb/en/library/with/','','https://mariadb.com/kb/en/library/with/'),(441,'DESCRIBE',28,'Syntax\n------ \n{DESCRIBE | DESC} tbl_name [col_name | wild]\n \nDescription\n----------- \nDESCRIBE provides information about the columns in a table.\nIt is a shortcut for SHOW COLUMNS FROM.\nThese statements also display information for views.\n \ncol_name can be a column name, or a string containing the\nSQL \"%\" and \"_\" wildcard characters to\nobtain output only for the columns with names matching the\nstring. There is no\nneed to enclose the string within quotes unless it contains\nspaces or other\nspecial characters.\n \nDESCRIBE city;\n \n+------------+----------+------+-----+---------+----------------+\n| Field | Type | Null | Key | Default | Extra |\n+------------+----------+------+-----+---------+----------------+\n| Id | int(11) | NO | PRI | NULL | auto_increment |\n| Name | char(35) | YES | | NULL | |\n| Country | char(3) | NO | UNI | | |\n| District | char(20) | YES | MUL | | |\n| Population | int(11) | YES | | NULL | |\n+------------+----------+------+-----+---------+----------------+\n \nThe description for SHOW COLUMNS provides\nmore information about the output columns.\n \n\n\nURL: https://mariadb.com/kb/en/library/describe/','','https://mariadb.com/kb/en/library/describe/'),(444,'ANALYZE FORMAT=JSON',28,'ANALYZE FORMAT=JSON is a mix of the EXPLAIN FORMAT=JSON and\nANALYZE statement features. ANALYZE FORMAT=JSON $statement\nwill execute $statement, and then print the output of\nEXPLAIN FORMAT=JSON, amended with the data from query\nexecution.\n \nBasic Execution Data\n \nYou can get the following also from tabular ANALYZE\nstatement form:\nr_rows is provided for any node that reads rows. It shows\nhow many rows were read, on average \nr_filtered is provided whenever there is a condition that is\nchecked. It shows the percentage of rows left after checking\nthe condition.\n \nAdvanced Execution Data\n \nThe most important data that is not available in tabula\nANALYZE statement are:\nr_loops field. This shows how many times the node was\nexecuted. Most query plan elements have this field.\nr_total_time_ms field. It shows how much time in total was\nspent executing this node. If the node has subnodes, their\nexecution time is included.\nr_buffer_size field. Query plan nodes that make use of\nbuffers report the size of buffer that was was used.\n \nData About Individual Query Plan Nodes\n \nfilesort node reports whether sorting was done with LIMIT n\nparameter, and how many rows were in the sort result. \nblock-nl-join node has r_loops field, which allows to tell\nwhether Using join buffer was efficient \nrange-checked-for-each-record reports counters that show the\nresult of the check. \nexpression-cache is used for subqueries, and it reports how\nmany times the cache was used, and what cache hit ratio was.\nunion_result node has r_rows so one can see how many rows\nwere produced after UNION operation\nand so forth\n \nUse Cases\n \nSee Examples of ANALYZE FORMAT=JSON.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/analyze-format-json/','','https://mariadb.com/kb/en/library/analyze-format-json/'),(445,'ANALYZE FORMAT=JSON Examples',28,'Example #1\n \nCustomers who have ordered more than 1M goods.\n \nANALYZE FORMAT=JSON\nSELECT CONT(*)\nFROM customer\nWHERE\n (SELECT SUM(o_totalprice) FROM orders WHERE\no_custkey=c_custkey) > 1000*1000;\n \nThe query takes 40 seconds over cold cache\n \nEXPLAIN: {\n \"query_block\": {\n \"select_id\": 1,\n \"r_loops\": 1,\n \"r_total_time_ms\": 39872,\n \"table\": {\n \"table_name\": \"customer\",\n \"access_type\": \"index\",\n \"key\": \"i_c_nationkey\",\n \"key_length\": \"5\",\n \"used_key_parts\": [\"c_nationkey\"],\n \"r_loops\": 1,\n \"rows\": 150303,\n \"r_rows\": 150000,\n \"r_total_time_ms\": 270.3,\n \"filtered\": 100,\n \"r_filtered\": 60.691,\n \"attached_condition\": \"((subquery#2) > ((1000 *\n1000)))\",\n \"using_index\": true\n },\n \"subqueries\": [\n {\n \"query_block\": {\n \"select_id\": 2,\n \"r_loops\": 150000,\n \"r_total_time_ms\": 39531,\n \"table\": {\n \"table_name\": \"orders\",\n \"access_type\": \"ref\",\n \"possible_keys\": [\"i_o_custkey\"],\n \"key\": \"i_o_custkey\",\n \"key_length\": \"5\",\n \"used_key_parts\": [\"o_custkey\"],\n \"ref\": [\"dbt3sf1.customer.c_custkey\"],\n \"r_loops\": 150000,\n \"rows\": 7,\n \"r_rows\": 10,\n \"r_total_time_ms\": 39208,\n \"filtered\": 100,\n \"r_filtered\": 100\n }\n }\n }\n ]\n }\n}\nANALYZE shows that 39.2 seconds were spent in the subquery,\nwhich was executed 150K times (for every row of outer\ntable).\n \n\n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/analyze-formatjson-examples/','','https://mariadb.com/kb/en/library/analyze-formatjson-examples/'),(447,'CROSSES',30,'Syntax\n------ \nCrosses(g1,g2)\n \nDescription\n----------- \nReturns 1 if g1 spatially crosses g2. Returns NULL if g1 is\na Polygon or a MultiPolygon, or if g2 is a\nPoint or a MultiPoint. Otherwise, returns 0.\n \nThe term spatially crosses denotes a spatial relation\nbetween two\ngiven geometries that has the following properties:\nThe two geometries intersect\nTheir intersection results in a geometry that has a\ndimension that is one\n less than the maximum dimension of the two given geometries\nTheir intersection is not equal to either of the two given\ngeometries\n \nCROSSES() is based on the original MySQL implementation, and\nuses object bounding rectangles, while ST_CROSSES() uses\nobject shapes.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/crosses/','','https://mariadb.com/kb/en/library/crosses/'),(452,'ST_CONTAINS',30,'Syntax\n------ \nST_CONTAINS(g1,g2)\n \nDescription\n----------- \nReturns 1 or 0 to indicate whether a geometry g1 completely\ncontains geometry g2.\n \nST_CONTAINS() uses object shapes, while CONTAINS(), based on\nthe original MySQL implementation, uses object bounding\nrectangles.\n \nST_CONTAINS tests the opposite relationship to ST_WITHIN().\n \nExamples\n-------- \nSET @g1 = ST_GEOMFROMTEXT(\'POLYGON((175 150, 20 40, 50 60,\n125 100, 175 150))\');\n \nSET @g2 = ST_GEOMFROMTEXT(\'POINT(174 149)\');\n \nSELECT ST_CONTAINS(@g1,@g2);\n+----------------------+\n| ST_CONTAINS(@g1,@g2) |\n+----------------------+\n| 1 |\n+----------------------+\n \nSET @g2 = ST_GEOMFROMTEXT(\'POINT(175 151)\');\n \nSELECT ST_CONTAINS(@g1,@g2);\n+----------------------+\n| ST_CONTAINS(@g1,@g2) |\n+----------------------+\n| 0 |\n+----------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st-contains/','','https://mariadb.com/kb/en/library/st-contains/'),(453,'ST_CROSSES',30,'Syntax\n------ \nST_CROSSES(g1,g2)\n \nDescription\n----------- \nReturns 1 if geometry g1 spatially crosses geometry g2.\nReturns NULL if g1 is a Polygon or a MultiPolygon, or if g2\nis a\nPoint or a MultiPoint. Otherwise, returns 0.\n \nThe term spatially crosses denotes a spatial relation\nbetween two\ngiven geometries that has the following properties:\nThe two geometries intersect\nTheir intersection results in a geometry that has a\ndimension that is one\n less than the maximum dimension of the two given geometries\nTheir intersection is not equal to either of the two given\ngeometries\n \nST_CROSSES() uses object shapes, while CROSSES(), based on\nthe original MySQL implementation, uses object bounding\nrectangles.\n \nExamples\n-------- \nSET @g1 = ST_GEOMFROMTEXT(\'LINESTRING(174 149, 176 151)\');\n \nSET @g2 = ST_GEOMFROMTEXT(\'POLYGON((175 150, 20 40, 50 60,\n125 100, 175 150))\');\n \nSELECT ST_CROSSES(@g1,@g2);\n+---------------------+\n| ST_CROSSES(@g1,@g2) |\n+---------------------+\n| 1 |\n+---------------------+\n \nSET @g1 = ST_GEOMFROMTEXT(\'LINESTRING(176 149, 176 151)\');\n \nSELECT ST_CROSSES(@g1,@g2);\n+---------------------+\n| ST_CROSSES(@g1,@g2) |\n+---------------------+\n| 0 |\n+---------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st-crosses/','','https://mariadb.com/kb/en/library/st-crosses/'); -INSERT INTO `help_topic` VALUES (455,'ST_DISJOINT',30,'Syntax\n------ \nST_DISJOINT(g1,g2)\n \nDescription\n----------- \nReturns 1 or 0 to indicate whether geometry g1 is spatially\ndisjoint from\n(does not intersect with) geometry g2.\n \nST_DISJOINT() uses object shapes, while DISJOINT(), based on\nthe original MySQL implementation, uses object bounding\nrectangles.\n \nST_DISJOINT() tests the opposite relationship to\nST_INTERSECTS().\n \nExamples\n-------- \nSET @g1 = ST_GEOMFROMTEXT(\'POINT(0 0)\');\n \nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(2 0, 0 2)\');\n \nSELECT ST_DISJOINT(@g1,@g2);\n+----------------------+\n| ST_DISJOINT(@g1,@g2) |\n+----------------------+\n| 1 |\n+----------------------+\n \nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(0 0, 0 2)\');\n \nSELECT ST_DISJOINT(@g1,@g2);\n+----------------------+\n| ST_DISJOINT(@g1,@g2) |\n+----------------------+\n| 0 |\n+----------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_disjoint/','','https://mariadb.com/kb/en/library/st_disjoint/'),(457,'ST_EQUALS',30,'Syntax\n------ \nST_EQUALS(g1,g2)\n \nDescription\n----------- \nReturns 1 or 0 to indicate whether geometry g1 is spatially\nequal to geometry g2.\n \nST_EQUALS() uses object shapes, while EQUALS(), based on the\noriginal MySQL implementation, uses object bounding\nrectangles.\n \nExamples\n-------- \nSET @g1 = ST_GEOMFROMTEXT(\'LINESTRING(174 149, 176 151)\');\n \nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(176 151, 174 149)\');\n \nSELECT ST_EQUALS(@g1,@g2);\n+--------------------+\n| ST_EQUALS(@g1,@g2) |\n+--------------------+\n| 1 |\n+--------------------+\n \nSET @g1 = ST_GEOMFROMTEXT(\'POINT(0 2)\');\n \nSET @g1 = ST_GEOMFROMTEXT(\'POINT(2 0)\');\n \nSELECT ST_EQUALS(@g1,@g2);\n+--------------------+\n| ST_EQUALS(@g1,@g2) |\n+--------------------+\n| 0 |\n+--------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st-equals/','','https://mariadb.com/kb/en/library/st-equals/'),(458,'ST_INTERSECTS',30,'Syntax\n------ \nST_INTERSECTS(g1,g2)\n \nDescription\n----------- \nReturns 1 or 0 to indicate whether geometry g1 spatially\nintersects geometry g2.\n \nST_INTERSECTS() uses object shapes, while INTERSECTS(),\nbased on the original MySQL implementation, uses object\nbounding rectangles.\n \nST_INTERSECTS() tests the opposite relationship to\nST_DISJOINT().\n \nExamples\n-------- \nSET @g1 = ST_GEOMFROMTEXT(\'POINT(0 0)\');\n \nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(0 0, 0 2)\');\n \nSELECT ST_INTERSECTS(@g1,@g2);\n+------------------------+\n| ST_INTERSECTS(@g1,@g2) |\n+------------------------+\n| 1 |\n+------------------------+\n \nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(2 0, 0 2)\');\n \nSELECT ST_INTERSECTS(@g1,@g2);\n+------------------------+\n| ST_INTERSECTS(@g1,@g2) |\n+------------------------+\n| 0 |\n+------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st-intersects/','','https://mariadb.com/kb/en/library/st-intersects/'),(461,'ST_TOUCHES',30,'Syntax\n------ \nST_TOUCHES(g1,g2)\n \nDescription\n----------- \nReturns 1 or 0 to indicate whether geometry g1 spatially\ntouches geometry g2. Two geometries spatially touch if the\ninteriors of the geometries do not intersect,\nbut the boundary of one of the geometries intersects either\nthe boundary or the\ninterior of the other.\n \nST_TOUCHES() uses object shapes, while TOUCHES(), based on\nthe original MySQL implementation, uses object bounding\nrectangles.\n \nExamples\n-------- \nSET @g1 = ST_GEOMFROMTEXT(\'POINT(2 0)\');\n \nSET @g2 = ST_GEOMFROMTEXT(\'LINESTRING(2 0, 0 2)\');\n \nSELECT ST_TOUCHES(@g1,@g2);\n+---------------------+\n| ST_TOUCHES(@g1,@g2) |\n+---------------------+\n| 1 |\n+---------------------+\n \nSET @g1 = ST_GEOMFROMTEXT(\'POINT(2 1)\');\n \nSELECT ST_TOUCHES(@g1,@g2);\n+---------------------+\n| ST_TOUCHES(@g1,@g2) |\n+---------------------+\n| 0 |\n+---------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st-touches/','','https://mariadb.com/kb/en/library/st-touches/'),(462,'ST_WITHIN',30,'Syntax\n------ \nST_WITHIN(g1,g2)\n \nDescription\n----------- \nReturns 1 or 0 to indicate whether geometry g1 is spatially\nwithin geometry g2.\n \nThis tests the opposite relationship as ST_CONTAINS().\n \nST_WITHIN() uses object shapes, while WITHIN(), based on the\noriginal MySQL implementation, uses object bounding\nrectangles.\n \nExamples\n-------- \nSET @g1 = ST_GEOMFROMTEXT(\'POINT(174 149)\');\n \nSET @g2 = ST_GEOMFROMTEXT(\'POLYGON((175 150, 20 40, 50 60,\n125 100, 175 150))\');\n \nSELECT ST_WITHIN(@g1,@g2);\n+--------------------+\n| ST_WITHIN(@g1,@g2) |\n+--------------------+\n| 1 |\n+--------------------+\n \nSET @g1 = ST_GEOMFROMTEXT(\'POINT(176 151)\');\n \nSELECT ST_WITHIN(@g1,@g2);\n+--------------------+\n| ST_WITHIN(@g1,@g2) |\n+--------------------+\n| 0 |\n+--------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st-within/','','https://mariadb.com/kb/en/library/st-within/'),(464,'WITHIN',30,'Syntax\n------ \nWithin(g1,g2)\n \nDescription\n----------- \nReturns 1 or 0 to indicate whether g1 is spatially within\ng2.\nThis tests the opposite relationship as Contains().\n \nWITHIN() is based on the original MySQL implementation, and\nuses object bounding rectangles, while ST_WITHIN() uses\nobject shapes.\n \nExamples\n-------- \nSET @g1 = GEOMFROMTEXT(\'POINT(174 149)\');\nSET @g2 = GEOMFROMTEXT(\'POINT(176 151)\');\nSET @g3 = GEOMFROMTEXT(\'POLYGON((175 150, 20 40, 50 60, 125\n100, 175 150))\');\n \nSELECT within(@g1,@g3);\n+-----------------+\n| within(@g1,@g3) |\n+-----------------+\n| 1 |\n+-----------------+\n \nSELECT within(@g2,@g3);\n+-----------------+\n| within(@g2,@g3) |\n+-----------------+\n| 0 |\n+-----------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/within/','','https://mariadb.com/kb/en/library/within/'),(465,'ADDDATE',31,'Syntax\n------ \nADDDATE(date,INTERVAL expr unit), ADDDATE(expr,days)\n \nDescription\n----------- \nWhen invoked with the INTERVAL form of the second argument,\nADDDATE()\nis a synonym for DATE_ADD(). The related function\nSUBDATE() is a synonym for DATE_SUB(). For\ninformation on the INTERVAL unit argument, see the\ndiscussion for\nDATE_ADD().\n \nWhen invoked with the days form of the second argument,\nMariaDB treats it as an\ninteger number of days to be added to expr.\n \nExamples\n-------- \nSELECT DATE_ADD(\'2008-01-02\', INTERVAL 31 DAY);\n+-----------------------------------------+\n| DATE_ADD(\'2008-01-02\', INTERVAL 31 DAY) |\n+-----------------------------------------+\n| 2008-02-02 |\n+-----------------------------------------+\n \nSELECT ADDDATE(\'2008-01-02\', INTERVAL 31 DAY);\n+----------------------------------------+\n| ADDDATE(\'2008-01-02\', INTERVAL 31 DAY) |\n+----------------------------------------+\n| 2008-02-02 |\n+----------------------------------------+\n \nSELECT ADDDATE(\'2008-01-02\', 31);\n+---------------------------+\n| ADDDATE(\'2008-01-02\', 31) |\n+---------------------------+\n| 2008-02-02 |\n+---------------------------+\n \nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n \nSELECT d, ADDDATE(d, 10) from t1;\n \n+---------------------+---------------------+\n| d | ADDDATE(d, 10) |\n+---------------------+---------------------+\n| 2007-01-30 21:31:07 | 2007-02-09 21:31:07 |\n| 1983-10-15 06:42:51 | 1983-10-25 06:42:51 |\n| 2011-04-21 12:34:56 | 2011-05-01 12:34:56 |\n| 2011-10-30 06:31:41 | 2011-11-09 06:31:41 |\n| 2011-01-30 14:03:25 | 2011-02-09 14:03:25 |\n| 2004-10-07 11:19:34 | 2004-10-17 11:19:34 |\n+---------------------+---------------------+\n \nSELECT d, ADDDATE(d, INTERVAL 10 HOUR) from t1;\n \n+---------------------+------------------------------+\n| d | ADDDATE(d, INTERVAL 10 HOUR) |\n+---------------------+------------------------------+\n| 2007-01-30 21:31:07 | 2007-01-31 07:31:07 |\n| 1983-10-15 06:42:51 | 1983-10-15 16:42:51 |\n| 2011-04-21 12:34:56 | 2011-04-21 22:34:56 |\n| 2011-10-30 06:31:41 | 2011-10-30 16:31:41 |\n| 2011-01-30 14:03:25 | 2011-01-31 00:03:25 |\n| 2004-10-07 11:19:34 | 2004-10-07 21:19:34 |\n+---------------------+------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/adddate/','','https://mariadb.com/kb/en/library/adddate/'),(466,'ADDTIME',31,'Syntax\n------ \nADDTIME(expr1,expr2)\n \nDescription\n----------- \nADDTIME() adds expr2 to expr1 and returns the result. expr1\nis a time\nor datetime expression, and expr2 is a time expression.\n \nExamples\n-------- \nSELECT ADDTIME(\'2007-12-31 23:59:59.999999\', \'1\n1:1:1.000002\');\n+---------------------------------------------------------+\n| ADDTIME(\'2007-12-31 23:59:59.999999\', \'1\n1:1:1.000002\') |\n+---------------------------------------------------------+\n| 2008-01-02 01:01:01.000001 |\n+---------------------------------------------------------+\n \nSELECT ADDTIME(\'01:00:00.999999\', \'02:00:00.999998\');\n+-----------------------------------------------+\n| ADDTIME(\'01:00:00.999999\', \'02:00:00.999998\') |\n+-----------------------------------------------+\n| 03:00:01.999997 |\n+-----------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/addtime/','','https://mariadb.com/kb/en/library/addtime/'),(467,'CONVERT_TZ',31,'Syntax\n------ \nCONVERT_TZ(dt,from_tz,to_tz)\n \nDescription\n----------- \nCONVERT_TZ() converts a datetime value dt from the time zone\ngiven by from_tz to the time zone given by to_tz and returns\nthe resulting value.\n \nIn order to use named time zones, such as GMT, MET or\nAfrica/Johannesburg, the time_zone tables must be loaded\n(see mysql_tzinfo_to_sql).\n \nNo conversion will take place if the value falls outside of\nthe supported TIMESTAMP range (\'1970-01-01 00:00:01\' to\n\'2038-01-19 05:14:07\' UTC) when converted from from_tz to\nUTC.\n \nThis function returns NULL if the arguments are invalid (or\nnamed time zones have not been loaded).\n \nSee time zones for more information.\n \nExamples\n-------- \nSELECT CONVERT_TZ(\'2016-01-01\n12:00:00\',\'+00:00\',\'+10:00\');\n+-----------------------------------------------------+\n| CONVERT_TZ(\'2016-01-01 12:00:00\',\'+00:00\',\'+10:00\')\n|\n+-----------------------------------------------------+\n| 2016-01-01 22:00:00 |\n+-----------------------------------------------------+\n \nUsing named time zones (with the time zone tables loaded):\n \nSELECT CONVERT_TZ(\'2016-01-01\n12:00:00\',\'GMT\',\'Africa/Johannesburg\');\n+---------------------------------------------------------------+\n| CONVERT_TZ(\'2016-01-01\n12:00:00\',\'GMT\',\'Africa/Johannesburg\') |\n+---------------------------------------------------------------+\n| 2016-01-01 14:00:00 |\n+---------------------------------------------------------------+\n \nThe value is out of the TIMESTAMP range, so no conversion\ntakes place:\n \nSELECT CONVERT_TZ(\'1969-12-31\n22:00:00\',\'+00:00\',\'+10:00\');\n+-----------------------------------------------------+\n| CONVERT_TZ(\'1969-12-31 22:00:00\',\'+00:00\',\'+10:00\')\n|\n+-----------------------------------------------------+\n| 1969-12-31 22:00:00 |\n+-----------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/convert_tz/','','https://mariadb.com/kb/en/library/convert_tz/'),(468,'CURDATE',31,'Syntax\n------ \nCURDATE()\n \nDescription\n----------- \nReturns the current date as a value in \'YYYY-MM-DD\' or\nYYYYMMDD\nformat, depending on whether the function is used in a\nstring or\nnumeric context.\n \nExamples\n-------- \nSELECT CURDATE();\n+------------+\n| CURDATE() |\n+------------+\n| 2019-03-05 |\n+------------+\n \nIn a numeric context (note this is not performing date\ncalculations):\n \nSELECT CURDATE() +0;\n \n+--------------+\n| CURDATE() +0 |\n+--------------+\n| 20190305 |\n+--------------+\n \nData calculation:\n \nSELECT CURDATE() - INTERVAL 5 DAY;\n \n+----------------------------+\n| CURDATE() - INTERVAL 5 DAY |\n+----------------------------+\n| 2019-02-28 |\n+----------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/curdate/','','https://mariadb.com/kb/en/library/curdate/'),(474,'DATEDIFF',31,'Syntax\n------ \nDATEDIFF(expr1,expr2)\n \nDescription\n----------- \nDATEDIFF() returns (expr1 – expr2) expressed\nas a value in days from one date to the other. expr1 and\nexpr2 are date\nor date-and-time expressions. Only the date parts of the\nvalues are used in the\ncalculation.\n \nExamples\n-------- \nSELECT DATEDIFF(\'2007-12-31 23:59:59\',\'2007-12-30\');\n+----------------------------------------------+\n| DATEDIFF(\'2007-12-31 23:59:59\',\'2007-12-30\') |\n+----------------------------------------------+\n| 1 |\n+----------------------------------------------+\n \nSELECT DATEDIFF(\'2010-11-30 23:59:59\',\'2010-12-31\');\n+----------------------------------------------+\n| DATEDIFF(\'2010-11-30 23:59:59\',\'2010-12-31\') |\n+----------------------------------------------+\n| -31 |\n+----------------------------------------------+\n \nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n \nSELECT NOW();\n+---------------------+\n| NOW() |\n+---------------------+\n| 2011-05-23 10:56:05 |\n+---------------------+\n \nSELECT d, DATEDIFF(NOW(),d) FROM t1;\n \n+---------------------+-------------------+\n| d | DATEDIFF(NOW(),d) |\n+---------------------+-------------------+\n| 2007-01-30 21:31:07 | 1574 |\n| 1983-10-15 06:42:51 | 10082 |\n| 2011-04-21 12:34:56 | 32 |\n| 2011-10-30 06:31:41 | -160 |\n| 2011-01-30 14:03:25 | 113 |\n| 2004-10-07 11:19:34 | 2419 |\n+---------------------+-------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/datediff/','','https://mariadb.com/kb/en/library/datediff/'),(475,'DATE_ADD',31,'Syntax\n------ \nDATE_ADD(date,INTERVAL expr unit)\n \nDescription\n----------- \nPerforms date arithmetic. The date argument specifies the\nstarting date or datetime value. expr is an expression\nspecifying the\ninterval value to be added or subtracted from the starting\ndate. expr is a\nstring; it may start with a \"-\" for negative intervals.\nunit is a\nkeyword indicating the units in which the expression should\nbe interpreted. See Date and Time Units for a complete list\nof permitted units. \n \nSee also DATE_SUB().\n \nExamples\n-------- \nSELECT \'2008-12-31 23:59:59\' + INTERVAL 1 SECOND;\n \n+-------------------------------------------+\n| \'2008-12-31 23:59:59\' + INTERVAL 1 SECOND |\n+-------------------------------------------+\n| 2009-01-01 00:00:00 |\n+-------------------------------------------+\n \nSELECT INTERVAL 1 DAY + \'2008-12-31\';\n \n+-------------------------------+\n| INTERVAL 1 DAY + \'2008-12-31\' |\n+-------------------------------+\n| 2009-01-01 |\n+-------------------------------+\n \nSELECT \'2005-01-01\' - INTERVAL 1 SECOND;\n \n+----------------------------------+\n| \'2005-01-01\' - INTERVAL 1 SECOND |\n+----------------------------------+\n| 2004-12-31 23:59:59 |\n+----------------------------------+\n \nSELECT DATE_ADD(\'2000-12-31 23:59:59\', INTERVAL 1 SECOND);\n+----------------------------------------------------+\n| DATE_ADD(\'2000-12-31 23:59:59\', INTERVAL 1 SECOND) |\n+----------------------------------------------------+\n| 2001-01-01 00:00:00 |\n+----------------------------------------------------+\n \nSELECT DATE_ADD(\'2010-12-31 23:59:59\', INTERVAL 1 DAY);\n+-------------------------------------------------+\n| DATE_ADD(\'2010-12-31 23:59:59\', INTERVAL 1 DAY) |\n+-------------------------------------------------+\n| 2011-01-01 23:59:59 |\n+-------------------------------------------------+\n \nSELECT DATE_ADD(\'2100-12-31 23:59:59\', INTERVAL \'1:1\'\nMINUTE_SECOND);\n+---------------------------------------------------------------+\n| DATE_ADD(\'2100-12-31 23:59:59\', INTERVAL \'1:1\'\nMINUTE_SECOND) |\n+---------------------------------------------------------------+\n| 2101-01-01 00:01:00 |\n+---------------------------------------------------------------+\n \nSELECT DATE_ADD(\'1900-01-01 00:00:00\', INTERVAL \'-1 10\'\nDAY_HOUR);\n+------------------------------------------------------------+\n| DATE_ADD(\'1900-01-01 00:00:00\', INTERVAL \'-1 10\'\nDAY_HOUR) |\n+------------------------------------------------------------+\n| 1899-12-30 14:00:00 |\n+------------------------------------------------------------+\n \nSELECT DATE_ADD(\'1992-12-31 23:59:59.000002\', INTERVAL\n\'1.999999\' SECOND_MICROSECOND);\n+--------------------------------------------------------------------------------+\n| DATE_ADD(\'1992-12-31 23:59:59.000002\', INTERVAL\n\'1.999999\' SECOND_MICROSECOND) |\n+--------------------------------------------------------------------------------+\n| 1993-01-01 00:00:01.000001 |\n+--------------------------------------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/date_add/','','https://mariadb.com/kb/en/library/date_add/'),(476,'DATE_FORMAT',31,'Syntax\n------ \nDATE_FORMAT(date, format[, locale])\n \nDescription\n----------- \nFormats the date value according to the format string. \n \nThe language used for the names is controlled by the value\nof the lc_time_names system variable. See server locale for\nmore on the supported locales.\n \nThe options that can be used by DATE_FORMAT(), as well as\nits inverse STR_TO_DATE() and the FROM_UNIXTIME() function,\nare:\n \nOption | Description | \n \n%a | Short weekday name in current locale (Variable\nlc_time_names). | \n \n%b | Short form month name in current locale. For locale\nen_US this is one of:\nJan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov or Dec. | \n \n%c | Month with 1 or 2 digits. | \n \n%D | Day with English suffix \'th\', \'nd\', \'st\' or\n\'rd\'\'. (1st, 2nd, 3rd...). | \n \n%d | Day with 2 digits. | \n \n%e | Day with 1 or 2 digits. | \n \n%f | Sub seconds 6 digits. | \n \n%H | Hour with 2 digits between 00-23. | \n \n%h | Hour with 2 digits between 01-12. | \n \n%I | Hour with 2 digits between 01-12. | \n \n%i | Minute with 2 digits. | \n \n%j | Day of the year (001-366) | \n \n%k | Hour with 1 digits between 0-23. | \n \n%l | Hour with 1 digits between 1-12. | \n \n%M | Full month name in current locale (Variable\nlc_time_names). | \n \n%m | Month with 2 digits. | \n \n%p | AM/PM according to current locale (Variable\nlc_time_names). | \n \n%r | Time in 12 hour format, followed by AM/PM. Short for\n\'%I:%i:%S %p\'. | \n \n%S | Seconds with 2 digits. | \n \n%s | Seconds with 2 digits. | \n \n%T | Time in 24 hour format. Short for \'%H:%i:%S\'. | \n \n%U | Week number (00-53), when first day of the week is\nSunday. | \n \n%u | Week number (00-53), when first day of the week is\nMonday. | \n \n%V | Week number (01-53), when first day of the week is\nSunday. Used with %X. | \n \n%v | Week number (01-53), when first day of the week is\nMonday. Used with %x. | \n \n%W | Full weekday name in current locale (Variable\nlc_time_names). | \n \n%w | Day of the week. 0 = Sunday, 6 = Saturday. | \n \n%X | Year with 4 digits when first day of the week is\nSunday. Used with %V. | \n \n%x | Year with 4 digits when first day of the week is\nMonday. Used with %v. | \n \n%Y | Year with 4 digits. | \n \n%y | Year with 2 digits. | \n \n%# | For str_to_date(), skip all numbers. | \n \n%. | For str_to_date(), skip all punctation characters. | \n \n%@ | For str_to_date(), skip all alpha characters. | \n \n%% | A literal % character. | \n \nTo get a date in one of the standard formats, GET_FORMAT()\ncan be used.\n \nExamples\n-------- \nSELECT DATE_FORMAT(\'2009-10-04 22:23:00\', \'%W %M %Y\');\n+------------------------------------------------+\n| DATE_FORMAT(\'2009-10-04 22:23:00\', \'%W %M %Y\') |\n+------------------------------------------------+\n| Sunday October 2009 |\n+------------------------------------------------+\n \nSELECT DATE_FORMAT(\'2007-10-04 22:23:00\', \'%H:%i:%s\');\n+------------------------------------------------+\n| DATE_FORMAT(\'2007-10-04 22:23:00\', \'%H:%i:%s\') |\n+------------------------------------------------+\n| 22:23:00 |\n+------------------------------------------------+\n \nSELECT DATE_FORMAT(\'1900-10-04 22:23:00\', \'%D %y %a %d %m\n%b %j\');\n+------------------------------------------------------------+\n| DATE_FORMAT(\'1900-10-04 22:23:00\', \'%D %y %a %d %m %b\n%j\') |\n+------------------------------------------------------------+\n| 4th 00 Thu 04 10 Oct 277 |\n+------------------------------------------------------------+\n \nSELECT DATE_FORMAT(\'1997-10-04 22:23:00\', \'%H %k %I %r %T\n%S %w\');\n+------------------------------------------------------------+\n| DATE_FORMAT(\'1997-10-04 22:23:00\', \'%H %k %I %r %T %S\n%w\') |\n+------------------------------------------------------------+\n| 22 22 10 10:23:00 PM 22:23:00 00 6 |\n+------------------------------------------------------------+\n \nSELECT DATE_FORMAT(\'1999-01-01\', \'%X %V\');\n+------------------------------------+\n| DATE_FORMAT(\'1999-01-01\', \'%X %V\') |\n+------------------------------------+\n| 1998 52 |\n+------------------------------------+\n \nSELECT DATE_FORMAT(\'2006-06-00\', \'%d\');\n+---------------------------------+\n| DATE_FORMAT(\'2006-06-00\', \'%d\') |\n+---------------------------------+\n| 00 |\n+---------------------------------+\n \nOptionally, the locale can be explicitly specified as the\nthird DATE_FORMAT() argument. Doing so makes the function\nindependent from the session settings, and the three\nargument version of DATE_FORMAT() can be used in virtual\nindexed and persistent generated-columns:\n \nSELECT DATE_FORMAT(\'2006-01-01\', \'%W\', \'el_GR\');\n+------------------------------------------+\n| DATE_FORMAT(\'2006-01-01\', \'%W\', \'el_GR\') |\n+------------------------------------------+\n| Κυριακή |\n+------------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/date_format/','','https://mariadb.com/kb/en/library/date_format/'),(477,'DATE_SUB',31,'Syntax\n------ \nDATE_SUB(date,INTERVAL expr unit)\n \nDescription\n----------- \nPerforms date arithmetic. The date argument specifies the\nstarting date or datetime value. expr is an expression\nspecifying the\ninterval value to be added or subtracted from the starting\ndate. expr is a\nstring; it may start with a \"-\" for negative intervals.\nunit is a\nkeyword indicating the units in which the expression should\nbe interpreted. See Date and Time Units for a complete list\nof permitted units. \n \nSee also DATE_ADD().\n \nExamples\n-------- \nSELECT DATE_SUB(\'1998-01-02\', INTERVAL 31 DAY);\n+-----------------------------------------+\n| DATE_SUB(\'1998-01-02\', INTERVAL 31 DAY) |\n+-----------------------------------------+\n| 1997-12-02 |\n+-----------------------------------------+\n \nSELECT DATE_SUB(\'2005-01-01 00:00:00\', INTERVAL \'1\n1:1:1\' DAY_SECOND);\n+----------------------------------------------------------------+\n| DATE_SUB(\'2005-01-01 00:00:00\', INTERVAL \'1 1:1:1\'\nDAY_SECOND) |\n+----------------------------------------------------------------+\n| 2004-12-30 22:58:59 |\n+----------------------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/date_sub/','','https://mariadb.com/kb/en/library/date_sub/'),(479,'DAYNAME',31,'Syntax\n------ \nDAYNAME(date)\n \nDescription\n----------- \nReturns the name of the weekday for date. The language used\nfor the name is controlled by the value\nof the lc_time_names system variable. See server locale for\nmore on the supported locales.\n \nExamples\n-------- \nSELECT DAYNAME(\'2007-02-03\');\n+-----------------------+\n| DAYNAME(\'2007-02-03\') |\n+-----------------------+\n| Saturday |\n+-----------------------+\n \nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n \nSELECT d, DAYNAME(d) FROM t1;\n \n+---------------------+------------+\n| d | DAYNAME(d) |\n+---------------------+------------+\n| 2007-01-30 21:31:07 | Tuesday |\n| 1983-10-15 06:42:51 | Saturday |\n| 2011-04-21 12:34:56 | Thursday |\n| 2011-10-30 06:31:41 | Sunday |\n| 2011-01-30 14:03:25 | Sunday |\n| 2004-10-07 11:19:34 | Thursday |\n+---------------------+------------+\n \nChanging the locale:\n \nSET lc_time_names = \'fr_CA\';\n \nSELECT DAYNAME(\'2013-04-01\');\n+-----------------------+\n| DAYNAME(\'2013-04-01\') |\n+-----------------------+\n| lundi |\n+-----------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/dayname/','','https://mariadb.com/kb/en/library/dayname/'),(480,'DAYOFMONTH',31,'Syntax\n------ \nDAYOFMONTH(date)\n \nDescription\n----------- \nReturns the day of the month for date, in the range 1 to 31,\nor 0\nfor dates such as \'0000-00-00\' or \'2008-00-00\' which\nhave a zero day\npart.\n \nDAY() is a synonym.\n \nExamples\n-------- \nSELECT DAYOFMONTH(\'2007-02-03\');\n+--------------------------+\n| DAYOFMONTH(\'2007-02-03\') |\n+--------------------------+\n| 3 |\n+--------------------------+\n \nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n \nSELECT d FROM t1 where DAYOFMONTH(d) = 30;\n \n+---------------------+\n| d |\n+---------------------+\n| 2007-01-30 21:31:07 |\n| 2011-10-30 06:31:41 |\n| 2011-01-30 14:03:25 |\n+---------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/dayofmonth/','','https://mariadb.com/kb/en/library/dayofmonth/'),(481,'DAYOFWEEK',31,'Syntax\n------ \nDAYOFWEEK(date)\n \nDescription\n----------- \nReturns the day of the week index for the date (1 = Sunday,\n2 = Monday, ..., 7 =\nSaturday). These index values correspond to the ODBC\nstandard.\n \nThis contrasts with WEEKDAY() which follows a different\nindex numbering\n(0 = Monday, 1 = Tuesday, ... 6 = Sunday).\n \nExamples\n-------- \nSELECT DAYOFWEEK(\'2007-02-03\');\n+-------------------------+\n| DAYOFWEEK(\'2007-02-03\') |\n+-------------------------+\n| 7 |\n+-------------------------+\n \nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n \nSELECT d, DAYNAME(d), DAYOFWEEK(d), WEEKDAY(d) from t1;\n \n+---------------------+------------+--------------+------------+\n| d | DAYNAME(d) | DAYOFWEEK(d) | WEEKDAY(d) |\n+---------------------+------------+--------------+------------+\n| 2007-01-30 21:31:07 | Tuesday | 3 | 1 |\n| 1983-10-15 06:42:51 | Saturday | 7 | 5 |\n| 2011-04-21 12:34:56 | Thursday | 5 | 3 |\n| 2011-10-30 06:31:41 | Sunday | 1 | 6 |\n| 2011-01-30 14:03:25 | Sunday | 1 | 6 |\n| 2004-10-07 11:19:34 | Thursday | 5 | 3 |\n+---------------------+------------+--------------+------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/dayofweek/','','https://mariadb.com/kb/en/library/dayofweek/'),(483,'EXTRACT',31,'Syntax\n------ \nEXTRACT(unit FROM date)\n \nDescription\n----------- \nThe EXTRACT() function extracts the required unit from the\ndate. See Date and Time Units for a complete list of\npermitted units.\n \nIn MariaDB 10.0.7 and MariaDB 5.5.35, EXTRACT (HOUR FROM\n...) was changed to return a value from 0 to 23, adhering to\nthe SQL standard. Until MariaDB 10.0.6 and MariaDB 5.5.34,\nand in all versions of MySQL at least as of MySQL 5.7, it\ncould return a value > 23. HOUR() is not a standard\nfunction, so continues to adhere to the old behaviour\ninherited from MySQL.\n \nExamples\n-------- \nSELECT EXTRACT(YEAR FROM \'2009-07-02\');\n+---------------------------------+\n| EXTRACT(YEAR FROM \'2009-07-02\') |\n+---------------------------------+\n| 2009 |\n+---------------------------------+\n \nSELECT EXTRACT(YEAR_MONTH FROM \'2009-07-02 01:02:03\');\n+------------------------------------------------+\n| EXTRACT(YEAR_MONTH FROM \'2009-07-02 01:02:03\') |\n+------------------------------------------------+\n| 200907 |\n+------------------------------------------------+\n \nSELECT EXTRACT(DAY_MINUTE FROM \'2009-07-02 01:02:03\');\n+------------------------------------------------+\n| EXTRACT(DAY_MINUTE FROM \'2009-07-02 01:02:03\') |\n+------------------------------------------------+\n| 20102 |\n+------------------------------------------------+\n \nSELECT EXTRACT(MICROSECOND FROM \'2003-01-02\n10:30:00.000123\');\n+--------------------------------------------------------+\n| EXTRACT(MICROSECOND FROM \'2003-01-02 10:30:00.000123\') |\n+--------------------------------------------------------+\n| 123 |\n+--------------------------------------------------------+\n \nFrom MariaDB 10.0.7 and MariaDB 5.5.35, EXTRACT (HOUR\nFROM...) returns a value from 0 to 23, as per the SQL\nstandard. HOUR is not a standard function, so continues to\nadhere to the old behaviour inherited from MySQL.\n \nSELECT EXTRACT(HOUR FROM \'26:30:00\'), HOUR(\'26:30:00\');\n+-------------------------------+------------------+\n| EXTRACT(HOUR FROM \'26:30:00\') | HOUR(\'26:30:00\') |\n+-------------------------------+------------------+\n| 2 | 26 |\n+-------------------------------+------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/extract/','','https://mariadb.com/kb/en/library/extract/'),(485,'FROM_UNIXTIME',31,'Syntax\n------ \nFROM_UNIXTIME(unix_timestamp),\nFROM_UNIXTIME(unix_timestamp,format)\n \nDescription\n----------- \nReturns a representation of the unix_timestamp argument as a\nvalue in\n\'YYYY-MM-DD HH:MM:SS\' or YYYYMMDDHHMMSS.uuuuuu format,\ndepending on\nwhether the function is used in a string or numeric context.\nThe value\nis expressed in the current time zone. unix_timestamp is an\ninternal\ntimestamp value such as is produced by the UNIX_TIMESTAMP()\nfunction.\n \nIf format is given, the result is formatted according to the\nformat\nstring, which is used the same way as listed in the entry\nfor the\nDATE_FORMAT() function.\n \nTimestamps in MariaDB have a maximum value of 2147483647,\nequivalent to 2038-01-19 05:14:07. This is due to the\nunderlying 32-bit limitation. Using the function on a\ntimestamp beyond this will result in NULL being returned.\nUse DATETIME as a storage type if you require dates beyond\nthis.\n \nThe options that can be used by FROM_UNIXTIME(), as well as\nDATE_FORMAT() and STR_TO_DATE(), are:\n \nOption | Description | \n \n%a | Short weekday name in current locale (Variable\nlc_time_names). | \n \n%b | Short form month name in current locale. For locale\nen_US this is one of:\nJan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov or Dec. | \n \n%c | Month with 1 or 2 digits. | \n \n%D | Day with English suffix \'th\', \'nd\', \'st\' or\n\'rd\'\'. (1st, 2nd, 3rd...). | \n \n%d | Day with 2 digits. | \n \n%e | Day with 1 or 2 digits. | \n \n%f | Sub seconds 6 digits. | \n \n%H | Hour with 2 digits between 00-23. | \n \n%h | Hour with 2 digits between 01-12. | \n \n%I | Hour with 2 digits between 01-12. | \n \n%i | Minute with 2 digits. | \n \n%j | Day of the year (001-366) | \n \n%k | Hour with 1 digits between 0-23. | \n \n%l | Hour with 1 digits between 1-12. | \n \n%M | Full month name in current locale (Variable\nlc_time_names). | \n \n%m | Month with 2 digits. | \n \n%p | AM/PM according to current locale (Variable\nlc_time_names). | \n \n%r | Time in 12 hour format, followed by AM/PM. Short for\n\'%I:%i:%S %p\'. | \n \n%S | Seconds with 2 digits. | \n \n%s | Seconds with 2 digits. | \n \n%T | Time in 24 hour format. Short for \'%H:%i:%S\'. | \n \n%U | Week number (00-53), when first day of the week is\nSunday. | \n \n%u | Week number (00-53), when first day of the week is\nMonday. | \n \n%V | Week number (01-53), when first day of the week is\nSunday. Used with %X. | \n \n%v | Week number (01-53), when first day of the week is\nMonday. Used with %x. | \n \n%W | Full weekday name in current locale (Variable\nlc_time_names). | \n \n%w | Day of the week. 0 = Sunday, 1 = Saturday. | \n \n%X | Year with 4 digits when first day of the week is\nSunday. Used with %V. | \n \n%x | Year with 4 digits when first day of the week is\nSunday. Used with %v. | \n \n%Y | Year with 4 digits. | \n \n%y | Year with 2 digits. | \n \n%# | For str_to_date(), skip all numbers. | \n \n%. | For str_to_date(), skip all punctation characters. | \n \n%@ | For str_to_date(), skip all alpha characters. | \n \n%% | A literal % character. | \n \nPerformance Considerations\n \nIf your session time zone is set to SYSTEM (the default),\nFROM_UNIXTIME() will call the OS function to convert the\ndata using the system time zone. At least on Linux, the\ncorresponding function (localtime_r) uses a global mutex\ninside glibc that can cause contention under high concurrent\nload.\n \nSet your time zone to a named time zone to avoid this issue.\nSee mysql time zone tables for details on how to do this.\n \nExamples\n-------- \nSELECT FROM_UNIXTIME(1196440219);\n+---------------------------+\n| FROM_UNIXTIME(1196440219) |\n+---------------------------+\n| 2007-11-30 11:30:19 |\n+---------------------------+\n \nSELECT FROM_UNIXTIME(1196440219) + 0;\n \n+-------------------------------+\n| FROM_UNIXTIME(1196440219) + 0 |\n+-------------------------------+\n| 20071130113019.000000 |\n+-------------------------------+\n \nSELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), \'%Y %D %M %h:%i:%s\n%x\');\n+---------------------------------------------------------+\n| FROM_UNIXTIME(UNIX_TIMESTAMP(), \'%Y %D %M %h:%i:%s %x\')\n|\n+---------------------------------------------------------+\n| 2010 27th March 01:03:47 2010 |\n+---------------------------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/from_unixtime/','','https://mariadb.com/kb/en/library/from_unixtime/'),(486,'GET_FORMAT',31,'Syntax\n------ \nGET_FORMAT({DATE|DATETIME|TIME},\n{\'EUR\'|\'USA\'|\'JIS\'|\'ISO\'|\'INTERNAL\'})\n \nDescription\n----------- \nReturns a format string. This function is useful in\ncombination with\nthe DATE_FORMAT() and the STR_TO_DATE() functions.\n \nPossible result formats are:\n \nFunction Call | Result Format | \n \nGET_FORMAT(DATE,\'EUR\') | \'%d.%m.%Y\' | \n \nGET_FORMAT(DATE,\'USA\') | \'%m.%d.%Y\' | \n \nGET_FORMAT(DATE,\'JIS\') | \'%Y-%m-%d\' | \n \nGET_FORMAT(DATE,\'ISO\') | \'%Y-%m-%d\' | \n \nGET_FORMAT(DATE,\'INTERNAL\') | \'%Y%m%d\' | \n \nGET_FORMAT(DATETIME,\'EUR\') | \'%Y-%m-%d %H.%i.%s\' | \n \nGET_FORMAT(DATETIME,\'USA\') | \'%Y-%m-%d %H.%i.%s\' | \n \nGET_FORMAT(DATETIME,\'JIS\') | \'%Y-%m-%d %H:%i:%s\' | \n \nGET_FORMAT(DATETIME,\'ISO\') | \'%Y-%m-%d %H:%i:%s\' | \n \nGET_FORMAT(DATETIME,\'INTERNAL\') | \'%Y%m%d%H%i%s\' | \n \nGET_FORMAT(TIME,\'EUR\') | \'%H.%i.%s\' | \n \nGET_FORMAT(TIME,\'USA\') | \'%h:%i:%s %p\' | \n \nGET_FORMAT(TIME,\'JIS\') | \'%H:%i:%s\' | \n \nGET_FORMAT(TIME,\'ISO\') | \'%H:%i:%s\' | \n \nGET_FORMAT(TIME,\'INTERNAL\') | \'%H%i%s\' | \n \nExamples\n-------- \nObtaining the string matching to the standard European date\nformat:\n \nSELECT GET_FORMAT(DATE, \'EUR\');\n+-------------------------+\n| GET_FORMAT(DATE, \'EUR\') |\n+-------------------------+\n| %d.%m.%Y |\n+-------------------------+\n \nUsing the same string to format a date:\n \nSELECT DATE_FORMAT(\'2003-10-03\',GET_FORMAT(DATE,\'EUR\'));\n+--------------------------------------------------+\n| DATE_FORMAT(\'2003-10-03\',GET_FORMAT(DATE,\'EUR\')) |\n+--------------------------------------------------+\n| 03.10.2003 |\n+--------------------------------------------------+\n \nSELECT STR_TO_DATE(\'10.31.2003\',GET_FORMAT(DATE,\'USA\'));\n+--------------------------------------------------+\n| STR_TO_DATE(\'10.31.2003\',GET_FORMAT(DATE,\'USA\')) |\n+--------------------------------------------------+\n| 2003-10-31 |\n+--------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/get_format/','','https://mariadb.com/kb/en/library/get_format/'),(487,'HOUR',31,'Syntax\n------ \nHOUR(time)\n \nDescription\n----------- \nReturns the hour for time. The range of the return value is\n0 to 23\nfor time-of-day values. However, the range of TIME values\nactually is\nmuch larger, so HOUR can return values greater than 23.\n \nThe return value is always positive, even if a negative TIME\nvalue is provided.\n \nExamples\n-------- \nSELECT HOUR(\'10:05:03\');\n+------------------+\n| HOUR(\'10:05:03\') |\n+------------------+\n| 10 |\n+------------------+\n \nSELECT HOUR(\'272:59:59\');\n+-------------------+\n| HOUR(\'272:59:59\') |\n+-------------------+\n| 272 |\n+-------------------+\n \nDifference between EXTRACT (HOUR FROM ...) (>= MariaDB\n10.0.7 and MariaDB 5.5.35) and HOUR:\n \nSELECT EXTRACT(HOUR FROM \'26:30:00\'), HOUR(\'26:30:00\');\n+-------------------------------+------------------+\n| EXTRACT(HOUR FROM \'26:30:00\') | HOUR(\'26:30:00\') |\n+-------------------------------+------------------+\n| 2 | 26 |\n+-------------------------------+------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/hour/','','https://mariadb.com/kb/en/library/hour/'),(488,'LAST_DAY',31,'Syntax\n------ \nLAST_DAY(date)\n \nDescription\n----------- \nTakes a date or datetime value and returns the corresponding\nvalue for\nthe last day of the month. Returns NULL if the argument is\ninvalid.\n \nExamples\n-------- \nSELECT LAST_DAY(\'2003-02-05\');\n+------------------------+\n| LAST_DAY(\'2003-02-05\') |\n+------------------------+\n| 2003-02-28 |\n+------------------------+\n \nSELECT LAST_DAY(\'2004-02-05\');\n+------------------------+\n| LAST_DAY(\'2004-02-05\') |\n+------------------------+\n| 2004-02-29 |\n+------------------------+\n \nSELECT LAST_DAY(\'2004-01-01 01:01:01\');\n+---------------------------------+\n| LAST_DAY(\'2004-01-01 01:01:01\') |\n+---------------------------------+\n| 2004-01-31 |\n+---------------------------------+\n \nSELECT LAST_DAY(\'2003-03-32\');\n+------------------------+\n| LAST_DAY(\'2003-03-32\') |\n+------------------------+\n| NULL |\n+------------------------+\n1 row in set, 1 warning (0.00 sec)\n \nWarning (Code 1292): Incorrect datetime value:\n\'2003-03-32\'\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/last_day/','','https://mariadb.com/kb/en/library/last_day/'),(491,'MAKEDATE',31,'Syntax\n------ \nMAKEDATE(year,dayofyear)\n \nDescription\n----------- \nReturns a date, given year and day-of-year values. dayofyear\nmust be\ngreater than 0 or the result is NULL.\n \nExamples\n-------- \nSELECT MAKEDATE(2011,31), MAKEDATE(2011,32);\n+-------------------+-------------------+\n| MAKEDATE(2011,31) | MAKEDATE(2011,32) |\n+-------------------+-------------------+\n| 2011-01-31 | 2011-02-01 |\n+-------------------+-------------------+\n \nSELECT MAKEDATE(2011,365), MAKEDATE(2014,365);\n+--------------------+--------------------+\n| MAKEDATE(2011,365) | MAKEDATE(2014,365) |\n+--------------------+--------------------+\n| 2011-12-31 | 2014-12-31 |\n+--------------------+--------------------+\n \nSELECT MAKEDATE(2011,0);\n+------------------+\n| MAKEDATE(2011,0) |\n+------------------+\n| NULL |\n+------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/makedate/','','https://mariadb.com/kb/en/library/makedate/'),(492,'MAKETIME',31,'Syntax\n------ \nMAKETIME(hour,minute,second)\n \nDescription\n----------- \nReturns a time value calculated from the hour, minute, and\nsecond arguments.\n \nIf minute or second are out of the range 0 to 60, NULL is\nreturned. The hour can be in the range -838 to 838, outside\nof which the value is truncated with a warning.\n \nExamples\n-------- \nSELECT MAKETIME(13,57,33);\n+--------------------+\n| MAKETIME(13,57,33) |\n+--------------------+\n| 13:57:33 |\n+--------------------+\n \nSELECT MAKETIME(-13,57,33);\n+---------------------+\n| MAKETIME(-13,57,33) |\n+---------------------+\n| -13:57:33 |\n+---------------------+\n \nSELECT MAKETIME(13,67,33);\n+--------------------+\n| MAKETIME(13,67,33) |\n+--------------------+\n| NULL |\n+--------------------+\n \nSELECT MAKETIME(-1000,57,33);\n+-----------------------+\n| MAKETIME(-1000,57,33) |\n+-----------------------+\n| -838:59:59 |\n+-----------------------+\n1 row in set, 1 warning (0.00 sec)\n \nSHOW WARNINGS;\n \n+---------+------+-----------------------------------------------+\n| Level | Code | Message |\n+---------+------+-----------------------------------------------+\n| Warning | 1292 | Truncated incorrect time value:\n\'-1000:57:33\' |\n+---------+------+-----------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/maketime/','','https://mariadb.com/kb/en/library/maketime/'),(493,'MICROSECOND',31,'Syntax\n------ \nMICROSECOND(expr)\n \nDescription\n----------- \nReturns the microseconds from the time or datetime\nexpression expr as a number in the range from 0 to 999999.\n \nIf expr is a time with no microseconds, zero is returned,\nwhile if expr is a date with no time, zero with a warning is\nreturned.\n \nExamples\n-------- \nSELECT MICROSECOND(\'12:00:00.123456\');\n+--------------------------------+\n| MICROSECOND(\'12:00:00.123456\') |\n+--------------------------------+\n| 123456 |\n+--------------------------------+\n \nSELECT MICROSECOND(\'2009-12-31 23:59:59.000010\');\n+-------------------------------------------+\n| MICROSECOND(\'2009-12-31 23:59:59.000010\') |\n+-------------------------------------------+\n| 10 |\n+-------------------------------------------+\n \nSELECT MICROSECOND(\'2013-08-07 12:13:14\');\n+------------------------------------+\n| MICROSECOND(\'2013-08-07 12:13:14\') |\n+------------------------------------+\n| 0 |\n+------------------------------------+\n \nSELECT MICROSECOND(\'2013-08-07\');\n+---------------------------+\n| MICROSECOND(\'2013-08-07\') |\n+---------------------------+\n| 0 |\n+---------------------------+\n1 row in set, 1 warning (0.00 sec)\n \nSHOW WARNINGS;\n \n+---------+------+----------------------------------------------+\n| Level | Code | Message |\n+---------+------+----------------------------------------------+\n| Warning | 1292 | Truncated incorrect time value:\n\'2013-08-07\' |\n+---------+------+----------------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/microsecond/','','https://mariadb.com/kb/en/library/microsecond/'),(497,'NOW',31,'Syntax\n------ \nNOW([precision])\nCURRENT_TIMESTAMP\nCURRENT_TIMESTAMP([precision])\nLOCALTIME, LOCALTIME([precision])\nLOCALTIMESTAMP\nLOCALTIMESTAMP([precision])\n \nDescription\n----------- \nReturns the current date and time as a value in \'YYYY-MM-DD\nHH:MM:SS\'\nor YYYYMMDDHHMMSS.uuuuuu format, depending on whether the\nfunction is\nused in a string or numeric context. The value is expressed\nin the\ncurrent time zone.\n \nThe optional precision determines the microsecond precision.\nSee Microseconds in MariaDB.\n \nNOW() (or its synonyms) can be used as the default value for\nTIMESTAMP columns as well as, since MariaDB 10.0.1, DATETIME\ncolumns. Before MariaDB 10.0.1, it was only possible for a\nsingle TIMESTAMP column per table to contain the\nCURRENT_TIMESTAMP as its default.\n \nWhen displayed in the INFORMATION_SCHEMA.COLUMNS table, a\ndefault CURRENT TIMESTAMP is displayed as CURRENT_TIMESTAMP\nup until MariaDB 10.2.2, and as current_timestamp() from\nMariaDB 10.2.3, due to to MariaDB 10.2 accepting expressions\nin the DEFAULT clause.\n \nExamples\n-------- \nSELECT NOW();\n+---------------------+\n| NOW() |\n+---------------------+\n| 2010-03-27 13:13:25 |\n+---------------------+\n \nSELECT NOW() + 0;\n \n+-----------------------+\n| NOW() + 0 |\n+-----------------------+\n| 20100327131329.000000 |\n+-----------------------+\n \nWith precision:\n \nSELECT CURRENT_TIMESTAMP(2);\n+------------------------+\n| CURRENT_TIMESTAMP(2) |\n+------------------------+\n| 2018-07-10 09:47:26.24 |\n+------------------------+\n \nUsed as a default TIMESTAMP:\n \nCREATE TABLE t (createdTS TIMESTAMP NOT NULL DEFAULT\nCURRENT_TIMESTAMP);\n \nFrom MariaDB 10.2.2:\n \nSELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE\nTABLE_SCHEMA=\'test\'\n AND COLUMN_NAME LIKE \'%ts%\'\\G\n*************************** 1. row\n***************************\n TABLE_CATALOG: def\n TABLE_SCHEMA: test\n TABLE_NAME: t\n COLUMN_NAME: ts\n ORDINAL_POSITION: 1\n COLUMN_DEFAULT: current_timestamp()\n...\n \n\n\nURL: https://mariadb.com/kb/en/library/now/','','https://mariadb.com/kb/en/library/now/'),(498,'PERIOD_ADD',31,'Syntax\n------ \nPERIOD_ADD(P,N)\n \nDescription\n----------- \nAdds N months to period P. P is in the format YYMM or\nYYYYMM, and is not a date value. If P contains a two-digit\nyear, values from 00 to 69 are converted to from 2000 to\n2069, while values from 70 are converted to 1970 upwards.\n \nReturns a value in the format YYYYMM.\n \nExamples\n-------- \nSELECT PERIOD_ADD(200801,2);\n+----------------------+\n| PERIOD_ADD(200801,2) |\n+----------------------+\n| 200803 |\n+----------------------+\n \nSELECT PERIOD_ADD(6910,2);\n+--------------------+\n| PERIOD_ADD(6910,2) |\n+--------------------+\n| 206912 |\n+--------------------+\n \nSELECT PERIOD_ADD(7010,2);\n+--------------------+\n| PERIOD_ADD(7010,2) |\n+--------------------+\n| 197012 |\n+--------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/period_add/','','https://mariadb.com/kb/en/library/period_add/'),(499,'PERIOD_DIFF',31,'Syntax\n------ \nPERIOD_DIFF(P1,P2)\n \nDescription\n----------- \nReturns the number of months between periods P1 and P2. P1\nand P2 \ncan be in the format YYMM or YYYYMM, and are not date\nvalues.\n \nIf P1 or P2 contains a two-digit year, values from 00 to 69\nare converted to from 2000 to 2069, while values from 70 are\nconverted to 1970 upwards.\n \nExamples\n-------- \nSELECT PERIOD_DIFF(200802,200703);\n+----------------------------+\n| PERIOD_DIFF(200802,200703) |\n+----------------------------+\n| 11 |\n+----------------------------+\n \nSELECT PERIOD_DIFF(6902,6803);\n+------------------------+\n| PERIOD_DIFF(6902,6803) |\n+------------------------+\n| 11 |\n+------------------------+\n \nSELECT PERIOD_DIFF(7002,6803);\n+------------------------+\n| PERIOD_DIFF(7002,6803) |\n+------------------------+\n| -1177 |\n+------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/period_diff/','','https://mariadb.com/kb/en/library/period_diff/'),(502,'SEC_TO_TIME',31,'Syntax\n------ \nSEC_TO_TIME(seconds)\n \nDescription\n----------- \nReturns the seconds argument, converted to hours, minutes,\nand\nseconds, as a TIME value. The range of the result is\nconstrained to\nthat of the TIME data type. A warning occurs if the argument\ncorresponds to a value outside that range.\n \nThe time will be returned in the format hh:mm:ss, or hhmmss\nif used in a numeric calculation.\n \nExamples\n-------- \nSELECT SEC_TO_TIME(12414);\n+--------------------+\n| SEC_TO_TIME(12414) |\n+--------------------+\n| 03:26:54 |\n+--------------------+\n \nSELECT SEC_TO_TIME(12414)+0;\n \n+----------------------+\n| SEC_TO_TIME(12414)+0 |\n+----------------------+\n| 32654 |\n+----------------------+\n \nSELECT SEC_TO_TIME(9999999);\n+----------------------+\n| SEC_TO_TIME(9999999) |\n+----------------------+\n| 838:59:59 |\n+----------------------+\n1 row in set, 1 warning (0.00 sec)\n \nSHOW WARNINGS;\n \n+---------+------+-------------------------------------------+\n| Level | Code | Message |\n+---------+------+-------------------------------------------+\n| Warning | 1292 | Truncated incorrect time value:\n\'9999999\' |\n+---------+------+-------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/sec_to_time/','','https://mariadb.com/kb/en/library/sec_to_time/'),(503,'STR_TO_DATE',31,'Syntax\n------ \nSTR_TO_DATE(str,format)\n \nDescription\n----------- \nThis is the inverse of the DATE_FORMAT() function. It takes\na string str and a format string format. STR_TO_DATE()\nreturns a\nDATETIME value if the format string contains both date and\ntime parts, or a\nDATE or TIME value if the string contains only date or time\nparts.\n \nThe date, time, or datetime values contained in str should\nbe given in the format indicated by format. If str contains\nan illegal date, time, or datetime value, STR_TO_DATE()\nreturns NULL. An illegal value also produces a warning.\n \nThe options that can be used by STR_TO_DATE(), as well as\nits inverse DATE_FORMAT() and the FROM_UNIXTIME() function,\nare:\n \nOption | Description | \n \n%a | Short weekday name in current locale (Variable\nlc_time_names). | \n \n%b | Short form month name in current locale. For locale\nen_US this is one of:\nJan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov or Dec. | \n \n%c | Month with 1 or 2 digits. | \n \n%D | Day with English suffix \'th\', \'nd\', \'st\' or\n\'rd\'\'. (1st, 2nd, 3rd...). | \n \n%d | Day with 2 digits. | \n \n%e | Day with 1 or 2 digits. | \n \n%f | Sub seconds 6 digits. | \n \n%H | Hour with 2 digits between 00-23. | \n \n%h | Hour with 2 digits between 01-12. | \n \n%I | Hour with 2 digits between 01-12. | \n \n%i | Minute with 2 digits. | \n \n%j | Day of the year (001-366) | \n \n%k | Hour with 1 digits between 0-23. | \n \n%l | Hour with 1 digits between 1-12. | \n \n%M | Full month name in current locale (Variable\nlc_time_names). | \n \n%m | Month with 2 digits. | \n \n%p | AM/PM according to current locale (Variable\nlc_time_names). | \n \n%r | Time in 12 hour format, followed by AM/PM. Short for\n\'%I:%i:%S %p\'. | \n \n%S | Seconds with 2 digits. | \n \n%s | Seconds with 2 digits. | \n \n%T | Time in 24 hour format. Short for \'%H:%i:%S\'. | \n \n%U | Week number (00-53), when first day of the week is\nSunday. | \n \n%u | Week number (00-53), when first day of the week is\nMonday. | \n \n%V | Week number (01-53), when first day of the week is\nSunday. Used with %X. | \n \n%v | Week number (01-53), when first day of the week is\nMonday. Used with %x. | \n \n%W | Full weekday name in current locale (Variable\nlc_time_names). | \n \n%w | Day of the week. 0 = Sunday, 6 = Saturday. | \n \n%X | Year with 4 digits when first day of the week is\nSunday. Used with %V. | \n \n%x | Year with 4 digits when first day of the week is\nMonday. Used with %v. | \n \n%Y | Year with 4 digits. | \n \n%y | Year with 2 digits. | \n \n%# | For str_to_date(), skip all numbers. | \n \n%. | For str_to_date(), skip all punctation characters. | \n \n%@ | For str_to_date(), skip all alpha characters. | \n \n%% | A literal % character. | \n \nExamples\n-------- \nSELECT STR_TO_DATE(\'Wednesday, June 2, 2014\', \'%W, %M %e,\n%Y\');\n+---------------------------------------------------------+\n| STR_TO_DATE(\'Wednesday, June 2, 2014\', \'%W, %M %e,\n%Y\') |\n+---------------------------------------------------------+\n| 2014-06-02 |\n+---------------------------------------------------------+\n \nSELECT STR_TO_DATE(\'Wednesday23423, June 2, 2014\', \'%W,\n%M %e, %Y\');\n+--------------------------------------------------------------+\n| STR_TO_DATE(\'Wednesday23423, June 2, 2014\', \'%W, %M %e,\n%Y\') |\n+--------------------------------------------------------------+\n| NULL |\n+--------------------------------------------------------------+\n1 row in set, 1 warning (0.00 sec)\n \nSHOW WARNINGS;\n \n+---------+------+-----------------------------------------------------------------------------------+\n| Level | Code | Message |\n+---------+------+-----------------------------------------------------------------------------------+\n| Warning | 1411 | Incorrect datetime value:\n\'Wednesday23423, June 2, 2014\' for function str_to_date |\n+---------+------+-----------------------------------------------------------------------------------+\n \nSELECT STR_TO_DATE(\'Wednesday23423, June 2, 2014\', \'%W%#,\n%M %e, %Y\');\n+----------------------------------------------------------------+\n| STR_TO_DATE(\'Wednesday23423, June 2, 2014\', \'%W%#, %M\n%e, %Y\') |\n+----------------------------------------------------------------+\n| 2014-06-02 |\n+----------------------------------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/str_to_date/','','https://mariadb.com/kb/en/library/str_to_date/'),(504,'SUBDATE',31,'Syntax\n------ \nSUBDATE(date,INTERVAL expr unit), SUBDATE(expr,days)\n \nDescription\n----------- \nWhen invoked with the INTERVAL form of the second argument,\nSUBDATE()\nis a synonym for DATE_SUB(). See Date and Time Units for a\ncomplete list of permitted units. \n \nThe second form allows the use of an integer value for days.\nIn such\ncases, it is interpreted as the number of days to be\nsubtracted from\nthe date or datetime expression expr.\n \nExamples\n-------- \nSELECT DATE_SUB(\'2008-01-02\', INTERVAL 31 DAY);\n+-----------------------------------------+\n| DATE_SUB(\'2008-01-02\', INTERVAL 31 DAY) |\n+-----------------------------------------+\n| 2007-12-02 |\n+-----------------------------------------+\n \nSELECT SUBDATE(\'2008-01-02\', INTERVAL 31 DAY);\n+----------------------------------------+\n| SUBDATE(\'2008-01-02\', INTERVAL 31 DAY) |\n+----------------------------------------+\n| 2007-12-02 |\n+----------------------------------------+\n \nSELECT SUBDATE(\'2008-01-02 12:00:00\', 31);\n+------------------------------------+\n| SUBDATE(\'2008-01-02 12:00:00\', 31) |\n+------------------------------------+\n| 2007-12-02 12:00:00 |\n+------------------------------------+\n \nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n \nSELECT d, SUBDATE(d, 10) from t1;\n \n+---------------------+---------------------+\n| d | SUBDATE(d, 10) |\n+---------------------+---------------------+\n| 2007-01-30 21:31:07 | 2007-01-20 21:31:07 |\n| 1983-10-15 06:42:51 | 1983-10-05 06:42:51 |\n| 2011-04-21 12:34:56 | 2011-04-11 12:34:56 |\n| 2011-10-30 06:31:41 | 2011-10-20 06:31:41 |\n| 2011-01-30 14:03:25 | 2011-01-20 14:03:25 |\n| 2004-10-07 11:19:34 | 2004-09-27 11:19:34 |\n+---------------------+---------------------+\n \nSELECT d, SUBDATE(d, INTERVAL 10 MINUTE) from t1;\n \n+---------------------+--------------------------------+\n| d | SUBDATE(d, INTERVAL 10 MINUTE) |\n+---------------------+--------------------------------+\n| 2007-01-30 21:31:07 | 2007-01-30 21:21:07 |\n| 1983-10-15 06:42:51 | 1983-10-15 06:32:51 |\n| 2011-04-21 12:34:56 | 2011-04-21 12:24:56 |\n| 2011-10-30 06:31:41 | 2011-10-30 06:21:41 |\n| 2011-01-30 14:03:25 | 2011-01-30 13:53:25 |\n| 2004-10-07 11:19:34 | 2004-10-07 11:09:34 |\n+---------------------+--------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/subdate/','','https://mariadb.com/kb/en/library/subdate/'),(505,'SUBTIME',31,'Syntax\n------ \nSUBTIME(expr1,expr2)\n \nDescription\n----------- \nSUBTIME() returns expr1 - expr2 expressed as a value in the\nsame\nformat as expr1. expr1 is a time or datetime expression, and\nexpr2 is\na time expression.\n \nExamples\n-------- \nSELECT SUBTIME(\'2007-12-31 23:59:59.999999\',\'1\n1:1:1.000002\');\n+--------------------------------------------------------+\n| SUBTIME(\'2007-12-31 23:59:59.999999\',\'1 1:1:1.000002\')\n|\n+--------------------------------------------------------+\n| 2007-12-30 22:58:58.999997 |\n+--------------------------------------------------------+\n \nSELECT SUBTIME(\'01:00:00.999999\', \'02:00:00.999998\');\n+-----------------------------------------------+\n| SUBTIME(\'01:00:00.999999\', \'02:00:00.999998\') |\n+-----------------------------------------------+\n| -00:59:59.999999 |\n+-----------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/subtime/','','https://mariadb.com/kb/en/library/subtime/'),(506,'SYSDATE',31,'Syntax\n------ \nSYSDATE([precision])\n \nDescription\n----------- \nReturns the current date and time as a value in \'YYYY-MM-DD\nHH:MM:SS\'\nor YYYYMMDDHHMMSS.uuuuuu format, depending on whether the\nfunction is\nused in a string or numeric context.\n \nThe optional precision determines the microsecond precision.\nSee Microseconds in MariaDB.\n \nSYSDATE() returns the time at which it executes. This\ndiffers from the\nbehavior for NOW(), which returns a constant time that\nindicates the\ntime at which the statement began to execute. (Within a\nstored routine\nor trigger, NOW() returns the time at which the routine or\ntriggering\nstatement began to execute.)\n \nIn addition, changing the timestamp system variable with a\nSET timestamp statement affects the value returned by\nNOW() but not by SYSDATE(). This means that timestamp\nsettings in the\nbinary log have no effect on invocations of SYSDATE().\n \nBecause SYSDATE() can return different values even within\nthe same\nstatement, and is not affected by SET TIMESTAMP, it is\nnon-deterministic and therefore unsafe for replication if\nstatement-based binary logging is used. If that is a\nproblem, you can\nuse row-based logging, or start the server with the mysqld\noption --sysdate-is-now to cause SYSDATE() to be an alias\nfor NOW(). The non-deterministic nature of SYSDATE() also\nmeans that indexes cannot be used for evaluating expressions\nthat refer to it, and that statements using the SYSDATE()\nfunction are unsafe for statement-based replication.\n \nExamples\n-------- \nDifference between NOW() and SYSDATE():\n \nSELECT NOW(), SLEEP(2), NOW();\n+---------------------+----------+---------------------+\n| NOW() | SLEEP(2) | NOW() |\n+---------------------+----------+---------------------+\n| 2010-03-27 13:23:40 | 0 | 2010-03-27 13:23:40 |\n+---------------------+----------+---------------------+\n \nSELECT SYSDATE(), SLEEP(2), SYSDATE();\n+---------------------+----------+---------------------+\n| SYSDATE() | SLEEP(2) | SYSDATE() |\n+---------------------+----------+---------------------+\n| 2010-03-27 13:23:52 | 0 | 2010-03-27 13:23:54 |\n+---------------------+----------+---------------------+\n \nWith precision:\n \nSELECT SYSDATE(4);\n+--------------------------+\n| SYSDATE(4) |\n+--------------------------+\n| 2018-07-10 10:17:13.1689 |\n+--------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/sysdate/','','https://mariadb.com/kb/en/library/sysdate/'),(508,'TIMEDIFF',31,'Syntax\n------ \nTIMEDIFF(expr1,expr2)\n \nDescription\n----------- \nTIMEDIFF() returns expr1 - expr2 expressed as a time value.\nexpr1 and\nexpr2 are time or date-and-time expressions, but both must\nbe of the\nsame type.\n \nExamples\n-------- \nSELECT TIMEDIFF(\'2000:01:01 00:00:00\', \'2000:01:01\n00:00:00.000001\');\n+---------------------------------------------------------------+\n| TIMEDIFF(\'2000:01:01 00:00:00\', \'2000:01:01\n00:00:00.000001\') |\n+---------------------------------------------------------------+\n| -00:00:00.000001 |\n+---------------------------------------------------------------+\n \nSELECT TIMEDIFF(\'2008-12-31 23:59:59.000001\', \'2008-12-30\n01:01:01.000002\');\n+----------------------------------------------------------------------+\n| TIMEDIFF(\'2008-12-31 23:59:59.000001\', \'2008-12-30\n01:01:01.000002\') |\n+----------------------------------------------------------------------+\n| 46:58:57.999999 |\n+----------------------------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/timediff/','','https://mariadb.com/kb/en/library/timediff/'),(509,'TIMESTAMP FUNCTION',31,'Syntax\n------ \nTIMESTAMP(expr), TIMESTAMP(expr1,expr2)\n \nDescription\n----------- \nWith a single argument, this function returns the date or\ndatetime\nexpression expr as a datetime value. With two arguments, it\nadds the\ntime expression expr2 to the date or datetime expression\nexpr1 and\nreturns the result as a datetime value.\n \nExamples\n-------- \nSELECT TIMESTAMP(\'2003-12-31\');\n+-------------------------+\n| TIMESTAMP(\'2003-12-31\') |\n+-------------------------+\n| 2003-12-31 00:00:00 |\n+-------------------------+\n \nSELECT TIMESTAMP(\'2003-12-31 12:00:00\',\'6:30:00\');\n+--------------------------------------------+\n| TIMESTAMP(\'2003-12-31 12:00:00\',\'6:30:00\') |\n+--------------------------------------------+\n| 2003-12-31 18:30:00 |\n+--------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/timestamp-function/','','https://mariadb.com/kb/en/library/timestamp-function/'),(510,'TIMESTAMPADD',31,'Syntax\n------ \nTIMESTAMPADD(unit,interval,datetime_expr)\n \nDescription\n----------- \nAdds the integer expression interval to the date or datetime\nexpression datetime_expr. The unit for interval is given by\nthe unit\nargument, which should be one of the following values:\nMICROSECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH,\nQUARTER, or YEAR.\n \nThe unit value may be specified using one of keywords as\nshown, or\nwith a prefix of SQL_TSI_. For example, DAY and SQL_TSI_DAY\nboth are\nlegal.\n \nBefore MariaDB 5.5, FRAC_SECOND was permitted as a synonym\nfor MICROSECOND.\n \nExamples\n-------- \nSELECT TIMESTAMPADD(MINUTE,1,\'2003-01-02\');\n+-------------------------------------+\n| TIMESTAMPADD(MINUTE,1,\'2003-01-02\') |\n+-------------------------------------+\n| 2003-01-02 00:01:00 |\n+-------------------------------------+\n \nSELECT TIMESTAMPADD(WEEK,1,\'2003-01-02\');\n+-----------------------------------+\n| TIMESTAMPADD(WEEK,1,\'2003-01-02\') |\n+-----------------------------------+\n| 2003-01-09 |\n+-----------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/timestampadd/','','https://mariadb.com/kb/en/library/timestampadd/'),(511,'TIMESTAMPDIFF',31,'Syntax\n------ \nTIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)\n \nDescription\n----------- \nReturns datetime_expr2 - datetime_expr1, where\ndatetime_expr1 and\ndatetime_expr2 are date or datetime expressions. One\nexpression may be\na date and the other a datetime; a date value is treated as\na datetime\nhaving the time part \'00:00:00\' where necessary. The unit\nfor the\nresult (an integer) is given by the unit argument. The legal\nvalues\nfor unit are the same as those listed in the description of\nthe\nTIMESTAMPADD() function, i.e MICROSECOND, SECOND, MINUTE,\nHOUR, DAY, WEEK, MONTH, QUARTER, or YEAR.\n \nTIMESTAMPDIFF can also be used to calculate age.\n \nExamples\n-------- \nSELECT TIMESTAMPDIFF(MONTH,\'2003-02-01\',\'2003-05-01\');\n+------------------------------------------------+\n| TIMESTAMPDIFF(MONTH,\'2003-02-01\',\'2003-05-01\') |\n+------------------------------------------------+\n| 3 |\n+------------------------------------------------+\n \nSELECT TIMESTAMPDIFF(YEAR,\'2002-05-01\',\'2001-01-01\');\n+-----------------------------------------------+\n| TIMESTAMPDIFF(YEAR,\'2002-05-01\',\'2001-01-01\') |\n+-----------------------------------------------+\n| -1 |\n+-----------------------------------------------+\n \nSELECT TIMESTAMPDIFF(MINUTE,\'2003-02-01\',\'2003-05-01\n12:05:55\');\n+----------------------------------------------------------+\n| TIMESTAMPDIFF(MINUTE,\'2003-02-01\',\'2003-05-01\n12:05:55\') |\n+----------------------------------------------------------+\n| 128885 |\n+----------------------------------------------------------+\n \nCalculating age:\n \nSELECT CURDATE();\n+------------+\n| CURDATE() |\n+------------+\n| 2019-05-27 |\n+------------+\n \nSELECT TIMESTAMPDIFF(YEAR, \'1971-06-06\', CURDATE()) AS\nage;\n \n+------+\n| age |\n+------+\n| 47 |\n+------+\n \nSELECT TIMESTAMPDIFF(YEAR, \'1971-05-06\', CURDATE()) AS\nage;\n \n+------+\n| age |\n+------+\n| 48 |\n+------+\n \nAge as of 2014-08-02:\n \nSELECT name, date_of_birth,\nTIMESTAMPDIFF(YEAR,date_of_birth,\'2014-08-02\') AS age \n FROM student_details;\n \n+---------+---------------+------+\n| name | date_of_birth | age |\n+---------+---------------+------+\n| Chun | 1993-12-31 | 20 |\n| Esben | 1946-01-01 | 68 |\n| Kaolin | 1996-07-16 | 18 |\n| Tatiana | 1988-04-13 | 26 |\n+---------+---------------+------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/timestampdiff/','','https://mariadb.com/kb/en/library/timestampdiff/'),(514,'TO_DAYS',31,'Syntax\n------ \nTO_DAYS(date)\n \nDescription\n----------- \nGiven a date date, returns the number of days since the\nstart of the current calendar (0000-00-00).\n \nThe function is not designed for use with dates before the\nadvent of the Gregorian calendar in October 1582. Results\nwill not be reliable since it doesn\'t account for the lost\ndays when the calendar changed from the Julian calendar.\n \nThis is the converse of the FROM_DAYS() function.\n \nExamples\n-------- \nSELECT TO_DAYS(\'2007-10-07\');\n+-----------------------+\n| TO_DAYS(\'2007-10-07\') |\n+-----------------------+\n| 733321 |\n+-----------------------+\n \nSELECT TO_DAYS(\'0000-01-01\');\n+-----------------------+\n| TO_DAYS(\'0000-01-01\') |\n+-----------------------+\n| 1 |\n+-----------------------+\n \nSELECT TO_DAYS(950501);\n+-----------------+\n| TO_DAYS(950501) |\n+-----------------+\n| 728779 |\n+-----------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/to_days/','','https://mariadb.com/kb/en/library/to_days/'),(515,'TO_SECONDS',31,'Syntax\n------ \nTO_SECONDS(expr)\n \nDescription\n----------- \nReturns the number of seconds from year 0 till expr, or NULL\nif expr is not a valid date or datetime.\n \nExamples\n-------- \nSELECT TO_SECONDS(\'2013-06-13\');\n+--------------------------+\n| TO_SECONDS(\'2013-06-13\') |\n+--------------------------+\n| 63538300800 |\n+--------------------------+\n \nSELECT TO_SECONDS(\'2013-06-13 21:45:13\');\n+-----------------------------------+\n| TO_SECONDS(\'2013-06-13 21:45:13\') |\n+-----------------------------------+\n| 63538379113 |\n+-----------------------------------+\n \nSELECT TO_SECONDS(NOW());\n+-------------------+\n| TO_SECONDS(NOW()) |\n+-------------------+\n| 63543530875 |\n+-------------------+\n \nSELECT TO_SECONDS(20130513);\n+----------------------+\n| TO_SECONDS(20130513) |\n+----------------------+\n| 63535622400 |\n+----------------------+\n1 row in set (0.00 sec)\n \nSELECT TO_SECONDS(130513);\n+--------------------+\n| TO_SECONDS(130513) |\n+--------------------+\n| 63535622400 |\n+--------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/to_seconds/','','https://mariadb.com/kb/en/library/to_seconds/'),(516,'UNIX_TIMESTAMP',31,'Syntax\n------ \nUNIX_TIMESTAMP()\nUNIX_TIMESTAMP(date)\n \nDescription\n----------- \nIf called with no argument, returns a Unix timestamp\n(seconds since\n\'1970-01-01 00:00:00\' UTC) as an unsigned integer. If\nUNIX_TIMESTAMP()\nis called with a date argument, it returns the value of the\nargument as seconds\nsince \'1970-01-01 00:00:00\' UTC. date may be a DATE\nstring, a\nDATETIME string, a TIMESTAMP, or a number in\nthe format YYMMDD or YYYYMMDD. The server interprets date as\na value in the\ncurrent time zone and converts it to an internal value in\nUTC. Clients can set\ntheir time zone as described in time zones.\n \nThe inverse function of UNIX_TIMESTAMP() is FROM_UNIXTIME()\n \nUNIX_TIMESTAMP() supports microseconds.\n \nTimestamps in MariaDB have a maximum value of 2147483647,\nequivalent to 2038-01-19 05:14:07. This is due to the\nunderlying 32-bit limitation. Using the function on a date\nbeyond this will result in NULL being returned. Use DATETIME\nas a storage type if you require dates beyond this.\n \nError Handling\n \nReturns NULL for wrong arguments to UNIX_TIMESTAMP(). In\nMySQL and MariaDB before 5.3 wrong arguments to\nUNIX_TIMESTAMP() returned 0. \n \nCompatibility\n \nAs you can see in the examples above,\nUNIX_TIMESTAMP(constant-date-string) returns a timestamp\nwith 6 decimals while MariaDB 5.2 and before returns it\nwithout decimals. This can cause a problem if you are using\nUNIX_TIMESTAMP() as a partitioning function. You can fix\nthis by using FLOOR(UNIX_TIMESTAMP(..)) or changing the date\nstring to a date number, like 20080101000000. \n \nExamples\n-------- \nSELECT UNIX_TIMESTAMP();\n+------------------+\n| UNIX_TIMESTAMP() |\n+------------------+\n| 1269711082 |\n+------------------+\n \nSELECT UNIX_TIMESTAMP(\'2007-11-30 10:30:19\');\n+---------------------------------------+\n| UNIX_TIMESTAMP(\'2007-11-30 10:30:19\') |\n+---------------------------------------+\n| 1196436619.000000 |\n+---------------------------------------+\n \nSELECT UNIX_TIMESTAMP(\"2007-11-30 10:30:19.123456\");\n+----------------------------------------------+\n| unix_timestamp(\"2007-11-30 10:30:19.123456\") |\n+----------------------------------------------+\n| 1196411419.123456 |\n+----------------------------------------------+\n \nSELECT FROM_UNIXTIME(UNIX_TIMESTAMP(\'2007-11-30\n10:30:19\'));\n+------------------------------------------------------+\n| FROM_UNIXTIME(UNIX_TIMESTAMP(\'2007-11-30 10:30:19\')) |\n+------------------------------------------------------+\n| 2007-11-30 10:30:19.000000 |\n+------------------------------------------------------+\n \nSELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(\'2007-11-30\n10:30:19\')));\n+-------------------------------------------------------------+\n| FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(\'2007-11-30\n10:30:19\'))) |\n+-------------------------------------------------------------+\n| 2007-11-30 10:30:19 |\n+-------------------------------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/unix_timestamp/','','https://mariadb.com/kb/en/library/unix_timestamp/'),(519,'UTC_TIMESTAMP',31,'Syntax\n------ \nUTC_TIMESTAMP\nUTC_TIMESTAMP([precision])\n \nDescription\n----------- \nReturns the current UTC date and time as a value in\n\'YYYY-MM-DD\nHH:MM:SS\' or YYYYMMDDHHMMSS.uuuuuu format, depending on\nwhether the\nfunction is used in a string or numeric context.\n \nThe optional precision determines the microsecond precision.\nSee Microseconds in MariaDB.\n \nExamples\n-------- \nSELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0;\n \n+---------------------+-----------------------+\n| UTC_TIMESTAMP() | UTC_TIMESTAMP() + 0 |\n+---------------------+-----------------------+\n| 2010-03-27 17:33:16 | 20100327173316.000000 |\n+---------------------+-----------------------+\n \nWith precision:\n \nSELECT UTC_TIMESTAMP(4);\n+--------------------------+\n| UTC_TIMESTAMP(4) |\n+--------------------------+\n| 2018-07-10 07:51:09.1019 |\n+--------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/utc_timestamp/','','https://mariadb.com/kb/en/library/utc_timestamp/'),(520,'WEEK',31,'Syntax\n------ \nWEEK(date[,mode])\n \nDescription\n----------- \nThis function returns the week number for date. The\ntwo-argument form of\nWEEK() allows you to specify whether the week starts on\nSunday or Monday\nand whether the return value should be in the range from 0\nto 53 or from 1 to\n53. If the mode argument is omitted, the value of the\ndefault_week_format system variable is used.\n \nModes\n \nMode | 1st day of week | Range | Week 1 is the 1st week with\n| \n \n0 | Sunday | 0-53 | a Sunday in this year | \n \n1 | Monday | 0-53 | more than 3 days this year | \n \n2 | Sunday | 1-53 | a Sunday in this year | \n \n3 | Monday | 1-53 | more than 3 days this year | \n \n4 | Sunday | 0-53 | more than 3 days this year | \n \n5 | Monday | 0-53 | a Monday in this year | \n \n6 | Sunday | 1-53 | more than 3 days this year | \n \n7 | Monday | 1-53 | a Monday in this year | \n \nExamples\n-------- \nSELECT WEEK(\'2008-02-20\');\n+--------------------+\n| WEEK(\'2008-02-20\') |\n+--------------------+\n| 7 |\n+--------------------+\n \nSELECT WEEK(\'2008-02-20\',0);\n+----------------------+\n| WEEK(\'2008-02-20\',0) |\n+----------------------+\n| 7 |\n+----------------------+\n \nSELECT WEEK(\'2008-02-20\',1);\n+----------------------+\n| WEEK(\'2008-02-20\',1) |\n+----------------------+\n| 8 |\n+----------------------+\n \nSELECT WEEK(\'2008-12-31\',0);\n+----------------------+\n| WEEK(\'2008-12-31\',0) |\n+----------------------+\n| 52 |\n+----------------------+\n \nSELECT WEEK(\'2008-12-31\',1);\n+----------------------+\n| WEEK(\'2008-12-31\',1) |\n+----------------------+\n| 53 |\n+----------------------+\n \nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n \nSELECT d, WEEK(d,0), WEEK(d,1) from t1;\n \n+---------------------+-----------+-----------+\n| d | WEEK(d,0) | WEEK(d,1) |\n+---------------------+-----------+-----------+\n| 2007-01-30 21:31:07 | 4 | 5 |\n| 1983-10-15 06:42:51 | 41 | 41 |\n| 2011-04-21 12:34:56 | 16 | 16 |\n| 2011-10-30 06:31:41 | 44 | 43 |\n| 2011-01-30 14:03:25 | 5 | 4 |\n| 2004-10-07 11:19:34 | 40 | 41 |\n+---------------------+-----------+-----------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/week/','','https://mariadb.com/kb/en/library/week/'),(521,'WEEKDAY',31,'Syntax\n------ \nWEEKDAY(date)\n \nDescription\n----------- \nReturns the weekday index for date \n(0 = Monday, 1 = Tuesday, ... 6 = Sunday).\n \nThis contrasts with DAYOFWEEK() which follows the ODBC\nstandard\n(1 = Sunday, 2 = Monday, ..., 7 = Saturday).\n \nExamples\n-------- \nSELECT WEEKDAY(\'2008-02-03 22:23:00\');\n+--------------------------------+\n| WEEKDAY(\'2008-02-03 22:23:00\') |\n+--------------------------------+\n| 6 |\n+--------------------------------+\n \nSELECT WEEKDAY(\'2007-11-06\');\n+-----------------------+\n| WEEKDAY(\'2007-11-06\') |\n+-----------------------+\n| 1 |\n+-----------------------+\n \nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n \nSELECT d FROM t1 where WEEKDAY(d) = 6;\n \n+---------------------+\n| d |\n+---------------------+\n| 2011-10-30 06:31:41 |\n| 2011-01-30 14:03:25 |\n+---------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/weekday/','','https://mariadb.com/kb/en/library/weekday/'),(522,'WEEKOFYEAR',31,'Syntax\n------ \nWEEKOFYEAR(date)\n \nDescription\n----------- \nReturns the calendar week of the date as a number in the\nrange from 1\nto 53. WEEKOFYEAR() is a compatibility function that is\nequivalent to\nWEEK(date,3).\n \nExamples\n-------- \nSELECT WEEKOFYEAR(\'2008-02-20\');\n+--------------------------+\n| WEEKOFYEAR(\'2008-02-20\') |\n+--------------------------+\n| 8 |\n+--------------------------+\n \nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n \n select * from t1;\n \n+---------------------+\n| d |\n+---------------------+\n| 2007-01-30 21:31:07 |\n| 1983-10-15 06:42:51 |\n| 2011-04-21 12:34:56 |\n| 2011-10-30 06:31:41 |\n| 2011-01-30 14:03:25 |\n| 2004-10-07 11:19:34 |\n+---------------------+\n \nSELECT d, WEEKOFYEAR(d), WEEK(d,3) from t1;\n \n+---------------------+---------------+-----------+\n| d | WEEKOFYEAR(d) | WEEK(d,3) |\n+---------------------+---------------+-----------+\n| 2007-01-30 21:31:07 | 5 | 5 |\n| 1983-10-15 06:42:51 | 41 | 41 |\n| 2011-04-21 12:34:56 | 16 | 16 |\n| 2011-10-30 06:31:41 | 43 | 43 |\n| 2011-01-30 14:03:25 | 4 | 4 |\n| 2004-10-07 11:19:34 | 41 | 41 |\n+---------------------+---------------+-----------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/weekofyear/','','https://mariadb.com/kb/en/library/weekofyear/'),(523,'YEAR',31,'Syntax\n------ \nYEAR(date)\n \nDescription\n----------- \nReturns the year for the given date, in the range 1000 to\n9999, or 0 for the\n\"zero\" date.\n \nExamples\n-------- \nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n \nSELECT * FROM t1;\n \n+---------------------+\n| d |\n+---------------------+\n| 2007-01-30 21:31:07 |\n| 1983-10-15 06:42:51 |\n| 2011-04-21 12:34:56 |\n| 2011-10-30 06:31:41 |\n| 2011-01-30 14:03:25 |\n| 2004-10-07 11:19:34 |\n+---------------------+\n \nSELECT * FROM t1 WHERE YEAR(d) = 2011;\n \n+---------------------+\n| d |\n+---------------------+\n| 2011-04-21 12:34:56 |\n| 2011-10-30 06:31:41 |\n| 2011-01-30 14:03:25 |\n+---------------------+\n \nSELECT YEAR(\'1987-01-01\');\n+--------------------+\n| YEAR(\'1987-01-01\') |\n+--------------------+\n| 1987 |\n+--------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/year/','','https://mariadb.com/kb/en/library/year/'),(524,'YEARWEEK',31,'Syntax\n------ \nYEARWEEK(date), YEARWEEK(date,mode)\n \nDescription\n----------- \nReturns year and week for a date. The mode argument works\nexactly like the mode\nargument to WEEK(). The year in the result may be different\nfrom the\nyear in the date argument for the first and the last week of\nthe year.\n \nExamples\n-------- \nSELECT YEARWEEK(\'1987-01-01\');\n+------------------------+\n| YEARWEEK(\'1987-01-01\') |\n+------------------------+\n| 198652 |\n+------------------------+\n \nCREATE TABLE t1 (d DATETIME);\nINSERT INTO t1 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\n \nSELECT * FROM t1;\n \n+---------------------+\n| d |\n+---------------------+\n| 2007-01-30 21:31:07 |\n| 1983-10-15 06:42:51 |\n| 2011-04-21 12:34:56 |\n| 2011-10-30 06:31:41 |\n| 2011-01-30 14:03:25 |\n| 2004-10-07 11:19:34 |\n+---------------------+\n6 rows in set (0.02 sec)\n \nSELECT YEARWEEK(d) FROM t1 WHERE YEAR(d) = 2011;\n \n+-------------+\n| YEARWEEK(d) |\n+-------------+\n| 201116 |\n| 201144 |\n| 201105 |\n+-------------+\n3 rows in set (0.03 sec)\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/yearweek/','','https://mariadb.com/kb/en/library/yearweek/'),(525,'Well-Known Binary (WKB) Format',32,'WKB stands for Well-Known Binary, a format for representing\ngeographical and geometrical data.\n \nWKB uses 1-byte unsigned integers, 4-byte unsigned integers,\nand 8-byte double-precision numbers.\nThe first byte indicates the byte order. 00 for big endian,\nor 01 for little endian.\nThe next 4 bytes indicate the geometry type. Values from 1\nto 7 indicate whether the type is Point, LineString,\nPolygon, MultiPoint, MultiLineString, MultiPolygon, or\nGeometryCollection respectively. \nThe 8-byte floats represent the co-ordinates.\n \nTake the following example, a sequence of 21 bytes each\nrepresented by two hex digits:\n \n000000000140000000000000004010000000000000\nIt\'s big endian\n000000000140000000000000004010000000000000\n \nIt\'s a POINT\n000000000140000000000000004010000000000000\n \nThe X co-ordinate is 2.0\n000000000140000000000000004010000000000000\n \nThe Y-co-ordinate is 4.0\n000000000140000000000000004010000000000000\n \n\n \n \n \n \n \n \n \n \n\nURL:\nhttps://mariadb.com/kb/en/library/well-known-binary-wkb-format/','','https://mariadb.com/kb/en/library/well-known-binary-wkb-format/'),(530,'MPolyFromWKB',32,'Syntax\n------ \nMPolyFromWKB(wkb[,srid])\nMultiPolygonFromWKB(wkb[,srid])\n \nDescription\n----------- \nConstructs a MULTIPOLYGON value using its WKB representation\nand SRID.\n \nMPolyFromWKB() and MultiPolygonFromWKB() are synonyms.\n \nExamples\n-------- \nSET @g = ST_AsBinary(MPointFromText(\'MULTIPOLYGON(((28\n26,28 0,84 0,84 42,28 26),(52 18,66 23,73 9,48 6,52\n18)),((59 18,67 18,67 13,59 13,59 18)))\'));\n \nSELECT ST_AsText(MPolyFromWKB(@g));\n+---------------------------------------------------------------------------------------------------------------+\n| ST_AsText(MPolyFromWKB(@g)) |\n+---------------------------------------------------------------------------------------------------------------+\n| MULTIPOLYGON(((28 26,28 0,84 0,84 42,28 26),(52 18,66\n23,73 9,48 6,52 18)),((59 18,67 18,67 13,59 13,59 18))) |\n+---------------------------------------------------------------------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/mpolyfromwkb/','','https://mariadb.com/kb/en/library/mpolyfromwkb/'),(545,'ST_GeomCollFromWKB',32,'Syntax\n------ \nST_GeomCollFromWKB(wkb[,srid])\nST_GeometryCollectionFromWKB(wkb[,srid])\nGeomCollFromWKB(wkb[,srid])\nGeometryCollectionFromWKB(wkb[,srid])\n \nDescription\n----------- \nConstructs a GEOMETRYCOLLECTION value using its WKB\nrepresentation and SRID.\n \nST_GeomCollFromWKB(), ST_GeometryCollectionFromWKB(),\nGeomCollFromWKB() and GeometryCollectionFromWKB() are\nsynonyms.\n \nExamples\n-------- \nSET @g =\nST_AsBinary(ST_GeomFromText(\'GEOMETRYCOLLECTION(POLYGON((5\n5,10 5,10 10,5 5)),POINT(10 10))\'));\n \nSELECT ST_AsText(ST_GeomCollFromWKB(@g));\n+----------------------------------------------------------------+\n| ST_AsText(ST_GeomCollFromWKB(@g)) |\n+----------------------------------------------------------------+\n| GEOMETRYCOLLECTION(POLYGON((5 5,10 5,10 10,5 5)),POINT(10\n10)) |\n+----------------------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_geomcollfromwkb/','','https://mariadb.com/kb/en/library/st_geomcollfromwkb/'),(565,'ST_BOUNDARY',36,'The ST_BOUNDARY function was introduced in MariaDB 10.1.2\n \nSyntax\n------ \nST_BOUNDARY(g)\nBOUNDARY(g)\n \nDescription\n----------- \nReturns a geometry that is the closure of the combinatorial\nboundary of the geometry value g.\n \nBOUNDARY() is a synonym.\n \nExamples\n-------- \nSELECT ST_AsText(ST_Boundary(ST_GeomFromText(\'LINESTRING(3\n3,0 0, -3 3)\')));\n+----------------------------------------------------------------------+\n| ST_AsText(ST_Boundary(ST_GeomFromText(\'LINESTRING(3 3,0\n0, -3 3)\'))) |\n+----------------------------------------------------------------------+\n| MULTIPOINT(3 3,-3 3) |\n+----------------------------------------------------------------------+\n \nSELECT ST_AsText(ST_Boundary(ST_GeomFromText(\'POLYGON((3\n3,0 0, -3 3, 3 3))\')));\n+--------------------------------------------------------------------------+\n| ST_AsText(ST_Boundary(ST_GeomFromText(\'POLYGON((3 3,0 0,\n-3 3, 3 3))\'))) |\n+--------------------------------------------------------------------------+\n| LINESTRING(3 3,0 0,-3 3,3 3) |\n+--------------------------------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_boundary/','','https://mariadb.com/kb/en/library/st_boundary/'),(567,'ST_ENVELOPE',36,'Syntax\n------ \nST_ENVELOPE(g)\nENVELOPE(g)\n \nDescription\n----------- \nReturns the Minimum Bounding Rectangle (MBR) for the\ngeometry value g. The result is returned as a Polygon value.\n \nThe polygon is defined by the corner points of the bounding\nbox:\n \nPOLYGON((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX\nMINY))\n \nST_ENVELOPE() and ENVELOPE() are synonyms.\n \nExamples\n-------- \nSELECT AsText(ST_ENVELOPE(GeomFromText(\'LineString(1 1,4\n4)\')));\n+----------------------------------------------------------+\n| AsText(ST_ENVELOPE(GeomFromText(\'LineString(1 1,4 4)\')))\n|\n+----------------------------------------------------------+\n| POLYGON((1 1,4 1,4 4,1 4,1 1)) |\n+----------------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_envelope/','','https://mariadb.com/kb/en/library/st_envelope/'),(570,'ST_ISCLOSED',36,'Syntax\n------ \nST_IsClosed(g)\nIsClosed(g)\n \nDescription\n----------- \nReturns 1 if a given LINESTRING\'s start and end points are\nthe same, or 0 if they are not the same. Before MariaDB\n10.1.5, returns NULL if not given a LINESTRING. After\nMariaDB 10.1.5, returns -1.\n \nST_IsClosed() and IsClosed() are synonyms.\n \nExamples\n-------- \nSET @ls = \'LineString(0 0, 0 4, 4 4, 0 0)\';\n \nSELECT ST_ISCLOSED(GEOMFROMTEXT(@ls));\n+--------------------------------+\n| ST_ISCLOSED(GEOMFROMTEXT(@ls)) |\n+--------------------------------+\n| 1 |\n+--------------------------------+\n \nSET @ls = \'LineString(0 0, 0 4, 4 4, 0 1)\';\n \nSELECT ST_ISCLOSED(GEOMFROMTEXT(@ls));\n+--------------------------------+\n| ST_ISCLOSED(GEOMFROMTEXT(@ls)) |\n+--------------------------------+\n| 0 |\n+--------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/st_isclosed/','','https://mariadb.com/kb/en/library/st_isclosed/'),(579,'BINARY Operator',37,'Syntax\n------ \nBINARY\n \nDescription\n----------- \nThe BINARY operator casts the string following it to a\nbinary string. This is an easy way to force a column\ncomparison to be done byte by byte rather than character by\ncharacter. This causes the comparison to be case sensitive\neven if the column isn\'t defined as BINARY or BLOB. \n \nBINARY also causes trailing spaces to be significant.\n \nExamples\n-------- \nSELECT \'a\' = \'A\';\n \n+-----------+\n| \'a\' = \'A\' |\n+-----------+\n| 1 |\n+-----------+\n \nSELECT BINARY \'a\' = \'A\';\n \n+------------------+\n| BINARY \'a\' = \'A\' |\n+------------------+\n| 0 |\n+------------------+\n \nSELECT \'a\' = \'a \';\n \n+------------+\n| \'a\' = \'a \' |\n+------------+\n| 1 |\n+------------+\n \nSELECT BINARY \'a\' = \'a \';\n \n+-------------------+\n| BINARY \'a\' = \'a \' |\n+-------------------+\n| 0 |\n+-------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/binary-operator/','','https://mariadb.com/kb/en/library/binary-operator/'),(581,'CAST',37,'Syntax\n------ \nCAST(expr AS type)\n \nDescription\n----------- \nThe CAST() function takes a value of one type and produces a\nvalue of another type, similar to the CONVERT() function.\nFor more information, see the description of CONVERT(). \n \nThe main difference between the CAST() and CONVERT() is that\nCONVERT(expr,type) is ODBC syntax while CAST(expr as type)\nand CONVERT(... USING ...) are SQL92 syntax.\n \nIn MariaDB 10.4 and later, you can use the CAST() function\nwith the INTERVAL keyword.\n \nUntil MariaDB 5.5.31, X\'HHHH\', the standard SQL syntax for\nbinary string literals, erroneously worked in the same way\nas 0xHHHH. In 5.5.31 it was intentionally changed to behave\nas a string in all contexts (and never as a number).\n \nThis introduces an incompatibility with previous versions of\nMariaDB, and all versions of MySQL (see the example below). \n \nExamples\n-------- \nSimple casts:\n \nSELECT CAST(\"abc\" AS BINARY);\nSELECT CAST(\"1\" AS UNSIGNED INTEGER);\nSELECT CAST(123 AS CHAR CHARACTER SET utf8)\n \nNote that when one casts to CHAR without specifying the\ncharacter set, the collation_connection character set\ncollation will be used. When used with CHAR CHARACTER SET,\nthe default collation for that character set will be used.\n \nSELECT COLLATION(CAST(123 AS CHAR));\n+------------------------------+\n| COLLATION(CAST(123 AS CHAR)) |\n+------------------------------+\n| latin1_swedish_ci |\n+------------------------------+\n \nSELECT COLLATION(CAST(123 AS CHAR CHARACTER SET utf8));\n+-------------------------------------------------+\n| COLLATION(CAST(123 AS CHAR CHARACTER SET utf8)) |\n+-------------------------------------------------+\n| utf8_general_ci |\n+-------------------------------------------------+\n \nIf you also want to change the collation, you have to use\nthe COLLATE operator:\n \nSELECT COLLATION(CAST(123 AS CHAR CHARACTER SET utf8) \n COLLATE utf8_unicode_ci);\n+-------------------------------------------------------------------------+\n| COLLATION(CAST(123 AS CHAR CHARACTER SET utf8) COLLATE\nutf8_unicode_ci) |\n+-------------------------------------------------------------------------+\n| utf8_unicode_ci |\n+-------------------------------------------------------------------------+\n \nUsing CAST() to order an ENUM field as a CHAR rather than\nthe internal numerical value:\n \nCREATE TABLE enum_list (enum_field enum(\'c\',\'a\',\'b\'));\n \nINSERT INTO enum_list (enum_field) \nVALUES(\'c\'),(\'a\'),(\'c\'),(\'b\');\n \nSELECT * FROM enum_list \nORDER BY enum_field;\n \n+------------+\n| enum_field |\n+------------+\n| c |\n| c |\n| a |\n| b |\n+------------+\n \nSELECT * FROM enum_list \nORDER BY CAST(enum_field AS CHAR);\n+------------+\n| enum_field |\n+------------+\n| a |\n| b |\n| c |\n| c |\n+------------+\n \nFrom MariaDB 5.5.31, the following will trigger warnings,\nsince x\'aa\' and \'X\'aa\' no longer behave as a number.\nPreviously, and in all versions of MySQL, no warnings are\ntriggered since they did erroneously behave as a number:\n \nSELECT CAST(0xAA AS UNSIGNED), CAST(x\'aa\' AS UNSIGNED),\nCAST(X\'aa\' AS UNSIGNED);\n+------------------------+-------------------------+-------------------------+\n| CAST(0xAA AS UNSIGNED) | CAST(x\'aa\' AS UNSIGNED) |\nCAST(X\'aa\' AS UNSIGNED) |\n+------------------------+-------------------------+-------------------------+\n| 170 | 0 | 0 |\n+------------------------+-------------------------+-------------------------+\n1 row in set, 2 warnings (0.00 sec)\n \nWarning (Code 1292): Truncated incorrect INTEGER value:\n\'\\xAA\'\nWarning (Code 1292): Truncated incorrect INTEGER value:\n\'\\xAA\'\n \nCasting to intervals:\n \nSELECT CAST(2019-01-04 INTERVAL AS DAY_SECOND(2)) AS\n\"Cast\";\n \n+-------------+\n| Cast |\n+-------------+\n| 00:20:17.00 |\n+-------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/cast/','','https://mariadb.com/kb/en/library/cast/'),(582,'CHAR Function',37,'Syntax\n------ \nCHAR(N,... [USING charset_name])\n \nDescription\n----------- \nCHAR() interprets each argument as an INT and returns a\nstring consisting of the characters given by the code values\nof those integers. NULL values are skipped. By default,\nCHAR() returns a binary string. To produce a string in a\ngiven character set, use the optional USING clause:\n \nSELECT CHARSET(CHAR(0x65)), CHARSET(CHAR(0x65 USING utf8));\n+---------------------+--------------------------------+\n| CHARSET(CHAR(0x65)) | CHARSET(CHAR(0x65 USING utf8)) |\n+---------------------+--------------------------------+\n| binary | utf8 |\n+---------------------+--------------------------------+\n \nIf USING is given and the result string is illegal for the\ngiven character set, a warning is issued. Also, if strict\nSQL mode is enabled, the result from CHAR() becomes NULL.\n \nExamples\n-------- \nSELECT CHAR(77,97,114,\'105\',97,\'68\',66);\n+----------------------------------+\n| CHAR(77,97,114,\'105\',97,\'68\',66) |\n+----------------------------------+\n| MariaDB |\n+----------------------------------+\n \nSELECT CHAR(77,77.3,\'77.3\');\n+----------------------+\n| CHAR(77,77.3,\'77.3\') |\n+----------------------+\n| MMM |\n+----------------------+\n1 row in set, 1 warning (0.00 sec)\n \nWarning (Code 1292): Truncated incorrect INTEGER value:\n\'77.3\'\n \n\n\nURL: https://mariadb.com/kb/en/library/char-function/','','https://mariadb.com/kb/en/library/char-function/'),(584,'CHAR_LENGTH',37,'Syntax\n------ \nCHAR_LENGTH(str)\n \nDescription\n----------- \nReturns the length of the given string argument, measured in\ncharacters. A multi-byte character counts as a single\ncharacter. This means that for a string containing five\ntwo-byte characters, LENGTH() (or OCTET_LENGTH() in Oracle\nmode) returns 10, whereas CHAR_LENGTH() returns 5. If the\nargument is NULL, it returns NULL. \n \nIf the argument is not a string value, it is converted into\na string.\n \nIt is synonymous with the CHARACTER_LENGTH() function.\n \nUntil MariaDB 10.3.1, returns MYSQL_TYPE_LONGLONG, or\nbigint(10), in all cases. From MariaDB 10.3.1, returns\nMYSQL_TYPE_LONG, or int(10), when the result would fit\nwithin 32-bits.\n \nExamples\n-------- \nSELECT CHAR_LENGTH(\'MariaDB\');\n+------------------------+\n| CHAR_LENGTH(\'MariaDB\') |\n+------------------------+\n| 7 |\n+------------------------+\n \nSELECT CHAR_LENGTH(\'π\');\n+-------------------+\n| CHAR_LENGTH(\'π\') |\n+-------------------+\n| 1 |\n+-------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/char_length/','','https://mariadb.com/kb/en/library/char_length/'),(585,'CHR',37,'The CHR() function was introduced in MariaDB 10.3.1 to\nprovide Oracle compatibility\n \nSyntax\n------ \nCHR(N)\n \nDescription\n----------- \nCHR() interprets each argument N as an integer and returns a\nVARCHAR(1) string consisting of the character given by the\ncode values of the integer. The character set and collation\nof the string are set according to the values of the\ncharacter_set_database and collation_database system\nvariables.\n \nCHR() is similar to the CHAR() function, but only accepts a\nsingle argument.\n \nCHR() is available in all sql_modes.\n \nExamples\n-------- \nSELECT CHR(67);\n+---------+\n| CHR(67) |\n+---------+\n| C |\n+---------+\n \nSELECT CHR(\'67\');\n+-----------+\n| CHR(\'67\') |\n+-----------+\n| C |\n+-----------+\n \nSELECT CHR(\'C\');\n+----------+\n| CHR(\'C\') |\n+----------+\n| |\n+----------+\n1 row in set, 1 warning (0.000 sec)\n \nSHOW WARNINGS;\n \n+---------+------+----------------------------------------+\n| Level | Code | Message |\n+---------+------+----------------------------------------+\n| Warning | 1292 | Truncated incorrect INTEGER value: \'C\'\n|\n+---------+------+----------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/chr/','','https://mariadb.com/kb/en/library/chr/'),(586,'CONCAT',37,'Syntax\n------ \nCONCAT(str1,str2,...)\n \nDescription\n----------- \nReturns the string that results from concatenating the\narguments. May have one or more arguments. If all arguments\nare non-binary strings, the result is a non-binary string.\nIf the arguments include any binary strings, the result is a\nbinary string. A numeric argument is converted to its\nequivalent binary string form; if you want to avoid that,\nyou can use an explicit type cast, as in this example:\n \nSELECT CONCAT(CAST(int_col AS CHAR), char_col);\n \nCONCAT() returns NULL if any argument is NULL.\n \nA NULL parameter hides all information contained in other\nparameters from the result. Sometimes this is not desirable;\nto avoid this, you can:\nUse the CONCAT_WS() function with an empty separator,\nbecause that function is NULL-safe.\nUse IFNULL() to turn NULLs into empty strings.\n \nOracle Mode\n \nIn Oracle mode from MariaDB 10.3, CONCAT ignores NULL.\n \nExamples\n-------- \nSELECT CONCAT(\'Ma\', \'ria\', \'DB\');\n+---------------------------+\n| CONCAT(\'Ma\', \'ria\', \'DB\') |\n+---------------------------+\n| MariaDB |\n+---------------------------+\n \nSELECT CONCAT(\'Ma\', \'ria\', NULL, \'DB\');\n+---------------------------------+\n| CONCAT(\'Ma\', \'ria\', NULL, \'DB\') |\n+---------------------------------+\n| NULL |\n+---------------------------------+\n \nSELECT CONCAT(42.0);\n+--------------+\n| CONCAT(42.0) |\n+--------------+\n| 42.0 |\n+--------------+\n \nUsing IFNULL() to handle NULLs:\n \nSELECT CONCAT(\'The value of @v is: \', IFNULL(@v, \'\'));\n+------------------------------------------------+\n| CONCAT(\'The value of @v is: \', IFNULL(@v, \'\')) |\n+------------------------------------------------+\n| The value of @v is: |\n+------------------------------------------------+\n \nIn Oracle mode, from MariaDB 10.3:\n \nSELECT CONCAT(\'Ma\', \'ria\', NULL, \'DB\');\n+---------------------------------+\n| CONCAT(\'Ma\', \'ria\', NULL, \'DB\') |\n+---------------------------------+\n| MariaDB |\n+---------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/concat/','','https://mariadb.com/kb/en/library/concat/'),(587,'CONCAT_WS',37,'Syntax\n------ \nCONCAT_WS(separator,str1,str2,...)\n \nDescription\n----------- \nCONCAT_WS() stands for Concatenate With Separator and is a\nspecial form of CONCAT(). The first argument is the\nseparator for the rest of the arguments. The separator is\nadded between the strings to be concatenated. The separator\ncan be a string, as can the rest of the arguments.\n \nIf the separator is NULL, the result is NULL; all other NULL\nvalues are skipped. This makes CONCAT_WS() suitable when you\nwant to concatenate some values and avoid losing all\ninformation if one of them is NULL.\n \nExamples\n-------- \nSELECT CONCAT_WS(\',\',\'First name\',\'Second name\',\'Last\nName\');\n+-------------------------------------------------------+\n| CONCAT_WS(\',\',\'First name\',\'Second name\',\'Last\nName\') |\n+-------------------------------------------------------+\n| First name,Second name,Last Name |\n+-------------------------------------------------------+\n \nSELECT CONCAT_WS(\'-\',\'Floor\',NULL,\'Room\');\n+------------------------------------+\n| CONCAT_WS(\'-\',\'Floor\',NULL,\'Room\') |\n+------------------------------------+\n| Floor-Room |\n+------------------------------------+\n \nIn some cases, remember to include a space in the separator\nstring:\n \nSET @a = \'gnu\', @b = \'penguin\', @c = \'sea lion\';\n \nQuery OK, 0 rows affected (0.00 sec)\n \nSELECT CONCAT_WS(\', \', @a, @b, @c);\n+-----------------------------+\n| CONCAT_WS(\', \', @a, @b, @c) |\n+-----------------------------+\n| gnu, penguin, sea lion |\n+-----------------------------+\n \nUsing CONCAT_WS() to handle NULLs:\n \nSET @a = \'a\', @b = NULL, @c = \'c\';\n \nSELECT CONCAT_WS(\'\', @a, @b, @c);\n+---------------------------+\n| CONCAT_WS(\'\', @a, @b, @c) |\n+---------------------------+\n| ac |\n+---------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/concat_ws/','','https://mariadb.com/kb/en/library/concat_ws/'),(588,'CONVERT',37,'Syntax\n------ \nCONVERT(expr,type), CONVERT(expr USING transcoding_name)\n \nDescription\n----------- \nThe CONVERT() and CAST() functions take a value of one type\nand produce a value of another type.\n \nThe type can be one of the following values:\nBINARY\nCHAR\nDATE\nDATETIME \nDECIMAL[(M[,D])]\nDOUBLE \nFLOAT — From MariaDB 10.4.5\nINTEGER \nShort for SIGNED INTEGER\n \nSIGNED [INTEGER]\nTIME \nUNSIGNED [INTEGER]\n \nNote that in MariaDB, INT and INTEGER are the same thing.\n \nBINARY produces a string with the BINARY data type. If the\noptional length is given, BINARY(N) causes the cast to use\nno more than N bytes of the argument. Values shorter than\nthe given number in bytes are padded with 0x00 bytes to make\nthem equal the length value.\n \nCHAR(N) causes the cast to use no more than the number of\ncharacters given in the argument.\n \nThe main difference between the CAST() and CONVERT() is that\nCONVERT(expr,type) is ODBC syntax while CAST(expr as type)\nand CONVERT(... USING ...) are SQL92 syntax.\n \nCONVERT() with USING is used to convert data between\ndifferent character sets. In MariaDB, transcoding names are\nthe same as the\ncorresponding character set names. For example, this\nstatement\nconverts the string \'abc\' in the default character set to\nthe\ncorresponding string in the utf8 character set:\n \nSELECT CONVERT(\'abc\' USING utf8);\n \nExamples\n-------- \nSELECT enum_col FROM tbl_name \nORDER BY CAST(enum_col AS CHAR);\n \nConverting a BINARY to string to permit the LOWER function\nto work:\n \nSET @x = \'AardVark\';\n \nSET @x = BINARY \'AardVark\';\n \nSELECT LOWER(@x), LOWER(CONVERT (@x USING latin1));\n+-----------+----------------------------------+\n| LOWER(@x) | LOWER(CONVERT (@x USING latin1)) |\n+-----------+----------------------------------+\n| AardVark | aardvark |\n+-----------+----------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/convert/','','https://mariadb.com/kb/en/library/convert/'),(589,'ELT',37,'Syntax\n------ \nELT(N, str1[, str2, str3,...])\n \nDescription\n----------- \nTakes a numeric argument and a series of string arguments.\nReturns the string that corresponds to the given numeric\nposition. For instance, it returns str1 if N is 1, str2 if N\nis 2, and so on. If the numeric argument is a FLOAT, MariaDB\nrounds it to the nearest INTEGER. If the numeric argument is\nless than 1, greater than the total number of arguments, or\nnot a number, ELT() returns NULL. It must have at least two\narguments.\n \nIt is complementary to the FIELD() function.\n \nExamples\n-------- \nSELECT ELT(1, \'ej\', \'Heja\', \'hej\', \'foo\');\n+------------------------------------+\n| ELT(1, \'ej\', \'Heja\', \'hej\', \'foo\') |\n+------------------------------------+\n| ej |\n+------------------------------------+\n \nSELECT ELT(4, \'ej\', \'Heja\', \'hej\', \'foo\');\n+------------------------------------+\n| ELT(4, \'ej\', \'Heja\', \'hej\', \'foo\') |\n+------------------------------------+\n| foo |\n+------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/elt/','','https://mariadb.com/kb/en/library/elt/'),(590,'EXPORT_SET',37,'Syntax\n------ \nEXPORT_SET(bits, on, off[, separator[, number_of_bits]])\n \nDescription\n----------- \nTakes a minimum of three arguments. Returns a string where\neach bit in the given bits argument is returned, with the\nstring values given for on and off. \n \nBits are examined from right to left, (from low-order to\nhigh-order bits). Strings are added to the result from left\nto right, separated by a separator string (defaults as\n\',\'). You can optionally limit the number of bits the\nEXPORT_SET() function examines using the number_of_bits\noption. \n \nIf any of the arguments are set as NULL, the function\nreturns NULL.\n \nExamples\n-------- \nSELECT EXPORT_SET(5,\'Y\',\'N\',\',\',4);\n+-----------------------------+\n| EXPORT_SET(5,\'Y\',\'N\',\',\',4) |\n+-----------------------------+\n| Y,N,Y,N |\n+-----------------------------+\n \nSELECT EXPORT_SET(6,\'1\',\'0\',\',\',10);\n+------------------------------+\n| EXPORT_SET(6,\'1\',\'0\',\',\',10) |\n+------------------------------+\n| 0,1,1,0,0,0,0,0,0,0 |\n+------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/export_set/','','https://mariadb.com/kb/en/library/export_set/'),(592,'FIELD',37,'Syntax\n------ \nFIELD(pattern, str1[,str2,...])\n \nDescription\n----------- \nReturns the index position of the string or number matching\nthe given pattern. Returns 0 in the event that none of the\narguments match the pattern. Raises an Error 1582 if not\ngiven at least two arguments.\n \nWhen all arguments given to the FIELD() function are\nstrings, they are treated as case-insensitive. When all the\narguments are numbers, they are treated as numbers.\nOtherwise, they are treated as doubles. \n \nIf the given pattern occurs more than once, the FIELD()\nfunction only returns the index of the first instance. If\nthe given pattern is NULL, the function returns 0, as a NULL\npattern always fails to match.\n \nThis function is complementary to the ELT() function.\n \nExamples\n-------- \nSELECT FIELD(\'ej\', \'Hej\', \'ej\', \'Heja\', \'hej\',\n\'foo\') \n AS \'Field Results\';\n \n+---------------+\n| Field Results | \n+---------------+\n| 2 |\n+---------------+\n \nSELECT FIELD(\'fo\', \'Hej\', \'ej\', \'Heja\', \'hej\',\n\'foo\')\n AS \'Field Results\';\n \n+---------------+\n| Field Results | \n+---------------+\n| 0 |\n+---------------+\n \nSELECT FIELD(1, 2, 3, 4, 5, 1) AS \'Field Results\';\n \n+---------------+\n| Field Results |\n+---------------+\n| 5 |\n+---------------+\n \nSELECT FIELD(NULL, 2, 3) AS \'Field Results\';\n \n+---------------+\n| Field Results |\n+---------------+\n| 0 |\n+---------------+\n \nSELECT FIELD(\'fail\') AS \'Field Results\';\n \nError 1582 (42000): Incorrect parameter count in call\nto native function \'field\'\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/field/','','https://mariadb.com/kb/en/library/field/'),(591,'EXTRACTVALUE',37,'Syntax\n------ \nEXTRACTVALUE(xml_frag, xpath_expr)\n \nDescription\n----------- \nThe EXTRACTVALUE() function takes two string arguments: a\nfragment of XML markup and an XPath expression, (also known\nas a locator). It returns the text (That is, CDDATA), of the\nfirst text node which is a child of the element or elements\nmatching the XPath expression. \n \nIn cases where a valid XPath expression does not match any\ntext nodes in a valid XML fragment, (including the implicit\n/text() expression), the EXTRACTVALUE() function returns an\nempty string.\n \nInvalid Arguments\n \nWhen either the XML fragment or the XPath expression is\nNULL, the EXTRACTVALUE() function returns NULL. When the XML\nfragment is invalid, it raises a warning Code 1525:\n \nWarning (Code 1525): Incorrect XML value: \'parse error at\nline 1 pos 11: unexpected END-OF-INPUT\'\n \nWhen the XPath value is invalid, it generates an Error 1105:\n \nERROR 1105 (HY000): XPATH syntax error: \')\'\n \nExplicit text() Expressions\n \nThis function is the equivalent of performing a match using\nthe XPath expression after appending /text(). In other\nwords:\n \nSELECT\n EXTRACTVALUE(\'example\', \'/cases/case\') AS \'Base\nExample\',\n EXTRACTVALUE(\'example\', \'/cases/case/text()\') AS\n\'text() Example\';\n \n+--------------+----------------+\n| Base Example | text() Example |\n+--------------+----------------+\n| example | example |\n+--------------+----------------+\n \nCount Matches\n \nWhen EXTRACTVALUE() returns multiple matches, it returns the\ncontent of the first child text node of each matching\nelement, in the matched order, as a single, space-delimited\nstring.\n \nBy design, the EXTRACTVALUE() function makes no distinction\nbetween a match on an empty element and no match at all. If\nyou need to determine whether no matching element was found\nin the XML fragment or if an element was found that\ncontained no child text nodes, use the XPath count()\nfunction. \n \nFor instance, when looking for a value that exists, but\ncontains no child text nodes, you would get a count of the\nnumber of matching instances:\n \nSELECT\n EXTRACTVALUE(\'\', \'/cases/case\') AS \'Empty Example\',\n EXTRACTVALUE(\'\', \'/cases/case/count()\') AS \'count()\nExample\';\n \n+---------------+-----------------+\n| Empty Example | count() Example |\n+---------------+-----------------+\n| | 1 |\n+---------------+-----------------+\n \nAlternatively, when looking for a value that doesn\'t exist,\ncount() returns 0.\n \nSELECT\n EXTRACTVALUE(\'\', \'/cases/person\') AS \'No Match\nExample\',\n EXTRACTVALUE(\'\', \'/cases/person/count()\') AS \'count()\nExample\';\n \n+------------------+-----------------+\n| No Match Example | count() Example |\n+------------------+-----------------+\n| | 0|\n+------------------+-----------------+\n \nMatches\n \nImportant: The EXTRACTVALUE() function only returns CDDATA.\nIt does not return tags that the element might contain or\nthe text that these child elements contain.\n \nSELECT EXTRACTVALUE(\'Personx@example.com\', \'/cases\') AS\nCase;\n \n+--------+\n| Case |\n+--------+\n| Person |\n+--------+\n \nNote, in the above example, while the XPath expression\nmatches to the parent instance, it does not return the\ncontained tag or its content.\n \nExamples\n-------- \nSELECT\n ExtractValue(\'cccddd\', \'/a\') AS val1,\n ExtractValue(\'cccddd\', \'/a/b\') AS val2,\n ExtractValue(\'cccddd\', \'//b\') AS val3,\n ExtractValue(\'cccddd\', \'/b\') AS val4,\n ExtractValue(\'cccdddeee\', \'//b\') AS val5;\n \n+------+------+------+------+---------+\n| val1 | val2 | val3 | val4 | val5 |\n+------+------+------+------+---------+\n| ccc | ddd | ddd | | ddd eee |\n+------+------+------+------+---------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/extractvalue/','','https://mariadb.com/kb/en/library/extractvalue/'),(593,'FIND_IN_SET',37,'Syntax\n------ \nFIND_IN_SET(pattern, strlist)\n \nDescription\n----------- \nReturns the index position where the given pattern occurs in\na string list. The first argument is the pattern you want to\nsearch for. The second argument is a string containing\ncomma-separated variables. If the second argument is of the\nSET data-type, the function is optimized to use bit\narithmetic.\n \nIf the pattern does not occur in the string list or if the\nstring list is an empty string, the function returns 0. If\neither argument is NULL, the function returns NULL. The\nfunction does not return the correct result if the pattern\ncontains a comma (\",\") character.\n \nExamples\n-------- \nSELECT FIND_IN_SET(\'b\',\'a,b,c,d\') AS \"Found Results\";\n \n+---------------+\n| Found Results |\n+---------------+\n| 2 |\n+---------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/find_in_set/','','https://mariadb.com/kb/en/library/find_in_set/'),(594,'FORMAT',37,'Syntax\n------ \nFORMAT(num, decimal_position[, locale])\n \nDescription\n----------- \nFormats the given number for display as a string, adding\nseparators to appropriate position and rounding the results\nto the given decimal position. For instance, it would format\n15233.345 to 15,233.35.\n \nIf the given decimal position is 0, it rounds to return no\ndecimal point or fractional part. You can optionally specify\na locale value to format numbers to the pattern appropriate\nfor the given region.\n \nExamples\n-------- \nSELECT FORMAT(1234567890.09876543210, 4) AS \'Format\';\n \n+--------------------+\n| Format |\n+--------------------+\n| 1,234,567,890.0988 |\n+--------------------+\n \nSELECT FORMAT(1234567.89, 4) AS \'Format\';\n \n+----------------+\n| Format |\n+----------------+\n| 1,234,567.8900 |\n+----------------+\n \nSELECT FORMAT(1234567.89, 0) AS \'Format\';\n \n+-----------+\n| Format |\n+-----------+\n| 1,234,568 |\n+-----------+\n \nSELECT FORMAT(123456789,2,\'rm_CH\') AS \'Format\';\n \n+----------------+\n| Format |\n+----------------+\n| 123\'456\'789,00 |\n+----------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/format/','','https://mariadb.com/kb/en/library/format/'),(595,'FROM_BASE64',37,'The FROM_BASE64() function was introduced in MariaDB 10.0.5.\n \nSyntax\n------ \nFROM_BASE64(str)\n \nDescription\n----------- \nDecodes the given base-64 encode string, returning the\nresult as a binary string. Returns NULL if the given string\nis NULL or if it\'s invalid.\n \nIt is the reverse of the TO_BASE64 function.\n \nThere are numerous methods to base-64 encode a string.\nMariaDB uses the following:\nIt encodes alphabet value 64 as \'+\'.\nIt encodes alphabet value 63 as \'/\'.\nIt codes output in groups of four printable characters. Each\nthree byte of data encoded uses four characters. If the\nfinal group is incomplete, it pads the difference with the\n\'=\' character.\nIt divides long output, adding a new line very 76\ncharacters.\nIn decoding, it recognizes and ignores newlines, carriage\nreturns, tabs and space whitespace characters.\n \nSELECT TO_BASE64(\'Maria\') AS \'Input\';\n \n+-----------+\n| Input |\n+-----------+\n| TWFyaWE= |\n+-----------+\n \nSELECT FROM_BASE64(\'TWFyaWE=\') AS \'Output\';\n \n+--------+\n| Output |\n+--------+\n| Maria |\n+--------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/from_base64/','','https://mariadb.com/kb/en/library/from_base64/'),(596,'HEX',37,'Syntax\n------ \nHEX(N_or_S)\n \nDescription\n----------- \nIf N_or_S is a number, returns a string representation of\nthe hexadecimal\nvalue of N, where N is a longlong (BIGINT) number. This is\nequivalent to CONV(N,10,16).\n \nIf N_or_S is a string, returns a hexadecimal string\nrepresentation of\nN_or_S where each byte of each character in N_or_S is\nconverted to two hexadecimal\ndigits. If N_or_S is NULL, returns NULL. The inverse of this\noperation is performed by the UNHEX()\nfunction.\n \nExamples\n-------- \nSELECT HEX(255);\n+----------+\n| HEX(255) |\n+----------+\n| FF |\n+----------+\n \nSELECT 0x4D617269614442;\n \n+------------------+\n| 0x4D617269614442 |\n+------------------+\n| MariaDB |\n+------------------+\n \nSELECT HEX(\'MariaDB\');\n+----------------+\n| HEX(\'MariaDB\') |\n+----------------+\n| 4D617269614442 |\n+----------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/hex/','','https://mariadb.com/kb/en/library/hex/'),(597,'INSERT Function',37,'Syntax\n------ \nINSERT(str,pos,len,newstr)\n \nDescription\n----------- \nReturns the string str, with the substring beginning at\nposition pos\nand len characters long replaced by the string newstr.\nReturns the\noriginal string if pos is not within the length of the\nstring.\nReplaces the rest of the string from position pos if len is\nnot within\nthe length of the rest of the string. Returns NULL if any\nargument is\nNULL.\n \nExamples\n-------- \nSELECT INSERT(\'Quadratic\', 3, 4, \'What\');\n+-----------------------------------+\n| INSERT(\'Quadratic\', 3, 4, \'What\') |\n+-----------------------------------+\n| QuWhattic |\n+-----------------------------------+\n \nSELECT INSERT(\'Quadratic\', -1, 4, \'What\');\n+------------------------------------+\n| INSERT(\'Quadratic\', -1, 4, \'What\') |\n+------------------------------------+\n| Quadratic |\n+------------------------------------+\n \nSELECT INSERT(\'Quadratic\', 3, 100, \'What\');\n+-------------------------------------+\n| INSERT(\'Quadratic\', 3, 100, \'What\') |\n+-------------------------------------+\n| QuWhat |\n+-------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/insert-function/','','https://mariadb.com/kb/en/library/insert-function/'),(601,'LENGTH',37,'Syntax\n------ \nLENGTH(str)\n \nDescription\n----------- \nReturns the length of the string str, measured in bytes. A\nmulti-byte\ncharacter counts as multiple bytes. This means that for a\nstring\ncontaining five two-byte characters, LENGTH() returns 10,\nwhereas\nCHAR_LENGTH() returns 5. \n \nIf str is not a string value, it is converted into a string.\nIf str is NULL, the function returns NULL.\n \nUntil MariaDB 10.3.1, returns MYSQL_TYPE_LONGLONG, or\nbigint(10), in all cases. From MariaDB 10.3.1, returns\nMYSQL_TYPE_LONG, or int(10), when the result would fit\nwithin 32-bits.\n \nOracle Mode\n \nWhen running Oracle mode from MariaDB 10.3, LENGTH() is a\nsynonym for CHAR_LENGTH().\n \nExamples\n-------- \nSELECT LENGTH(\'MariaDB\');\n+-------------------+\n| LENGTH(\'MariaDB\') |\n+-------------------+\n| 7 |\n+-------------------+\n \nSELECT LENGTH(\'π\');\n+--------------+\n| LENGTH(\'π\') |\n+--------------+\n| 2 |\n+--------------+\n \nIn Oracle mode from MariaDB 10.3:\n \nSELECT LENGTH(\'π\');\n+--------------+\n| LENGTH(\'π\') |\n+--------------+\n| 1 |\n+--------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/length/','','https://mariadb.com/kb/en/library/length/'),(604,'LOAD_FILE',37,'Syntax\n------ \nLOAD_FILE(file_name)\n \nDescription\n----------- \nReads the file and returns the file contents as a string. To\nuse this function, the file must be located on the server\nhost, you must specify the full path name to the file, and\nyou must have the FILE privilege. The file must be readable\nby all and it must be less than the size, in bytes, of the\nmax_allowed_packet system variable. If the secure_file_priv\nsystem variable is set to a non-empty directory name, the\nfile to be loaded must be located in that directory.\n \nIf the file does not exist or cannot be read because one of\nthe preceding conditions is not satisfied, the function\nreturns NULL.\n \nSince MariaDB 5.1, the character_set_filesystem system\nvariable has controlled interpretation of file names that\nare given as literal strings.\n \nStatements using the LOAD_FILE() function are not safe for\nstatement based replication. This is because the slave will\nexecute the LOAD_FILE() command itself. If the file doesn\'t\nexist on the slave, the function will return NULL.\n \nExamples\n-------- \nUPDATE t SET blob_col=LOAD_FILE(\'/tmp/picture\') WHERE\nid=1;\n \n\n\nURL: https://mariadb.com/kb/en/library/load_file/','','https://mariadb.com/kb/en/library/load_file/'),(603,'LIKE',37,'Syntax\n------ \nexpr LIKE pat [ESCAPE \'escape_char\']\nexpr NOT LIKE pat [ESCAPE \'escape_char\']\n \nDescription\n----------- \nTests whether expr matches the pattern pat. Returns either 1\n(TRUE) or 0 (FALSE).\nBoth expr and pat may be any valid expression and are\nevaluated to strings.\nPatterns may use the following wildcard characters:\n% matches any number of characters, including zero.\n_ matches any single character.\n \nUse NOT LIKE to test if a string does not match a pattern.\nThis is equivalent to using\nthe NOT operator on the entire LIKE expression.\n \nIf either the expression or the pattern is NULL, the result\nis NULL.\n \nLIKE performs case-insensitive substring matches if the\ncollation for the\nexpression and pattern is case-insensitive. For\ncase-sensitive matches, declare either argument\nto use a binary collation using COLLATE, or coerce either of\nthem to a BINARY\nstring using CAST. Use SHOW COLLATION to get a list of\navailable collations. Collations ending in _bin are\ncase-sensitive.\n \nNumeric arguments are coerced to binary strings.\n \nThe _ wildcard matches a single character, not byte. It will\nonly match a multi-byte character\nif it is valid in the expression\'s character set. For\nexample, _ will match _utf8\"€\", but it\nwill not match _latin1\"€\" because the Euro sign is not a\nvalid latin1 character. If necessary,\nuse CONVERT to use the expression in a different character\nset.\n \nIf you need to match the characters _ or %, you must escape\nthem. By default,\nyou can prefix the wildcard characters the backslash\ncharacter \\ to escape them.\nThe backslash is used both to encode special characters like\nnewlines when a string is\nparsed as well as to escape wildcards in a pattern after\nparsing. Thus, to match an\nactual backslash, you sometimes need to double-escape it as\n\"\\\\\\\\\".\n \nTo avoid difficulties with the backslash character, you can\nchange the wildcard escape\ncharacter using ESCAPE in a LIKE expression. The argument to\nESCAPE\nmust be a single-character string.\n \nExamples\n-------- \nSelect the days that begin with \"T\":\n \nCREATE TABLE t1 (d VARCHAR(16));\nINSERT INTO t1 VALUES (\"Monday\"), (\"Tuesday\"),\n(\"Wednesday\"), (\"Thursday\"), (\"Friday\"),\n(\"Saturday\"), (\"Sunday\");\nSELECT * FROM t1 WHERE d LIKE \"T%\";\n \nSELECT * FROM t1 WHERE d LIKE \"T%\";\n+----------+\n| d |\n+----------+\n| Tuesday |\n| Thursday |\n+----------+\n \nSelect the days that contain the substring \"es\":\n \nSELECT * FROM t1 WHERE d LIKE \"%es%\";\n \nSELECT * FROM t1 WHERE d LIKE \"%es%\";\n+-----------+\n| d |\n+-----------+\n| Tuesday |\n| Wednesday |\n+-----------+\n \nSelect the six-character day names:\n \nSELECT * FROM t1 WHERE d like \"___day\";\n \nSELECT * FROM t1 WHERE d like \"___day\";\n+---------+\n| d |\n+---------+\n| Monday |\n| Friday |\n| Sunday |\n+---------+\n \nWith the default collations, LIKE is case-insensitive:\n \nSELECT * FROM t1 where d like \"t%\";\n \nSELECT * FROM t1 where d like \"t%\";\n+----------+\n| d |\n+----------+\n| Tuesday |\n| Thursday |\n+----------+\n \nUse COLLATE to specify a binary collation, forcing\ncase-sensitive matches:\n \nSELECT * FROM t1 WHERE d like \"t%\" COLLATE latin1_bin;\n \nSELECT * FROM t1 WHERE d like \"t%\" COLLATE latin1_bin;\nEmpty set (0.00 sec)\n \nYou can include functions and operators in the expression to\nmatch. Select dates\nbased on their day name:\n \nCREATE TABLE t2 (d DATETIME);\nINSERT INTO t2 VALUES\n (\"2007-01-30 21:31:07\"),\n (\"1983-10-15 06:42:51\"),\n (\"2011-04-21 12:34:56\"),\n (\"2011-10-30 06:31:41\"),\n (\"2011-01-30 14:03:25\"),\n (\"2004-10-07 11:19:34\");\nSELECT * FROM t2 WHERE DAYNAME(d) LIKE \"T%\";\n \nSELECT * FROM t2 WHERE DAYNAME(d) LIKE \"T%\";\n+------------------+\n| d |\n+------------------+\n| 2007-01-30 21:31 |\n| 2011-04-21 12:34 |\n| 2004-10-07 11:19 |\n+------------------+\n3 rows in set, 7 warnings (0.00 sec)\n \nOptimizing LIKE\n \nMariaDB can use indexes for LIKE on string columns in the\ncase where the LIKE doesn\'t start with % or _.\nStarting from MariaDB 10.0, one can set the\noptimizer_use_condition_selectivity variable to 5. If this\nis done, then the optimizer will read\noptimizer_selectivity_sampling_limit rows to calculate the\nselectivity of the LIKE expression before starting to\ncalculate the query plan. This can help speed up some LIKE\nqueries by providing the optimizer with more information\nabout your data.\n \n\n\nURL: https://mariadb.com/kb/en/library/like/','','https://mariadb.com/kb/en/library/like/'),(605,'LOCATE',37,'Syntax\n------ \nLOCATE(substr,str), LOCATE(substr,str,pos)\n \nDescription\n----------- \nThe first syntax returns the position of the first\noccurrence of\nsubstring substr in string str. The second syntax returns\nthe position\nof the first occurrence of substring substr in string str,\nstarting at\nposition pos. Returns 0 if substr is not in str.\n \nLOCATE() performs a case-insensitive search.\n \nIf any argument is NULL, returns NULL.\n \nINSTR() is a synonym of LOCATE() without the third argument.\n \nExamples\n-------- \nSELECT LOCATE(\'bar\', \'foobarbar\');\n+----------------------------+\n| LOCATE(\'bar\', \'foobarbar\') |\n+----------------------------+\n| 4 |\n+----------------------------+\n \nSELECT LOCATE(\'My\', \'Maria\');\n+-----------------------+\n| LOCATE(\'My\', \'Maria\') |\n+-----------------------+\n| 0 |\n+-----------------------+\n \nSELECT LOCATE(\'bar\', \'foobarbar\', 5);\n+-------------------------------+\n| LOCATE(\'bar\', \'foobarbar\', 5) |\n+-------------------------------+\n| 7 |\n+-------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/locate/','','https://mariadb.com/kb/en/library/locate/'),(606,'LOWER',37,'Syntax\n------ \nLOWER(str)\n \nDescription\n----------- \nReturns the string str with all characters changed to\nlowercase\naccording to the current character set mapping. The default\nis latin1\n(cp1252 West European).\n \nExamples\n-------- \n SELECT LOWER(\'QUADRATICALLY\');\n+------------------------+\n| LOWER(\'QUADRATICALLY\') |\n+------------------------+\n| quadratically |\n+------------------------+\n \nLOWER() (and UPPER()) are ineffective when applied to binary\nstrings (BINARY, VARBINARY, BLOB). \nTo perform lettercase conversion, CONVERT the string to a\nnon-binary string:\n \nSET @str = BINARY \'North Carolina\';\n \nSELECT LOWER(@str), LOWER(CONVERT(@str USING latin1));\n+----------------+-----------------------------------+\n| LOWER(@str) | LOWER(CONVERT(@str USING latin1)) |\n+----------------+-----------------------------------+\n| North Carolina | north carolina |\n+----------------+-----------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/lower/','','https://mariadb.com/kb/en/library/lower/'),(607,'LPAD',37,'Syntax\n------ \nLPAD(str, len [,padstr])\n \nDescription\n----------- \nReturns the string str, left-padded with the string padstr\nto a length\nof len characters. If str is longer than len, the return\nvalue is\nshortened to len characters. If padstr is omitted, the LPAD\nfunction pads spaces.\n \nPrior to MariaDB 10.3.1, the padstr parameter was mandatory.\n \nReturns NULL if given a NULL argument. If the result is\nempty (zero length), returns either an empty string or, from\nMariaDB 10.3.6 with SQL_MODE=Oracle, NULL.\n \nThe Oracle mode version of the function can be accessed\noutside of Oracle mode by using LPAD_ORACLE as the function\nname.\n \nExamples\n-------- \nSELECT LPAD(\'hello\',10,\'.\');\n+----------------------+\n| LPAD(\'hello\',10,\'.\') |\n+----------------------+\n| .....hello |\n+----------------------+\n \nSELECT LPAD(\'hello\',2,\'.\');\n+---------------------+\n| LPAD(\'hello\',2,\'.\') |\n+---------------------+\n| he |\n+---------------------+\n \nFrom MariaDB 10.3.1, with the pad string defaulting to\nspace.\n \nSELECT LPAD(\'hello\',10);\n+------------------+\n| LPAD(\'hello\',10) |\n+------------------+\n| hello |\n+------------------+\n \nOracle mode version from MariaDB 10.3.6:\n \nSELECT LPAD(\'\',0),LPAD_ORACLE(\'\',0);\n+------------+-------------------+\n| LPAD(\'\',0) | LPAD_ORACLE(\'\',0) |\n+------------+-------------------+\n| | NULL |\n+------------+-------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/lpad/','','https://mariadb.com/kb/en/library/lpad/'),(608,'LTRIM',37,'Syntax\n------ \nLTRIM(str)\n \nDescription\n----------- \nReturns the string str with leading space characters\nremoved.\n \nReturns NULL if given a NULL argument. If the result is\nempty, returns either an empty string, or, from MariaDB\n10.3.6 with SQL_MODE=Oracle, NULL.\n \nThe Oracle mode version of the function can be accessed\noutside of Oracle mode by using LTRIM_ORACLE as the function\nname.\n \nExamples\n-------- \nSELECT QUOTE(LTRIM(\' MariaDB \'));\n+-------------------------------+\n| QUOTE(LTRIM(\' MariaDB \')) |\n+-------------------------------+\n| \'MariaDB \' |\n+-------------------------------+\n \nOracle mode version from MariaDB 10.3.6:\n \nSELECT LTRIM(\'\'),LTRIM_ORACLE(\'\');\n+-----------+------------------+\n| LTRIM(\'\') | LTRIM_ORACLE(\'\') |\n+-----------+------------------+\n| | NULL |\n+-----------+------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/ltrim/','','https://mariadb.com/kb/en/library/ltrim/'),(609,'MAKE_SET',37,'Syntax\n------ \nMAKE_SET(bits,str1,str2,...)\n \nDescription\n----------- \nReturns a set value (a string containing substrings\nseparated by \",\"\ncharacters) consisting of the strings that have the\ncorresponding bit\nin bits set. str1 corresponds to bit 0, str2 to bit 1, and\nso on. NULL\nvalues in str1, str2, ... are not appended to the result.\n \nExamples\n-------- \nSELECT MAKE_SET(1,\'a\',\'b\',\'c\');\n+-------------------------+\n| MAKE_SET(1,\'a\',\'b\',\'c\') |\n+-------------------------+\n| a |\n+-------------------------+\n \nSELECT MAKE_SET(1 | 4,\'hello\',\'nice\',\'world\');\n+----------------------------------------+\n| MAKE_SET(1 | 4,\'hello\',\'nice\',\'world\') |\n+----------------------------------------+\n| hello,world |\n+----------------------------------------+\n \nSELECT MAKE_SET(1 | 4,\'hello\',\'nice\',NULL,\'world\');\n+---------------------------------------------+\n| MAKE_SET(1 | 4,\'hello\',\'nice\',NULL,\'world\') |\n+---------------------------------------------+\n| hello |\n+---------------------------------------------+\n \nSELECT QUOTE(MAKE_SET(0,\'a\',\'b\',\'c\'));\n+--------------------------------+\n| QUOTE(MAKE_SET(0,\'a\',\'b\',\'c\')) |\n+--------------------------------+\n| \'\' |\n+--------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/make_set/','','https://mariadb.com/kb/en/library/make_set/'),(610,'MATCH AGAINST',37,'Syntax\n------ \nMATCH (col1,col2,...) AGAINST (expr [search_modifier])\n \nDescription\n----------- \nA special construct used to perform a fulltext search on a\nfulltext index.\n \nSee Fulltext Index Overview for a full description, and\nFull-text Indexes for more articles on the topic.\n \nExamples\n-------- \nCREATE TABLE ft_myisam(copy TEXT,FULLTEXT(copy))\nENGINE=MyISAM;\n \nINSERT INTO ft_myisam(copy) VALUES (\'Once upon a time\'),\n(\'There was a wicked witch\'), \n (\'Who ate everybody up\');\n \nSELECT * FROM ft_myisam WHERE MATCH(copy)\nAGAINST(\'wicked\');\n+--------------------------+\n| copy |\n+--------------------------+\n| There was a wicked witch |\n+--------------------------+\n \nSELECT id, body, MATCH (title,body) AGAINST\n (\'Security implications of running MySQL as root\'\n IN NATURAL LANGUAGE MODE) AS score\n FROM articles WHERE MATCH (title,body) AGAINST\n (\'Security implications of running MySQL as root\'\n IN NATURAL LANGUAGE MODE);\n+----+-------------------------------------+-----------------+\n| id | body | score |\n+----+-------------------------------------+-----------------+\n| 4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014\n|\n| 6 | When configured properly, MySQL ... | 1.3114095926285\n|\n+----+-------------------------------------+-----------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/match-against/','','https://mariadb.com/kb/en/library/match-against/'),(618,'REGEXP_INSTR',37,'REGEXP_INSTR was introduced in MariaDB 10.0.5.\n \nSyntax\n------ \nREGEXP_INSTR(subject, pattern)\n \nReturns the position of the first occurrence of the regular\nexpression pattern in the string subject, or 0 if pattern\nwas not found.\n \nThe positions start with 1 and are measured in characters\n(i.e. not in bytes), which is important for multi-byte\ncharacter sets. You can cast a multi-byte character set to\nBINARY to get offsets in bytes.\n \nThe function follows the case sensitivity rules of the\neffective collation. Matching is performed case\ninsensitively for case insensitive collations, and case\nsensitively for case sensitive collations and for binary\ndata.\n \nThe collation case sensitivity can be overwritten using the\n(?i) and (?-i) PCRE flags.\n \nMariaDB 10.0.5 switched to the PCRE regular expression\nlibrary for enhanced regular expression performance, and\nREGEXP_INSTR was introduced as part of this enhancement.\n \nExamples\n-------- \nSELECT REGEXP_INSTR(\'abc\',\'b\');\n-> 2\n \nSELECT REGEXP_INSTR(\'abc\',\'x\');\n-> 0\n \nSELECT REGEXP_INSTR(\'BJÖRN\',\'N\');\n-> 5\n \nCasting a multi-byte character set as BINARY to get offsets\nin bytes:\n \nSELECT REGEXP_INSTR(BINARY \'BJÖRN\',\'N\') AS\ncast_utf8_to_binary;\n-> 6\n \nCase sensitivity:\n \nSELECT REGEXP_INSTR(\'ABC\',\'b\');\n-> 2\n \nSELECT REGEXP_INSTR(\'ABC\' COLLATE utf8_bin,\'b\');\n-> 0\n \nSELECT REGEXP_INSTR(BINARY\'ABC\',\'b\');\n-> 0\n \nSELECT REGEXP_INSTR(\'ABC\',\'(?-i)b\');\n-> 0\n \nSELECT REGEXP_INSTR(\'ABC\' COLLATE utf8_bin,\'(?i)b\');\n-> 2\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/regexp_instr/','','https://mariadb.com/kb/en/regexp_instr/'),(619,'REGEXP_REPLACE',37,'REGEXP_REPLACE was introduced in MariaDB 10.0.5.\n \nSyntax\n------ \nREGEXP_REPLACE(subject, pattern, replace)\n \nDescription\n----------- \nREGEXP_REPLACE returns the string subject with all\noccurrences of the regular expression pattern replaced by\nthe string replace. If no occurrences are found, then\nsubject is returned as is.\n \nThe replace string can have backreferences to the\nsubexpressions in the form \\N, where N is a number from 1\nto 9.\n \nThe function follows the case sensitivity rules of the\neffective collation. Matching is performed case\ninsensitively for case insensitive collations, and case\nsensitively for case sensitive collations and for binary\ndata.\n \nThe collation case sensitivity can be overwritten using the\n(?i) and (?-i) PCRE flags.\n \nMariaDB 10.0.5 switched to the PCRE regular expression\nlibrary for enhanced regular expression performance, and\nREGEXP_REPLACE was introduced as part of this enhancement.\n \nMariaDB 10.0.11 introduced the default_regex_flags variable\nto address the remaining compatibilities between PCRE and\nthe old regex library. \n \nExamples\n-------- \nSELECT REGEXP_REPLACE(\'ab12cd\',\'[0-9]\',\'\') AS\nremove_digits;\n-> abcd\n \nSELECT REGEXP_REPLACE(\'titlebody\', \'\',\' \')\nAS strip_html;\n-> title body\n \nBackreferences to the subexpressions in the form \\N, where\nN is a number from 1 to 9:\n \nSELECT REGEXP_REPLACE(\'James Bond\',\'^(.*)\n(.*)$\',\'\\\\2, \\\\1\') AS reorder_name;\n-> Bond, James\n \nCase insensitive and case sensitive matches:\n \nSELECT REGEXP_REPLACE(\'ABC\',\'b\',\'-\') AS\ncase_insensitive;\n-> A-C\n \nSELECT REGEXP_REPLACE(\'ABC\' COLLATE utf8_bin,\'b\',\'-\')\nAS case_sensitive;\n-> ABC\n \nSELECT REGEXP_REPLACE(BINARY \'ABC\',\'b\',\'-\') AS\nbinary_data;\n-> ABC\n \nOverwriting the collation case sensitivity using the (?i)\nand (?-i) PCRE flags.\n \nSELECT REGEXP_REPLACE(\'ABC\',\'(?-i)b\',\'-\') AS\nforce_case_sensitive;\n-> ABC\n \nSELECT REGEXP_REPLACE(BINARY \'ABC\',\'(?i)b\',\'-\') AS\nforce_case_insensitive;\n-> A-C\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/regexp_replace/','','https://mariadb.com/kb/en/regexp_replace/'),(620,'REGEXP_SUBSTR',37,'REGEXP_SUBSTR was introduced in MariaDB 10.0.5.\n \nSyntax\n------ \nREGEXP_SUBSTR(subject,pattern)\n \nDescription\n----------- \nReturns the part of the string subject that matches the\nregular expression pattern, or an empty string if pattern\nwas not found.\n \nThe function follows the case sensitivity rules of the\neffective collation. Matching is performed case\ninsensitively for case insensitive collations, and case\nsensitively for case sensitive collations and for binary\ndata.\n \nThe collation case sensitivity can be overwritten using the\n(?i) and (?-i) PCRE flags.\n \nMariaDB 10.0.5 switched to the PCRE regular expression\nlibrary for enhanced regular expression performance, and\nREGEXP_SUBSTR was introduced as part of this enhancement.\n \nMariaDB 10.0.11 introduced the default_regex_flags variable\nto address the remaining compatibilities between PCRE and\nthe old regex library. \n \nExamples\n-------- \nSELECT REGEXP_SUBSTR(\'ab12cd\',\'[0-9]+\');\n-> 12\n \nSELECT REGEXP_SUBSTR(\n \'See https://mariadb.org/en/foundation/ for details\',\n \'https?://[^/]*\');\n-> https://mariadb.org\n \nSELECT REGEXP_SUBSTR(\'ABC\',\'b\');\n-> B\n \nSELECT REGEXP_SUBSTR(\'ABC\' COLLATE utf8_bin,\'b\');\n->\n \nSELECT REGEXP_SUBSTR(BINARY\'ABC\',\'b\');\n->\n \nSELECT REGEXP_SUBSTR(\'ABC\',\'(?i)b\');\n-> B\n \nSELECT REGEXP_SUBSTR(\'ABC\' COLLATE utf8_bin,\'(?+i)b\');\n-> B\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/regexp_substr/','','https://mariadb.com/kb/en/regexp_substr/'),(625,'RPAD',37,'Syntax\n------ \nRPAD(str, len [, padstr])\n \nDescription\n----------- \nReturns the string str, right-padded with the string padstr\nto a\nlength of len characters. If str is longer than len, the\nreturn value\nis shortened to len characters. If padstr is omitted, the\nRPAD function pads spaces.\n \nPrior to MariaDB 10.3.1, the padstr parameter was mandatory.\n \nReturns NULL if given a NULL argument. If the result is\nempty (a length of zero), returns either an empty string,\nor, from MariaDB 10.3.6 with SQL_MODE=Oracle, NULL.\n \nThe Oracle mode version of the function can be accessed\noutside of Oracle mode by using RPAD_ORACLE as the function\nname.\n \nExamples\n-------- \nSELECT RPAD(\'hello\',10,\'.\');\n+----------------------+\n| RPAD(\'hello\',10,\'.\') |\n+----------------------+\n| hello..... |\n+----------------------+\n \nSELECT RPAD(\'hello\',2,\'.\');\n+---------------------+\n| RPAD(\'hello\',2,\'.\') |\n+---------------------+\n| he |\n+---------------------+\n \nFrom MariaDB 10.3.1, with the pad string defaulting to\nspace.\n \nSELECT RPAD(\'hello\',30);\n+--------------------------------+\n| RPAD(\'hello\',30) |\n+--------------------------------+\n| hello |\n+--------------------------------+\n \nOracle mode version from MariaDB 10.3.6:\n \nSELECT RPAD(\'\',0),RPAD_ORACLE(\'\',0);\n+------------+-------------------+\n| RPAD(\'\',0) | RPAD_ORACLE(\'\',0) |\n+------------+-------------------+\n| | NULL |\n+------------+-------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/rpad/','','https://mariadb.com/kb/en/library/rpad/'),(626,'RTRIM',37,'Syntax\n------ \nRTRIM(str)\n \nDescription\n----------- \nReturns the string str with trailing space characters\nremoved.\n \nReturns NULL if given a NULL argument. If the result is\nempty, returns either an empty string, or, from MariaDB\n10.3.6 with SQL_MODE=Oracle, NULL.\n \nThe Oracle mode version of the function can be accessed\noutside of Oracle mode by using RTRIM_ORACLE as the function\nname.\n \nExamples\n-------- \nSELECT QUOTE(RTRIM(\'MariaDB \'));\n+-----------------------------+\n| QUOTE(RTRIM(\'MariaDB \')) |\n+-----------------------------+\n| \'MariaDB\' |\n+-----------------------------+\n \nOracle mode version from MariaDB 10.3.6:\n \nSELECT RTRIM(\'\'),RTRIM_ORACLE(\'\');\n+-----------+------------------+\n| RTRIM(\'\') | RTRIM_ORACLE(\'\') |\n+-----------+------------------+\n| | NULL |\n+-----------+------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/rtrim/','','https://mariadb.com/kb/en/library/rtrim/'),(627,'SOUNDEX',37,'Syntax\n------ \nSOUNDEX(str)\n \nDescription\n----------- \nReturns a soundex string from str. Two strings that sound\nalmost the\nsame should have identical soundex strings. A standard\nsoundex string is four\ncharacters long, but the SOUNDEX() function returns an\narbitrarily long\nstring. You can use SUBSTRING() on the result to get a\nstandard soundex\nstring. All non-alphabetic characters in str are ignored.\nAll\ninternational alphabetic characters outside the A-Z range\nare treated as\nvowels.\n \nImportant: When using SOUNDEX(), you should be aware of the\nfollowing limitations:\nThis function, as currently implemented, is intended to work\nwell with\n strings that are in the English language only. Strings in\nother languages may\n not produce reliable results.\n \nExamples\n-------- \nSOUNDEX(\'Hello\');\n+------------------+\n| SOUNDEX(\'Hello\') |\n+------------------+\n| H400 |\n+------------------+\n \nSELECT SOUNDEX(\'MariaDB\');\n+--------------------+\n| SOUNDEX(\'MariaDB\') |\n+--------------------+\n| M631 |\n+--------------------+\n \nSELECT SOUNDEX(\'Knowledgebase\');\n+--------------------------+\n| SOUNDEX(\'Knowledgebase\') |\n+--------------------------+\n| K543212 |\n+--------------------------+\n \nSELECT givenname, surname FROM users WHERE\nSOUNDEX(givenname) = SOUNDEX(\"robert\");\n+-----------+---------+\n| givenname | surname |\n+-----------+---------+\n| Roberto | Castro |\n+-----------+---------+\n \n\n\nURL: https://mariadb.com/kb/en/library/soundex/','','https://mariadb.com/kb/en/library/soundex/'),(632,'SUBSTRING',37,'Syntax\n------ \nSUBSTRING(str,pos), \nSUBSTRING(str FROM pos), \nSUBSTRING(str,pos,len),\nSUBSTRING(str FROM pos FOR len)\n \nSUBSTR(str,pos), \nSUBSTR(str FROM pos), \nSUBSTR(str,pos,len),\nSUBSTR(str FROM pos FOR len)\n \nDescription\n----------- \nThe forms without a len argument return a substring from\nstring str starting at position pos.\n \nThe forms with a len argument return a substring len\ncharacters long from string str, starting at position pos.\n \nThe forms that use FROM are standard SQL syntax.\n \nIt is also possible to use a negative value for pos. In this\ncase, the beginning of the substring is pos characters from\nthe end of the string, rather than the beginning. A negative\nvalue may be used for pos in any of the forms of this\nfunction.\n \nBy default, the position of the first character in the\nstring from which the substring is to be extracted is\nreckoned as 1. For Oracle-compatibility, from MariaDB\n10.3.3, when sql_mode is set to \'oracle\', position zero is\ntreated as position 1 (although the first character is still\nreckoned as 1).\n \nIf any argument is NULL, returns NULL.\n \nExamples\n-------- \nSELECT SUBSTRING(\'Knowledgebase\',5);\n+------------------------------+\n| SUBSTRING(\'Knowledgebase\',5) |\n+------------------------------+\n| ledgebase |\n+------------------------------+\n \nSELECT SUBSTRING(\'MariaDB\' FROM 6);\n+-----------------------------+\n| SUBSTRING(\'MariaDB\' FROM 6) |\n+-----------------------------+\n| DB |\n+-----------------------------+\n \nSELECT SUBSTRING(\'Knowledgebase\',3,7);\n+--------------------------------+\n| SUBSTRING(\'Knowledgebase\',3,7) |\n+--------------------------------+\n| owledge |\n+--------------------------------+\n \nSELECT SUBSTRING(\'Knowledgebase\', -4);\n+--------------------------------+\n| SUBSTRING(\'Knowledgebase\', -4) |\n+--------------------------------+\n| base |\n+--------------------------------+\n \nSELECT SUBSTRING(\'Knowledgebase\', -8, 4);\n+-----------------------------------+\n| SUBSTRING(\'Knowledgebase\', -8, 4) |\n+-----------------------------------+\n| edge |\n+-----------------------------------+\n \nSELECT SUBSTRING(\'Knowledgebase\' FROM -8 FOR 4);\n+------------------------------------------+\n| SUBSTRING(\'Knowledgebase\' FROM -8 FOR 4) |\n+------------------------------------------+\n| edge |\n+------------------------------------------+\n \nOracle mode from MariaDB 10.3.3:\n \nSELECT SUBSTR(\'abc\',0,3);\n+-------------------+\n| SUBSTR(\'abc\',0,3) |\n+-------------------+\n| |\n+-------------------+\n \nSELECT SUBSTR(\'abc\',1,2);\n+-------------------+\n| SUBSTR(\'abc\',1,2) |\n+-------------------+\n| ab |\n+-------------------+\n \nSET sql_mode=\'oracle\';\n \nSELECT SUBSTR(\'abc\',0,3);\n+-------------------+\n| SUBSTR(\'abc\',0,3) |\n+-------------------+\n| abc |\n+-------------------+\n \nSELECT SUBSTR(\'abc\',1,2);\n+-------------------+\n| SUBSTR(\'abc\',1,2) |\n+-------------------+\n| ab |\n+-------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/substring/','','https://mariadb.com/kb/en/library/substring/'),(633,'SUBSTRING_INDEX',37,'Syntax\n------ \nSUBSTRING_INDEX(str,delim,count)\n \nDescription\n----------- \nReturns the substring from string str before count\noccurrences of the\ndelimiter delim. If count is positive, everything to the\nleft\nof the final delimiter (counting from the left) is returned.\nIf count\nis negative, everything to the right of the final delimiter\n(counting from the\nright) is returned. SUBSTRING_INDEX() performs a\ncase-sensitive match when\nsearching for delim.\n \nIf any argument is NULL, returns NULL.\n \nExamples\n-------- \nSELECT SUBSTRING_INDEX(\'www.mariadb.org\', \'.\', 2);\n+--------------------------------------------+\n| SUBSTRING_INDEX(\'www.mariadb.org\', \'.\', 2) |\n+--------------------------------------------+\n| www.mariadb |\n+--------------------------------------------+\n \nSELECT SUBSTRING_INDEX(\'www.mariadb.org\', \'.\', -2);\n+---------------------------------------------+\n| SUBSTRING_INDEX(\'www.mariadb.org\', \'.\', -2) |\n+---------------------------------------------+\n| mariadb.org |\n+---------------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/substring_index/','','https://mariadb.com/kb/en/library/substring_index/'),(634,'TO_BASE64',37,'The TO_BASE64() function was introduced in MariaDB 10.0.5.\n \nSyntax\n------ \nTO_BASE64(str)\n \nDescription\n----------- \nConverts the string argument str to its base-64 encoded\nform, returning the result as a character string in the\nconnection character set and collation.\n \nThe argument str will be converted to string first if it is\nnot a string. A NULL argument will return a NULL result.\n \nThe reverse function, FROM_BASE64(), decodes an encoded\nbase-64 string.\n \nThere are a numerous different methods to base-64 encode a\nstring. The following are used by MariaDB and MySQL:\nAlphabet value 64 is encoded as \'+\'.\nAlphabet value 63 is encoded as \'/\'.\nEncoding output is made up of groups of four printable\ncharacters, with each three bytes of data encoded using four\ncharacters. If the final group is not complete, it is padded\nwith \'=\' characters to make up a length of four.\nTo divide long output, a newline is added after every 76\ncharacters.\nDecoding will recognize and ignore newlines, carriage\nreturns, tabs, and spaces. \n \nExamples\n-------- \nSELECT TO_BASE64(\'Maria\');\n+--------------------+\n| TO_BASE64(\'Maria\') |\n+--------------------+\n| TWFyaWE= |\n+--------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/to_base64/','','https://mariadb.com/kb/en/library/to_base64/'),(635,'TRIM',37,'Syntax\n------ \nTRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str),\nTRIM([remstr FROM] str)\n \nDescription\n----------- \nReturns the string str with all remstr prefixes or suffixes\nremoved. If none of the specifiers BOTH, LEADING, or\nTRAILING is given, BOTH is assumed. remstr is optional and,\nif not specified, spaces are removed.\n \nReturns NULL if given a NULL argument. If the result is\nempty, returns either an empty string, or, from MariaDB\n10.3.6 with SQL_MODE=Oracle, NULL.\n \nThe Oracle mode version of the function can be accessed\noutside of Oracle mode by using TRIM_ORACLE as the function\nname.\n \nExamples\n-------- \nSELECT TRIM(\' bar \')\\G\n*************************** 1. row\n***************************\nTRIM(\' bar \'): bar\n \nSELECT TRIM(LEADING \'x\' FROM \'xxxbarxxx\')\\G\n*************************** 1. row\n***************************\nTRIM(LEADING \'x\' FROM \'xxxbarxxx\'): barxxx\n \nSELECT TRIM(BOTH \'x\' FROM \'xxxbarxxx\')\\G\n*************************** 1. row\n***************************\nTRIM(BOTH \'x\' FROM \'xxxbarxxx\'): bar\n \nSELECT TRIM(TRAILING \'xyz\' FROM \'barxxyz\')\\G\n*************************** 1. row\n***************************\nTRIM(TRAILING \'xyz\' FROM \'barxxyz\'): barx\n \nOracle mode version from MariaDB 10.3.6:\n \nSELECT TRIM(\'\'),TRIM_ORACLE(\'\');\n+----------+-----------------+\n| TRIM(\'\') | TRIM_ORACLE(\'\') |\n+----------+-----------------+\n| | NULL |\n+----------+-----------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/trim/','','https://mariadb.com/kb/en/library/trim/'),(637,'UNHEX',37,'Syntax\n------ \nUNHEX(str)\n \nDescription\n----------- \nPerforms the inverse operation of HEX(str). That is, it\ninterprets\neach pair of hexadecimal digits in the argument as a number\nand\nconverts it to the character represented by the number. The\nresulting\ncharacters are returned as a binary string.\n \nIf str is NULL, UNHEX() returns NULL.\n \nExamples\n-------- \nSELECT HEX(\'MariaDB\');\n+----------------+\n| HEX(\'MariaDB\') |\n+----------------+\n| 4D617269614442 |\n+----------------+\n \nSELECT UNHEX(\'4D617269614442\');\n+-------------------------+\n| UNHEX(\'4D617269614442\') |\n+-------------------------+\n| MariaDB |\n+-------------------------+\n \nSELECT 0x4D617269614442;\n \n+------------------+\n| 0x4D617269614442 |\n+------------------+\n| MariaDB |\n+------------------+\n \nSELECT UNHEX(HEX(\'string\'));\n+----------------------+\n| UNHEX(HEX(\'string\')) |\n+----------------------+\n| string |\n+----------------------+\n \nSELECT HEX(UNHEX(\'1267\'));\n+--------------------+\n| HEX(UNHEX(\'1267\')) |\n+--------------------+\n| 1267 |\n+--------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/unhex/','','https://mariadb.com/kb/en/library/unhex/'),(638,'UPDATEXML',37,'Syntax\n------ \nUpdateXML(xml_target, xpath_expr, new_xml)\n \nDescription\n----------- \nThis function replaces a single portion of a given fragment\nof XML markup\nxml_target with a new XML fragment new_xml, and then returns\nthe\nchanged XML. The portion of xml_target that is replaced\nmatches an XPath\nexpression xpath_expr supplied by the user. If no expression\nmatching\nxpath_expr is found, or if multiple matches are found, the\nfunction returns\nthe original xml_target XML fragment. All three arguments\nshould be\nstrings.\n \nExamples\n-------- \nSELECT\n UpdateXML(\'ccc\', \'/a\', \'fff\') AS val1,\n UpdateXML(\'ccc\', \'/b\', \'fff\') AS val2,\n UpdateXML(\'ccc\', \'//b\', \'fff\') AS val3,\n UpdateXML(\'ccc\', \'/a/d\', \'fff\') AS val4,\n UpdateXML(\'ccc\', \'/a/d\', \'fff\') AS val5\n \\G\n*************************** 1. row\n***************************\nval1: fff\nval2: ccc\nval3: fff\nval4: cccfff\nval5: ccc\n1 row in set (0.00 sec)\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/updatexml/','','https://mariadb.com/kb/en/library/updatexml/'),(640,'WEIGHT_STRING',37,'The WEIGHT_STRING function was introduced in MariaDB 10.0.5.\n \nSyntax\n------ \nWEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [LEVEL levels]\n[flags])\n levels: N [ASC|DESC|REVERSE] [, N [ASC|DESC|REVERSE]] ... \n \nDescription\n----------- \nReturns a binary string representing the string\'s sorting\nand comparison value. A string with a lower result means\nthat for sorting purposes the string appears before a string\nwith a higher result.\n \nWEIGHT_STRING() is particularly useful when adding new\ncollations, for testing purposes.\n \nIf str is a non-binary string (CHAR, VARCHAR or TEXT),\nWEIGHT_STRING returns the string\'s collation weight. If str\nis a binary string (BINARY, VARBINARY or BLOB), the return\nvalue is simply the input value, since the weight for each\nbyte in a binary string is the byte value.\n \nWEIGHT_STRING() returns NULL if given a NULL input. \n \nThe optional AS clause permits casting the input string to a\nbinary or non-binary string, as well as to a particular\nlength.\n \nAS BINARY(N) measures the length in bytes rather than\ncharacters, and right pads with 0x00 bytes to the desired\nlength. \n \nAS CHAR(N) measures the length in characters, and right pads\nwith spaces to the desired length.\n \nN has a minimum value of 1, and if it is less than the\nlength of the input string, the string is truncated without\nwarning.\n \nThe optional LEVEL clause specifies that the return value\nshould contain weights for specific collation levels. The\nlevels specifier can either be a single integer, a\ncomma-separated list of integers, or a range of integers\nseparated by a dash (whitespace is ignored). Integers can\nrange from 1 to a maximum of 6, dependent on the collation,\nand need to be listed in ascending order.\n \nIf the LEVEL clause is no provided, a default of 1 to the\nmaximum for the collation is assumed.\n \nIf the LEVEL is specified without using a range, an optional\nmodifier is permitted.\n \nASC, the default, returns the weights without any\nmodification.\n \nDESC returns bitwise-inverted weights.\n \nREVERSE returns the weights in reverse order.\n \nExamples\n-------- \nThe examples below use the HEX() function to represent\nnon-printable results in hexadecimal format.\n \nSELECT HEX(WEIGHT_STRING(\'x\'));\n+-------------------------+\n| HEX(WEIGHT_STRING(\'x\')) |\n+-------------------------+\n| 0058 |\n+-------------------------+\n \nSELECT HEX(WEIGHT_STRING(\'x\' AS BINARY(4)));\n+--------------------------------------+\n| HEX(WEIGHT_STRING(\'x\' AS BINARY(4))) |\n+--------------------------------------+\n| 78000000 |\n+--------------------------------------+\n \nSELECT HEX(WEIGHT_STRING(\'x\' AS CHAR(4)));\n+------------------------------------+\n| HEX(WEIGHT_STRING(\'x\' AS CHAR(4))) |\n+------------------------------------+\n| 0058002000200020 |\n+------------------------------------+\n \nSELECT HEX(WEIGHT_STRING(0xaa22ee LEVEL 1));\n+--------------------------------------+\n| HEX(WEIGHT_STRING(0xaa22ee LEVEL 1)) |\n+--------------------------------------+\n| AA22EE |\n+--------------------------------------+\n \nSELECT HEX(WEIGHT_STRING(0xaa22ee LEVEL 1 DESC));\n+-------------------------------------------+\n| HEX(WEIGHT_STRING(0xaa22ee LEVEL 1 DESC)) |\n+-------------------------------------------+\n| 55DD11 |\n+-------------------------------------------+\n \nSELECT HEX(WEIGHT_STRING(0xaa22ee LEVEL 1 REVERSE));\n+----------------------------------------------+\n| HEX(WEIGHT_STRING(0xaa22ee LEVEL 1 REVERSE)) |\n+----------------------------------------------+\n| EE22AA |\n+----------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/weight_string/','','https://mariadb.com/kb/en/library/weight_string/'),(641,'ALTER DATABASE',39,'Modifies a database, changing its overall characteristics.\n \nSyntax\n------ \nALTER {DATABASE | SCHEMA} [db_name]\n alter_specification ...\nALTER {DATABASE | SCHEMA} db_name\n UPGRADE DATA DIRECTORY NAME\n \nalter_specification:\n [DEFAULT] CHARACTER SET [=] charset_name\n | [DEFAULT] COLLATE [=] collation_name\n \nDescription\n----------- \nALTER DATABASE enables you to change the overall\ncharacteristics of a\ndatabase. These characteristics are stored in the db.opt\nfile in the\ndatabase directory. To use ALTER DATABASE, you need the\nALTER\nprivilege on the database. ALTER SCHEMA is a synonym for\nALTER\nDATABASE.\n \nThe CHARACTER SET clause changes the default database\ncharacter set.\nThe COLLATE clause changes the default database collation.\nSee Character Sets and Collations for more.\n \nYou can see what character sets and collations are available\nusing,\nrespectively, the SHOW CHARACTER SET and SHOW COLLATION\nstatements.\n \nChanging the default character set/collation of a database\ndoes not change the character set/collation of any stored\nprocedures or stored functions that were previously created,\nand relied on the defaults. These need to be dropped and\nrecreated in order to apply the character set/collation\nchanges.\n \nThe database name can be omitted from the first syntax, in\nwhich case\nthe statement applies to the default database.\n \nThe syntax that includes the UPGRADE DATA DIRECTORY NAME\nclause was\nadded in MySQL 5.1.23. It updates the name of the directory\nassociated\nwith the database to use the encoding implemented in MySQL\n5.1 for\nmapping database names to database directory names (see\nIdentifier to File Name Mapping). This\nclause is for use under these conditions:\nIt is intended when upgrading MySQL to 5.1 or later from\nolder versions.\nIt is intended to update a database directory name to the\ncurrent encoding format if the name contains special\ncharacters that need encoding.\nThe statement is used by mysqlcheck (as invoked by\nmysql_upgrade).\n \nFor example,if a database in MySQL 5.0 has a name of a-b-c,\nthe name\ncontains instance of the `-\' character. In 5.0, the\ndatabase directory\nis also named a-b-c, which is not necessarily safe for all\nfile\nsystems. In MySQL 5.1 and up, the same database name is\nencoded as\na@002db@002dc to produce a file system-neutral directory\nname.\n \nWhen a MySQL installation is upgraded to MySQL 5.1 or later\nfrom an\nolder version,the server displays a name such as a-b-c\n(which is in\nthe old format) as #mysql50#a-b-c, and you must refer to the\nname\nusing the #mysql50# prefix. Use UPGRADE DATA DIRECTORY NAME\nin this\ncase to explicitly tell the server to re-encode the database\ndirectory\nname to the current encoding format:\n \nALTER DATABASE `#mysql50#a-b-c` UPGRADE DATA DIRECTORY NAME;\n \nAfter executing this statement, you can refer to the\ndatabase as a-b-c\nwithout the special #mysql50# prefix.\n \nExamples\n-------- \nALTER DATABASE test CHARACTER SET = \'utf8\' COLLATE =\n\'utf8_bin\';\n \n\n\nURL: https://mariadb.com/kb/en/library/alter-database/','','https://mariadb.com/kb/en/library/alter-database/'),(642,'ALTER EVENT',39,'Modifies one or more characteristics of an existing event.\n \nSyntax\n------ \nALTER\n [DEFINER = { user | CURRENT_USER }]\n EVENT event_name\n [ON SCHEDULE schedule]\n [ON COMPLETION [NOT] PRESERVE]\n [RENAME TO new_event_name]\n [ENABLE | DISABLE | DISABLE ON SLAVE]\n [COMMENT \'comment\']\n [DO sql_statement]\n \nDescription\n----------- \nThe ALTER EVENT statement is used to change one or more of\nthe\ncharacteristics of an existing event without the need to\ndrop and recreate it.\nThe syntax for each of the DEFINER, ON SCHEDULE, ON\nCOMPLETION,\nCOMMENT, ENABLE / DISABLE, and DO clauses is exactly the\nsame as when used with CREATE EVENT.\n \nThis statement requires the EVENT privilege.\nWhen a user executes a successful ALTER EVENT statement,\nthat user becomes\nthe definer for the affected event.\n \n(In MySQL 5.1.11 and earlier, an event could be altered only\nby its definer, or\nby a user having the SUPER privilege.)\n \nALTER EVENT works only with an existing event:\n \nALTER EVENT no_such_event ON SCHEDULE EVERY \'2:3\'\nDAY_HOUR;\nERROR 1539 (HY000): Unknown event \'no_such_event\'\n \nExamples\n-------- \nALTER EVENT myevent \n ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 2 HOUR \n DO \n UPDATE myschema.mytable SET mycol = mycol + 1;\n \n\n\nURL: https://mariadb.com/kb/en/library/alter-event/','','https://mariadb.com/kb/en/library/alter-event/'),(643,'ALTER FUNCTION',39,'Syntax\n------ \nALTER FUNCTION func_name [characteristic ...]\n \ncharacteristic:\n { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL\nDATA }\n | SQL SECURITY { DEFINER | INVOKER }\n | COMMENT \'string\'\n \nDescription\n----------- \nThis statement can be used to change the characteristics of\na stored\nfunction. More than one change may be specified in an ALTER\nFUNCTION\nstatement. However, you cannot change the parameters or body\nof a\nstored function using this statement; to make such changes,\nyou must\ndrop and re-create the function using DROP FUNCTION and\nCREATE FUNCTION.\n \nYou must have the ALTER ROUTINE privilege for the function.\n(That\nprivilege is granted automatically to the function creator.)\nIf binary\nlogging is enabled, the ALTER FUNCTION statement might also\nrequire\nthe SUPER privilege, as described in Binary Logging of\nStored Routines.\n \nExample\n \nALTER FUNCTION hello SQL SECURITY INVOKER;\n \n\n\nURL: https://mariadb.com/kb/en/library/alter-function/','','https://mariadb.com/kb/en/library/alter-function/'),(645,'ALTER PROCEDURE',39,'Syntax\n------ \nALTER PROCEDURE proc_name [characteristic ...]\n \ncharacteristic:\n { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL\nDATA }\n | SQL SECURITY { DEFINER | INVOKER }\n | COMMENT \'string\'\n \nDescription\n----------- \nThis statement can be used to change the characteristics of\na stored\nprocedure. More than one change may be specified in an ALTER\nPROCEDURE\nstatement. However, you cannot change the parameters or body\nof a\nstored procedure using this statement. To make such changes,\nyou must\ndrop and re-create the procedure using either CREATE OR\nREPLACE PROCEDURE (since MariaDB 10.1.3) or DROP PROCEDURE\nand CREATE PROCEDURE (MariaDB 10.1.2 and before).\n \nYou must have the ALTER ROUTINE privilege for the procedure.\nBy default, that privilege is granted automatically to the\nprocedure creator. See Stored Routine Privileges.\n \nExample\n \nALTER PROCEDURE simpleproc SQL SECURITY INVOKER;\n \n\n\nURL: https://mariadb.com/kb/en/library/alter-procedure/','','https://mariadb.com/kb/en/library/alter-procedure/'),(649,'ALTER VIEW',39,'Syntax\n------ \nALTER\n [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]\n [DEFINER = { user | CURRENT_USER }]\n [SQL SECURITY { DEFINER | INVOKER }]\n VIEW view_name [(column_list)]\n AS select_statement\n [WITH [CASCADED | LOCAL] CHECK OPTION]\n \nDescription\n----------- \nThis statement changes the definition of a view, which must\nexist. The\nsyntax is similar to that for CREATE VIEW and the effect is\nthe same\nas for CREATE OR REPLACE VIEW if the view exists. This\nstatement\nrequires the CREATE VIEW and DROP privileges for the view,\nand some\nprivilege for each column referred to in the SELECT\nstatement. As of\nMariaDB 5.1.23, ALTER VIEW is allowed only to the definer or\nusers with\nthe SUPER privilege.\n \nExample\n \nALTER VIEW v AS SELECT a, a*3 AS a2 FROM t;\n \n\n\nURL: https://mariadb.com/kb/en/library/alter-view/','','https://mariadb.com/kb/en/library/alter-view/'),(651,'CREATE DATABASE',39,'Syntax\n------ \nCREATE [OR REPLACE] {DATABASE | SCHEMA} [IF NOT EXISTS]\ndb_name\n [create_specification] ...\n \ncreate_specification:\n [DEFAULT] CHARACTER SET [=] charset_name\n | [DEFAULT] COLLATE [=] collation_name\n \nDescription\n----------- \nCREATE DATABASE creates a database with the given name. To\nuse this statement, you need the CREATE privilege for the\ndatabase. CREATE SCHEMA is a synonym for CREATE DATABASE.\n \nFor valid identifiers to use as database names, see\nIdentifier Names.\n \nOR REPLACE\n \nThe OR REPLACE clause was added in MariaDB 10.1.3\n \nIf the optional OR REPLACE clause is used, it acts as a\nshortcut for:\n \nDROP DATABASE IF EXISTS db_name;\n \nCREATE DATABASE db_name ...;\n \nIF NOT EXISTS\n \nWhen the IF NOT EXISTS clause is used, MariaDB will return a\nwarning instead of an error if the specified database\nalready exists.\n \nExamples\n-------- \nCREATE DATABASE db1;\n \nQuery OK, 1 row affected (0.18 sec)\n \nCREATE DATABASE db1;\n \nERROR 1007 (HY000): Can\'t create database \'db1\'; database\nexists\n \nCREATE OR REPLACE DATABASE db1;\nQuery OK, 2 rows affected (0.00 sec)\n \nCREATE DATABASE IF NOT EXISTS db1;\nQuery OK, 1 row affected, 1 warning (0.01 sec)\n \nSHOW WARNINGS;\n+-------+------+----------------------------------------------+\n| Level | Code | Message |\n+-------+------+----------------------------------------------+\n| Note | 1007 | Can\'t create database \'db1\';\n database exists |\n+-------+------+----------------------------------------------+\n \nSetting the character sets and collation. See Setting\nCharacter Sets and Collations for more details.\n \nCREATE DATABASE czech_slovak_names \n CHARACTER SET = \'keybcs2\'\n COLLATE = \'keybcs2_bin\';\n \n\n\nURL: https://mariadb.com/kb/en/library/create-database/','','https://mariadb.com/kb/en/library/create-database/'),(650,'CONSTRAINT',39,'MariaDB supports the implementation of constraints at the\ntable-level using either CREATE TABLE or ALTER TABLE\nstatements. A table constraint restricts the data you can\nadd to the table. If you attempt to insert invalid data on a\ncolumn, MariaDB throws an error. \n \nSyntax\n------ \n[CONSTRAINT [symbol]] constraint_expression\n \nconstraint_expression:\n | PRIMARY KEY [index_type] (index_col_name, ...)\n[index_option] ...\n | FOREIGN KEY [index_name] (index_col_name, ...) \n REFERENCES tbl_name (index_col_name, ...)\n [ON DELETE reference_option]\n [ON UPDATE reference_option]\n | UNIQUE [INDEX|KEY] [index_name]\n [index_type] (index_col_name, ...) [index_option] ...\n | CHECK (check_constraints)\n \nindex_type:\n USING {BTREE | HASH | RTREE}\n \nindex_col_name:\n col_name [(length)] [ASC | DESC]\n \nindex_option:\n | KEY_BLOCK_SIZE [=] value\n | index_type\n | WITH PARSER parser_name\n | COMMENT \'string\'\n | CLUSTERING={YES|NO}\n \nreference_option:\n RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT\n \nDescription\n----------- \nConstraints provide restrictions on the data you can add to\na table. This allows you to enforce data integrity from\nMariaDB, rather than through application logic. When a\nstatement violates a constraint, MariaDB throws an error.\n \nThere are four types of table constraints:\n \nConstraint | Description | \n \nPRIMARY KEY | Sets the column for referencing rows. Values\nmust be unique and not null. | \n \nFOREIGN KEY | Sets the column to reference the primary key\non another table. | \n \nUNIQUE | Requires values in column or columns only occur\nonce in the table. | \n \nCHECK | Checks whether the data meets the given condition. |\n\n \nFOREIGN KEY Constraints\n \nInnoDB supports foreign key constraints. The syntax for a\nforeign key\nconstraint definition in InnoDB looks like this:\n \n[CONSTRAINT [symbol]] FOREIGN KEY\n [index_name] (index_col_name, ...)\n REFERENCES tbl_name (index_col_name,...)\n [ON DELETE reference_option]\n [ON UPDATE reference_option]\n \nreference_option:\n RESTRICT | CASCADE | SET NULL | NO ACTION\n \nCHECK Constraints\n \nFrom MariaDB 10.2.1, constraints are enforced. Before\nMariaDB 10.2.1 constraint expressions were accepted in the\nsyntax but ignored.\n \nIn MariaDB 10.2.1 you can define constraints in 2 different\nways:\nCHECK(expression) given as part of a column definition.\nCONSTRAINT [constraint_name] CHECK (expression)\n \nBefore a row is inserted or updated, all constraints are\nevaluated in the order they are defined. If any constraint\nexpression returns false, then the row will not be inserted\nor updated.\nOne can use most deterministic functions in a constraint,\nincluding UDFs.\n \nCREATE TABLE t1 (a INT CHECK (a>2), b INT CHECK (b>2),\nCONSTRAINT a_greater CHECK (a>b));\n \nIf you use the second format and you don\'t give a name to\nthe constraint, then the constraint will get an\nautomatically generated name. This is done so that you can\nlater delete the constraint with ALTER TABLE DROP\nconstraint_name.\n \nOne can disable all constraint expression checks by setting\nthe check_constraint_checks variable to OFF. This is useful\nfor example when loading a table that violates some\nconstraints that you want to later find and fix in SQL.\n \nReplication\n \nIn row-based replication, only the master checks\nconstraints, and failed statements will not be replicated.\nIn statement-based replication, the slaves will also check\nconstraints. Constraints should therefore be identical, as\nwell as deterministic, in a replication environment.\n \nAuto_increment\n \nFrom MariaDB 10.2.6, auto_increment columns are no longer\npermitted in check constraints. Previously they were\npermitted, but would not work correctly. See MDEV-11117.\n \nExamples\n-------- \nCREATE TABLE product (category INT NOT NULL, id INT NOT\nNULL,\n price DECIMAL,\n PRIMARY KEY(category, id)) ENGINE=INNODB;\n \nCREATE TABLE customer (id INT NOT NULL,\n PRIMARY KEY (id)) ENGINE=INNODB;\n \nCREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT,\n product_category INT NOT NULL,\n product_id INT NOT NULL,\n customer_id INT NOT NULL,\n PRIMARY KEY(no),\n INDEX (product_category, product_id),\n FOREIGN KEY (product_category, product_id)\n REFERENCES product(category, id)\n ON UPDATE CASCADE ON DELETE RESTRICT,\n INDEX (customer_id),\n FOREIGN KEY (customer_id)\n REFERENCES customer(id)) ENGINE=INNODB;\n \nThe following examples will work from MariaDB 10.2.1\nonwards.\n \nNumeric constraints and comparisons:\n \nCREATE TABLE t1 (a INT CHECK (a>2), b INT CHECK (b>2),\nCONSTRAINT a_greater CHECK (a>b));\n \nINSERT INTO t1(a) VALUES (1);\nERROR 4022 (23000): CONSTRAINT `a` failed for `test`.`t1`\n \nINSERT INTO t1(a,b) VALUES (3,4);\nERROR 4022 (23000): CONSTRAINT `a_greater` failed for\n`test`.`t1`\n \nINSERT INTO t1(a,b) VALUES (4,3);\nQuery OK, 1 row affected (0.04 sec)\n \nDropping a constraint:\n \nALTER TABLE t1 DROP CONSTRAINT a_greater;\n \nAdding a constraint:\n \nALTER TABLE t1 ADD CONSTRAINT a_greater CHECK (a>b);\n \nDate comparisons and character length:\n \nCREATE TABLE t2 (name VARCHAR(30) CHECK\n(CHAR_LENGTH(name)>2), start_date DATE, \n end_date DATE CHECK (start_date IS NULL OR end_date IS NULL\nOR start_date2)), start_date DATE, \n end_date DATE CHECK (start_date IS NULL OR end_date IS NULL\nOR start_date2 is very different to CHAR_LENGTH(name>2) as\nthe latter mistakenly performs a numeric comparison on the\nname field, leading to unexpected results.\n \n\n\nURL: https://mariadb.com/kb/en/library/constraint/','','https://mariadb.com/kb/en/library/constraint/'),(652,'CREATE EVENT',39,'Syntax\n------ \nCREATE [OR REPLACE]\n [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]\n EVENT \n [IF NOT EXISTS]\n event_name \n ON SCHEDULE schedule\n [ON COMPLETION [NOT] PRESERVE]\n [ENABLE | DISABLE | DISABLE ON SLAVE]\n [COMMENT \'comment\']\n DO sql_statement;\n \nschedule:\n AT timestamp [+ INTERVAL interval] ...\n | EVERY interval \n [STARTS timestamp [+ INTERVAL interval] ...] \n [ENDS timestamp [+ INTERVAL interval] ...]\n \ninterval:\n quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |\n WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |\n DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}\n \nDescription\n----------- \nThis statement creates and schedules a new event. It\nrequires the\nEVENT privilege for the schema in which the event is to be\ncreated.\n \nThe minimum requirements for a valid CREATE EVENT statement\nare as\nfollows:\nThe keywords CREATE EVENT plus an event name, which uniquely\nidentifies\n the event in the current schema. (Prior to MySQL 5.1.12,\nthe event name\n needed to be unique only among events created by the same\nuser on a given\n database.)\nAn ON SCHEDULE clause, which determines when and how often\nthe event\n executes.\nA DO clause, which contains the SQL statement to be executed\nby an\n event.\n \nHere is an example of a minimal CREATE EVENT statement:\n \nCREATE EVENT myevent\n ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR\n DO\n UPDATE myschema.mytable SET mycol = mycol + 1;\n \nThe previous statement creates an event named myevent. This\nevent executes once\n— one hour following its creation\n— by running an SQL statement that increments the\nvalue of the myschema.mytable table\'s mycol column by 1.\n \nThe event_name must be a valid MariaDB identifier with a\nmaximum length\nof 64 characters. It may be delimited using back ticks, and\nmay be\nqualified with the name of a database schema. An event is\nassociated\nwith both a MariaDB user (the definer) and a schema, and its\nname must\nbe unique among names of events within that schema. In\ngeneral, the\nrules governing event names are the same as those for names\nof stored\nroutines. See Identifier Names.\n \nIf no schema is indicated as part of event_name, the default\n(current)\nschema is assumed.\n \nFor valid identifiers to use as event names, see Identifier\nNames.\n \nOR REPLACE\n \nThe OR REPLACE clause was included in MariaDB 10.1.4. If\nused and the event already exists, instead of an error being\nreturned, the existing event will be dropped and replaced by\nthe newly defined event.\n \nIF NOT EXISTS\n \nIf the IF NOT EXISTS clause is used, MariaDB will return a\nwarning instead of an error if the event already exists.\nCannot be used together with OR REPLACE.\n \nON SCHEDULE\n \nThe ON SCHEDULE clause can be used to specify when the event\nmust be triggered.\n \nAT\n \nIf you want to execute the event only once (one time event),\nyou can use the AT keyword, followed by a timestamp. If you\nuse CURRENT_TIMESTAMP, the event acts as soon as it is\ncreated. As a convenience, you can add one or more intervals\nto that timestamp. You can also specify a timestamp in the\npast, so that the event is stored but not triggered, until\nyou modify it via ALTER EVENT.\n \nThe following example shows how to create an event that will\nbe triggered tomorrow at a certain time:\n \nCREATE EVENT example\nON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY + INTERVAL\n3 HOUR\nDO something;\n \nYou can also specify that an event must be triggered at a\nregular interval (recurring event). In such cases, use the\nEVERY clause followed by the interval.\n \nIf an event is recurring, you can specify when the first\nexecution must happen via the STARTS clause and a maximum\ntime for the last execution via the ENDS clause. STARTS and\nENDS clauses are followed by a timestamp and, optionally,\none or more intervals. The ENDS clause can specify a\ntimestamp in the past, so that the event is stored but not\nexecuted until you modify it via ALTER EVENT.\n \nIn the following example, next month a recurring event will\nbe triggered hourly for a week:\n \nCREATE EVENT example\nON SCHEDULE EVERY 1 HOUR\nSTARTS CURRENT_TIMESTAMP + INTERVAL 1 MONTH\nENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH + INTERVAL 1 WEEK\nDO some_task;\n \nIntervals consist of a quantity and a time unit. The time\nunits are the same used for other staments and time\nfunctions, except that you can\'t use microseconds for\nevents. For simple time units, like HOUR or MINUTE, the\nquantity is an integer number, for example \'10 MINUTE\'.\nFor composite time units, like HOUR_MINUTE or HOUR_SECOND,\nthe quantity must be a string with all involved simple\nvalues and their separators, for example \'2:30\' or\n\'2:30:30\'.\n \nON COMPLETION [NOT] PRESERVE\n \nThe ON COMPLETION clause can be used to specify if the event\nmust be deleted after its last execution (that is, after its\nAT or ENDS timestamp is past). By default, events are\ndropped when they are expired. To explicitly state that this\nis the desired behaviour, you can use ON COMPLETION NOT\nPRESERVE. Instead, if you want the event to be preserved,\nyou can use ON COMPLETION PRESERVE.\n \nIn you specify ON COMPLETION NOT PRESERVE, and you specify a\ntimestamp in the past for AT or ENDS clause, the event will\nbe immediatly dropped. In such cases, you will get a Note\n1558: \"Event execution time is in the past and ON\nCOMPLETION NOT PRESERVE is set. The event was dropped\nimmediately after creation\".\n \nENABLE/DISABLE/DISABLE ON SLAVE\n \nEvents are ENABLEd by default. If you want to stop MariaDB\nfrom executing\nan event, you may specify DISABLE. When it is ready to be\nactivated, you\nmay enable it using ALTER EVENT. Another option is\nDISABLE ON SLAVE, which indicates that an event was created\non a master and has been replicated to the slave, which is\nprevented from executing the event. If DISABLE ON SLAVE is\nspecifically set, the event will not be executed.\n \nCOMMENT\n \nThe COMMENT clause may be used to set a comment for the\nevent. Maximum\nlength for comments is 64 characters. The comment is a\nstring, so it must be\nquoted. To see events comments, you can query the\nINFORMATION_SCHEMA.EVENTS table (the column is named\nEVENT_COMMENT).\n \nExamples\n-------- \nMinimal CREATE EVENT statement:\n \nCREATE EVENT myevent\n ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR\n DO\n UPDATE myschema.mytable SET mycol = mycol + 1;\n \nAn event that will be triggered tomorrow at a certain time:\n \nCREATE EVENT example\nON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY + INTERVAL\n3 HOUR\nDO something;\n \nNext month a recurring event will be triggered hourly for a\nweek:\n \nCREATE EVENT example\nON SCHEDULE EVERY 1 HOUR\nSTARTS CURRENT_TIMESTAMP + INTERVAL 1 MONTH\nENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH + INTERVAL 1 WEEK\nDO some_task;\n \nOR REPLACE and IF NOT EXISTS:\n \nCREATE EVENT myevent\n ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR\n DO\n UPDATE myschema.mytable SET mycol = mycol + 1;\n \nERROR 1537 (HY000): Event \'myevent\' already exists\n \nCREATE OR REPLACE EVENT myevent\n ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR\n DO\n UPDATE myschema.mytable SET mycol = mycol + 1;;\nQuery OK, 0 rows affected (0.00 sec)\n \nCREATE EVENT IF NOT EXISTS myevent\n ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR\n DO\n UPDATE myschema.mytable SET mycol = mycol + 1;\n \nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n \n SHOW WARNINGS;\n \n+-------+------+--------------------------------+\n| Level | Code | Message |\n+-------+------+--------------------------------+\n| Note | 1537 | Event \'myevent\' already exists |\n+-------+------+--------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/create-event/','','https://mariadb.com/kb/en/library/create-event/'),(654,'CREATE INDEX',39,'Syntax\n------ \nCREATE [OR REPLACE] [UNIQUE|FULLTEXT|SPATIAL] INDEX \n [IF NOT EXISTS] index_name\n [index_type]\n ON tbl_name (index_col_name,...)\n [WAIT n | NOWAIT]\n [index_option]\n [algorithm_option | lock_option] ...\n \nindex_col_name:\n col_name [(length)] [ASC | DESC]\n \nindex_type:\n USING {BTREE | HASH | RTREE}\n \nindex_option:\n KEY_BLOCK_SIZE [=] value\n | index_type\n | WITH PARSER parser_name\n | COMMENT \'string\'\n \nalgorithm_option:\n ALGORITHM [=] {DEFAULT|INPLACE|COPY|NOCOPY|INSTANT}\n \nlock_option:\n LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE}\n \nDescription\n----------- \nCREATE INDEX is mapped to an ALTER TABLE statement to create\nindexes.\nSee ALTER TABLE. CREATE INDEX cannot be used to create a\nPRIMARY KEY; use ALTER TABLE instead.\n \nIf another connection is using the table, a metadata lock is\nactive, and this statement will wait until the lock is\nreleased. This is also true for non-transactional tables.\n \nAnother shortcut, DROP INDEX, allows the removal of an\nindex.\n \nFor valid identifiers to use as index names, see Identifier\nNames.\n \nNote that KEY_BLOCK_SIZE is currently ignored in CREATE\nINDEX, although it is included in the output of SHOW CREATE\nTABLE.\n \nPrivileges\n \nExecuting the CREATE INDEX statement requires the INDEX\nprivilege for the table or the database.\n \nOnline DDL\n \nIn MariaDB 10.0 and later, online DDL is supported with the\nALGORITHM and LOCK clauses.\n \nSee InnoDB Online DDL Overview for more information on\nonline DDL with InnoDB.\n \nCREATE OR REPLACE INDEX ...\n \nThe OR REPLACE clause was added in MariaDB 10.1.4.\n \nIf the OR REPLACE clause is used and if the index already\nexists, then instead of returning an error, the server will\ndrop the existing index and replace it with the newly\ndefined index.\n \nCREATE INDEX IF NOT EXISTS ...\n \nIf the IF NOT EXISTS clause is used, then the index will\nonly be created if an index with the same name does not\nalready exist. If the index already exists, then a warning\nwill be triggered by default.\n \nIndex Definitions\n \nSee CREATE TABLE: Index Definitions for information about\nindex definitions.\n \nWAIT/NOWAIT\n \nSet the lock wait timeout. See WAIT and NOWAIT.\n \nALGORITHM\n \nSee ALTER TABLE: ALGORITHM for more information.\n \nLOCK\n \nSee ALTER TABLE: LOCK for more information.\n \nProgress Reporting\n \nMariaDB provides progress reporting for CREATE INDEX\nstatement for clients\nthat support the new progress reporting protocol. For\nexample, if you were using the mysql client, then the\nprogress report might look like this::\n \nCREATE INDEX ON tab (num);;\nStage: 1 of 2 \'copy to tmp table\' 46% of stage\n \nThe progress report is also shown in the output of the SHOW\nPROCESSLIST statement and in the contents of the\ninformation_schema.PROCESSLIST table.\n \nSee Progress Reporting for more information.\n \nExamples\n-------- \nCreating a unique index:\n \nCREATE UNIQUE INDEX HomePhone ON Employees(Home_Phone);\n \nOR REPLACE and IF NOT EXISTS:\n \nCREATE INDEX xi ON xx5 (x);\nQuery OK, 0 rows affected (0.03 sec)\n \nCREATE INDEX xi ON xx5 (x);\nERROR 1061 (42000): Duplicate key name \'xi\'\n \nCREATE OR REPLACE INDEX xi ON xx5 (x);\nQuery OK, 0 rows affected (0.03 sec)\n \nCREATE INDEX IF NOT EXISTS xi ON xx5 (x);\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n \nSHOW WARNINGS;\n \n+-------+------+-------------------------+\n| Level | Code | Message |\n+-------+------+-------------------------+\n| Note | 1061 | Duplicate key name \'xi\' |\n+-------+------+-------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/create-index/','','https://mariadb.com/kb/en/library/create-index/'),(655,'CREATE PACKAGE',39,'Oracle-style packages were introduced in MariaDB 10.3.5.\n \nSyntax\n------ \nCREATE\n [ OR REPLACE]\n [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]\n PACKAGE [ IF NOT EXISTS ]\n [ db_name . ] package_name\n [ package_characteristic ... ]\n{ AS | IS }\n [ package_specification_element ... ]\nEND [ package_name ]\n \npackage_characteristic:\n COMMENT \'string\'\n | SQL SECURITY { DEFINER | INVOKER }\n \npackage_specification_element:\n FUNCTION_SYM package_specification_function ;\n | PROCEDURE_SYM package_specification_procedure ;\n \npackage_specification_function:\n func_name [ ( func_param [, func_param]... ) ]\n RETURNS func_return_type\n [ package_routine_characteristic... ]\n \npackage_specification_procedure:\n proc_name [ ( proc_param [, proc_param]... ) ]\n [ package_routine_characteristic... ]\n \nfunc_return_type:\n type\n \nfunc_param:\n param_name type\n \nproc_param:\n param_name { IN | OUT | INOUT | IN OUT } type\n \ntype:\n Any valid MariaDB explicit or anchored data type\n \npackage_routine_characteristic:\n COMMENT \'string\'\n | LANGUAGE SQL\n | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL\nDATA }\n | SQL SECURITY { DEFINER | INVOKER }\n \nDescription\n----------- \nThe CREATE PACKAGE statement can be used when Oracle\nSQL_MODE is set.\n \nThe CREATE PACKAGE creates the specification for a stored\npackage (a collection of logically related stored objects).\nA stored package specification declares public routines\n(procedures and functions) of the package, but does not\nimplement these routines.\n \nA package whose specification was created by the CREATE\nPACKAGE statement, should later be implemented using the\nCREATE PACKAGE BODY statement.\n \nExamples\n-------- \nSET sql_mode=ORACLE;\nDELIMITER $$\nCREATE OR REPLACE PACKAGE employee_tools AS\n FUNCTION getSalary(eid INT) RETURN DECIMAL(10,2);\n PROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2));\n PROCEDURE raiseSalaryStd(eid INT);\n PROCEDURE hire(ename TEXT, esalary DECIMAL(10,2));\nEND;\n$$\nDELIMITER ;\n \n\n\nURL: https://mariadb.com/kb/en/library/create-package/','','https://mariadb.com/kb/en/library/create-package/'),(656,'CREATE PACKAGE BODY',39,'Oracle-style packages were introduced in MariaDB 10.3.5.\n \nSyntax\n------ \nCREATE [ OR REPLACE ]\n [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]\n PACKAGE BODY\n [ IF NOT EXISTS ]\n [ db_name . ] package_name\n [ package_characteristic... ]\n{ AS | IS }\n package_implementation_declare_section\n package_implementation_executable_section\nEND [ package_name]\n \npackage_implementation_declare_section:\n package_implementation_item_declaration\n [ package_implementation_item_declaration... ]\n [ package_implementation_routine_definition... ]\n | package_implementation_routine_definition\n [ package_implementation_routine_definition...]\n \npackage_implementation_item_declaration:\n variable_declaration ;\n \nvariable_declaration:\n variable_name[,...] type [:= expr ]\n \npackage_implementation_routine_definition:\n FUNCTION package_specification_function\n [ package_implementation_function_body ] ;\n | PROCEDURE package_specification_procedure\n [ package_implementation_procedure_body ] ;\n \npackage_implementation_function_body:\n { AS | IS } package_routine_body [func_name]\n \npackage_implementation_procedure_body:\n { AS | IS } package_routine_body [proc_name]\n \npackage_routine_body:\n [ package_routine_declarations ]\n BEGIN\n statements [ EXCEPTION exception_handlers ]\n END\n \npackage_routine_declarations:\n package_routine_declaration \';\'\n[package_routine_declaration \';\']...\n \npackage_routine_declaration:\n variable_declaration\n | condition_name CONDITION FOR condition_value\n | user_exception_name EXCEPTION\n | CURSOR_SYM cursor_name\n [ ( cursor_formal_parameters ) ]\n IS select_statement\n ;\n \npackage_implementation_executable_section:\n END\n | BEGIN\n statement ; [statement ; ]...\n [EXCEPTION exception_handlers]\n END\n \nexception_handlers:\n exception_handler [exception_handler...]\n \nexception_handler:\n WHEN_SYM condition_value [, condition_value]...\n THEN_SYM statement ; [statement ;]...\n \ncondition_value:\n condition_name\n | user_exception_name\n | SQLWARNING\n | SQLEXCEPTION\n | NOT FOUND\n | OTHERS_SYM\n | SQLSTATE [VALUE] sqlstate_value\n | mariadb_error_code\n \n\nDescription\n----------- \nThe CREATE PACKAGE BODY statement can be used when Oracle\nSQL_MODE is set.\n \nThe CREATE PACKAGE BODY statement creates the package body\nfor a stored package. The package specification must be\npreviously created using the CREATE PACKAGE statement.\n \nA package body provides implementations of the package\npublic routines and can optionally have:\npackage-wide private variables\npackage private routines\nforward declarations for private routines\nan executable initialization section\n \nExamples\n-------- \nSET sql_mode=ORACLE;\nDELIMITER $$\nCREATE OR REPLACE PACKAGE employee_tools AS\n FUNCTION getSalary(eid INT) RETURN DECIMAL(10,2);\n PROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2));\n PROCEDURE raiseSalaryStd(eid INT);\n PROCEDURE hire(ename TEXT, esalary DECIMAL(10,2));\nEND;\n$$\nCREATE PACKAGE BODY employee_tools AS\n -- package body variables\n stdRaiseAmount DECIMAL(10,2):=500;\n \n -- private routines\n PROCEDURE log (eid INT, ecmnt TEXT) AS\n BEGIN\n INSERT INTO employee_log (id, cmnt) VALUES (eid, ecmnt);\n END;\n \n -- public routines\n PROCEDURE hire(ename TEXT, esalary DECIMAL(10,2)) AS\n eid INT;\n BEGIN\n INSERT INTO employee (name, salary) VALUES (ename,\nesalary);\n eid:= last_insert_id();\n log(eid, \'hire \' || ename);\n END;\n \n FUNCTION getSalary(eid INT) RETURN DECIMAL(10,2) AS\n nSalary DECIMAL(10,2);\n BEGIN\n SELECT salary INTO nSalary FROM employee WHERE id=eid;\n log(eid, \'getSalary id=\' || eid || \' salary=\' ||\nnSalary);\n RETURN nSalary;\n END;\n \n PROCEDURE raiseSalary(eid INT, amount DECIMAL(10,2)) AS\n BEGIN\n UPDATE employee SET salary=salary+amount WHERE id=eid;\n log(eid, \'raiseSalary id=\' || eid || \' amount=\' ||\namount);\n END;\n \n PROCEDURE raiseSalaryStd(eid INT) AS\n BEGIN\n raiseSalary(eid, stdRaiseAmount);\n log(eid, \'raiseSalaryStd id=\' || eid);\n END;\n \nBEGIN\n -- This code is executed when the current session\n -- accesses any of the package routines for the first time\n log(0, \'Session \' || connection_id() || \' \' ||\ncurrent_user || \' started\');\nEND;\n$$\n \nDELIMITER ;\n \n\n\nURL: https://mariadb.com/kb/en/library/create-package-body/','','https://mariadb.com/kb/en/library/create-package-body/'),(664,'DROP DATABASE',39,'Syntax\n------ \nDROP {DATABASE | SCHEMA} [IF EXISTS] db_name\n \nDescription\n----------- \nDROP DATABASE drops all tables in the database and deletes\nthe database. Be very careful with this statement! To use\nDROP DATABASE,\nyou need the DROP privilege on the database. DROP SCHEMA is\na synonym for DROP DATABASE.\n \nImportant: When a database is dropped, user privileges on\nthe database are not automatically dropped. See GRANT.\n \nIF EXISTS\n \nUse IF EXISTS to prevent an error from occurring for\ndatabases that do not exist. A NOTE is generated for each\nnon-existent database when using IF EXISTS. See SHOW\nWARNINGS.\n \nExamples\n-------- \nDROP DATABASE bufg;\n \nQuery OK, 0 rows affected (0.39 sec)\n \nDROP DATABASE bufg;\n \nERROR 1008 (HY000): Can\'t drop database \'bufg\'; database\ndoesn\'t exist\n \n \\W\nShow warnings enabled.\n \nDROP DATABASE IF EXISTS bufg;\n \nQuery OK, 0 rows affected, 1 warning (0.00 sec)\nNote (Code 1008): Can\'t drop database \'bufg\'; database\ndoesn\'t exist\n \n\n\nURL: https://mariadb.com/kb/en/library/drop-database/','','https://mariadb.com/kb/en/library/drop-database/'),(658,'CREATE SEQUENCE',39,'CREATE SEQUENCE was introduced in MariaDB 10.3.\n \nSyntax\n------ \nCREATE [OR REPLACE] [TEMPORARY] SEQUENCE [IF NOT EXISTS]\nsequence_name\n[ INCREMENT [ BY | = ] increment ]\n[ MINVALUE [=] minvalue | NO MINVALUE | NOMINVALUE ]\n[ MAXVALUE [=] maxvalue | NO MAXVALUE | NOMAXVALUE ]\n[ START [ WITH | = ] start ] \n[ CACHE [=] cache | NOCACHE ] [ CYCLE | NOCYCLE] \n[table_options]\n \nThe options for CREATE SEQUENCE can be given in any order,\noptionally followed by table_options.\n \ntable_options can be any of the normal table options in\nCREATE TABLE but the most usable ones are ENGINE=... and\nCOMMENT=.\n \nNOMAXVALUE and NOMINVALUE are there to allow one to create\nSEQUENCEs using the Oracle syntax.\n \nDescription\n----------- \nCREATE SEQUENCE will create a sequence that generates new\nvalues when called with NEXT VALUE FOR sequence_name. It\'s\nan alternative to AUTO INCREMENT when one wants to have more\ncontrol of how the numbers are generated. As the SEQUENCE\ncaches values (up to CACHE) it can in some cases be much\nfaster than AUTO INCREMENT. Another benefit is that one can\naccess the last value generated by all used sequences, which\nsolves one of the limitations with LAST_INSERT_ID().\n \nCREATE SEQUENCE requires the CREATE privilege.\n \nDROP SEQUENCE can be used to drop a sequence, and ALTER\nSEQUENCE to change it.\n \nArguments to Create\n \nThe following options may be used:\n \nOption | Default value |  Description | \n \nINCREMENT |  1 | Increment to use for values. May be\nnegative. Setting an increment of 0 causes the sequence to\nuse the value of the auto_increment_increment system\nvariable at the time of creation, which is always a positive\nnumber. (see MDEV-16035). | \n \nMINVALUE | 1 if INCREMENT > 0 and -9223372036854775807 if\nINCREMENT < 0 | Minimum value for the sequence | \n \nMAXVALUE | 9223372036854775806 if INCREMENT > 0 and -1 if\nINCREMENT < 0 | Max value for sequence | \n \nSTART | MINVALUE if INCREMENT > 0 and MAX_VALUE if\nINCREMENT< 0 | First value that the sequence will generate |\n\n \nCACHE | 1000 |  Number of values that should be cached. 0\nif no CACHE. The underlying table will be updated first time\na new sequence number is generated and each time the cache\nruns out. | \n \nIf CYCLE is used then the sequence should start again from\nMINVALUE after it has run out of values. Default value is\nNOCYCLE.\n \nConstraints on Create Arguments\n \nTo be able to create a legal sequence, the following must\nhold:\nMAXVALUE >= start\nMAXVALUE > MINVALUE\nSTART >= MINVALUE\nMAXVALUE = -9223372036854775807 (LONGLONG_MIN+1)\n \nNote that sequences can\'t generate the maximum/minimum 64\nbit number because of the constraint of\nMINVALUE and MAXVALUE. \n \nExamples\n-------- \nCREATE SEQUENCE s START WITH 100 INCREMENT BY 10;\n \nCREATE SEQUENCE s2 START WITH -100 INCREMENT BY -10;\n \nThe following statement fails, as the increment conflicts\nwith the defaults\n \nCREATE SEQUENCE s3 START WITH -100 INCREMENT BY 10;\n \nERROR 4082 (HY000): Sequence \'test.s3\' values are\nconflicting\n \nThe sequence can be created by specifying workable minimum\nand maximum values:\n \nCREATE SEQUENCE s3 START WITH -100 INCREMENT BY 10\nMINVALUE=-100 MAXVALUE=1000;\n \n\n\nURL: https://mariadb.com/kb/en/library/create-sequence/','','https://mariadb.com/kb/en/library/create-sequence/'),(665,'DROP EVENT',39,'Syntax\n------ \nDROP EVENT [IF EXISTS] event_name\n \nDescription\n----------- \nThis statement drops the event named event_name. The event\nimmediately\nceases being active, and is deleted completely from the\nserver.\n \nIf the event does not exist, the error\nERROR 1517 (HY000): Unknown event \'event_name\'\nresults. You can override this and cause the\nstatement to generate a NOTE for non-existent events instead\nby using\nIF EXISTS. See SHOW WARNINGS.\n \nThis statement requires the EVENT privilege. In MySQL 5.1.11\nand earlier, an event could be dropped only\nby its definer, or by a user having the SUPER privilege.\n \nExamples\n-------- \nDROP EVENT myevent3;\n \nUsing the IF EXISTS clause:\n \nDROP EVENT IF EXISTS myevent3;\n \nQuery OK, 0 rows affected, 1 warning (0.01 sec)\n \nSHOW WARNINGS;\n \n+-------+------+-------------------------------+\n| Level | Code | Message |\n+-------+------+-------------------------------+\n| Note | 1305 | Event myevent3 does not exist |\n+-------+------+-------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/drop-event/','','https://mariadb.com/kb/en/library/drop-event/'),(666,'DROP FUNCTION',39,'Syntax\n------ \nDROP FUNCTION [IF EXISTS] f_name\n \nDescription\n----------- \nThe DROP FUNCTION statement is used to drop a stored\nfunction or a user-defined function (UDF). That is, the\nspecified routine is removed from the server, along with all\nprivileges specific to the function. You must have the ALTER\nROUTINE privilege for the routine in order to drop it. If\nthe automatic_sp_privileges server system variable is set,\nboth the ALTER ROUTINE and EXECUTE privileges are granted\nautomatically to the routine creator - see Stored Routine\nPrivileges.\n \nIF EXISTS\n \nThe IF EXISTS clause is a MySQL/MariaDB extension. It\nprevents an error from occurring if the function does not\nexist. A\nNOTE is produced that can be viewed with SHOW WARNINGS.\n \nFor dropping a user-defined functions (UDF), see DROP\nFUNCTION UDF.\n \nExamples\n-------- \nDROP FUNCTION hello;\n \nQuery OK, 0 rows affected (0.042 sec)\n \nDROP FUNCTION hello;\n \nERROR 1305 (42000): FUNCTION test.hello does not exist\n \nDROP FUNCTION IF EXISTS hello;\n \nQuery OK, 0 rows affected, 1 warning (0.000 sec)\n \nSHOW WARNINGS;\n \n+-------+------+------------------------------------+\n| Level | Code | Message |\n+-------+------+------------------------------------+\n| Note | 1305 | FUNCTION test.hello does not exist |\n+-------+------+------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/drop-function/','','https://mariadb.com/kb/en/library/drop-function/'),(659,'CREATE SERVER',39,'Syntax\n------ \nCREATE [OR REPLACE] SERVER [IF NOT EXISTS] server_name\n FOREIGN DATA WRAPPER wrapper_name\n OPTIONS (option [, option] ...)\n \noption:\n { HOST character-literal\n | DATABASE character-literal\n | USER character-literal\n | PASSWORD character-literal\n | SOCKET character-literal\n | OWNER character-literal\n | PORT numeric-literal }\n \nDescription\n----------- \nThis statement creates the definition of a server for use\nwith the Spider,\nFEDERATED or FederatedX storage\nengine. The CREATE SERVER statement creates a new row within\nthe\nservers table within the mysql database. This statement\nrequires the SUPER privilege.\n \nThe server_name should be a unique reference to the server.\nServer definitions\nare global within the scope of the server, it is not\npossible to qualify the\nserver definition to a specific database. server_name has a\nmaximum length of\n64 characters (names longer than 64 characters are silently\ntruncated), and is\ncase insensitive. You may specify the name as a quoted\nstring.\n \nThe wrapper_name should be mysql, and may be quoted with\nsingle quotes.\nOther values for wrapper_name are not currently supported.\n \nFor each option you must specify either a character literal\nor numeric literal.\nCharacter literals are UTF-8, support a maximum length of 64\ncharacters and\ndefault to a blank (empty) string. String literals are\nsilently truncated to 64\ncharacters. Numeric literals must be a number between 0 and\n9999, default value\nis 0.\n \nNote: The OWNER option is currently not applied, and has no\neffect on\nthe ownership or operation of the server connection that is\ncreated.\n \nThe CREATE SERVER statement creates an entry in the\nmysql.servers table that can later be used with the\nCREATE TABLE statement when creating a Spider, FederatedX or\nFEDERATED table. The options that you specify will\nbe used to populate the columns in the mysql.servers table.\nThe table columns\nare Server_name, Host, Db, Username, Password, Port and\nSocket.\n \n DROP SERVER removes a previously created server definition.\n\n \nCREATE SERVER is not written to the binary log, irrespective\nof\nthe binary log format being used.\n \nFor valid identifiers to use as server names, see Identifier\nNames.\n \nOR REPLACE\n \nIf the optional OR REPLACE clause is used, it acts as a\nshortcut for:\n \nDROP SERVER IF EXISTS name;\n \nCREATE SERVER server_name ...;\n \nIF NOT EXISTS\n \nIf the IF NOT EXISTS clause is used, MariaDB will return a\nwarning instead of an error if the server already exists.\nCannot be used together with OR REPLACE.\n \nExamples\n-------- \nCREATE SERVER s\nFOREIGN DATA WRAPPER mysql\nOPTIONS (USER \'Remote\', HOST \'192.168.1.106\', DATABASE\n\'test\');\n \nOR REPLACE and IF NOT EXISTS:\n \nCREATE SERVER s \nFOREIGN DATA WRAPPER mysql \nOPTIONS (USER \'Remote\', HOST \'192.168.1.106\', DATABASE\n\'test\');\nERROR 1476 (HY000): The foreign server, s, you are trying to\ncreate already exists\n \nCREATE OR REPLACE SERVER s \nFOREIGN DATA WRAPPER mysql \nOPTIONS (USER \'Remote\', HOST \'192.168.1.106\', DATABASE\n\'test\');\nQuery OK, 0 rows affected (0.00 sec)\n \nCREATE SERVER IF NOT EXISTS s \nFOREIGN DATA WRAPPER mysql \nOPTIONS (USER \'Remote\', HOST \'192.168.1.106\', DATABASE\n\'test\');\nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n \nSHOW WARNINGS;\n \n+-------+------+----------------------------------------------------------------+\n| Level | Code | Message |\n+-------+------+----------------------------------------------------------------+\n| Note | 1476 | The foreign server, s, you are trying to\ncreate already exists |\n+-------+------+----------------------------------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/create-server/','','https://mariadb.com/kb/en/library/create-server/'),(667,'DROP INDEX',39,'Syntax\n------ \nDROP INDEX [IF EXISTS] index_name ON tbl_name \n [WAIT n |NOWAIT]\n [algorithm_option | lock_option] ...\n \nalgorithm_option:\n ALGORITHM [=] {DEFAULT|INPLACE|COPY|NOCOPY|INSTANT}\n \nlock_option:\n LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE}\n \nDescription\n----------- \nDROP INDEX drops the index named index_name from the table\ntbl_name.\nThis statement is mapped to an ALTER TABLE statement to drop\nthe\nindex.\n \nIf another connection is using the table, a metadata lock is\nactive, and this statement will wait until the lock is\nreleased. This is also true for non-transactional tables.\n \nSee ALTER TABLE.\n \nAnother shortcut, CREATE INDEX, allows the creation of an\nindex.\n \nTo remove the primary key, `PRIMARY` must be specified as\nindex_name. Note that the quotes are necessary, because\nPRIMARY is a keyword.\n \nPrivileges\n \nExecuting the DROP INDEX statement requires the INDEX\nprivilege for the table or the database.\n \nOnline DDL\n \nIn MariaDB 10.0 and later, online DDL is supported with the\nALGORITHM and LOCK clauses.\n \nSee InnoDB Online DDL Overview for more information on\nonline DDL with InnoDB.\n \nDROP INDEX IF EXISTS ...\n \nThe IF EXISTS clause was added in MariaDB 10.1.4.\n \nIf the IF EXISTS clause is used, then MariaDB will return a\nwarning instead of an error if the index does not exist.\n \nWAIT/NOWAIT\n \nSet the lock wait timeout. See WAIT and NOWAIT.\n \nALGORITHM\n \nSee ALTER TABLE: ALGORITHM for more information.\n \nLOCK\n \nSee ALTER TABLE: LOCK for more information.\n \nProgress Reporting\n \nMariaDB provides progress reporting for DROP INDEX statement\nfor clients\nthat support the new progress reporting protocol. For\nexample, if you were using the mysql client, then the\nprogress report might look like this::\n \n\n\nURL: https://mariadb.com/kb/en/library/drop-index/','','https://mariadb.com/kb/en/library/drop-index/'),(662,'CREATE TRIGGER',39,'Syntax\n------ \nCREATE [OR REPLACE]\n [DEFINER = { user | CURRENT_USER | role | CURRENT_ROLE }]\n TRIGGER [IF NOT EXISTS] trigger_name trigger_time\ntrigger_event\n ON tbl_name FOR EACH ROW\n [{ FOLLOWS | PRECEDES } other_trigger_name ]\n trigger_stmt\n \nDescription\n----------- \nThis statement creates a new trigger. A trigger is a named\ndatabase\nobject that is associated with a table, and that activates\nwhen a\nparticular event occurs for the table. The trigger becomes\nassociated\nwith the table named tbl_name, which must refer to a\npermanent table.\nYou cannot associate a trigger with a TEMPORARY table or a\nview.\n \nCREATE TRIGGER requires the TRIGGER privilege for the table\nassociated\nwith the trigger. (Before MySQL 5.1.6, this statement\nrequires the\nSUPER privilege.)\n \nYou can have multiple triggers for the same trigger_time and\ntrigger_event.\n \nFor valid identifiers to use as trigger names, see\nIdentifier Names.\n \nOR REPLACE\n \nIf used and the trigger already exists, instead of an error\nbeing returned, the existing trigger will be dropped and\nreplaced by the newly defined trigger.\n \nDEFINER\n \nThe DEFINER clause determines the security context to be\nused when\nchecking access privileges at trigger activation time.\n \nIF NOT EXISTS\n \nIf the IF NOT EXISTS clause is used, the trigger will only\nbe created if a trigger of the same name does not exist. If\nthe trigger already exists, by default a warning will be\nreturned.\n \ntrigger_time\n \ntrigger_time is the trigger action time. It can be BEFORE or\nAFTER to\nindicate that the trigger activates before or after each row\nto be\nmodified.\n \ntrigger_event\n \ntrigger_event indicates the kind of statement that activates\nthe\ntrigger. The trigger_event can be one of the following:\nINSERT: The trigger is activated whenever a new row is\ninserted into the table; for example, through INSERT, LOAD\nDATA, and REPLACE statements.\nUPDATE: The trigger is activated whenever a row is modified;\nfor example, through UPDATE statements.\nDELETE: The trigger is activated whenever a row is deleted\nfrom the table; for example, through DELETE and REPLACE\nstatements. However, DROP TABLE and TRUNCATE statements on\nthe table do not activate this trigger, because they do not\nuse DELETE. Dropping a partition does not activate DELETE\ntriggers, either.\n \nFOLLOWS/PRECEDES other_trigger_name\n \nThe FOLLOWS other_trigger_name and PRECEDES\nother_trigger_name options were added in MariaDB 10.2.3 as\npart of supporting multiple triggers per action time.\nThis is the same syntax used by MySQL 5.7, although MySQL\n5.7 does not have multi-trigger support.\n \nFOLLOWS adds the new trigger after another trigger while\nPRECEDES adds the new trigger before another trigger. If\nneither option is used, the new trigger is added last for\nthe given action and time.\n \nFOLLOWS and PRECEDES are not stored in the trigger\ndefinition. However the trigger order is guaranteed to not\nchange over time. mysqldump and other backup methods will\nnot change trigger order.\nYou can verify the trigger order from the ACTION_ORDER\ncolumn in INFORMATION_SCHEMA.TRIGGERS table.\n \nSELECT trigger_name, action_order FROM\ninformation_schema.triggers \n WHERE event_object_table=\'t1\';\n \nExamples\n-------- \nCREATE DEFINER=`root`@`localhost` TRIGGER increment_animal\n AFTER INSERT ON animals FOR EACH ROW \n UPDATE animal_count SET animal_count.animals =\nanimal_count.animals+1;\n \nOR REPLACE and IF NOT EXISTS\n \nCREATE DEFINER=`root`@`localhost` TRIGGER increment_animal\n AFTER INSERT ON animals FOR EACH ROW\n UPDATE animal_count SET animal_count.animals =\nanimal_count.animals+1;\n \nERROR 1359 (HY000): Trigger already exists\n \nCREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER\nincrement_animal\n AFTER INSERT ON animals FOR EACH ROW\n UPDATE animal_count SET animal_count.animals =\nanimal_count.animals+1;\n \nQuery OK, 0 rows affected (0.12 sec)\n \nCREATE DEFINER=`root`@`localhost` TRIGGER IF NOT EXISTS\nincrement_animal\n AFTER INSERT ON animals FOR EACH ROW\n UPDATE animal_count SET animal_count.animals =\nanimal_count.animals+1;\n \nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n \nSHOW WARNINGS;\n \n+-------+------+------------------------+\n| Level | Code | Message |\n+-------+------+------------------------+\n| Note | 1359 | Trigger already exists |\n+-------+------+------------------------+\n1 row in set (0.00 sec)\n \n\n\nURL: https://mariadb.com/kb/en/library/create-trigger/','','https://mariadb.com/kb/en/library/create-trigger/'),(670,'DROP PROCEDURE',39,'Syntax\n------ \nDROP PROCEDURE [IF EXISTS] sp_name\n \nDescription\n----------- \nThis statement is used to drop a stored procedure. That is,\nthe\nspecified routine is removed from the server along with all\nprivileges specific to the procedure. You must have the\nALTER ROUTINE privilege for the routine. If the\nautomatic_sp_privileges server system variable is set, that\nprivilege and EXECUTE are granted automatically to the\nroutine creator - see Stored Routine Privileges.\n \nThe IF EXISTS clause is a MySQL/MariaDB extension. It\nprevents an error from occurring if the procedure or\nfunction does not exist. A\nNOTE is produced that can be viewed with SHOW WARNINGS.\n \nWhile this statement takes effect immediately, threads which\nare executing a procedure can continue execution.\n \nExamples\n-------- \nDROP PROCEDURE simpleproc;\n \nIF EXISTS:\n \nDROP PROCEDURE simpleproc;\n \nERROR 1305 (42000): PROCEDURE test.simpleproc does not exist\n \nDROP PROCEDURE IF EXISTS simpleproc;\n \nQuery OK, 0 rows affected, 1 warning (0.00 sec)\n \nSHOW WARNINGS;\n \n+-------+------+------------------------------------------+\n| Level | Code | Message |\n+-------+------+------------------------------------------+\n| Note | 1305 | PROCEDURE test.simpleproc does not exist |\n+-------+------+------------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/drop-procedure/','','https://mariadb.com/kb/en/library/drop-procedure/'),(671,'DROP SEQUENCE',39,'DROP SEQUENCE was introduced in MariaDB 10.3.\n \nSyntax\n------ \nDROP [TEMPORARY] SEQUENCE [IF EXISTS] [/*COMMENT TO SAVE*/]\n sequence_name [, sequence_name] ...\n \nDescription\n----------- \nDROP SEQUENCE removes one or more sequences created with\nCREATE SEQUENCE. You must have the DROP privilege for each\nsequence. MariaDB returns an error indicating by name which\nnon-existing tables it was unable to drop, but it also drops\nall of the tables in the list that do exist.\n \nImportant: When a table is dropped, user privileges on the\ntable are not automatically dropped. See GRANT.\n \nIf another connection is using the sequence, a metadata lock\nis active, and this statement will wait until the lock is\nreleased. This is also true for non-transactional tables.\n \nFor each referenced sequence, DROP SEQUENCE drops a\ntemporary sequence with that name, if it exists. If it does\nnot exist, and the TEMPORARY keyword is not used, it drops a\nnon-temporary sequence with the same name, if it exists. The\nTEMPORARY keyword ensures that a non-temporary sequence will\nnot accidentally be dropped.\n \nUse IF EXISTS to prevent an error from occurring for\nsequences that do not exist. A NOTE is generated for each\nnon-existent sequence when using IF EXISTS. See SHOW\nWARNINGS.\n \nDROP SEQUENCE requires the DROP privilege.\n \nNotes\n \nDROP SEQUENCE only removes sequences, not tables. However,\nDROP TABLE can remove both sequences and tables.\n \n\n\nURL: https://mariadb.com/kb/en/library/drop-sequence/','','https://mariadb.com/kb/en/library/drop-sequence/'),(672,'DROP SERVER',39,'Syntax\n------ \nDROP SERVER [ IF EXISTS ] server_name\n \nDescription\n----------- \nDrops the server definition for the server named\nserver_name. The\ncorresponding row within the mysql.servers table will be\ndeleted. This\nstatement requires the SUPER privilege. \n \nDropping a server for a table does not affect any\nFederatedX, FEDERATED or Spider tables that used this\nconnection information when they were created. \n \nIF EXISTS\n \nIf the IF EXISTS clause is used, MariaDB will not return an\nerror if the server does not exist. Unlike all other\nstatements, DROP SERVER IF EXISTS does not issue a note if\nthe server does not exist. See MDEV-9400.\n \nExamples\n-------- \nDROP SERVER s;\n \nIF EXISTS:\n \nDROP SERVER s;\n \nERROR 1477 (HY000): The foreign server name you are trying\nto reference \n does not exist. Data source error: s\n \nDROP SERVER IF EXISTS s;\n \nQuery OK, 0 rows affected (0.00 sec)\n \n\n\nURL: https://mariadb.com/kb/en/library/drop-server/','','https://mariadb.com/kb/en/library/drop-server/'),(675,'DROP TRIGGER',39,'Syntax\n------ \nDROP TRIGGER [IF EXISTS] [schema_name.]trigger_name\n \nDescription\n----------- \nThis statement drops a trigger. The schema (database) name\nis optional. If the\nschema is omitted, the trigger is dropped from the default\nschema.\nIts use requires the TRIGGER privilege for the table\nassociated with the trigger.\n \nUse IF EXISTS to prevent an error from occurring for a\ntrigger that does not exist. A NOTE is generated for a\nnon-existent trigger\nwhen using IF EXISTS. See SHOW WARNINGS.\n \nNote: Triggers for a table are also dropped if you drop the\ntable.\n \nExamples\n-------- \nDROP TRIGGER test.example_trigger;\n \nUsing the IF EXISTS clause:\n \nDROP TRIGGER IF EXISTS test.example_trigger;\n \nQuery OK, 0 rows affected, 1 warning (0.01 sec)\n \nSHOW WARNINGS;\n \n+-------+------+------------------------+\n| Level | Code | Message |\n+-------+------+------------------------+\n| Note | 1360 | Trigger does not exist |\n+-------+------+------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/drop-trigger/','','https://mariadb.com/kb/en/library/drop-trigger/'),(676,'DROP VIEW',39,'Syntax\n------ \nDROP VIEW [IF EXISTS]\n view_name [, view_name] ...\n [RESTRICT | CASCADE]\n \nDescription\n----------- \nDROP VIEW removes one or more views. You must have the DROP\nprivilege for\neach view. If any of the views named in the argument list do\nnot exist, MariaDB\nreturns an error indicating by name which non-existing views\nit was unable to\ndrop, but it also drops all of the views in the list that do\nexist.\n \nThe IF EXISTS clause prevents an error from occurring for\nviews that don\'t\nexist. When this clause is given, a NOTE is generated for\neach non-existent\nview. See SHOW WARNINGS.\n \nRESTRICT and CASCADE, if given, are parsed and ignored.\n \nIt is possible to specify view names as db_name.view_name.\nThis is useful to delete views from multiple databases with\none statement. See Identifier Qualifiers for details.\n \nThe DROP privilege is required to use DROP TABLE on\nnon-temporary tables. For temporary tables, no privilege is\nrequired, because such tables are only visible for the\ncurrent session.\n \nIf a view references another view, it will be possible to\ndrop the referenced view. However, the other view will\nreference a view which does not exist any more. Thus,\nquerying it will produce an error similar to the following:\n \nERROR 1356 (HY000): View \'db_name.view_name\' references\ninvalid table(s) or \ncolumn(s) or function(s) or definer/invoker of view lack\nrights to use them\n \nThis problem is reported in the output of CHECK TABLE.\n \nNote that it is not necessary to use DROP VIEW to replace an\nexisting view, because CREATE VIEW has an OR REPLACE clause.\n \nExamples\n-------- \nDROP VIEW v,v2;\n \nGiven views v and v2, but no view v3\n \nDROP VIEW v,v2,v3;\nERROR 1051 (42S02): Unknown table \'v3\'\n \nDROP VIEW IF EXISTS v,v2,v3;\nQuery OK, 0 rows affected, 1 warning (0.01 sec)\n \nSHOW WARNINGS;\n+-------+------+-------------------------+\n| Level | Code | Message |\n+-------+------+-------------------------+\n| Note | 1051 | Unknown table \'test.v3\' |\n+-------+------+-------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/drop-view/','','https://mariadb.com/kb/en/library/drop-view/'),(673,'DROP TABLE',39,'Syntax\n------ \nDROP [TEMPORARY] TABLE [IF EXISTS] [/*COMMENT TO SAVE*/]\n tbl_name [, tbl_name] ...\n [WAIT n|NOWAIT]\n [RESTRICT | CASCADE]\n \nDescription\n----------- \nDROP TABLE removes one or more tables. You must have the\nDROP privilege\nfor each table. All table data and the table definition are\nremoved, as well as triggers associated to the table, so be\ncareful with this statement! If any of the tables named in\nthe argument list do\nnot exist, MariaDB returns an error indicating by name which\nnon-existing tables\nit was unable to drop, but it also drops all of the tables\nin the list that do\nexist.\n \nImportant: When a table is dropped, user privileges on the\ntable are not\nautomatically dropped. See GRANT.\n \nIf another connection is using the table, a metadata lock is\nactive, and this statement will wait until the lock is\nreleased. This is also true for non-transactional tables.\n \nNote that for a partitioned table, DROP TABLE permanently\nremoves the table\ndefinition, all of its partitions, and all of the data which\nwas stored in\nthose partitions. It also removes the partitioning\ndefinition (.par) file\nassociated with the dropped table.\n \nFor each referenced table, DROP TABLE drops a temporary\ntable with that name, if it exists. If it does not exist,\nand the TEMPORARY keyword is not used, it drops a\nnon-temporary table with the same name, if it exists. The\nTEMPORARY keyword ensures that a non-temporary table will\nnot accidentally be dropped.\n \nUse IF EXISTS to prevent an error from occurring for tables\nthat do not\nexist. A NOTE is generated for each non-existent table when\nusing\nIF EXISTS. See SHOW WARNINGS.\n \nIf a foreign key references this table, the table cannot be\ndropped. In this case, it is necessary to drop the foreign\nkey first.\n \nRESTRICT and CASCADE are allowed to make porting from other\ndatabase systems easier. In MariaDB, they do nothing.\n \nSince MariaDB 5.5.27, the comment before the tablenames\n(that /*COMMENT TO SAVE*/) is stored in the binary log. That\nfeature can be used by replication tools to send their\ninternal messages.\n \nIt is possible to specify table names as db_name.tab_name.\nThis is useful to delete tables from multiple databases with\none statement. See Identifier Qualifiers for details.\n \nThe DROP privilege is required to use DROP TABLE on\nnon-temporary tables. For temporary tables, no privilege is\nrequired, because such tables are only visible for the\ncurrent session.\n \nNote: DROP TABLE automatically commits the current active\ntransaction,\nunless you use the TEMPORARY keyword.\n \nWAIT/NOWAIT\n \nSet the lock wait timeout. See WAIT and NOWAIT.\n \nDROP TABLE in replication\n \nDROP TABLE has the following characteristics in replication:\nDROP TABLE IF EXISTS are always logged.\nDROP TABLE without IF EXISTS for tables that don\'t exist\nare not written to the binary log.\nDropping of TEMPORARY tables are prefixed in the log with\nTEMPORARY. These drops are only logged when running\nstatement or mixed mode replication.\nOne DROP TABLE statement can be logged with up to 3\ndifferent DROP statements:\nDROP TEMPORARY TABLE\nlist_of_non_transactional_temporary_tables\nDROP TEMPORARY TABLE list_of_transactional_temporary_tables\nDROP TABLE list_of_normal_tables\n \nStarting from MariaDB 10.0.8, DROP TABLE on the master is\ntreated on the slave as DROP TABLE IF EXISTS. You can change\nthat by setting slave-ddl-exec-mode to STRICT.\n \nDropping an Internal #sql-... Table\n \nIf the mysqld process is killed during an ALTER TABLE you\nmay find a table named #sql-... in your data directory. In\nMariaDB 10.3, InnoDB tables with this prefix will de deleted\nautomatically during startup.\nIn MariaDB 10.4 we will ensure that these temporary tables\nwill always be deleted automatically.\n \nIf you want to delete one of these tables explicitly you can\ndo so by using the following syntax:\n \nDROP TABLE `#mysql50##sql-...`;\n \nWhen running an ALTER TABLE…ALGORITHM=INPLACE that\nrebuilds the table, InnoDB will create an internal #sql-ib\ntable. For these tables, the .frm file will be called\nsomething else. In order to drop such a table after a server\ncrash, you must rename the #sql*.frm file to match the\n#sql-ib*.ibd file.\n \nExamples\n-------- \nDROP TABLE Employees, Customers;\n \nNotes\n \nBeware that DROP TABLE can drop both tables and sequences.\nThis is mainly done to allow old tools like mysqldump to\nwork with sequences.\n \n\n\nURL: https://mariadb.com/kb/en/library/drop-table/','','https://mariadb.com/kb/en/library/drop-table/'),(678,'RENAME TABLE',39,'Syntax\n------ \nRENAME TABLE tbl_name \n [WAIT n | NOWAIT]\n TO new_tbl_name\n [, tbl_name2 TO new_tbl_name2] ...\n \nDescription\n----------- \nThis statement renames one or more tables or views, but not\nthe privileges associated to them.\n \nThe rename operation is done atomically, which means that no\nother session can\naccess any of the tables while the rename is running. For\nexample, if you have\nan existing table old_table, you can create another table\nnew_table that has the same structure but is empty, and then\nreplace the existing table with the empty one as follows\n(assuming that\nbackup_table does not already exist):\n \nCREATE TABLE new_table (...);\nRENAME TABLE old_table TO backup_table, new_table TO\nold_table;\n \ntbl_name can optionally be specified as db_name.tbl_name.\nSee Identifier Qualifiers. This allows to use RENAME to move\na table from a database to another (as long as they are on\nthe same filesystem):\n \nRENAME TABLE db1.t TO db2.t;\n \nNote that moving a table to another database is not possible\nif it has some triggers. Trying to do so produces the\nfollowing error:\n \nERROR 1435 (HY000): Trigger in wrong schema\n \nAlso, views cannot be moved to another database:\n \nERROR 1450 (HY000): Changing schema from \'old_db\' to\n\'new_db\' is not allowed.\n \nIf a RENAME TABLE renames more than one table and one\nrenaming fails, all renames executed by the same statement\nare rolled back.\n \nRenames are always executed in the specified order. Knowing\nthis, it is also possible to swap two tables\' names:\n \nRENAME TABLE t1 TO tmp_table,\n t2 TO t1,\n tmp_table TO t2;\n \nPrivileges\n \nExecuting the RENAME TABLE statement requires the DROP,\nCREATE and INSERT privileges for the table or the database.\n \nWAIT/NOWAIT\n \nSet the lock wait timeout. See WAIT and NOWAIT.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/rename-table/','','https://mariadb.com/kb/en/library/rename-table/'),(677,'MERGE',39,'Description\n----------- \nThe MERGE storage engine, also known as the MRG_MyISAM\nengine, is a\ncollection of identical MyISAM tables that can be used as\none.\n\"Identical\" means that all tables have identical column\nand index\ninformation. You cannot merge MyISAM tables in which the\ncolumns are\nlisted in a different order, do not have exactly the same\ncolumns, or\nhave the indexes in different order. However, any or all of\nthe MyISAM\ntables can be compressed with myisampack. Columns names and\nindexes names can be different, as long as data types and\nNULL/NOT NULL clauses are the same. Differences in\ntable options such as AVG_ROW_LENGTH, MAX_ROWS, or PACK_KEYS\ndo not\nmatter.\n \nEach index in a MERGE table must match an index in\nunderlying MyISAM tables, but the opposite is not true.\nAlso, a MERGE table cannot have a PRIMARY KEY or UNIQUE\nindexes, because it cannot enforce uniqueness over all\nunderlying tables.\n \nThe following options are meaningful for MERGE tables:\nUNION. This option specifies the list of the underlying\nMyISAM tables. The list is enclosed between parentheses and\nseparated with commas.\nINSERT_METHOD. This options specifies whether, and how,\nINSERTs are allowed for the table. Allowed values are: NO\n(INSERTs are not allowed), FIRST (new rows will be written\ninto the first table specified in the UNION list), LAST (new\nrows will be written into the last table specified in the\nUNION list). The default value is NO.\n \nIf you define a MERGE table with a definition which is\ndifferent from the underlying MyISAM tables, or one of the\nunderlying tables is not MyISAM, the CREATE TABLE statement\nwill not return any error. But any statement which involves\nthe table will produce an error like the following:\n \nERROR 1168 (HY000): Unable to open underlying table which is\ndifferently defined \n or of non-MyISAM type or doesn\'t exist\n \nA CHECK TABLE will show more information about the problem.\n \nThe error is also produced if the table is properly define,\nbut an underlying table\'s definition changes at some point\nin time.\n \nIf you try to insert a new row into a MERGE table with\nINSERT_METHOD=NO, you will get an error like the following:\n \nERROR 1036 (HY000): Table \'tbl_name\' is read only\n \nIt is possible to build a MERGE table on MyISAM tables which\nhave one or more virtual columns. MERGE itself does not\nsupport virtual columns, thus such columns will be seen as\nregular columns. The data types and sizes will still need to\nbe identical, and they cannot be NOT NULL.\n \nExamples\n-------- \nCREATE TABLE t1 (\n a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,\n message CHAR(20)) ENGINE=MyISAM;\n \nCREATE TABLE t2 (\n a INT NOT NULL AUTO_INCREMENT PRIMARY KEY,\n message CHAR(20)) ENGINE=MyISAM;\n \nINSERT INTO t1 (message) VALUES\n(\'Testing\'),(\'table\'),(\'t1\');\n \nINSERT INTO t2 (message) VALUES\n(\'Testing\'),(\'table\'),(\'t2\');\n \nCREATE TABLE total (\n a INT NOT NULL AUTO_INCREMENT,\n message CHAR(20), INDEX(a))\n ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;\n \nSELECT * FROM total;\n \n+---+---------+\n| a | message |\n+---+---------+\n| 1 | Testing |\n| 2 | table |\n| 3 | t1 |\n| 1 | Testing |\n| 2 | table |\n| 3 | t2 |\n+---+---------+\n \nIn the following example, we\'ll create three MyISAM tables,\nand then a MERGE table on them. However, one of them uses a\ndifferent data type for the column b, so a SELECT will\nproduce an error:\n \nCREATE TABLE t1 (\n a INT,\n b INT\n) ENGINE = MyISAM;\n \nCREATE TABLE t2 (\n a INT,\n b INT\n) ENGINE = MyISAM;\n \nCREATE TABLE t3 (\n a INT,\n b TINYINT\n) ENGINE = MyISAM;\n \nCREATE TABLE t_mrg (\n a INT,\n b INT\n) ENGINE = MERGE,UNION=(t1,t2,t3);\n \nSELECT * FROM t_mrg;\n \nERROR 1168 (HY000): Unable to open underlying table which is\ndifferently defined\n or of non-MyISAM type or doesn\'t exist\n \nTo find out what\'s wrong, we\'ll use a CHECK TABLE:\n \nCHECK TABLE t_mrg;\n \n+------------+-------+----------+-----------------------------------------------------------------------------------------------------+\n| Table | Op | Msg_type | Msg_text |\n+------------+-------+----------+-----------------------------------------------------------------------------------------------------+\n| test.t_mrg | check | Error | Table \'test.t3\' is\ndifferently defined or of non-MyISAM type or doesn\'t exist\n|\n| test.t_mrg | check | Error | Unable to open underlying\ntable which is differently defined or of non-MyISAM type or\ndoesn\'t exist |\n| test.t_mrg | check | error | Corrupt |\n+------------+-------+----------+-----------------------------------------------------------------------------------------------------+\n \nNow, we know that the problem is in t3\'s definition.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/library/merge/','','https://mariadb.com/kb/en/library/merge/'),(681,'NEXT VALUE for sequence_name',40,'SEQUENCEs were introduced in MariaDB 10.3\n \nSyntax\n------ \nNEXT VALUE FOR sequence\n \nor\n \nNEXTVAL(sequence_name)\n \nor in Oracle mode (SQL_MODE=ORACLE)\n \nsequence_name.nextval\n \nNEXT VALUE FOR is ANSI SQL syntax while NEXTVAL() is\nPostgreSQL syntax.\n \nDescription\n----------- \nGenerate next value for a SEQUENCE.\nYou can greatly speed up NEXT VALUE by creating the sequence\nwith the CACHE option. If not, every NEXT VALUE usage will\ncause changes in the stored SEQUENCE table.\nWhen using NEXT VALUE the value will be reserved at once and\nwill not be reused, except if the SEQUENCE was created with\nCYCLE. This means that when you are using SEQUENCEs you have\nto expect gaps in the generated sequence numbers.\nIf one updates the SEQUENCE with SETVAL() or ALTER SEQUENCE\n... RESTART, NEXT VALUE FOR will notice this and start from\nthe next requested value.\nFLUSH TABLES will close the sequence and the next sequence\nnumber generated will be according to what\'s stored in the\nSEQUENCE object. In effect, this will discard the cached\nvalues.\nNEXT VALUE requires the INSERT privilege.\n \nYou can also use NEXT VALUE FOR sequence for column DEFAULT.\n \n\n\nURL:\nhttps://mariadb.com/kb/en/library/next-value-for-sequence_name/','','https://mariadb.com/kb/en/library/next-value-for-sequence_name/'),(679,'TRUNCATE TABLE',39,'Syntax\n------ \nTRUNCATE [TABLE] tbl_name\n [WAIT n | NOWAIT]\n \nDescription\n----------- \nTRUNCATE TABLE empties a table completely. It requires the\nDROP privilege. See GRANT.\n \ntbl_name can also be specified in the form db_name.tbl_name\n(see Identifier Qualifiers).\n \nLogically, TRUNCATE TABLE is equivalent to a DELETE\nstatement that deletes all rows, but there are practical\ndifferences under some circumstances.\n \nTRUNCATE TABLE will fail for an InnoDB table if any FOREIGN\nKEY constraints from other tables reference the table,\nreturning the error:\n \nERROR 1701 (42000): Cannot truncate a table referenced in a\nforeign key constraint\n \nForeign Key constraints between columns in the same table\nare permitted.\n \nFor an InnoDB table, if there are no FOREIGN KEY\nconstraints, InnoDB performs fast truncation by dropping the\noriginal table and creating an empty one with the same\ndefinition, which is much faster than deleting rows one by\none. The AUTO_INCREMENT counter is reset by TRUNCATE TABLE,\nregardless of whether there is a FOREIGN KEY constraint.\n \nThe count of rows affected by TRUNCATE TABLE is accurate\nonly\nwhen it is mapped to a DELETE statement.\n \nFor other storage engines, TRUNCATE TABLE differs from\nDELETE in the following ways:\nTruncate operations drop and re-create the table, which is\nmuch\n faster than deleting rows one by one, particularly for\nlarge tables.\nTruncate operations cause an implicit commit.\nTruncation operations cannot be performed if the session\nholds an\n active table lock.\nTruncation operations do not return a meaningful value for\nthe number\n of deleted rows. The usual result is \"0 rows affected,\"\nwhich should\n be interpreted as \"no information.\"\nAs long as the table format file tbl_name.frm is valid, the\n table can be re-created as an empty table\n with TRUNCATE TABLE, even if the data or index files have\nbecome\n corrupted.\nThe table handler does not remember the last\n used AUTO_INCREMENT value, but starts counting\n from the beginning. This is true even for MyISAM and\nInnoDB, which normally\n do not reuse sequence values.\nWhen used with partitioned tables, TRUNCATE TABLE preserves\n the partitioning; that is, the data and index files are\ndropped and\n re-created, while the partition definitions (.par) file is\n unaffected.\nSince truncation of a table does not make any use of DELETE,\n the TRUNCATE statement does not invoke ON DELETE triggers.\nTRUNCATE TABLE will only reset the values in the Performance\nSchema summary tables to zero or null, and will not remove\nthe rows.\n \nFor the purposes of binary logging and replication, TRUNCATE\nTABLE is treated as DROP TABLE followed by CREATE TABLE (DDL\nrather than DML).\n \nTRUNCATE TABLE does not work on views. Currently, TRUNCATE\nTABLE drops all historical records from a system-versioned\ntable.\n \nWAIT/NOWAIT\n \nSet the lock wait timeout. See WAIT and NOWAIT.\n \nOracle-mode\n \nOracle-mode from MariaDB 10.3 permits the optional keywords\nREUSE STORAGE or DROP STORAGE to be used.\n \nTRUNCATE [TABLE] tbl_name [{DROP | REUSE} STORAGE]\n \nThese have no effect on the operation.\n \nPerformance\n \nTRUNCATE TABLE is faster than DELETE, because it drops and\nre-creates a table.\n \nWith XtraDB/InnoDB, TRUNCATE TABLE is slower if\ninnodb_file_per_table=ON is set (the default since MariaDB\n5.5). This is because TRUNCATE TABLE unlinks the underlying\ntablespace file, which can be an expensive operation. See\nMDEV-8069 for more details.\n \nThe performance issues with innodb_file_per_table=ON can be\nexacerbated in cases where the InnoDB buffer pool is very\nlarge and innodb_adaptive_hash_index=ON is set. In that\ncase, using DROP TABLE followed by CREATE TABLE instead of\nTRUNCATE TABLE may perform better. Setting\ninnodb_adaptive_hash_index=OFF can also help. In MariaDB\n10.2.19 and later, this performance can also be improved by\nsetting innodb_safe_truncate=OFF. See MDEV-9459 for more\ndetails.\n \nSetting innodb_adaptive_hash_index=OFF can also improve\nTRUNCATE TABLE performance in general. See MDEV-16796 for\nmore details.\n \n\n\nURL: https://mariadb.com/kb/en/library/truncate-table/','','https://mariadb.com/kb/en/library/truncate-table/'),(683,'PREVIOUS VALUE FOR sequence_name',40,'SEQUENCEs were introduced in MariaDB 10.3.\n \nSyntax\n------ \nPREVIOUS VALUE FOR sequence_name\n \nor\n \nLASTVAL(sequence_name)\n \nor in Oracle mode (SQL_MODE=ORACLE)\n \nsequence_name.currval\n \nPREVIOUS VALUE FOR is IBM DB2 syntax while LASTVAL() is\nPostgreSQL syntax.\n \nDescription\n----------- \nGet last value in the current connection generated from a\nsequence.\nIf the sequence has not yet been used by the connection,\nPREVIOUS VALUE FOR returns NULL\nIf a SEQUENCE has been dropped and re-created then it\'s\ntreated as a new SEQUENCE and PREVIOUS VALUE FOR will return\nNULL.\nFLUSH TABLES has no effect on PREVIOUS VALUE FOR.\nPrevious values for all used sequences are stored per\nconnection until connection ends.\n \nPREVIOUS VALUE FOR requires the SELECT privilege.\n \nExample\n \nSELECT PREVIOUS VALUE FOR s;\n \n+----------------------+\n| PREVIOUS VALUE FOR s |\n+----------------------+\n| 100 |\n+----------------------+\n \n\n\nURL:\nhttps://mariadb.com/kb/en/library/previous-value-for-sequence_name/','','https://mariadb.com/kb/en/library/previous-value-for-sequence_name/'),(684,'Sequence Overview',40,'Sequences were introduced in MariaDB 10.3.\n \nIntroduction\n \nA sequence is an object that generates a sequence of numeric\nvalues, as specified by the CREATE SEQUENCE statement. \n \nCREATE SEQUENCE will create a sequence that generates new\nvalues when called with NEXT VALUE FOR sequence_name. It\'s\nan alternative to AUTO INCREMENT when one wants to have more\ncontrol of how the numbers are generated. As the SEQUENCE\ncaches values (up to the CACHE value in the CREATE SEQUENCE\nstatement, by default 1000) it can in some cases be much\nfaster than AUTO INCREMENT. Another benefit is that one can\naccess the last value generated by all used sequences, which\nsolves one of the limitations with LAST_INSERT_ID().\n \nCreating a Sequence\n \nThe CREATE SEQUENCE statement is used to create a sequence.\nHere is an example of a sequence starting at 100,\nincrementing by 10 each time:\n \nCREATE SEQUENCE s START WITH 100 INCREMENT BY 10;\n \nThe CREATE SEQUENCE statement, along with defaults, can be\nviewd with the SHOW CREATE SEQUENCE STATEMENT, for example:\n \nSHOW CREATE SEQUENCE s\\G\n*************************** 1. row\n***************************\n Table: s\nCreate Table: CREATE SEQUENCE `s` start with 100 minvalue 1\nmaxvalue 9223372036854775806 \n increment by 10 cache 1000 nocycle ENGINE=InnoDB\n \nUsing Sequence Objects\n \nTo get the next value from a sequence, use\n \nNEXT VALUE FOR sequence_name\n \nor\n \nNEXTVAL(sequence_name)\n \nor in Oracle mode (SQL_MODE=ORACLE)\n \nsequence_name.nextval\n \nFor retrieving the last value used by the current connection\nfrom a sequence\nuse:\n \nPREVIOUS VALUE FOR sequence_name\n \nor\n \nLASTVAL(sequence_name)\n \nor in Oracle mode (SQL_MODE=ORACLE)\n \nsequence_name.currval\n \nFor example:\n \nSELECT NEXTVAL(s);\n+------------+\n| NEXTVAL(s) |\n+------------+\n| 100 |\n+------------+\n \nSELECT NEXTVAL(s);\n+------------+\n| NEXTVAL(s) |\n+------------+\n| 110 |\n+------------+\n \nSELECT LASTVAL(s);\n+------------+\n| LASTVAL(s) |\n+------------+\n| 110 |\n+------------+\n \nUsing Sequences in DEFAULT\n \nStarting from 10.3.3 you can use Sequences in DEFAULT:\n \ncreate sequence s1;\n \ncreate table t1 (a int primary key default (next value for\ns1), b int);\ninsert into t1 (b) values (1),(2);\nselect * from t1;\n \n+---+------+\n| a | b |\n+---+------+\n| 1 | 1 |\n| 2 | 2 |\n+---+------+\n \nChanging a Sequence\n \nThe ALTER SEQUENCE statement is used for changing sequences.\nFor example, to restart the sequence at another value:\n \nALTER SEQUENCE s RESTART 50;\n \nSELECT NEXTVAL(s);\n+------------+\n| NEXTVAL(s) |\n+------------+\n| 50 |\n+------------+\n \nThe SETVAL function can also be used to set the next value\nto be returned for a SEQUENCE, for example:\n \nSELECT SETVAL(s, 100);\n+----------------+\n| SETVAL(s, 100) |\n+----------------+\n| 100 |\n+----------------+\n \nSETVAL can only be used to increase the sequence value.\nAttempting to set a lower value will fail, returning NULL:\n \nSELECT SETVAL(s, 50);\n+---------------+\n| SETVAL(s, 50) |\n+---------------+\n| NULL |\n+---------------+\n \nDropping a Sequence\n \nThe DROP SEQUENCE statement is used to drop a sequence, for\nexample:\n \nDROP SEQUENCE s;\n \nReplication\n \nIf one wants to use Sequences in a master-master setup or\nwith Galera one\nshould use INCREMENT=0. This will tell the Sequence to use\nauto_increment_increment and auto_increment_offset to\ngenerate unique values for each server.\n \nStandards Compliance\n \nMariaDB 10.3 supports both ANSI SQL and Oracle syntax for\nsequences.\n \nHowever as SEQUENCE is implemented as a special kind of\ntable, it uses the same namespace as tables. The benefits\nare that sequences show up in SHOW TABLES, and one can also\ncreate a sequence with CREATE TABLE and drop it with DROP\nTABLE. One can SELECT from it as from any other table. This\nensures that all old tools that work with tables should work\nwith sequences.\n \nSince sequence objects act as regular tables in many\ncontexts, they will be affected by LOCK TABLES. This is not\nthe case in other DBMS, such as Oracle, where LOCK TABLE\ndoes not affect sequences.\n \nNotes\n \nOne of the goals with the Sequence implementation is that\nall old\ntools, such as mysqldump, should work unchanged, while still\nkeeping the\nnormal usage of sequence standard compatibly.\n \nTo make this possible, sequence is currently implemented as\na table with a few exclusive properties.\n \nThe special properties for sequence tables are:\nA sequence table has always one row.\nWhen one creates a sequence, either with CREATE TABLE or\nCREATE SEQUENCE, one row will be inserted.\nIf one tries to insert into a sequence table, the single row\nwill be updated. This allows mysqldump to work but also\ngives the additional benefit that one can change all\nproperties of a sequence with a single insert. New\napplications should of course also use ALTER SEQUENCE.\nUPDATE or DELETE can\'t be performed on Sequence objects.\nDoing a select on the sequence shows the current state of\nthe sequence, except the values that are reserved in the\ncache. The next_value column shows the next value not\nreserved by the cache.\nFLUSH TABLES will close the sequence and the next sequence\nnumber generated will be according to what\'s stored in the\nSequence object. In effect, this will discard the cached\nvalues.\nA number of normal table operations work on Sequence tables.\nSee next section.\n \nTable Operations that Work with Sequences\n \nSHOW CREATE TABLE sequence_name. This shows the table\nstructure that is behind the SEQUENCE including the field\nnames that can be used with SELECT or even CREATE TABLE.\nCREATE TABLE sequence-structure ... SEQUENCE=1\nALTER TABLE sequence RENAME TO sequence2\nRENAME TABLE sequence_name TO new_sequence_name\nDROP TABLE sequence_name. This is allowed mainly to get old\ntools like mysqldump to work with sequence tables.\nSHOW TABLES\n \nImplementation\n \nInternally, sequence tables are created as a normal table\nwithout\nrollback (the InnoDB, Aria and MySAM engines support this),\nwrapped by a\nsequence engine object. This allowed us to create sequences\nwith\nalmost no performance impact for normal tables. (The cost is\none \'if\'\nper insert if the binary log is enabled).\n \nUnderlying Table Structure\n \nThe following example shows the table structure of sequences\nand how it\ncan be used as a table.\n(Output of results are slightly edited to make them easier\nto read)\n \ncreate sequence t1;\nshow create sequence t1\\G\n***** 1. row *****\n CREATE SEQUENCE `t1` start with 1 minvalue 1 maxvalue\n9223372036854775806\n increment by 1 cache 1000 nocycle ENGINE=InnoDB\n \nshow create table t1\\G\n***** 1. row *****\nCreate Table: CREATE TABLE `t1` (\n `next_not_cached_value` bigint(21) NOT NULL,\n `minimum_value` bigint(21) NOT NULL,\n `maximum_value` bigint(21) NOT NULL,\n `start_value` bigint(21) NOT NULL COMMENT \'start value\nwhen sequences is created or value if RESTART is used\',\n `increment` bigint(21) NOT NULL COMMENT \'increment\nvalue\',\n `cache_size` bigint(21) unsigned NOT NULL,\n `cycle_option` tinyint(1) unsigned NOT NULL COMMENT \'0 if\nno cycles are allowed, 1 if the sequence should begin a new\ncycle when maximum_value is passed\',\n `cycle_count` bigint(21) NOT NULL COMMENT \'How many cycles\nhave been done\'\n) ENGINE=InnoDB SEQUENCE=1\n \nselect * from t1\\G\nnext_not_cached_value: 1\n minimum_value: 1\n maximum_value: 9223372036854775806\n start_value: 1\n increment: 1\n cache_size: 1000\n cycle_option: 0\n cycle_count: 0\nThe cycle_count column is incremented every time the\nsequence wraps around.\n \nCredits\n \nThanks to Jianwe Zhao from Aliyun for his work on SEQUENCE\nin AliSQL, which gave ideas and inspiration for this work.\nThanks to Peter Gulutzan,who helped test and gave useful\ncomments about the implementation.\n \n\n\nURL: https://mariadb.com/kb/en/library/sequence-overview/','','https://mariadb.com/kb/en/library/sequence-overview/'),(685,'SETVAL()',40,'SEQUENCEs were introduced in MariaDB 10.3.\n \nSyntax\n------ \nSETVAL(sequence_name, next_value, [is_used, [round]])\n \nDescription\n----------- \nSet the next value to be returned for a SEQUENCE.\n \nThis function is compatible with PostgreSQL syntax, extended\nwith the round argument.\n \nIf the is_used argument is not given or is 1 or true, then\nthe next used value will\none after the given value. If is_used is 0 or false then the\nnext generated value\nwill be the given value.\n \nIf round is used then it will set the round value (or the\ninternal cycle count, starting at zero) for the sequence.\nIf round is not used, it\'s assumed to be 0.\n \nnext_value must be an integer literal.\n \nFor SEQUENCE tables defined with CYCLE (see CREATE SEQUENCE)\none should use both next_value and round to define the next\nvalue. In this case the\ncurrent sequence value is defined to be round, next_value.\n \nThe result returned by SETVAL() is next_value or NULL if the\ngiven next_value and round is smaller than the current\nvalue.\n \nSETVAL() will not set the SEQUENCE value to a something that\nis less than\nits current value. This is needed to ensure that SETVAL()\nis replication safe. If you want to set the SEQUENCE to a\nsmaller number\nuse ALTER SEQUENCE.\n \nIf CYCLE is used, first round and then next_value are\ncompared\nto see if the value is bigger than the current value.\n \nInternally, in the MariaDB server, SETVAL() is used to\ninform\nslaves that a SEQUENCE has changed value. The slave may get\nSETVAL() statements out of order, but this is ok as only the\nbiggest one will have an effect.\n \nSETVAL requires the INSERT privilege.\n \nExamples\n-------- \nSELECT setval(foo, 42); -- Next nextval will return 43\nSELECT setval(foo, 42, true); -- Same as above\nSELECT setval(foo, 42, false); -- Next nextval will return\n42\n \nSETVAL setting higher and lower values on a sequence with an\nincrement of 10:\n \nSELECT NEXTVAL(s);\n+------------+\n| NEXTVAL(s) |\n+------------+\n| 50 |\n+------------+\n \nSELECT SETVAL(s, 100);\n+----------------+\n| SETVAL(s, 100) |\n+----------------+\n| 100 |\n+----------------+\n \nSELECT NEXTVAL(s);\n+------------+\n| NEXTVAL(s) |\n+------------+\n| 110 |\n+------------+\n \nSELECT SETVAL(s, 50);\n+---------------+\n| SETVAL(s, 50) |\n+---------------+\n| NULL |\n+---------------+\n \nSELECT NEXTVAL(s);\n+------------+\n| NEXTVAL(s) |\n+------------+\n| 120 |\n+------------+\n \nExample demonstrating round:\n \nCREATE OR REPLACE SEQUENCE s1\n START WITH 1\n MINVALUE 1\n MAXVALUE 99\n INCREMENT BY 1 \n CACHE 20 \n CYCLE;\n \nSELECT SETVAL(s1, 99, 1, 0);\n+----------------------+\n| SETVAL(s1, 99, 1, 0) |\n+----------------------+\n| 99 |\n+----------------------+\n \nSELECT NEXTVAL(s1);\n+-------------+\n| NEXTVAL(s1) |\n+-------------+\n| 1 |\n+-------------+\n \nThe following statement returns NULL, as the given\nnext_value and round is smaller than the current value.\n \nSELECT SETVAL(s1, 99, 1, 0);\n+----------------------+\n| SETVAL(s1, 99, 1, 0) |\n+----------------------+\n| NULL |\n+----------------------+\n \nSELECT NEXTVAL(s1);\n+-------------+\n| NEXTVAL(s1) |\n+-------------+\n| 2 |\n+-------------+\n \nIncreasing the round from zero to 1 will allow next_value to\nbe returned.\n \nSELECT SETVAL(s1, 99, 1, 1);\n+----------------------+\n| SETVAL(s1, 99, 1, 1) |\n+----------------------+\n| 99 |\n+----------------------+\n \nSELECT NEXTVAL(s1);\n+-------------+\n| NEXTVAL(s1) |\n+-------------+\n| 1 |\n+-------------+\n \n\n\nURL: https://mariadb.com/kb/en/library/setval/','','https://mariadb.com/kb/en/library/setval/'),(687,'JSON_ARRAY_APPEND',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_ARRAY_APPEND(json_doc, path, value[, path, value] ...)\n \nDescription\n----------- \nAppends values to the end of the specified arrays within a\nJSON document, returning the result, or NULL if any of the\narguments are NULL.\n \nEvaluation is performed from left to right, with the\nresulting document from the previous pair becoming the new\nvalue against which the next pair is evaluated.\n \nIf the json_doc is not a valid JSON document, or if any of\nthe paths are not valid, or contain a * or ** wildcard, an\nerror is returned.\n \nExamples\n-------- \nSET @json = \'[1, 2, [3, 4]]\';\n \nSELECT JSON_ARRAY_APPEND(@json, \'$[0]\', 5)\n+-------------------------------------+\n| JSON_ARRAY_APPEND(@json, \'$[0]\', 5) |\n+-------------------------------------+\n| [[1, 5], 2, [3, 4]] |\n+-------------------------------------+\n \nSELECT JSON_ARRAY_APPEND(@json, \'$[1]\', 6);\n+-------------------------------------+\n| JSON_ARRAY_APPEND(@json, \'$[1]\', 6) |\n+-------------------------------------+\n| [1, [2, 6], [3, 4]] |\n+-------------------------------------+\n \nSELECT JSON_ARRAY_APPEND(@json, \'$[1]\', 6, \'$[2]\', 7);\n+------------------------------------------------+\n| JSON_ARRAY_APPEND(@json, \'$[1]\', 6, \'$[2]\', 7) |\n+------------------------------------------------+\n| [1, [2, 6], [3, 4, 7]] |\n+------------------------------------------------+\n \nSELECT JSON_ARRAY_APPEND(@json, \'$\', 5);\n+----------------------------------+\n| JSON_ARRAY_APPEND(@json, \'$\', 5) |\n+----------------------------------+\n| [1, 2, [3, 4], 5] |\n+----------------------------------+\n \nSET @json = \'{\"A\": 1, \"B\": [2], \"C\": [3, 4]}\';\n \nSELECT JSON_ARRAY_APPEND(@json, \'$.B\', 5);\n+------------------------------------+\n| JSON_ARRAY_APPEND(@json, \'$.B\', 5) |\n+------------------------------------+\n| {\"A\": 1, \"B\": [2, 5], \"C\": [3, 4]} |\n+------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_array_append/','','https://mariadb.com/kb/en/json_array_append/'),(688,'JSON_ARRAY_INSERT',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_ARRAY_INSERT(json_doc, path, value[, path, value] ...)\n \nDescription\n----------- \nInserts a value into a JSON document, returning the modified\ndocument, or NULL if any of the arguments are NULL.\n \nEvaluation is performed from left to right, with the\nresulting document from the previous pair becoming the new\nvalue against which the next pair is evaluated.\n \nIf the json_doc is not a valid JSON document, or if any of\nthe paths are not valid, or contain a * or ** wildcard, an\nerror is returned.\n \nExamples\n-------- \nSET @json = \'[1, 2, [3, 4]]\';\n \nSELECT JSON_ARRAY_INSERT(@json, \'$[0]\', 5);\n+-------------------------------------+\n| JSON_ARRAY_INSERT(@json, \'$[0]\', 5) |\n+-------------------------------------+\n| [5, 1, 2, [3, 4]] |\n+-------------------------------------+\n \nSELECT JSON_ARRAY_INSERT(@json, \'$[1]\', 6);\n+-------------------------------------+\n| JSON_ARRAY_INSERT(@json, \'$[1]\', 6) |\n+-------------------------------------+\n| [1, 6, 2, [3, 4]] |\n+-------------------------------------+\n \nSELECT JSON_ARRAY_INSERT(@json, \'$[1]\', 6, \'$[2]\', 7);\n+------------------------------------------------+\n| JSON_ARRAY_INSERT(@json, \'$[1]\', 6, \'$[2]\', 7) |\n+------------------------------------------------+\n| [1, 6, 7, 2, [3, 4]] |\n+------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_array_insert/','','https://mariadb.com/kb/en/json_array_insert/'),(690,'JSON_CONTAINS',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_CONTAINS(json_doc, val[, path])\n \nDescription\n----------- \nReturns whether or not the specified value is found in the\ngiven JSON document or, optionally, at the specified path\nwithin the document. Returns 1 if it does, 0 if not and NULL\nif any of the arguments are null. An error occurs if the\ndocument or path is not valid, or contains the * or **\nwildcards.\n \nExamples\n-------- \nSET @json = \'{\"A\": 0, \"B\": {\"C\": 1}, \"D\": 2}\';\n \nSELECT JSON_CONTAINS(@json, \'2\', \'$.A\');\n+----------------------------------+\n| JSON_CONTAINS(@json, \'2\', \'$.A\') |\n+----------------------------------+\n| 0 |\n+----------------------------------+\n \nSELECT JSON_CONTAINS(@json, \'2\', \'$.D\');\n+----------------------------------+\n| JSON_CONTAINS(@json, \'2\', \'$.D\') |\n+----------------------------------+\n| 1 |\n+----------------------------------+\n \nSELECT JSON_CONTAINS(@json, \'{\"C\": 1}\', \'$.A\');\n+-----------------------------------------+\n| JSON_CONTAINS(@json, \'{\"C\": 1}\', \'$.A\') |\n+-----------------------------------------+\n| 0 |\n+-----------------------------------------+\n \nSELECT JSON_CONTAINS(@json, \'{\"C\": 1}\', \'$.B\');\n+-----------------------------------------+\n| JSON_CONTAINS(@json, \'{\"C\": 1}\', \'$.B\') |\n+-----------------------------------------+\n| 1 |\n+-----------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_contains/','','https://mariadb.com/kb/en/json_contains/'),(691,'JSON_CONTAINS_PATH',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_CONTAINS_PATH(json_doc, return_arg, path[, path] ...)\n \nDescription\n----------- \nIndicates whether the given JSON document contains data at\nthe specified path or paths. Returns 1 if it does, 0 if not\nand NULL if any of the arguments are null.\n \nThe return_arg can be one or all:\none - Returns 1 if at least one path exists within the JSON\ndocument. \nall - Returns 1 only if all paths exist within the JSON\ndocument.\n \nExamples\n-------- \nSET @json = \'{\"A\": 1, \"B\": [2], \"C\": [3, 4]}\';\n \nSELECT JSON_CONTAINS_PATH(@json, \'one\', \'$.A\', \'$.D\');\n+------------------------------------------------+\n| JSON_CONTAINS_PATH(@json, \'one\', \'$.A\', \'$.D\') |\n+------------------------------------------------+\n| 1 |\n+------------------------------------------------+\n1 row in set (0.00 sec)\n \nSELECT JSON_CONTAINS_PATH(@json, \'all\', \'$.A\', \'$.D\');\n+------------------------------------------------+\n| JSON_CONTAINS_PATH(@json, \'all\', \'$.A\', \'$.D\') |\n+------------------------------------------------+\n| 0 |\n+------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_contains_path/','','https://mariadb.com/kb/en/json_contains_path/'),(692,'JSON_DEPTH',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_DEPTH(json_doc)\n \nDescription\n----------- \nReturns the maximum depth of the given JSON document, or\nNULL if the argument is null. An error will occur if the\nargument is an invalid JSON document.\nScalar values or empty arrays or objects have a depth of 1.\nArrays or objects that are not empty but contain only\nelements or member values of depth 1 will have a depth of 2.\nIn other cases, the depth will be greater than 2.\n \nExamples\n-------- \nSELECT JSON_DEPTH(\'[]\'), JSON_DEPTH(\'true\'),\nJSON_DEPTH(\'{}\');\n+------------------+--------------------+------------------+\n| JSON_DEPTH(\'[]\') | JSON_DEPTH(\'true\') |\nJSON_DEPTH(\'{}\') |\n+------------------+--------------------+------------------+\n| 1 | 1 | 1 |\n+------------------+--------------------+------------------+\n \nSELECT JSON_DEPTH(\'[1, 2, 3]\'), JSON_DEPTH(\'[[], {},\n[]]\');\n+-------------------------+----------------------------+\n| JSON_DEPTH(\'[1, 2, 3]\') | JSON_DEPTH(\'[[], {}, []]\') |\n+-------------------------+----------------------------+\n| 2 | 2 |\n+-------------------------+----------------------------+\n \nSELECT JSON_DEPTH(\'[1, 2, [3, 4, 5, 6], 7]\');\n+---------------------------------------+\n| JSON_DEPTH(\'[1, 2, [3, 4, 5, 6], 7]\') |\n+---------------------------------------+\n| 3 |\n+---------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_depth/','','https://mariadb.com/kb/en/json_depth/'),(694,'JSON_EXISTS',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nDescription\n----------- \nDetermines whether a specified JSON value exists in the\ngiven data. Returns 1 if found, 0 if not, or NULL if any of\nthe inputs were NULL.\n \nExamples\n-------- \nSELECT JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2,\n3]}\', \"$.key2\");\n+------------------------------------------------------------+\n| JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2, 3]}\',\n\"$.key2\") |\n+------------------------------------------------------------+\n| 1 |\n+------------------------------------------------------------+\n \nSELECT JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2,\n3]}\', \"$.key3\");\n+------------------------------------------------------------+\n| JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2, 3]}\',\n\"$.key3\") |\n+------------------------------------------------------------+\n| 0 |\n+------------------------------------------------------------+\n \nSELECT JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2,\n3]}\', \"$.key2[1]\");\n+---------------------------------------------------------------+\n| JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2, 3]}\',\n\"$.key2[1]\") |\n+---------------------------------------------------------------+\n| 1 |\n+---------------------------------------------------------------+\n \nSELECT JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2,\n3]}\', \"$.key2[10]\");\n+----------------------------------------------------------------+\n| JSON_EXISTS(\'{\"key1\":\"xxxx\", \"key2\":[1, 2, 3]}\',\n\"$.key2[10]\") |\n+----------------------------------------------------------------+\n| 0 |\n+----------------------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_exists/','','https://mariadb.com/kb/en/json_exists/'),(695,'JSON_EXTRACT',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_EXTRACT(json_doc, path[, path] ...)\n \nDescription\n----------- \nExtracts data from a JSON document. The extracted data is\nselected from the parts matching the path arguments. Returns\nall matched values; either as a single matched value, or, if\nthe arguments could return multiple values, a result\nautowrapped as an array in the matching order.\n \nReturns NULL if no paths match or if any of the arguments\nare NULL. \n \nAn error will occur if any path argument is not a valid\npath, or if the json_doc argument is not a valid JSON\ndocument.\n \nExamples\n-------- \nSET @json = \'[1, 2, [3, 4]]\';\n \nSELECT JSON_EXTRACT(@json, \'$[1]\');\n+-----------------------------+\n| JSON_EXTRACT(@json, \'$[1]\') |\n+-----------------------------+\n| 2 |\n+-----------------------------+\n \nSELECT JSON_EXTRACT(@json, \'$[2]\');\n+-----------------------------+\n| JSON_EXTRACT(@json, \'$[2]\') |\n+-----------------------------+\n| [3, 4] |\n+-----------------------------+\n \nSELECT JSON_EXTRACT(@json, \'$[2][1]\');\n+--------------------------------+\n| JSON_EXTRACT(@json, \'$[2][1]\') |\n+--------------------------------+\n| 4 |\n+--------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_extract/','','https://mariadb.com/kb/en/json_extract/'),(696,'JSON_INSERT',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_INSERT(json_doc, path, val[, path, val] ...)\n \nDescription\n----------- \nInserts data into a JSON document, returning the resulting\ndocument or NULL if any argument is null. \n \nAn error will occur if the JSON document is not invalid, or\nif any of the paths are invalid or contain a * or **\nwildcard.\n \nJSON_INSERT can only insert data while JSON_REPLACE can only\nupdate. JSON_SET can update or insert data. \n \nExamples\n-------- \nSET @json = \'{ \"A\": 0, \"B\": [1, 2]}\';\n \nSELECT JSON_INSERT(@json, \'$.C\', \'[3, 4]\');\n+--------------------------------------+\n| JSON_INSERT(@json, \'$.C\', \'[3, 4]\') |\n+--------------------------------------+\n| { \"A\": 0, \"B\": [1, 2], \"C\":\"[3, 4]\"} |\n+--------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_insert/','','https://mariadb.com/kb/en/json_insert/'),(697,'JSON_KEYS',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_KEYS(json_doc[, path])\n \nDescription\n----------- \nReturns the keys as a JSON array from the top-level value of\na JSON object or, if the optional path argument is provided,\nthe top-level keys from the path. \n \nExcludes keys from nested sub-objects in the top level\nvalue. The resulting array will be empty if the selected\nobject is empty.\n \nReturns NULL if any of the arguments are null, a given path\ndoes not locate an object, or if the json_doc argument is\nnot an object.\n \nAn error will occur if JSON document is invalid, the path is\ninvalid or if the path contains a * or ** wildcard.\n \nExamples\n-------- \nSELECT JSON_KEYS(\'{\"A\": 1, \"B\": {\"C\": 2}}\');\n+--------------------------------------+\n| JSON_KEYS(\'{\"A\": 1, \"B\": {\"C\": 2}}\') |\n+--------------------------------------+\n| [\"A\", \"B\"] |\n+--------------------------------------+\n \nSELECT JSON_KEYS(\'{\"A\": 1, \"B\": 2, \"C\": {\"D\":\n3}}\', \'$.C\');\n+-----------------------------------------------------+\n| JSON_KEYS(\'{\"A\": 1, \"B\": 2, \"C\": {\"D\": 3}}\',\n\'$.C\') |\n+-----------------------------------------------------+\n| [\"D\"] |\n+-----------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_keys/','','https://mariadb.com/kb/en/json_keys/'),(698,'JSON_LENGTH',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_LENGTH(json_doc[, path])\n \nDescription\n----------- \nReturns the length of a JSON document, or, if the optional\npath argument is given, the length of the value within the\ndocument specified by the path. \n \nReturns NULL if any of the arguments argument are null or\nthe path argument does not identify a value in the document.\n\n \nAn error will occur if the JSON document is invalid, the\npath is invalid or if the path contains a * or ** wildcard.\n \nLength will be determined as follow:\nA scalar\'s length is always 1.\nIf an array, the number of elements in the array.\nIf an object, the number of members in the object.\n \nThe length of nested arrays or objects are not counted.\n \nExamples\n-------- \n\n \n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_length/','','https://mariadb.com/kb/en/json_length/'),(702,'JSON_QUERY',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_QUERY(json_doc, path)\n \nDescription\n----------- \nGiven a JSON document, returns an object or array specified\nby the path. Returns NULL if not given a valid JSON\ndocument, or if there is no match.\n \nExamples\n-------- \nselect json_query(\'{\"key1\":{\"a\":1, \"b\":[1,2]}}\',\n\'$.key1\');\n+-----------------------------------------------------+\n| json_query(\'{\"key1\":{\"a\":1, \"b\":[1,2]}}\',\n\'$.key1\') |\n+-----------------------------------------------------+\n| {\"a\":1, \"b\":[1,2]} |\n+-----------------------------------------------------+\n \nselect json_query(\'{\"key1\":123, \"key1\": [1,2,3]}\',\n\'$.key1\');\n+-------------------------------------------------------+\n| json_query(\'{\"key1\":123, \"key1\": [1,2,3]}\',\n\'$.key1\') |\n+-------------------------------------------------------+\n| [1,2,3] |\n+-------------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_query/','','https://mariadb.com/kb/en/json_query/'),(703,'JSON_QUOTE',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_QUOTE(json_value)\n \nDescription\n----------- \nQuotes a string as a JSON value, usually for producing valid\nJSON string literals for inclusion in JSON documents. Wraps\nthe string with double quote characters and escapes interior\nquotes and other special characters, returning a utf8mb4\nstring. \n \nReturns NULL if the argument is NULL.\n \nExamples\n-------- \nSELECT JSON_QUOTE(\'A\'), JSON_QUOTE(\"B\"),\nJSON_QUOTE(\'\"C\"\');\n+-----------------+-----------------+-------------------+\n| JSON_QUOTE(\'A\') | JSON_QUOTE(\"B\") |\nJSON_QUOTE(\'\"C\"\') |\n+-----------------+-----------------+-------------------+\n| \"A\" | \"B\" | \"\\\"C\\\"\" |\n+-----------------+-----------------+-------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_quote/','','https://mariadb.com/kb/en/json_quote/'),(704,'JSON_REMOVE',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_REMOVE(json_doc, path[, path] ...)\n \nDescription\n----------- \nRemoves data from a JSON document returning the result, or\nNULL if any of the arguments are null. If the element does\nnot exist in the document, no changes are made.\n \nAn error will occur if JSON document is invalid, the path is\ninvalid or if the path contains a * or ** wildcard.\n \nPath arguments are evaluated from left to right, with the\nresult from the earlier evaluation being used as the value\nfor the next.\n \nExamples\n-------- \nSELECT JSON_REMOVE(\'{\"A\": 1, \"B\": 2, \"C\": {\"D\":\n3}}\', \'$.C\');\n+-------------------------------------------------------+\n| JSON_REMOVE(\'{\"A\": 1, \"B\": 2, \"C\": {\"D\": 3}}\',\n\'$.C\') |\n+-------------------------------------------------------+\n| {\"A\": 1, \"B\": 2} |\n+-------------------------------------------------------+\n \nSELECT JSON_REMOVE(\'[\"A\", \"B\", [\"C\", \"D\"],\n\"E\"]\', \'$[1]\');\n+----------------------------------------------------+\n| JSON_REMOVE(\'[\"A\", \"B\", [\"C\", \"D\"], \"E\"]\',\n\'$[1]\') |\n+----------------------------------------------------+\n| [\"A\", [\"C\", \"D\"], \"E\"] |\n+----------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_remove/','','https://mariadb.com/kb/en/json_remove/'),(705,'JSON_REPLACE',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_REPLACE(json_doc, path, val[, path, val] ...)\n \nDescription\n----------- \nReplaces existing values in a JSON document, returning the\nresult, or NULL if any of the arguments are NULL. \n \nAn error will occur if the JSON document is invalid, the\npath is invalid or if the path contains a * or ** wildcard.\n \nPaths and values are evaluated from left to right, with the\nresult from the earlier evaluation being used as the value\nfor the next.\n \nJSON_REPLACE can only update data, while JSON_INSERT can\nonly insert. JSON_SET can update or insert data. \n \nExamples\n-------- \nSELECT JSON_REPLACE(\'{ \"A\": 1, \"B\": [2, 3]}\',\n\'$.B[1]\', 4);\n+-----------------------------------------------------+\n| JSON_REPLACE(\'{ \"A\": 1, \"B\": [2, 3]}\', \'$.B[1]\',\n4) |\n+-----------------------------------------------------+\n| { \"A\": 1, \"B\": [2, 4]} |\n+-----------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_replace/','','https://mariadb.com/kb/en/json_replace/'),(706,'JSON_SEARCH',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_SEARCH(json_doc, return_arg, search_str[, escape_char[,\npath] ...])\n \nDescription\n----------- \nReturns the path to the given string within a JSON document,\nor NULL if any of json_doc, search_str or a path argument is\nNULL; if the search string is not found, or if no path\nexists within the document. \n \nA warning will occur if the JSON document is not valid, any\nof the path arguments are not valid, if return_arg is\nneither one nor all, or if the escape character is not a\nconstant. NULL will be returned.\n \nreturn_arg can be one of two values:\n\'one: Terminates after finding the first match, so will\nreturn one path string. If there is more than one match, it\nis undefined which is considered first.\nall: Returns all matching path strings, without duplicates.\nMultiple strings are autowrapped as an array. The order is\nundefined.\n \nExamples\n-------- \nSET @json = \'[\"A\", [{\"B\": \"1\"}], {\"C\":\"AB\"},\n{\"D\":\"BC\"}]\';\n \nSELECT JSON_SEARCH(@json, \'one\', \'AB\');\n+---------------------------------+\n| JSON_SEARCH(@json, \'one\', \'AB\') |\n+---------------------------------+\n| \"$[2].C\" |\n+---------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_search/','','https://mariadb.com/kb/en/json_search/'),(708,'JSON_TYPE',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_TYPE(json_val)\n \nDescription\n----------- \nReturns the type of a JSON value, or NULL if the argument is\nnull.\n \nAn error will occur if the argument is an invalid JSON\nvalue.\n \nThe following is a complete list of the possible return\ntypes:\n \nReturn type | Value | \n \nARRAY | JSON array | \n \nBIT | MariaDB BIT scalar | \n \nBLOB | MariaDB binary types (BINARY, VARBINARY or BLOB) | \n \nBOOLEAN | JSON true/false literals | \n \nDATE | MariaDB DATE scalar | \n \nDATETIME | MariaDB DATETIME or TIMESTAMP scalar | \n \nDECIMAL | MariaDB DECIMAL or NUMERIC scalar | \n \nDOUBLE | MariaDB DOUBLE FLOAT scalar | \n \nINTEGER | MariaDB integer types (TINYINT, SMALLINT,\nMEDIUMINT, INT or BIGINT) | \n \nNULL | JSON null literal or NULL argument | \n \nOBJECT | JSON object | \n \nOPAQUE | Any valid JSON value that is not one of the other\ntypes. | \n \nSTRING | MariaDB character types (CHAR, VARCHAR, TEXT, ENUM\nor SET) | \n \nTIME | MariaDB TIME scalar | \n \nExamples\n-------- \nSELECT JSON_TYPE(\'{\"A\": 1, \"B\": 2, \"C\": 3}\');\n+---------------------------------------+\n| JSON_TYPE(\'{\"A\": 1, \"B\": 2, \"C\": 3}\') |\n+---------------------------------------+\n| OBJECT |\n+---------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_type/','','https://mariadb.com/kb/en/json_type/'),(709,'JSON_UNQUOTE',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_UNQUOTE(val)\n \nDescription\n----------- \nUnquotes a JSON value, returning a string, or NULL if the\nargument is null. \n \nAn error will occur if the given value begins and ends with\ndouble quotes and is an invalid JSON string literal.\n \nCertain character sequences have special meanings within a\nstring. Usually, a backspace is ignored, but the escape\nsequences in the table below are recognised by MariaDB,\nunless the SQL Mode is set to NO_BACKSLASH_ESCAPES SQL.\n \nEscape sequence | Character | \n \n\\\" | Double quote (\") | \n \n\\b | Backspace | \n \n\\f | Formfeed | \n \n\\n | Newline (linefeed) | \n \n\\r | Carriage return | \n \n\\t | Tab | \n \n\\\\ | Backslash (\\) | \n \n\\uXXXX | UTF-8 bytes for Unicode value XXXX | \n \nExamples\n-------- \nSELECT JSON_UNQUOTE(\'\"Monty\"\');\n+-------------------------+\n| JSON_UNQUOTE(\'\"Monty\"\') |\n+-------------------------+\n| Monty |\n+-------------------------+\n \nWith the default SQL Mode:\n \nSELECT JSON_UNQUOTE(\'Si\\bng\\ting\');\n+-----------------------------+\n| JSON_UNQUOTE(\'Si\\bng\\ting\') |\n+-----------------------------+\n| Sng ing |\n+-----------------------------+\n \nSetting NO_BACKSLASH_ESCAPES:\n \nSET @@sql_mode = \'NO_BACKSLASH_ESCAPES\';\n \nSELECT JSON_UNQUOTE(\'Si\\bng\\ting\');\n+-----------------------------+\n| JSON_UNQUOTE(\'Si\\bng\\ting\') |\n+-----------------------------+\n| Si\\bng\\ting |\n+-----------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_unquote/','','https://mariadb.com/kb/en/json_unquote/'),(710,'JSON_VALID',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_VALID(value)\n \nDescription\n----------- \nIndicates whether the given value is a valid JSON document\nor not. Returns 1 if valid, 0 if not, and NULL if the\nargument is NULL.\n \nFrom MariaDB 10.4.3, the JSON_VALID function is\nautomatically used as a CHECK constraint for the JSON data\ntype alias in order to ensure that a valid json document is\ninserted. \n \nExamples\n-------- \nSELECT JSON_VALID(\'{\"id\": 1, \"name\": \"Monty\"}\');\n+------------------------------------------+\n| JSON_VALID(\'{\"id\": 1, \"name\": \"Monty\"}\') |\n+------------------------------------------+\n| 1 |\n+------------------------------------------+\n \nSELECT JSON_VALID(\'{\"id\": 1, \"name\": \"Monty\",\n\"oddfield\"}\');\n+------------------------------------------------------+\n| JSON_VALID(\'{\"id\": 1, \"name\": \"Monty\",\n\"oddfield\"}\') |\n+------------------------------------------------------+\n| 0 |\n+------------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_valid/','','https://mariadb.com/kb/en/json_valid/'),(711,'JSON_VALUE',41,'JSON functions were added in MariaDB 10.2.3.\n \nSyntax\n------ \nJSON_VALUE(json_doc, path)\n \nDescription\n----------- \nGiven a JSON document, returns the scalar specified by the\npath. Returns NULL if not given a valid JSON document, or if\nthere is no match.\n \nExamples\n-------- \nselect json_value(\'{\"key1\":123}\', \'$.key1\');\n+--------------------------------------+\n| json_value(\'{\"key1\":123}\', \'$.key1\') |\n+--------------------------------------+\n| 123 |\n+--------------------------------------+\n \nselect json_value(\'{\"key1\": [1,2,3], \"key1\":123}\',\n\'$.key1\');\n+-------------------------------------------------------+\n| json_value(\'{\"key1\": [1,2,3], \"key1\":123}\',\n\'$.key1\') |\n+-------------------------------------------------------+\n| 123 |\n+-------------------------------------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/json_value/','','https://mariadb.com/kb/en/json_value/'),(713,'DENSE_RANK',42,'The DENSE_RANK() function was first introduced with window\nfunctions in MariaDB 10.2.0.\n \nSyntax\n------ \nDENSE_RANK() OVER (\n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n) \n \nDescription\n----------- \nDENSE_RANK() is a window function that displays the number\nof a given row, starting at one and following the ORDER BY\nsequence of the window function, with identical values\nreceiving the same result. Unlike the RANK() function, there\nare no skipped values if the preceding results are\nidentical. It is also similar to the ROW_NUMBER() function\nexcept that in that function, identical values will receive\na different row number for each result.\n \nExamples\n-------- \nThe distinction between DENSE_RANK(), RANK() and\nROW_NUMBER():\n \nCREATE TABLE student(course VARCHAR(10), mark int, name\nvarchar(10));\n \nINSERT INTO student VALUES \n (\'Maths\', 60, \'Thulile\'),\n (\'Maths\', 60, \'Pritha\'),\n (\'Maths\', 70, \'Voitto\'),\n (\'Maths\', 55, \'Chun\'),\n (\'Biology\', 60, \'Bilal\'),\n (\'Biology\', 70, \'Roger\');\n \nSELECT \n RANK() OVER (PARTITION BY course ORDER BY mark DESC) AS\nrank, \n DENSE_RANK() OVER (PARTITION BY course ORDER BY mark DESC)\nAS dense_rank, \n ROW_NUMBER() OVER (PARTITION BY course ORDER BY mark DESC)\nAS row_num, \n course, mark, name \nFROM student ORDER BY course, mark DESC;\n \n+------+------------+---------+---------+------+---------+\n| rank | dense_rank | row_num | course | mark | name |\n+------+------------+---------+---------+------+---------+\n| 1 | 1 | 1 | Biology | 70 | Roger |\n| 2 | 2 | 2 | Biology | 60 | Bilal |\n| 1 | 1 | 1 | Maths | 70 | Voitto |\n| 2 | 2 | 2 | Maths | 60 | Thulile |\n| 2 | 2 | 3 | Maths | 60 | Pritha |\n| 4 | 3 | 4 | Maths | 55 | Chun |\n+------+------------+---------+---------+------+---------+\n \n\n\nURL: https://mariadb.com/kb/en/dense_rank/','','https://mariadb.com/kb/en/dense_rank/'),(714,'FIRST_VALUE',42,'The FIRST_VALUE() function was first introduced with other\nwindow functions in MariaDB 10.2.\n \nSyntax\n------ \nFIRST_VALUE(expr) OVER (\n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n) \n \nDescription\n----------- \nFIRST_VALUE returns the first result from an ordered set, or\nNULL if no such result exists.\n \nExamples\n-------- \nCREATE TABLE t1 (\n pk int primary key,\n a int,\n b int,\n c char(10),\n d decimal(10, 3),\n e real\n);\n \nINSERT INTO t1 VALUES\n( 1, 0, 1, \'one\', 0.1, 0.001),\n( 2, 0, 2, \'two\', 0.2, 0.002),\n( 3, 0, 3, \'three\', 0.3, 0.003),\n( 4, 1, 2, \'three\', 0.4, 0.004),\n( 5, 1, 1, \'two\', 0.5, 0.005),\n( 6, 1, 1, \'one\', 0.6, 0.006),\n( 7, 2, NULL, \'n_one\', 0.5, 0.007),\n( 8, 2, 1, \'n_two\', NULL, 0.008),\n( 9, 2, 2, NULL, 0.7, 0.009),\n(10, 2, 0, \'n_four\', 0.8, 0.010),\n(11, 2, 10, NULL, 0.9, NULL);\n \nSELECT pk, FIRST_VALUE(pk) OVER (ORDER BY pk) AS first_asc,\n LAST_VALUE(pk) OVER (ORDER BY pk) AS last_asc,\n FIRST_VALUE(pk) OVER (ORDER BY pk DESC) AS first_desc,\n LAST_VALUE(pk) OVER (ORDER BY pk DESC) AS last_desc\nFROM t1\nORDER BY pk DESC;\n \n+----+-----------+----------+------------+-----------+\n| pk | first_asc | last_asc | first_desc | last_desc |\n+----+-----------+----------+------------+-----------+\n| 11 | 1 | 11 | 11 | 11 |\n| 10 | 1 | 10 | 11 | 10 |\n| 9 | 1 | 9 | 11 | 9 |\n| 8 | 1 | 8 | 11 | 8 |\n| 7 | 1 | 7 | 11 | 7 |\n| 6 | 1 | 6 | 11 | 6 |\n| 5 | 1 | 5 | 11 | 5 |\n| 4 | 1 | 4 | 11 | 4 |\n| 3 | 1 | 3 | 11 | 3 |\n| 2 | 1 | 2 | 11 | 2 |\n| 1 | 1 | 1 | 11 | 1 |\n+----+-----------+----------+------------+-----------+\n \nCREATE OR REPLACE TABLE t1 (i int);\nINSERT INTO t1 VALUES\n(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);\n \nSELECT i,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW\nand 1 FOLLOWING) AS f_1f,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW and\n1 FOLLOWING) AS l_1f,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 PRECEDING\nAND 1 FOLLOWING) AS f_1p1f,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 PRECEDING AND\n1 FOLLOWING) AS f_1p1f,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 2 PRECEDING\nAND 1 PRECEDING) AS f_2p1p,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 2 PRECEDING AND\n1 PRECEDING) AS f_2p1p,\n FIRST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 FOLLOWING\nAND 2 FOLLOWING) AS f_1f2f,\n LAST_VALUE(i) OVER (ORDER BY i ROWS BETWEEN 1 FOLLOWING AND\n2 FOLLOWING) AS f_1f2f\nFROM t1;\n \n+------+------+------+--------+--------+--------+--------+--------+--------+\n| i | f_1f | l_1f | f_1p1f | f_1p1f | f_2p1p | f_2p1p |\nf_1f2f | f_1f2f |\n+------+------+------+--------+--------+--------+--------+--------+--------+\n| 1 | 1 | 2 | 1 | 2 | NULL | NULL | 2 | 3 |\n| 2 | 2 | 3 | 1 | 3 | 1 | 1 | 3 | 4 |\n| 3 | 3 | 4 | 2 | 4 | 1 | 2 | 4 | 5 |\n| 4 | 4 | 5 | 3 | 5 | 2 | 3 | 5 | 6 |\n| 5 | 5 | 6 | 4 | 6 | 3 | 4 | 6 | 7 |\n| 6 | 6 | 7 | 5 | 7 | 4 | 5 | 7 | 8 |\n| 7 | 7 | 8 | 6 | 8 | 5 | 6 | 8 | 9 |\n| 8 | 8 | 9 | 7 | 9 | 6 | 7 | 9 | 10 |\n| 9 | 9 | 10 | 8 | 10 | 7 | 8 | 10 | 10 |\n| 10 | 10 | 10 | 9 | 10 | 8 | 9 | NULL | NULL |\n+------+------+------+--------+--------+--------+--------+--------+--------+\n \n\n\nURL: https://mariadb.com/kb/en/first_value/','','https://mariadb.com/kb/en/first_value/'),(715,'LAG',42,'The LAG() function was first introduced with other window\nfunctions in MariaDB 10.2.\n \nSyntax\n------ \nLAG (expr[, offset]) OVER ( \n [ PARTITION BY partition_expression ] \n < ORDER BY order_list >\n)\n \nDescription\n----------- \nThe LAG function accesses data from a previous row according\nto the ORDER BY clause without the need for a self-join. The\nspecific row is determined by the offset (default 1), which\nspecifies the number of rows behind the current row to use.\nAn offset of 0 is the current row.\n \nExamples\n-------- \nCREATE TABLE t1 (pk int primary key, a int, b int, c\nchar(10), d decimal(10, 3), e real);\n \nINSERT INTO t1 VALUES\n ( 1, 0, 1, \'one\', 0.1, 0.001),\n ( 2, 0, 2, \'two\', 0.2, 0.002),\n ( 3, 0, 3, \'three\', 0.3, 0.003),\n ( 4, 1, 2, \'three\', 0.4, 0.004),\n ( 5, 1, 1, \'two\', 0.5, 0.005),\n ( 6, 1, 1, \'one\', 0.6, 0.006),\n ( 7, 2, NULL, \'n_one\', 0.5, 0.007),\n ( 8, 2, 1, \'n_two\', NULL, 0.008),\n ( 9, 2, 2, NULL, 0.7, 0.009),\n (10, 2, 0, \'n_four\', 0.8, 0.010),\n (11, 2, 10, NULL, 0.9, NULL);\n \nSELECT pk, LAG(pk) OVER (ORDER BY pk) AS l,\n LAG(pk,1) OVER (ORDER BY pk) AS l1,\n LAG(pk,2) OVER (ORDER BY pk) AS l2,\n LAG(pk,0) OVER (ORDER BY pk) AS l0,\n LAG(pk,-1) OVER (ORDER BY pk) AS lm1,\n LAG(pk,-2) OVER (ORDER BY pk) AS lm2 \nFROM t1;\n \n+----+------+------+------+------+------+------+\n| pk | l | l1 | l2 | l0 | lm1 | lm2 |\n+----+------+------+------+------+------+------+\n| 1 | NULL | NULL | NULL | 1 | 2 | 3 |\n| 2 | 1 | 1 | NULL | 2 | 3 | 4 |\n| 3 | 2 | 2 | 1 | 3 | 4 | 5 |\n| 4 | 3 | 3 | 2 | 4 | 5 | 6 |\n| 5 | 4 | 4 | 3 | 5 | 6 | 7 |\n| 6 | 5 | 5 | 4 | 6 | 7 | 8 |\n| 7 | 6 | 6 | 5 | 7 | 8 | 9 |\n| 8 | 7 | 7 | 6 | 8 | 9 | 10 |\n| 9 | 8 | 8 | 7 | 9 | 10 | 11 |\n| 10 | 9 | 9 | 8 | 10 | 11 | NULL |\n| 11 | 10 | 10 | 9 | 11 | NULL | NULL |\n+----+------+------+------+------+------+------+\n \n\n\nURL: https://mariadb.com/kb/en/lag/','','https://mariadb.com/kb/en/lag/'),(717,'MEDIAN',42,'The MEDIAN() window function was first introduced with in\nMariaDB 10.3.3.\n \nSyntax\n------ \nMEDIAN(median expression) OVER (\n [ PARTITION BY partition_expression ] \n)\n \nDescription\n----------- \nMEDIAN() is a window function that returns the median value\nof a range of values.\n \nIt is a specific case of PERCENTILE_CONT, with an argument\nof 0.5 and the ORDER BY column the one in MEDIAN\'s\nargument. \n \nMEDIAN() OVER ( [ PARTITION BY partition_expression] )\n \nIs equivalent to:\n \nPERCENTILE_CONT(0.5) WITHIN \n GROUP (ORDER BY ) OVER ( [ PARTITION BY\npartition_expression ])\n \nExamples\n-------- \nCREATE TABLE book_rating (name CHAR(30), star_rating\nTINYINT);\n \nINSERT INTO book_rating VALUES (\'Lord of the Ladybirds\',\n5);\nINSERT INTO book_rating VALUES (\'Lord of the Ladybirds\',\n3);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 1);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 2);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 5);\n \nSELECT name, median(star_rating) OVER (PARTITION BY name)\nFROM book_rating;\n \n+-----------------------+----------------------------------------------+\n| name | median(star_rating) OVER (PARTITION BY name) |\n+-----------------------+----------------------------------------------+\n| Lord of the Ladybirds | 4.0000000000 |\n| Lord of the Ladybirds | 4.0000000000 |\n| Lady of the Flies | 2.0000000000 |\n| Lady of the Flies | 2.0000000000 |\n| Lady of the Flies | 2.0000000000 |\n+-----------------------+----------------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/median/','','https://mariadb.com/kb/en/median/'),(719,'NTILE',42,'The NTILE() function was first introduced with window\nfunctions in MariaDB 10.2.0.\n \nSyntax\n------ \nNTILE (expr) OVER ( \n [ PARTITION BY partition_expression ] \n [ ORDER BY order_list ]\n)\n \nDescription\n----------- \nNTILE() is a window function that returns an integer\nindicating which group a given row falls into. The number of\ngroups is specified in the argument (expr), starting at one.\nOrdered rows in the partition are divided into the specified\nnumber of groups with as equal a size as possible. \n \nExamples\n-------- \ncreate table t1 (\n pk int primary key,\n a int,\n b int\n );\n \ninsert into t1 values\n (11 , 0, 10),\n (12 , 0, 10),\n (13 , 1, 10),\n (14 , 1, 10),\n (18 , 2, 10),\n (15 , 2, 20),\n (16 , 2, 20),\n (17 , 2, 20),\n (19 , 4, 20),\n (20 , 4, 20);\n \nselect pk, a, b,\n ntile(1) over (order by pk)\n from t1;\n \n+----+------+------+-----------------------------+\n| pk | a | b | ntile(1) over (order by pk) |\n+----+------+------+-----------------------------+\n| 11 | 0 | 10 | 1 |\n| 12 | 0 | 10 | 1 |\n| 13 | 1 | 10 | 1 |\n| 14 | 1 | 10 | 1 |\n| 15 | 2 | 20 | 1 |\n| 16 | 2 | 20 | 1 |\n| 17 | 2 | 20 | 1 |\n| 18 | 2 | 10 | 1 |\n| 19 | 4 | 20 | 1 |\n| 20 | 4 | 20 | 1 |\n+----+------+------+-----------------------------+\n \nselect pk, a, b,\n ntile(4) over (order by pk)\n from t1;\n \n+----+------+------+-----------------------------+\n| pk | a | b | ntile(4) over (order by pk) |\n+----+------+------+-----------------------------+\n| 11 | 0 | 10 | 1 |\n| 12 | 0 | 10 | 1 |\n| 13 | 1 | 10 | 1 |\n| 14 | 1 | 10 | 2 |\n| 15 | 2 | 20 | 2 |\n| 16 | 2 | 20 | 2 |\n| 17 | 2 | 20 | 3 |\n| 18 | 2 | 10 | 3 |\n| 19 | 4 | 20 | 4 |\n| 20 | 4 | 20 | 4 |\n+----+------+------+-----------------------------+\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/ntile/','','https://mariadb.com/kb/en/ntile/'),(720,'PERCENT_RANK',42,'The PERCENT_RANK() function was first introduced with window\nfunctions in MariaDB 10.2.0.\n \nSyntax\n------ \nPERCENT_RANK() OVER (\n [ PARTITION BY partition_expression ] \n [ ORDER BY order_list ]\n)\n \nDescription\n----------- \nPERCENT_RANK() is a window function that returns the\nrelative percent rank of a given row. The following formula\nis used to calculate the percent rank:\n \n(rank - 1) / (number of rows in the window or partition - 1)\n \nExamples\n-------- \ncreate table t1 (\n pk int primary key,\n a int,\n b int\n);\n \ninsert into t1 values\n( 1 , 0, 10),\n( 2 , 0, 10),\n( 3 , 1, 10),\n( 4 , 1, 10),\n( 8 , 2, 10),\n( 5 , 2, 20),\n( 6 , 2, 20),\n( 7 , 2, 20),\n( 9 , 4, 20),\n(10 , 4, 20);\n \nselect pk, a, b,\n rank() over (order by a) as rank,\n percent_rank() over (order by a) as pct_rank,\n cume_dist() over (order by a) as cume_dist\nfrom t1;\n \n+----+------+------+------+--------------+--------------+\n| pk | a | b | rank | pct_rank | cume_dist |\n+----+------+------+------+--------------+--------------+\n| 1 | 0 | 10 | 1 | 0.0000000000 | 0.2000000000 |\n| 2 | 0 | 10 | 1 | 0.0000000000 | 0.2000000000 |\n| 3 | 1 | 10 | 3 | 0.2222222222 | 0.4000000000 |\n| 4 | 1 | 10 | 3 | 0.2222222222 | 0.4000000000 |\n| 5 | 2 | 20 | 5 | 0.4444444444 | 0.8000000000 |\n| 6 | 2 | 20 | 5 | 0.4444444444 | 0.8000000000 |\n| 7 | 2 | 20 | 5 | 0.4444444444 | 0.8000000000 |\n| 8 | 2 | 10 | 5 | 0.4444444444 | 0.8000000000 |\n| 9 | 4 | 20 | 9 | 0.8888888889 | 1.0000000000 |\n| 10 | 4 | 20 | 9 | 0.8888888889 | 1.0000000000 |\n+----+------+------+------+--------------+--------------+\n \nselect pk, a, b,\n percent_rank() over (order by pk) as pct_rank,\n cume_dist() over (order by pk) as cume_dist\nfrom t1 order by pk;\n \n+----+------+------+--------------+--------------+\n| pk | a | b | pct_rank | cume_dist |\n+----+------+------+--------------+--------------+\n| 1 | 0 | 10 | 0.0000000000 | 0.1000000000 |\n| 2 | 0 | 10 | 0.1111111111 | 0.2000000000 |\n| 3 | 1 | 10 | 0.2222222222 | 0.3000000000 |\n| 4 | 1 | 10 | 0.3333333333 | 0.4000000000 |\n| 5 | 2 | 20 | 0.4444444444 | 0.5000000000 |\n| 6 | 2 | 20 | 0.5555555556 | 0.6000000000 |\n| 7 | 2 | 20 | 0.6666666667 | 0.7000000000 |\n| 8 | 2 | 10 | 0.7777777778 | 0.8000000000 |\n| 9 | 4 | 20 | 0.8888888889 | 0.9000000000 |\n| 10 | 4 | 20 | 1.0000000000 | 1.0000000000 |\n+----+------+------+--------------+--------------+\n \nselect pk, a, b,\n percent_rank() over (partition by a order by a) as\npct_rank,\n cume_dist() over (partition by a order by a) as cume_dist\nfrom t1;\n \n+----+------+------+--------------+--------------+\n| pk | a | b | pct_rank | cume_dist |\n+----+------+------+--------------+--------------+\n| 1 | 0 | 10 | 0.0000000000 | 1.0000000000 |\n| 2 | 0 | 10 | 0.0000000000 | 1.0000000000 |\n| 3 | 1 | 10 | 0.0000000000 | 1.0000000000 |\n| 4 | 1 | 10 | 0.0000000000 | 1.0000000000 |\n| 5 | 2 | 20 | 0.0000000000 | 1.0000000000 |\n| 6 | 2 | 20 | 0.0000000000 | 1.0000000000 |\n| 7 | 2 | 20 | 0.0000000000 | 1.0000000000 |\n| 8 | 2 | 10 | 0.0000000000 | 1.0000000000 |\n| 9 | 4 | 20 | 0.0000000000 | 1.0000000000 |\n| 10 | 4 | 20 | 0.0000000000 | 1.0000000000 |\n+----+------+------+--------------+--------------+\n \n\n\nURL: https://mariadb.com/kb/en/percent_rank/','','https://mariadb.com/kb/en/percent_rank/'),(722,'PERCENTILE_DISC',42,'The PERCENTILE_DISC() window function was first introduced\nwith in MariaDB 10.3.3.\n \nSyntax\n------ \n\nDescription\n----------- \nPERCENTILE_DISC() (standing for discrete percentile) is a\nwindow function which returns the first value in the set\nwhose ordered position is the same or more than the\nspecified fraction.\n \nEssentially, the following process is followed to find the\nvalue to return:\nGet the number of rows in the partition.\nWalk through the partition, in order, until finding the the\nfirst row with CUME_DIST() > function_argument.\n \nExamples\n-------- \nCREATE TABLE book_rating (name CHAR(30), star_rating\nTINYINT);\n \nINSERT INTO book_rating VALUES (\'Lord of the Ladybirds\',\n5);\nINSERT INTO book_rating VALUES (\'Lord of the Ladybirds\',\n3);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 1);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 2);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 5);\n \nSELECT name, PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY\nstar_rating)\n OVER (PARTITION BY name) AS pc FROM book_rating;\n \n+-----------------------+------+\n| name | pc |\n+-----------------------+------+\n| Lord of the Ladybirds | 3 |\n| Lord of the Ladybirds | 3 |\n| Lady of the Flies | 2 |\n| Lady of the Flies | 2 |\n| Lady of the Flies | 2 |\n+-----------------------+------+\n5 rows in set (0.000 sec)\n \nSELECT name, PERCENTILE_DISC(0) WITHIN GROUP (ORDER BY\nstar_rating) \n OVER (PARTITION BY name) AS pc FROM book_rating;\n \n+-----------------------+------+\n| name | pc |\n+-----------------------+------+\n| Lord of the Ladybirds | 3 |\n| Lord of the Ladybirds | 3 |\n| Lady of the Flies | 1 |\n| Lady of the Flies | 1 |\n| Lady of the Flies | 1 |\n+-----------------------+------+\n5 rows in set (0.000 sec)\n \nSELECT name, PERCENTILE_DISC(1) WITHIN GROUP (ORDER BY\nstar_rating) \n OVER (PARTITION BY name) AS pc FROM book_rating;\n \n+-----------------------+------+\n| name | pc |\n+-----------------------+------+\n| Lord of the Ladybirds | 5 |\n| Lord of the Ladybirds | 5 |\n| Lady of the Flies | 5 |\n| Lady of the Flies | 5 |\n| Lady of the Flies | 5 |\n+-----------------------+------+\n5 rows in set (0.000 sec)\n \nSELECT name, PERCENTILE_DISC(0.6) WITHIN GROUP (ORDER BY\nstar_rating) \n OVER (PARTITION BY name) AS pc FROM book_rating;\n \n+-----------------------+------+\n| name | pc |\n+-----------------------+------+\n| Lord of the Ladybirds | 5 |\n| Lord of the Ladybirds | 5 |\n| Lady of the Flies | 2 |\n| Lady of the Flies | 2 |\n| Lady of the Flies | 2 |\n+-----------------------+------\n \n\n\nURL: https://mariadb.com/kb/en/percentile_disc/','','https://mariadb.com/kb/en/percentile_disc/'),(721,'PERCENTILE_CONT',42,'The PERCENTILE_CONT() window function was first introduced\nwith in MariaDB 10.3.3.\n \nSyntax\n------ \nDescription\n----------- \nPERCENTILE_CONT() (standing for continuous percentile) is a\nwindow function which returns a value which corresponds to\nthe given fraction in the sort order. If required, it will\ninterpolate between adjacent input items.\n \nEssentially, the following process is followed to find the\nvalue to return:\nGet the number of rows in the partition, denoted by N\nRN = p*(N-1), where p denotes the argument to the\nPERCENTILE_CONT function\ncalculate the FRN(floor row number) and CRN(column row\nnumber for the group( FRN= floor(RN) and CRN = ceil(RN))\nlook up rows FRN and CRN\nIf (CRN = FRN = RN) then the result is (value of expression\nfrom row at RN)\nOtherwise the result is\n(CRN - RN) * (value of expression for row at FRN) +\n(RN - FRN) * (value of expression for row at CRN)\n \nThe MEDIAN function is a specific case of PERCENTILE_CONT,\nequivalent to PERCENTILE_CONT(0.5).\n \nExamples\n-------- \nCREATE TABLE book_rating (name CHAR(30), star_rating\nTINYINT);\n \nINSERT INTO book_rating VALUES (\'Lord of the Ladybirds\',\n5);\nINSERT INTO book_rating VALUES (\'Lord of the Ladybirds\',\n3);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 1);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 2);\nINSERT INTO book_rating VALUES (\'Lady of the Flies\', 5);\n \nSELECT name, PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY\nstar_rating) \n OVER (PARTITION BY name) AS pc \n FROM book_rating;\n \n+-----------------------+--------------+\n| name | pc |\n+-----------------------+--------------+\n| Lord of the Ladybirds | 4.0000000000 |\n| Lord of the Ladybirds | 4.0000000000 |\n| Lady of the Flies | 2.0000000000 |\n| Lady of the Flies | 2.0000000000 |\n| Lady of the Flies | 2.0000000000 |\n+-----------------------+--------------+\n \nSELECT name, PERCENTILE_CONT(1) WITHIN GROUP (ORDER BY\nstar_rating) \n OVER (PARTITION BY name) AS pc \n FROM book_rating;\n \n+-----------------------+--------------+\n| name | pc |\n+-----------------------+--------------+\n| Lord of the Ladybirds | 5.0000000000 |\n| Lord of the Ladybirds | 5.0000000000 |\n| Lady of the Flies | 5.0000000000 |\n| Lady of the Flies | 5.0000000000 |\n| Lady of the Flies | 5.0000000000 |\n+-----------------------+--------------+\n \nSELECT name, PERCENTILE_CONT(0) WITHIN GROUP (ORDER BY\nstar_rating) \n OVER (PARTITION BY name) AS pc \n FROM book_rating;\n \n+-----------------------+--------------+\n| name | pc |\n+-----------------------+--------------+\n| Lord of the Ladybirds | 3.0000000000 |\n| Lord of the Ladybirds | 3.0000000000 |\n| Lady of the Flies | 1.0000000000 |\n| Lady of the Flies | 1.0000000000 |\n| Lady of the Flies | 1.0000000000 |\n+-----------------------+--------------+\n \nSELECT name, PERCENTILE_CONT(0.6) WITHIN GROUP (ORDER BY\nstar_rating) \n OVER (PARTITION BY name) AS pc \n FROM book_rating;\n \n+-----------------------+--------------+\n| name | pc |\n+-----------------------+--------------+\n| Lord of the Ladybirds | 4.2000000000 |\n| Lord of the Ladybirds | 4.2000000000 |\n| Lady of the Flies | 2.6000000000 |\n| Lady of the Flies | 2.6000000000 |\n| Lady of the Flies | 2.6000000000 |\n+-----------------------+--------------+\n \n\n\nURL: https://mariadb.com/kb/en/percentile_cont/','','https://mariadb.com/kb/en/percentile_cont/'),(723,'RANK',42,'The RANK() function was first introduced with window\nfunctions in MariaDB 10.2.0.\n \nSyntax\n------ \nRANK() OVER (\n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n) \n \nDescription\n----------- \nRANK() is a window function that displays the number of a\ngiven row, starting at one and following the ORDER BY\nsequence of the window function, with identical values\nreceiving the same result. It is similar to the ROW_NUMBER()\nfunction except that in that function, identical values will\nreceive a different row number for each result.\n \nExamples\n-------- \nThe distinction between DENSE_RANK(), RANK() and\nROW_NUMBER():\n \nCREATE TABLE student(course VARCHAR(10), mark int, name\nvarchar(10));\n \nINSERT INTO student VALUES \n (\'Maths\', 60, \'Thulile\'),\n (\'Maths\', 60, \'Pritha\'),\n (\'Maths\', 70, \'Voitto\'),\n (\'Maths\', 55, \'Chun\'),\n (\'Biology\', 60, \'Bilal\'),\n (\'Biology\', 70, \'Roger\');\n \nSELECT \n RANK() OVER (PARTITION BY course ORDER BY mark DESC) AS\nrank, \n DENSE_RANK() OVER (PARTITION BY course ORDER BY mark DESC)\nAS dense_rank, \n ROW_NUMBER() OVER (PARTITION BY course ORDER BY mark DESC)\nAS row_num, \n course, mark, name \nFROM student ORDER BY course, mark DESC;\n \n+------+------------+---------+---------+------+---------+\n| rank | dense_rank | row_num | course | mark | name |\n+------+------------+---------+---------+------+---------+\n| 1 | 1 | 1 | Biology | 70 | Roger |\n| 2 | 2 | 2 | Biology | 60 | Bilal |\n| 1 | 1 | 1 | Maths | 70 | Voitto |\n| 2 | 2 | 2 | Maths | 60 | Thulile |\n| 2 | 2 | 3 | Maths | 60 | Pritha |\n| 4 | 3 | 4 | Maths | 55 | Chun |\n+------+------------+---------+---------+------+---------+\n \n\n\nURL: https://mariadb.com/kb/en/rank/','','https://mariadb.com/kb/en/rank/'),(724,'ROW_NUMBER',42,'ROW_NUMBER() was first introduced with window functions in\nMariaDB 10.2.0.\n \nSyntax\n------ \nROW_NUMBER() OVER (\n [ PARTITION BY partition_expression ]\n [ ORDER BY order_list ]\n) \n \nDescription\n----------- \nROW_NUMBER() is a window function that displays the number\nof a given row, starting at one and following the ORDER BY\nsequence of the window function, with identical values\nreceiving different row numbers. It is similar to the RANK()\nand DENSE_RANK() functions except that in that function,\nidentical values will receive the same rank for each result.\n \nExamples\n-------- \nThe distinction between DENSE_RANK(), RANK() and\nROW_NUMBER():\n \nCREATE TABLE student(course VARCHAR(10), mark int, name\nvarchar(10));\n \nINSERT INTO student VALUES \n (\'Maths\', 60, \'Thulile\'),\n (\'Maths\', 60, \'Pritha\'),\n (\'Maths\', 70, \'Voitto\'),\n (\'Maths\', 55, \'Chun\'),\n (\'Biology\', 60, \'Bilal\'),\n (\'Biology\', 70, \'Roger\');\n \nSELECT \n RANK() OVER (PARTITION BY course ORDER BY mark DESC) AS\nrank, \n DENSE_RANK() OVER (PARTITION BY course ORDER BY mark DESC)\nAS dense_rank, \n ROW_NUMBER() OVER (PARTITION BY course ORDER BY mark DESC)\nAS row_num, \n course, mark, name \nFROM student ORDER BY course, mark DESC;\n \n+------+------------+---------+---------+------+---------+\n| rank | dense_rank | row_num | course | mark | name |\n+------+------------+---------+---------+------+---------+\n| 1 | 1 | 1 | Biology | 70 | Roger |\n| 2 | 2 | 2 | Biology | 60 | Bilal |\n| 1 | 1 | 1 | Maths | 70 | Voitto |\n| 2 | 2 | 2 | Maths | 60 | Thulile |\n| 2 | 2 | 3 | Maths | 60 | Pritha |\n| 4 | 3 | 4 | Maths | 55 | Chun |\n+------+------------+---------+---------+------+---------+\n \n\n\nURL: https://mariadb.com/kb/en/row_number/','','https://mariadb.com/kb/en/row_number/'),(725,'SPIDER_BG_DIRECT_SQL',43,'Syntax\n------ \nSPIDER_BG_DIRECT_SQL(\'sql\', \'tmp_table_list\',\n\'parameters\')\n \nDescription\n----------- \nExecutes the given SQL statement in the background on the\nremote server, as defined in the parameters listing. If the\nquery returns a result-set, it sttores the results in the\ngiven temporary table. When the given SQL statement executes\nsuccessfully, this function returns the number of called\nUDF\'s. It returns 0 when the given SQL statement fails.\n \nThis function is a UDF installed with the Spider storage\nengine.\n \nExamples\n-------- \nSELECT SPIDER_BG_DIRECT_SQL(\'SELECT * FROM example_table\',\n\'\', \n \'srv \"node1\", port \"8607\"\') AS \"Direct Query\";\n+--------------+\n| Direct Query | \n+--------------+\n| 1 |\n+--------------+\n \nParameters\n \nerror_rw_mode\n \nDescription: Returns empty results on network error.\n0 : Return error on getting network error.\n1: Return 0 records on getting network error.\n \nDefault Table Value: 0\nDSN Parameter Name: erwm\n \n\n\nURL: https://mariadb.com/kb/en/spider_bg_direct_sql/','','https://mariadb.com/kb/en/spider_bg_direct_sql/'),(726,'SPIDER_COPY_TABLES',43,'Syntax\n------ \nSPIDER_COPY_TABLES(spider_table_name, \n source_link_id, destination_link_id_list [,parameters])\n \nDescription\n----------- \nA UDF installed with the Spider Storage Engine, this\nfunction copies table data from source_link_id to\ndestination_link_id_list. The service does not need to be\nstopped in order to copy.\n \nIf the Spider table is partitioned, the name must be of the\nformat table_name#P#partition_name. The partition name can\nbe viewed in the mysql.spider_tables table, for example:\n \nSELECT table_name FROM mysql.spider_tables;\n+-------------+\n| table_name |\n+-------------+\n| spt_a#P#pt1 |\n| spt_a#P#pt2 |\n| spt_a#P#pt3 |\n+-------------+\n \nReturns 1 if the data was copied successfully, or 0 if\ncopying the data failed.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/spider_copy_tables/','','https://mariadb.com/kb/en/spider_copy_tables/'),(727,'SPIDER_DIRECT_SQL',43,'Syntax\n------ \nSPIDER_DIRECT_SQL(\'sql\', \'tmp_table_list\',\n\'parameters\')\n \nDescription\n----------- \nA UDF installed with the Spider Storage Engine, this\nfunction is used to execute the SQL string sql on the remote\nserver, as defined in parameters. If any resultsets are\nreturned, they are stored in the tmp_table_list.\n \nThe function returns 1 if the SQL executes successfully, or\n0 if it fails.\n \nExamples\n-------- \nSELECT SPIDER_DIRECT_SQL(\'SELECT * FROM s\', \'\', \'srv\n\"node1\", port \"8607\"\');\n+----------------------------------------------------------------------+\n| SPIDER_DIRECT_SQL(\'SELECT * FROM s\', \'\', \'srv\n\"node1\", port \"8607\"\') |\n+----------------------------------------------------------------------+\n| 1 |\n+----------------------------------------------------------------------+\n \n\n\nURL: https://mariadb.com/kb/en/spider_direct_sql/','','https://mariadb.com/kb/en/spider_direct_sql/'),(729,'COLUMN_ADD',44,'The Dynamic columns feature was introduced in MariaDB 5.3.\n \nSyntax\n------ \nCOLUMN_ADD(dyncol_blob, column_nr, value [as type],\n[column_nr, value [as type]]...);\nCOLUMN_ADD(dyncol_blob, column_name, value [as type],\n[column_name, value [as type]]...);\n \nDescription\n----------- \nAdds or updates dynamic columns.\ndyncol_blob must be either a valid dynamic columns blob (for\nexample, COLUMN_CREATE returns such blob), or an empty\nstring.\ncolumn_name specifies the name of the column to be added. If\ndyncol_blob already has a column with this name, it will be\noverwritten.\nvalue specifies the new value for the column. Passing a NULL\nvalue will cause the column to be deleted.\nas type is optional. See #datatypes section for a discussion\nabout types.\n \nThe return value is a dynamic column blob after the\nmodifications.\n \nExamples\n-------- \n-- MariaDB 5.3+:\nUPDATE tbl SET dyncol_blob=COLUMN_ADD(dyncol_blob, 1\n/*column id*/, \"value\") WHERE id=1;\n \n-- MariaDB 10.0.1+:\nUPDATE t1 SET dyncol_blob=COLUMN_ADD(dyncol_blob,\n\"column_name\", \"value\") WHERE id=1;\n \nNote: COLUMN_ADD() is a regular function (just like\nCONCAT()), hence, in order to update the value in the table\nyou have to use the UPDATE ... SET\ndynamic_col=COLUMN_ADD(dynamic_col,\n....) pattern.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/column_add/','','https://mariadb.com/kb/en/column_add/'),(731,'COLUMN_CREATE',44,'The Dynamic columns feature was introduced in MariaDB 5.3.\n \nSyntax\n------ \nCOLUMN_CREATE(column_nr, value [as type], [column_nr, value\n[as type]]...);\nCOLUMN_CREATE(column_name, value [as type], [column_name,\nvalue [as type]]...);\n \nDescription\n----------- \nReturns a dynamic columns blob that stores the specified\ncolumns with values.\n \nThe return value is suitable for \nstoring in a table\nfurther modification with other dynamic columns functions\n \nThe as type part allows one to specify the value type. In\nmost cases,\nthis is redundant because MariaDB will be able to deduce the\ntype of the\nvalue. Explicit type specification may be needed when the\ntype of the value is\nnot apparent. For example, a literal \'2012-12-01\' has a\nCHAR type by\ndefault, one will need to specify \'2012-12-01\' AS DATE to\nhave it stored as\na date. See Dynamic Columns:Datatypes for further details.\n \nExamples\n-------- \n-- MariaDB 5.3+:\nINSERT INTO tbl SET dyncol_blob=COLUMN_CREATE(1 /*column\nid*/, \"value\");\n-- MariaDB 10.0.1+:\nINSERT INTO tbl SET\ndyncol_blob=COLUMN_CREATE(\"column_name\", \"value\");\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/column_create/','','https://mariadb.com/kb/en/column_create/'),(734,'COLUMN_GET',44,'The Dynamic columns feature was introduced in MariaDB 5.3.\n \nSyntax\n------ \nCOLUMN_GET(dyncol_blob, column_nr as type);\nCOLUMN_GET(dyncol_blob, column_name as type);\n \nDescription\n----------- \nGets the value of a dynamic column by its name. If no column\nwith the given name exists, NULL will be returned.\n \ncolumn_name as type requires that one specify the datatype\nof the dynamic column they are reading. \n \nThis may seem counter-intuitive: why would one need to\nspecify which datatype they\'re retrieving? Can\'t the\ndynamic columns system figure the datatype from the data\nbeing stored?\n \nThe answer is: SQL is a statically-typed language. The SQL\ninterpreter needs to know the datatypes of all expressions\nbefore the query is run (for example, when one is using\nprepared statements and runs \"select COLUMN_GET(...)\", the\nprepared statement API requires the server to inform the\nclient about the datatype of the column being read before\nthe query is executed and the server can see what datatype\nthe column actually has).\n \nA note about lengths\n \nIf you\'re running queries like:\n \nSELECT COLUMN_GET(blob, \'colname\' as CHAR) ...\n \nwithout specifying a maximum length (i.e. using #as CHAR#,\nnot as CHAR(n)), MariaDB will report the maximum length of\nthe resultset column to be 53,6870,911 for MariaDB\n5.3-10.0.0 and 16,777,216 for MariaDB 10.0.1+. This may\ncause excessive memory usage in some client libraries,\nbecause they try to pre-allocate a buffer of maximum\nresultset width. To avoid this problem, use CHAR(n) whenever\nyou\'re using COLUMN_GET in the select list.\n \nSee Dynamic Columns:Datatypes for more information about\ndatatypes.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/column_get/','','https://mariadb.com/kb/en/column_get/'),(735,'COLUMN_JSON',44,'COLUMN_JSON was introduced in MariaDB 10.0.1\n \nSyntax\n------ \nCOLUMN_JSON(dyncol_blob)\n \nDescription\n----------- \nReturns a JSON representation of data in dyncol_blob. Can\nalso be used to display nested columns. See dynamic columns\nfor more information.\n \nExample\n \nselect item_name, COLUMN_JSON(dynamic_cols) from assets;\n+-----------------+----------------------------------------+\n| item_name | COLUMN_JSON(dynamic_cols) |\n+-----------------+----------------------------------------+\n| MariaDB T-shirt | {\"size\":\"XL\",\"color\":\"blue\"} |\n| Thinkpad Laptop | {\"color\":\"black\",\"warranty\":\"3\nyears\"} |\n+-----------------+----------------------------------------+\n \nLimitation: COLUMN_JSON will decode nested dynamic columns\nat a nesting level of not more than 10 levels deep. Dynamic\ncolumns that are nested deeper than 10 levels will be shown\nas BINARY string, without encoding.\n \n\n \n \n \n \n \n \n \n\nURL: https://mariadb.com/kb/en/column_json/','','https://mariadb.com/kb/en/column_json/'); -/*!40000 ALTER TABLE `help_topic` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `index_stats` --- - -DROP TABLE IF EXISTS `index_stats`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `index_stats` ( - `db_name` varchar(64) COLLATE utf8_bin NOT NULL, - `table_name` varchar(64) COLLATE utf8_bin NOT NULL, - `index_name` varchar(64) COLLATE utf8_bin NOT NULL, - `prefix_arity` int(11) unsigned NOT NULL, - `avg_frequency` decimal(12,4) DEFAULT NULL, - PRIMARY KEY (`db_name`,`table_name`,`index_name`,`prefix_arity`) -) ENGINE=Aria DEFAULT CHARSET=utf8 COLLATE=utf8_bin PAGE_CHECKSUM=1 TRANSACTIONAL=0 COMMENT='Statistics on Indexes'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `index_stats` --- - -LOCK TABLES `index_stats` WRITE; -/*!40000 ALTER TABLE `index_stats` DISABLE KEYS */; -/*!40000 ALTER TABLE `index_stats` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `innodb_index_stats` --- - -DROP TABLE IF EXISTS `innodb_index_stats`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `innodb_index_stats` ( - `database_name` varchar(64) COLLATE utf8_bin NOT NULL, - `table_name` varchar(199) COLLATE utf8_bin NOT NULL, - `index_name` varchar(64) COLLATE utf8_bin NOT NULL, - `last_update` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), - `stat_name` varchar(64) COLLATE utf8_bin NOT NULL, - `stat_value` bigint(20) unsigned NOT NULL, - `sample_size` bigint(20) unsigned DEFAULT NULL, - `stat_description` varchar(1024) COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`database_name`,`table_name`,`index_name`,`stat_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `innodb_table_stats` --- - -DROP TABLE IF EXISTS `innodb_table_stats`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `innodb_table_stats` ( - `database_name` varchar(64) COLLATE utf8_bin NOT NULL, - `table_name` varchar(199) COLLATE utf8_bin NOT NULL, - `last_update` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), - `n_rows` bigint(20) unsigned NOT NULL, - `clustered_index_size` bigint(20) unsigned NOT NULL, - `sum_of_other_index_sizes` bigint(20) unsigned NOT NULL, - PRIMARY KEY (`database_name`,`table_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `plugin` --- - -DROP TABLE IF EXISTS `plugin`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `plugin` ( - `name` varchar(64) NOT NULL DEFAULT '', - `dl` varchar(128) NOT NULL DEFAULT '', - PRIMARY KEY (`name`) -) ENGINE=Aria DEFAULT CHARSET=utf8 PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='MySQL plugins'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `plugin` --- - -LOCK TABLES `plugin` WRITE; -/*!40000 ALTER TABLE `plugin` DISABLE KEYS */; -/*!40000 ALTER TABLE `plugin` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `proc` --- - -DROP TABLE IF EXISTS `proc`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `proc` ( - `db` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', - `name` char(64) NOT NULL DEFAULT '', - `type` enum('FUNCTION','PROCEDURE','PACKAGE','PACKAGE BODY') NOT NULL, - `specific_name` char(64) NOT NULL DEFAULT '', - `language` enum('SQL') NOT NULL DEFAULT 'SQL', - `sql_data_access` enum('CONTAINS_SQL','NO_SQL','READS_SQL_DATA','MODIFIES_SQL_DATA') NOT NULL DEFAULT 'CONTAINS_SQL', - `is_deterministic` enum('YES','NO') NOT NULL DEFAULT 'NO', - `security_type` enum('INVOKER','DEFINER') NOT NULL DEFAULT 'DEFINER', - `param_list` blob NOT NULL, - `returns` longblob NOT NULL, - `body` longblob NOT NULL, - `definer` char(141) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', - `created` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), - `modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', - `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH','EMPTY_STRING_IS_NULL','SIMULTANEOUS_ASSIGNMENT','TIME_ROUND_FRACTIONAL') NOT NULL DEFAULT '', - `comment` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `character_set_client` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `collation_connection` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `db_collation` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, - `body_utf8` longblob DEFAULT NULL, - `aggregate` enum('NONE','GROUP') NOT NULL DEFAULT 'NONE', - PRIMARY KEY (`db`,`name`,`type`) -) ENGINE=Aria DEFAULT CHARSET=utf8 PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='Stored Procedures'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `proc` --- - -LOCK TABLES `proc` WRITE; -/*!40000 ALTER TABLE `proc` DISABLE KEYS */; -INSERT INTO `proc` VALUES ('mysql','AddGeometryColumn','PROCEDURE','AddGeometryColumn','SQL','CONTAINS_SQL','NO','INVOKER','catalog varchar(64), t_schema varchar(64),\n t_name varchar(64), geometry_column varchar(64), t_srid int','','begin\n set @qwe= concat(\'ALTER TABLE \', t_schema, \'.\', t_name, \' ADD \', geometry_column,\' GEOMETRY REF_SYSTEM_ID=\', t_srid); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end','mariadb.sys@localhost','2021-08-08 06:43:52','2021-08-08 06:43:52','','','utf8','utf8_general_ci','utf8mb4_general_ci','begin\n set @qwe= concat(\'ALTER TABLE \', t_schema, \'.\', t_name, \' ADD \', geometry_column,\' GEOMETRY REF_SYSTEM_ID=\', t_srid); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end','NONE'),('mysql','DropGeometryColumn','PROCEDURE','DropGeometryColumn','SQL','CONTAINS_SQL','NO','INVOKER','catalog varchar(64), t_schema varchar(64),\n t_name varchar(64), geometry_column varchar(64)','','begin\n set @qwe= concat(\'ALTER TABLE \', t_schema, \'.\', t_name, \' DROP \', geometry_column); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end','mariadb.sys@localhost','2021-08-08 06:43:52','2021-08-08 06:43:52','','','utf8','utf8_general_ci','utf8mb4_general_ci','begin\n set @qwe= concat(\'ALTER TABLE \', t_schema, \'.\', t_name, \' DROP \', geometry_column); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end','NONE'); -/*!40000 ALTER TABLE `proc` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `procs_priv` --- - -DROP TABLE IF EXISTS `procs_priv`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `procs_priv` ( - `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '', - `Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `User` char(80) COLLATE utf8_bin NOT NULL DEFAULT '', - `Routine_name` char(64) CHARACTER SET utf8 NOT NULL DEFAULT '', - `Routine_type` enum('FUNCTION','PROCEDURE','PACKAGE','PACKAGE BODY') COLLATE utf8_bin NOT NULL, - `Grantor` char(141) COLLATE utf8_bin NOT NULL DEFAULT '', - `Proc_priv` set('Execute','Alter Routine','Grant') CHARACTER SET utf8 NOT NULL DEFAULT '', - `Timestamp` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), - PRIMARY KEY (`Host`,`Db`,`User`,`Routine_name`,`Routine_type`), - KEY `Grantor` (`Grantor`) -) ENGINE=Aria DEFAULT CHARSET=utf8 COLLATE=utf8_bin PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='Procedure privileges'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `procs_priv` --- - -LOCK TABLES `procs_priv` WRITE; -/*!40000 ALTER TABLE `procs_priv` DISABLE KEYS */; -/*!40000 ALTER TABLE `procs_priv` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `proxies_priv` --- - -DROP TABLE IF EXISTS `proxies_priv`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `proxies_priv` ( - `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '', - `User` char(80) COLLATE utf8_bin NOT NULL DEFAULT '', - `Proxied_host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '', - `Proxied_user` char(80) COLLATE utf8_bin NOT NULL DEFAULT '', - `With_grant` tinyint(1) NOT NULL DEFAULT 0, - `Grantor` char(141) COLLATE utf8_bin NOT NULL DEFAULT '', - `Timestamp` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), - PRIMARY KEY (`Host`,`User`,`Proxied_host`,`Proxied_user`), - KEY `Grantor` (`Grantor`) -) ENGINE=Aria DEFAULT CHARSET=utf8 COLLATE=utf8_bin PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='User proxy privileges'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `proxies_priv` --- - -LOCK TABLES `proxies_priv` WRITE; -/*!40000 ALTER TABLE `proxies_priv` DISABLE KEYS */; -INSERT INTO `proxies_priv` VALUES ('localhost','root','','',1,'','2021-08-08 06:43:52'),('mariadb-0','root','','',1,'','2021-08-08 06:43:52'); -/*!40000 ALTER TABLE `proxies_priv` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `roles_mapping` --- - -DROP TABLE IF EXISTS `roles_mapping`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `roles_mapping` ( - `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '', - `User` char(80) COLLATE utf8_bin NOT NULL DEFAULT '', - `Role` char(80) COLLATE utf8_bin NOT NULL DEFAULT '', - `Admin_option` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', - UNIQUE KEY `Host` (`Host`,`User`,`Role`) -) ENGINE=Aria DEFAULT CHARSET=utf8 COLLATE=utf8_bin PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='Granted roles'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `roles_mapping` --- - -LOCK TABLES `roles_mapping` WRITE; -/*!40000 ALTER TABLE `roles_mapping` DISABLE KEYS */; -/*!40000 ALTER TABLE `roles_mapping` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `servers` --- - -DROP TABLE IF EXISTS `servers`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `servers` ( - `Server_name` char(64) NOT NULL DEFAULT '', - `Host` varchar(2048) NOT NULL DEFAULT '', - `Db` char(64) NOT NULL DEFAULT '', - `Username` char(80) NOT NULL DEFAULT '', - `Password` char(64) NOT NULL DEFAULT '', - `Port` int(4) NOT NULL DEFAULT 0, - `Socket` char(64) NOT NULL DEFAULT '', - `Wrapper` char(64) NOT NULL DEFAULT '', - `Owner` varchar(512) NOT NULL DEFAULT '', - PRIMARY KEY (`Server_name`) -) ENGINE=Aria DEFAULT CHARSET=utf8 PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='MySQL Foreign Servers table'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `servers` --- - -LOCK TABLES `servers` WRITE; -/*!40000 ALTER TABLE `servers` DISABLE KEYS */; -/*!40000 ALTER TABLE `servers` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `table_stats` --- - -DROP TABLE IF EXISTS `table_stats`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `table_stats` ( - `db_name` varchar(64) COLLATE utf8_bin NOT NULL, - `table_name` varchar(64) COLLATE utf8_bin NOT NULL, - `cardinality` bigint(21) unsigned DEFAULT NULL, - PRIMARY KEY (`db_name`,`table_name`) -) ENGINE=Aria DEFAULT CHARSET=utf8 COLLATE=utf8_bin PAGE_CHECKSUM=1 TRANSACTIONAL=0 COMMENT='Statistics on Tables'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `table_stats` --- - -LOCK TABLES `table_stats` WRITE; -/*!40000 ALTER TABLE `table_stats` DISABLE KEYS */; -/*!40000 ALTER TABLE `table_stats` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `tables_priv` --- - -DROP TABLE IF EXISTS `tables_priv`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `tables_priv` ( - `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '', - `Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `User` char(80) COLLATE utf8_bin NOT NULL DEFAULT '', - `Table_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `Grantor` char(141) COLLATE utf8_bin NOT NULL DEFAULT '', - `Timestamp` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), - `Table_priv` set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger','Delete versioning rows') CHARACTER SET utf8 NOT NULL DEFAULT '', - `Column_priv` set('Select','Insert','Update','References') CHARACTER SET utf8 NOT NULL DEFAULT '', - PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`), - KEY `Grantor` (`Grantor`) -) ENGINE=Aria DEFAULT CHARSET=utf8 COLLATE=utf8_bin PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='Table privileges'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `tables_priv` --- - -LOCK TABLES `tables_priv` WRITE; -/*!40000 ALTER TABLE `tables_priv` DISABLE KEYS */; -INSERT INTO `tables_priv` VALUES ('localhost','mysql','mariadb.sys','global_priv','root@localhost','0000-00-00 00:00:00','Select,Delete',''); -/*!40000 ALTER TABLE `tables_priv` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `time_zone` --- - -DROP TABLE IF EXISTS `time_zone`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `time_zone` ( - `Time_zone_id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `Use_leap_seconds` enum('Y','N') NOT NULL DEFAULT 'N', - PRIMARY KEY (`Time_zone_id`) -) ENGINE=Aria DEFAULT CHARSET=utf8 PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='Time zones'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `time_zone` --- - -LOCK TABLES `time_zone` WRITE; -/*!40000 ALTER TABLE `time_zone` DISABLE KEYS */; -/*!40000 ALTER TABLE `time_zone` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `time_zone_leap_second` --- - -DROP TABLE IF EXISTS `time_zone_leap_second`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `time_zone_leap_second` ( - `Transition_time` bigint(20) NOT NULL, - `Correction` int(11) NOT NULL, - PRIMARY KEY (`Transition_time`) -) ENGINE=Aria DEFAULT CHARSET=utf8 PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='Leap seconds information for time zones'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `time_zone_leap_second` --- - -LOCK TABLES `time_zone_leap_second` WRITE; -/*!40000 ALTER TABLE `time_zone_leap_second` DISABLE KEYS */; -/*!40000 ALTER TABLE `time_zone_leap_second` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `time_zone_name` --- - -DROP TABLE IF EXISTS `time_zone_name`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `time_zone_name` ( - `Name` char(64) NOT NULL, - `Time_zone_id` int(10) unsigned NOT NULL, - PRIMARY KEY (`Name`) -) ENGINE=Aria DEFAULT CHARSET=utf8 PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='Time zone names'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `time_zone_name` --- - -LOCK TABLES `time_zone_name` WRITE; -/*!40000 ALTER TABLE `time_zone_name` DISABLE KEYS */; -/*!40000 ALTER TABLE `time_zone_name` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `time_zone_transition` --- - -DROP TABLE IF EXISTS `time_zone_transition`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `time_zone_transition` ( - `Time_zone_id` int(10) unsigned NOT NULL, - `Transition_time` bigint(20) NOT NULL, - `Transition_type_id` int(10) unsigned NOT NULL, - PRIMARY KEY (`Time_zone_id`,`Transition_time`) -) ENGINE=Aria DEFAULT CHARSET=utf8 PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='Time zone transitions'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `time_zone_transition` --- - -LOCK TABLES `time_zone_transition` WRITE; -/*!40000 ALTER TABLE `time_zone_transition` DISABLE KEYS */; -/*!40000 ALTER TABLE `time_zone_transition` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `time_zone_transition_type` --- - -DROP TABLE IF EXISTS `time_zone_transition_type`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `time_zone_transition_type` ( - `Time_zone_id` int(10) unsigned NOT NULL, - `Transition_type_id` int(10) unsigned NOT NULL, - `Offset` int(11) NOT NULL DEFAULT 0, - `Is_DST` tinyint(3) unsigned NOT NULL DEFAULT 0, - `Abbreviation` char(8) NOT NULL DEFAULT '', - PRIMARY KEY (`Time_zone_id`,`Transition_type_id`) -) ENGINE=Aria DEFAULT CHARSET=utf8 PAGE_CHECKSUM=1 TRANSACTIONAL=1 COMMENT='Time zone transition types'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `time_zone_transition_type` --- - -LOCK TABLES `time_zone_transition_type` WRITE; -/*!40000 ALTER TABLE `time_zone_transition_type` DISABLE KEYS */; -/*!40000 ALTER TABLE `time_zone_transition_type` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Temporary table structure for view `user` --- - -DROP TABLE IF EXISTS `user`; -/*!50001 DROP VIEW IF EXISTS `user`*/; -SET @saved_cs_client = @@character_set_client; -SET character_set_client = utf8; -/*!50001 CREATE TABLE `user` ( - `Host` tinyint NOT NULL, - `User` tinyint NOT NULL, - `Password` tinyint NOT NULL, - `Select_priv` tinyint NOT NULL, - `Insert_priv` tinyint NOT NULL, - `Update_priv` tinyint NOT NULL, - `Delete_priv` tinyint NOT NULL, - `Create_priv` tinyint NOT NULL, - `Drop_priv` tinyint NOT NULL, - `Reload_priv` tinyint NOT NULL, - `Shutdown_priv` tinyint NOT NULL, - `Process_priv` tinyint NOT NULL, - `File_priv` tinyint NOT NULL, - `Grant_priv` tinyint NOT NULL, - `References_priv` tinyint NOT NULL, - `Index_priv` tinyint NOT NULL, - `Alter_priv` tinyint NOT NULL, - `Show_db_priv` tinyint NOT NULL, - `Super_priv` tinyint NOT NULL, - `Create_tmp_table_priv` tinyint NOT NULL, - `Lock_tables_priv` tinyint NOT NULL, - `Execute_priv` tinyint NOT NULL, - `Repl_slave_priv` tinyint NOT NULL, - `Repl_client_priv` tinyint NOT NULL, - `Create_view_priv` tinyint NOT NULL, - `Show_view_priv` tinyint NOT NULL, - `Create_routine_priv` tinyint NOT NULL, - `Alter_routine_priv` tinyint NOT NULL, - `Create_user_priv` tinyint NOT NULL, - `Event_priv` tinyint NOT NULL, - `Trigger_priv` tinyint NOT NULL, - `Create_tablespace_priv` tinyint NOT NULL, - `Delete_history_priv` tinyint NOT NULL, - `ssl_type` tinyint NOT NULL, - `ssl_cipher` tinyint NOT NULL, - `x509_issuer` tinyint NOT NULL, - `x509_subject` tinyint NOT NULL, - `max_questions` tinyint NOT NULL, - `max_updates` tinyint NOT NULL, - `max_connections` tinyint NOT NULL, - `max_user_connections` tinyint NOT NULL, - `plugin` tinyint NOT NULL, - `authentication_string` tinyint NOT NULL, - `password_expired` tinyint NOT NULL, - `is_role` tinyint NOT NULL, - `default_role` tinyint NOT NULL, - `max_statement_time` tinyint NOT NULL -) ENGINE=MyISAM */; -SET character_set_client = @saved_cs_client; - --- --- Table structure for table `general_log` --- - -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE IF NOT EXISTS `general_log` ( - `event_time` timestamp(6) NOT NULL DEFAULT current_timestamp(6) ON UPDATE current_timestamp(6), - `user_host` mediumtext NOT NULL, - `thread_id` bigint(21) unsigned NOT NULL, - `server_id` int(10) unsigned NOT NULL, - `command_type` varchar(64) NOT NULL, - `argument` mediumtext NOT NULL -) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `slow_log` --- - -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE IF NOT EXISTS `slow_log` ( - `start_time` timestamp(6) NOT NULL DEFAULT current_timestamp(6) ON UPDATE current_timestamp(6), - `user_host` mediumtext NOT NULL, - `query_time` time(6) NOT NULL, - `lock_time` time(6) NOT NULL, - `rows_sent` int(11) NOT NULL, - `rows_examined` int(11) NOT NULL, - `db` varchar(512) NOT NULL, - `last_insert_id` int(11) NOT NULL, - `insert_id` int(11) NOT NULL, - `server_id` int(10) unsigned NOT NULL, - `sql_text` mediumtext NOT NULL, - `thread_id` bigint(21) unsigned NOT NULL, - `rows_affected` int(11) NOT NULL -) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `transaction_registry` --- - -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE IF NOT EXISTS `transaction_registry` ( - `transaction_id` bigint(20) unsigned NOT NULL, - `commit_id` bigint(20) unsigned NOT NULL, - `begin_timestamp` timestamp(6) NOT NULL DEFAULT '0000-00-00 00:00:00.000000', - `commit_timestamp` timestamp(6) NOT NULL DEFAULT '0000-00-00 00:00:00.000000', - `isolation_level` enum('READ-UNCOMMITTED','READ-COMMITTED','REPEATABLE-READ','SERIALIZABLE') COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`transaction_id`), - UNIQUE KEY `commit_id` (`commit_id`), - KEY `begin_timestamp` (`begin_timestamp`), - KEY `commit_timestamp` (`commit_timestamp`,`transaction_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Current Database: `phpmyadmin` --- - -CREATE DATABASE /*!32312 IF NOT EXISTS*/ `phpmyadmin` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; - -USE `phpmyadmin`; - --- --- Table structure for table `pma__bookmark` --- - -DROP TABLE IF EXISTS `pma__bookmark`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pma__bookmark` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `dbase` varchar(255) COLLATE utf8_bin NOT NULL DEFAULT '', - `user` varchar(255) COLLATE utf8_bin NOT NULL DEFAULT '', - `label` varchar(255) CHARACTER SET utf8 NOT NULL DEFAULT '', - `query` text COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Bookmarks'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `pma__bookmark` --- - -LOCK TABLES `pma__bookmark` WRITE; -/*!40000 ALTER TABLE `pma__bookmark` DISABLE KEYS */; -/*!40000 ALTER TABLE `pma__bookmark` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `pma__central_columns` --- - -DROP TABLE IF EXISTS `pma__central_columns`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pma__central_columns` ( - `db_name` varchar(64) COLLATE utf8_bin NOT NULL, - `col_name` varchar(64) COLLATE utf8_bin NOT NULL, - `col_type` varchar(64) COLLATE utf8_bin NOT NULL, - `col_length` text COLLATE utf8_bin DEFAULT NULL, - `col_collation` varchar(64) COLLATE utf8_bin NOT NULL, - `col_isNull` tinyint(1) NOT NULL, - `col_extra` varchar(255) COLLATE utf8_bin DEFAULT '', - `col_default` text COLLATE utf8_bin DEFAULT NULL, - PRIMARY KEY (`db_name`,`col_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Central list of columns'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `pma__central_columns` --- - -LOCK TABLES `pma__central_columns` WRITE; -/*!40000 ALTER TABLE `pma__central_columns` DISABLE KEYS */; -/*!40000 ALTER TABLE `pma__central_columns` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `pma__column_info` --- - -DROP TABLE IF EXISTS `pma__column_info`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pma__column_info` ( - `id` int(5) unsigned NOT NULL AUTO_INCREMENT, - `db_name` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `table_name` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `column_name` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `comment` varchar(255) CHARACTER SET utf8 NOT NULL DEFAULT '', - `mimetype` varchar(255) CHARACTER SET utf8 NOT NULL DEFAULT '', - `transformation` varchar(255) COLLATE utf8_bin NOT NULL DEFAULT '', - `transformation_options` varchar(255) COLLATE utf8_bin NOT NULL DEFAULT '', - `input_transformation` varchar(255) COLLATE utf8_bin NOT NULL DEFAULT '', - `input_transformation_options` varchar(255) COLLATE utf8_bin NOT NULL DEFAULT '', - PRIMARY KEY (`id`), - UNIQUE KEY `db_name` (`db_name`,`table_name`,`column_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Column information for phpMyAdmin'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `pma__column_info` --- - -LOCK TABLES `pma__column_info` WRITE; -/*!40000 ALTER TABLE `pma__column_info` DISABLE KEYS */; -/*!40000 ALTER TABLE `pma__column_info` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `pma__designer_settings` --- - -DROP TABLE IF EXISTS `pma__designer_settings`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pma__designer_settings` ( - `username` varchar(64) COLLATE utf8_bin NOT NULL, - `settings_data` text COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`username`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Settings related to Designer'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `pma__designer_settings` --- - -LOCK TABLES `pma__designer_settings` WRITE; -/*!40000 ALTER TABLE `pma__designer_settings` DISABLE KEYS */; -/*!40000 ALTER TABLE `pma__designer_settings` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `pma__export_templates` --- - -DROP TABLE IF EXISTS `pma__export_templates`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pma__export_templates` ( - `id` int(5) unsigned NOT NULL AUTO_INCREMENT, - `username` varchar(64) COLLATE utf8_bin NOT NULL, - `export_type` varchar(10) COLLATE utf8_bin NOT NULL, - `template_name` varchar(64) COLLATE utf8_bin NOT NULL, - `template_data` text COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `u_user_type_template` (`username`,`export_type`,`template_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Saved export templates'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `pma__export_templates` --- - -LOCK TABLES `pma__export_templates` WRITE; -/*!40000 ALTER TABLE `pma__export_templates` DISABLE KEYS */; -/*!40000 ALTER TABLE `pma__export_templates` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `pma__favorite` --- - -DROP TABLE IF EXISTS `pma__favorite`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pma__favorite` ( - `username` varchar(64) COLLATE utf8_bin NOT NULL, - `tables` text COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`username`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Favorite tables'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `pma__favorite` --- - -LOCK TABLES `pma__favorite` WRITE; -/*!40000 ALTER TABLE `pma__favorite` DISABLE KEYS */; -/*!40000 ALTER TABLE `pma__favorite` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `pma__history` --- - -DROP TABLE IF EXISTS `pma__history`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pma__history` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `username` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `db` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `table` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `timevalue` timestamp NOT NULL DEFAULT current_timestamp(), - `sqlquery` text COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`id`), - KEY `username` (`username`,`db`,`table`,`timevalue`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='SQL history for phpMyAdmin'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `pma__history` --- - -LOCK TABLES `pma__history` WRITE; -/*!40000 ALTER TABLE `pma__history` DISABLE KEYS */; -/*!40000 ALTER TABLE `pma__history` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `pma__navigationhiding` --- - -DROP TABLE IF EXISTS `pma__navigationhiding`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pma__navigationhiding` ( - `username` varchar(64) COLLATE utf8_bin NOT NULL, - `item_name` varchar(64) COLLATE utf8_bin NOT NULL, - `item_type` varchar(64) COLLATE utf8_bin NOT NULL, - `db_name` varchar(64) COLLATE utf8_bin NOT NULL, - `table_name` varchar(64) COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`username`,`item_name`,`item_type`,`db_name`,`table_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Hidden items of navigation tree'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `pma__navigationhiding` --- - -LOCK TABLES `pma__navigationhiding` WRITE; -/*!40000 ALTER TABLE `pma__navigationhiding` DISABLE KEYS */; -/*!40000 ALTER TABLE `pma__navigationhiding` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `pma__pdf_pages` --- - -DROP TABLE IF EXISTS `pma__pdf_pages`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pma__pdf_pages` ( - `db_name` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `page_nr` int(10) unsigned NOT NULL AUTO_INCREMENT, - `page_descr` varchar(50) CHARACTER SET utf8 NOT NULL DEFAULT '', - PRIMARY KEY (`page_nr`), - KEY `db_name` (`db_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='PDF relation pages for phpMyAdmin'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `pma__pdf_pages` --- - -LOCK TABLES `pma__pdf_pages` WRITE; -/*!40000 ALTER TABLE `pma__pdf_pages` DISABLE KEYS */; -/*!40000 ALTER TABLE `pma__pdf_pages` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `pma__recent` --- - -DROP TABLE IF EXISTS `pma__recent`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pma__recent` ( - `username` varchar(64) COLLATE utf8_bin NOT NULL, - `tables` text COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`username`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Recently accessed tables'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `pma__recent` --- - -LOCK TABLES `pma__recent` WRITE; -/*!40000 ALTER TABLE `pma__recent` DISABLE KEYS */; -/*!40000 ALTER TABLE `pma__recent` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `pma__relation` --- - -DROP TABLE IF EXISTS `pma__relation`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pma__relation` ( - `master_db` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `master_table` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `master_field` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `foreign_db` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `foreign_table` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `foreign_field` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '', - PRIMARY KEY (`master_db`,`master_table`,`master_field`), - KEY `foreign_field` (`foreign_db`,`foreign_table`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Relation table'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `pma__relation` --- - -LOCK TABLES `pma__relation` WRITE; -/*!40000 ALTER TABLE `pma__relation` DISABLE KEYS */; -/*!40000 ALTER TABLE `pma__relation` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `pma__savedsearches` --- - -DROP TABLE IF EXISTS `pma__savedsearches`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pma__savedsearches` ( - `id` int(5) unsigned NOT NULL AUTO_INCREMENT, - `username` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `db_name` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `search_name` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `search_data` text COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `u_savedsearches_username_dbname` (`username`,`db_name`,`search_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Saved searches'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `pma__savedsearches` --- - -LOCK TABLES `pma__savedsearches` WRITE; -/*!40000 ALTER TABLE `pma__savedsearches` DISABLE KEYS */; -/*!40000 ALTER TABLE `pma__savedsearches` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `pma__table_coords` --- - -DROP TABLE IF EXISTS `pma__table_coords`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pma__table_coords` ( - `db_name` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `table_name` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `pdf_page_number` int(11) NOT NULL DEFAULT 0, - `x` float unsigned NOT NULL DEFAULT 0, - `y` float unsigned NOT NULL DEFAULT 0, - PRIMARY KEY (`db_name`,`table_name`,`pdf_page_number`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Table coordinates for phpMyAdmin PDF output'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `pma__table_coords` --- - -LOCK TABLES `pma__table_coords` WRITE; -/*!40000 ALTER TABLE `pma__table_coords` DISABLE KEYS */; -/*!40000 ALTER TABLE `pma__table_coords` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `pma__table_info` --- - -DROP TABLE IF EXISTS `pma__table_info`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pma__table_info` ( - `db_name` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `table_name` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '', - `display_field` varchar(64) COLLATE utf8_bin NOT NULL DEFAULT '', - PRIMARY KEY (`db_name`,`table_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Table information for phpMyAdmin'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `pma__table_info` --- - -LOCK TABLES `pma__table_info` WRITE; -/*!40000 ALTER TABLE `pma__table_info` DISABLE KEYS */; -/*!40000 ALTER TABLE `pma__table_info` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `pma__table_uiprefs` --- - -DROP TABLE IF EXISTS `pma__table_uiprefs`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pma__table_uiprefs` ( - `username` varchar(64) COLLATE utf8_bin NOT NULL, - `db_name` varchar(64) COLLATE utf8_bin NOT NULL, - `table_name` varchar(64) COLLATE utf8_bin NOT NULL, - `prefs` text COLLATE utf8_bin NOT NULL, - `last_update` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), - PRIMARY KEY (`username`,`db_name`,`table_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Tables'' UI preferences'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `pma__table_uiprefs` --- - -LOCK TABLES `pma__table_uiprefs` WRITE; -/*!40000 ALTER TABLE `pma__table_uiprefs` DISABLE KEYS */; -/*!40000 ALTER TABLE `pma__table_uiprefs` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `pma__tracking` --- - -DROP TABLE IF EXISTS `pma__tracking`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pma__tracking` ( - `db_name` varchar(64) COLLATE utf8_bin NOT NULL, - `table_name` varchar(64) COLLATE utf8_bin NOT NULL, - `version` int(10) unsigned NOT NULL, - `date_created` datetime NOT NULL, - `date_updated` datetime NOT NULL, - `schema_snapshot` text COLLATE utf8_bin NOT NULL, - `schema_sql` text COLLATE utf8_bin DEFAULT NULL, - `data_sql` longtext COLLATE utf8_bin DEFAULT NULL, - `tracking` set('UPDATE','REPLACE','INSERT','DELETE','TRUNCATE','CREATE DATABASE','ALTER DATABASE','DROP DATABASE','CREATE TABLE','ALTER TABLE','RENAME TABLE','DROP TABLE','CREATE INDEX','DROP INDEX','CREATE VIEW','ALTER VIEW','DROP VIEW') COLLATE utf8_bin DEFAULT NULL, - `tracking_active` int(1) unsigned NOT NULL DEFAULT 1, - PRIMARY KEY (`db_name`,`table_name`,`version`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Database changes tracking for phpMyAdmin'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `pma__tracking` --- - -LOCK TABLES `pma__tracking` WRITE; -/*!40000 ALTER TABLE `pma__tracking` DISABLE KEYS */; -/*!40000 ALTER TABLE `pma__tracking` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `pma__userconfig` --- - -DROP TABLE IF EXISTS `pma__userconfig`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pma__userconfig` ( - `username` varchar(64) COLLATE utf8_bin NOT NULL, - `timevalue` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), - `config_data` text COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`username`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='User preferences storage for phpMyAdmin'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `pma__userconfig` --- - -LOCK TABLES `pma__userconfig` WRITE; -/*!40000 ALTER TABLE `pma__userconfig` DISABLE KEYS */; -INSERT INTO `pma__userconfig` VALUES ('admin','2021-08-09 08:57:43','{\"Console\\/Mode\":\"show\"}'); -/*!40000 ALTER TABLE `pma__userconfig` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `pma__usergroups` --- - -DROP TABLE IF EXISTS `pma__usergroups`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pma__usergroups` ( - `usergroup` varchar(64) COLLATE utf8_bin NOT NULL, - `tab` varchar(64) COLLATE utf8_bin NOT NULL, - `allowed` enum('Y','N') COLLATE utf8_bin NOT NULL DEFAULT 'N', - PRIMARY KEY (`usergroup`,`tab`,`allowed`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='User groups with configured menu items'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `pma__usergroups` --- - -LOCK TABLES `pma__usergroups` WRITE; -/*!40000 ALTER TABLE `pma__usergroups` DISABLE KEYS */; -/*!40000 ALTER TABLE `pma__usergroups` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `pma__users` --- - -DROP TABLE IF EXISTS `pma__users`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `pma__users` ( - `username` varchar(64) COLLATE utf8_bin NOT NULL, - `usergroup` varchar(64) COLLATE utf8_bin NOT NULL, - PRIMARY KEY (`username`,`usergroup`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users and their assignments to user groups'; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `pma__users` --- - -LOCK TABLES `pma__users` WRITE; -/*!40000 ALTER TABLE `pma__users` DISABLE KEYS */; -/*!40000 ALTER TABLE `pma__users` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Current Database: `test` --- - -CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET latin1 */; - -USE `test`; - --- --- Current Database: `wordpress` --- - -CREATE DATABASE /*!32312 IF NOT EXISTS*/ `wordpress` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; - -USE `wordpress`; - --- --- Table structure for table `wp_commentmeta` --- - -DROP TABLE IF EXISTS `wp_commentmeta`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_commentmeta` ( - `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `comment_id` bigint(20) unsigned NOT NULL DEFAULT 0, - `meta_key` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `meta_value` longtext COLLATE utf8mb4_unicode_ci DEFAULT NULL, - PRIMARY KEY (`meta_id`), - KEY `comment_id` (`comment_id`), - KEY `meta_key` (`meta_key`(191)) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_commentmeta` --- - -LOCK TABLES `wp_commentmeta` WRITE; -/*!40000 ALTER TABLE `wp_commentmeta` DISABLE KEYS */; -/*!40000 ALTER TABLE `wp_commentmeta` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_comments` --- - -DROP TABLE IF EXISTS `wp_comments`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_comments` ( - `comment_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `comment_post_ID` bigint(20) unsigned NOT NULL DEFAULT 0, - `comment_author` tinytext COLLATE utf8mb4_unicode_ci NOT NULL, - `comment_author_email` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `comment_author_url` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `comment_author_IP` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `comment_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `comment_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `comment_content` text COLLATE utf8mb4_unicode_ci NOT NULL, - `comment_karma` int(11) NOT NULL DEFAULT 0, - `comment_approved` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '1', - `comment_agent` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `comment_type` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'comment', - `comment_parent` bigint(20) unsigned NOT NULL DEFAULT 0, - `user_id` bigint(20) unsigned NOT NULL DEFAULT 0, - PRIMARY KEY (`comment_ID`), - KEY `comment_post_ID` (`comment_post_ID`), - KEY `comment_approved_date_gmt` (`comment_approved`,`comment_date_gmt`), - KEY `comment_date_gmt` (`comment_date_gmt`), - KEY `comment_parent` (`comment_parent`), - KEY `comment_author_email` (`comment_author_email`(10)) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_comments` --- - -LOCK TABLES `wp_comments` WRITE; -/*!40000 ALTER TABLE `wp_comments` DISABLE KEYS */; -INSERT INTO `wp_comments` VALUES (1,1,'A WordPress Commenter','wapuu@wordpress.example','https://wordpress.org/','','2021-08-08 06:46:47','2021-08-08 06:46:47','Hi, this is a comment.\nTo get started with moderating, editing, and deleting comments, please visit the Comments screen in the dashboard.\nCommenter avatars come from Gravatar.',0,'1','','comment',0,0); -/*!40000 ALTER TABLE `wp_comments` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_links` --- - -DROP TABLE IF EXISTS `wp_links`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_links` ( - `link_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `link_url` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `link_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `link_image` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `link_target` varchar(25) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `link_description` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `link_visible` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'Y', - `link_owner` bigint(20) unsigned NOT NULL DEFAULT 1, - `link_rating` int(11) NOT NULL DEFAULT 0, - `link_updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `link_rel` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `link_notes` mediumtext COLLATE utf8mb4_unicode_ci NOT NULL, - `link_rss` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - PRIMARY KEY (`link_id`), - KEY `link_visible` (`link_visible`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_links` --- - -LOCK TABLES `wp_links` WRITE; -/*!40000 ALTER TABLE `wp_links` DISABLE KEYS */; -/*!40000 ALTER TABLE `wp_links` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_options` --- - -DROP TABLE IF EXISTS `wp_options`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_options` ( - `option_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `option_name` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `option_value` longtext COLLATE utf8mb4_unicode_ci NOT NULL, - `autoload` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'yes', - PRIMARY KEY (`option_id`), - UNIQUE KEY `option_name` (`option_name`), - KEY `autoload` (`autoload`) -) ENGINE=InnoDB AUTO_INCREMENT=143 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_options` --- - -LOCK TABLES `wp_options` WRITE; -/*!40000 ALTER TABLE `wp_options` DISABLE KEYS */; -INSERT INTO `wp_options` VALUES (1,'siteurl','http://192.168.49.2:5050','yes'),(2,'home','http://192.168.49.2:5050','yes'),(3,'blogname','wordpress','yes'),(4,'blogdescription','Just another WordPress site','yes'),(5,'users_can_register','0','yes'),(6,'admin_email','sjbfd@idbfbdf.sd','yes'),(7,'start_of_week','1','yes'),(8,'use_balanceTags','0','yes'),(9,'use_smilies','1','yes'),(10,'require_name_email','1','yes'),(11,'comments_notify','1','yes'),(12,'posts_per_rss','10','yes'),(13,'rss_use_excerpt','0','yes'),(14,'mailserver_url','mail.example.com','yes'),(15,'mailserver_login','login@example.com','yes'),(16,'mailserver_pass','password','yes'),(17,'mailserver_port','110','yes'),(18,'default_category','1','yes'),(19,'default_comment_status','open','yes'),(20,'default_ping_status','open','yes'),(21,'default_pingback_flag','1','yes'),(22,'posts_per_page','10','yes'),(23,'date_format','F j, Y','yes'),(24,'time_format','g:i a','yes'),(25,'links_updated_date_format','F j, Y g:i a','yes'),(26,'comment_moderation','0','yes'),(27,'moderation_notify','1','yes'),(28,'permalink_structure','','yes'),(29,'rewrite_rules','','yes'),(30,'hack_file','0','yes'),(31,'blog_charset','UTF-8','yes'),(32,'moderation_keys','','no'),(33,'active_plugins','a:0:{}','yes'),(34,'category_base','','yes'),(35,'ping_sites','http://rpc.pingomatic.com/','yes'),(36,'comment_max_links','2','yes'),(37,'gmt_offset','0','yes'),(38,'default_email_category','1','yes'),(39,'recently_edited','','no'),(40,'template','twentytwentyone','yes'),(41,'stylesheet','twentytwentyone','yes'),(42,'comment_registration','0','yes'),(43,'html_type','text/html','yes'),(44,'use_trackback','0','yes'),(45,'default_role','subscriber','yes'),(46,'db_version','49752','yes'),(47,'uploads_use_yearmonth_folders','1','yes'),(48,'upload_path','','yes'),(49,'blog_public','1','yes'),(50,'default_link_category','2','yes'),(51,'show_on_front','posts','yes'),(52,'tag_base','','yes'),(53,'show_avatars','1','yes'),(54,'avatar_rating','G','yes'),(55,'upload_url_path','','yes'),(56,'thumbnail_size_w','150','yes'),(57,'thumbnail_size_h','150','yes'),(58,'thumbnail_crop','1','yes'),(59,'medium_size_w','300','yes'),(60,'medium_size_h','300','yes'),(61,'avatar_default','mystery','yes'),(62,'large_size_w','1024','yes'),(63,'large_size_h','1024','yes'),(64,'image_default_link_type','none','yes'),(65,'image_default_size','','yes'),(66,'image_default_align','','yes'),(67,'close_comments_for_old_posts','0','yes'),(68,'close_comments_days_old','14','yes'),(69,'thread_comments','1','yes'),(70,'thread_comments_depth','5','yes'),(71,'page_comments','0','yes'),(72,'comments_per_page','50','yes'),(73,'default_comments_page','newest','yes'),(74,'comment_order','asc','yes'),(75,'sticky_posts','a:0:{}','yes'),(76,'widget_categories','a:0:{}','yes'),(77,'widget_text','a:0:{}','yes'),(78,'widget_rss','a:0:{}','yes'),(79,'uninstall_plugins','a:0:{}','no'),(80,'timezone_string','','yes'),(81,'page_for_posts','0','yes'),(82,'page_on_front','0','yes'),(83,'default_post_format','0','yes'),(84,'link_manager_enabled','0','yes'),(85,'finished_splitting_shared_terms','1','yes'),(86,'site_icon','0','yes'),(87,'medium_large_size_w','768','yes'),(88,'medium_large_size_h','0','yes'),(89,'wp_page_for_privacy_policy','3','yes'),(90,'show_comments_cookies_opt_in','1','yes'),(91,'admin_email_lifespan','1643957206','yes'),(92,'disallowed_keys','','no'),(93,'comment_previously_approved','1','yes'),(94,'auto_plugin_theme_update_emails','a:0:{}','no'),(95,'auto_update_core_dev','enabled','yes'),(96,'auto_update_core_minor','enabled','yes'),(97,'auto_update_core_major','enabled','yes'),(98,'wp_force_deactivated_plugins','a:0:{}','yes'),(99,'initial_db_version','49752','yes'),(100,'wp_user_roles','a:5:{s:13:\"administrator\";a:2:{s:4:\"name\";s:13:\"Administrator\";s:12:\"capabilities\";a:61:{s:13:\"switch_themes\";b:1;s:11:\"edit_themes\";b:1;s:16:\"activate_plugins\";b:1;s:12:\"edit_plugins\";b:1;s:10:\"edit_users\";b:1;s:10:\"edit_files\";b:1;s:14:\"manage_options\";b:1;s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:6:\"import\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:8:\"level_10\";b:1;s:7:\"level_9\";b:1;s:7:\"level_8\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:12:\"delete_users\";b:1;s:12:\"create_users\";b:1;s:17:\"unfiltered_upload\";b:1;s:14:\"edit_dashboard\";b:1;s:14:\"update_plugins\";b:1;s:14:\"delete_plugins\";b:1;s:15:\"install_plugins\";b:1;s:13:\"update_themes\";b:1;s:14:\"install_themes\";b:1;s:11:\"update_core\";b:1;s:10:\"list_users\";b:1;s:12:\"remove_users\";b:1;s:13:\"promote_users\";b:1;s:18:\"edit_theme_options\";b:1;s:13:\"delete_themes\";b:1;s:6:\"export\";b:1;}}s:6:\"editor\";a:2:{s:4:\"name\";s:6:\"Editor\";s:12:\"capabilities\";a:34:{s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;}}s:6:\"author\";a:2:{s:4:\"name\";s:6:\"Author\";s:12:\"capabilities\";a:10:{s:12:\"upload_files\";b:1;s:10:\"edit_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;s:22:\"delete_published_posts\";b:1;}}s:11:\"contributor\";a:2:{s:4:\"name\";s:11:\"Contributor\";s:12:\"capabilities\";a:5:{s:10:\"edit_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;}}s:10:\"subscriber\";a:2:{s:4:\"name\";s:10:\"Subscriber\";s:12:\"capabilities\";a:2:{s:4:\"read\";b:1;s:7:\"level_0\";b:1;}}}','yes'),(101,'fresh_site','0','yes'),(102,'widget_block','a:6:{i:2;a:1:{s:7:\"content\";s:19:\"\";}i:3;a:1:{s:7:\"content\";s:154:\"

Recent Posts

\";}i:4;a:1:{s:7:\"content\";s:227:\"

Recent Comments

\";}i:5;a:1:{s:7:\"content\";s:146:\"

Archives

\";}i:6;a:1:{s:7:\"content\";s:150:\"

Categories

\";}s:12:\"_multiwidget\";i:1;}','yes'),(103,'sidebars_widgets','a:4:{s:19:\"wp_inactive_widgets\";a:0:{}s:9:\"sidebar-1\";a:3:{i:0;s:7:\"block-2\";i:1;s:7:\"block-3\";i:2;s:7:\"block-4\";}s:9:\"sidebar-2\";a:2:{i:0;s:7:\"block-5\";i:1;s:7:\"block-6\";}s:13:\"array_version\";i:3;}','yes'),(104,'cron','a:7:{i:1628405233;a:6:{s:32:\"recovery_mode_clean_expired_keys\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}s:18:\"wp_https_detection\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}s:34:\"wp_privacy_delete_old_export_files\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"hourly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:3600;}}s:16:\"wp_version_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}s:17:\"wp_update_plugins\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}s:16:\"wp_update_themes\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1628405240;a:2:{s:19:\"wp_scheduled_delete\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}s:25:\"delete_expired_transients\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1628405242;a:1:{s:30:\"wp_scheduled_auto_draft_delete\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1628405300;a:1:{s:28:\"wp_update_comment_type_batch\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:2:{s:8:\"schedule\";b:0;s:4:\"args\";a:0:{}}}}i:1628405941;a:1:{s:8:\"do_pings\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:2:{s:8:\"schedule\";b:0;s:4:\"args\";a:0:{}}}}i:1628491633;a:1:{s:30:\"wp_site_health_scheduled_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"weekly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:604800;}}}s:7:\"version\";i:2;}','yes'),(105,'widget_pages','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(106,'widget_calendar','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(107,'widget_archives','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(108,'widget_media_audio','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(109,'widget_media_image','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(110,'widget_media_gallery','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(111,'widget_media_video','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(112,'widget_meta','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(113,'widget_search','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(114,'widget_tag_cloud','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(115,'widget_nav_menu','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(116,'widget_custom_html','a:1:{s:12:\"_multiwidget\";i:1;}','yes'),(117,'_transient_doing_cron','1628498914.9167380332946777343750','yes'),(118,'_site_transient_update_core','O:8:\"stdClass\":4:{s:7:\"updates\";a:1:{i:0;O:8:\"stdClass\":10:{s:8:\"response\";s:6:\"latest\";s:8:\"download\";s:57:\"https://downloads.wordpress.org/release/wordpress-5.8.zip\";s:6:\"locale\";s:5:\"en_US\";s:8:\"packages\";O:8:\"stdClass\":5:{s:4:\"full\";s:57:\"https://downloads.wordpress.org/release/wordpress-5.8.zip\";s:10:\"no_content\";s:68:\"https://downloads.wordpress.org/release/wordpress-5.8-no-content.zip\";s:11:\"new_bundled\";s:69:\"https://downloads.wordpress.org/release/wordpress-5.8-new-bundled.zip\";s:7:\"partial\";s:0:\"\";s:8:\"rollback\";s:0:\"\";}s:7:\"current\";s:3:\"5.8\";s:7:\"version\";s:3:\"5.8\";s:11:\"php_version\";s:6:\"5.6.20\";s:13:\"mysql_version\";s:3:\"5.0\";s:11:\"new_bundled\";s:3:\"5.6\";s:15:\"partial_version\";s:0:\"\";}}s:12:\"last_checked\";i:1628405241;s:15:\"version_checked\";s:3:\"5.8\";s:12:\"translations\";a:0:{}}','no'),(119,'_site_transient_update_plugins','O:8:\"stdClass\":4:{s:12:\"last_checked\";i:1628405241;s:8:\"response\";a:0:{}s:12:\"translations\";a:0:{}s:9:\"no_update\";a:2:{s:19:\"akismet/akismet.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:21:\"w.org/plugins/akismet\";s:4:\"slug\";s:7:\"akismet\";s:6:\"plugin\";s:19:\"akismet/akismet.php\";s:11:\"new_version\";s:6:\"4.1.10\";s:3:\"url\";s:38:\"https://wordpress.org/plugins/akismet/\";s:7:\"package\";s:57:\"https://downloads.wordpress.org/plugin/akismet.4.1.10.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:59:\"https://ps.w.org/akismet/assets/icon-256x256.png?rev=969272\";s:2:\"1x\";s:59:\"https://ps.w.org/akismet/assets/icon-128x128.png?rev=969272\";}s:7:\"banners\";a:1:{s:2:\"1x\";s:61:\"https://ps.w.org/akismet/assets/banner-772x250.jpg?rev=479904\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"4.6\";}s:9:\"hello.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:25:\"w.org/plugins/hello-dolly\";s:4:\"slug\";s:11:\"hello-dolly\";s:6:\"plugin\";s:9:\"hello.php\";s:11:\"new_version\";s:5:\"1.7.2\";s:3:\"url\";s:42:\"https://wordpress.org/plugins/hello-dolly/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/plugin/hello-dolly.1.7.2.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:64:\"https://ps.w.org/hello-dolly/assets/icon-256x256.jpg?rev=2052855\";s:2:\"1x\";s:64:\"https://ps.w.org/hello-dolly/assets/icon-128x128.jpg?rev=2052855\";}s:7:\"banners\";a:1:{s:2:\"1x\";s:66:\"https://ps.w.org/hello-dolly/assets/banner-772x250.jpg?rev=2052855\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"4.6\";}}}','no'),(120,'_site_transient_timeout_theme_roots','1628407041','no'),(121,'_site_transient_theme_roots','a:3:{s:14:\"twentynineteen\";s:7:\"/themes\";s:12:\"twentytwenty\";s:7:\"/themes\";s:15:\"twentytwentyone\";s:7:\"/themes\";}','no'),(122,'_site_transient_update_themes','O:8:\"stdClass\":5:{s:12:\"last_checked\";i:1628405242;s:7:\"checked\";a:3:{s:14:\"twentynineteen\";s:3:\"2.1\";s:12:\"twentytwenty\";s:3:\"1.8\";s:15:\"twentytwentyone\";s:3:\"1.4\";}s:8:\"response\";a:0:{}s:9:\"no_update\";a:3:{s:14:\"twentynineteen\";a:6:{s:5:\"theme\";s:14:\"twentynineteen\";s:11:\"new_version\";s:3:\"2.1\";s:3:\"url\";s:44:\"https://wordpress.org/themes/twentynineteen/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/theme/twentynineteen.2.1.zip\";s:8:\"requires\";s:5:\"4.9.6\";s:12:\"requires_php\";s:5:\"5.2.4\";}s:12:\"twentytwenty\";a:6:{s:5:\"theme\";s:12:\"twentytwenty\";s:11:\"new_version\";s:3:\"1.8\";s:3:\"url\";s:42:\"https://wordpress.org/themes/twentytwenty/\";s:7:\"package\";s:58:\"https://downloads.wordpress.org/theme/twentytwenty.1.8.zip\";s:8:\"requires\";s:3:\"4.7\";s:12:\"requires_php\";s:5:\"5.2.4\";}s:15:\"twentytwentyone\";a:6:{s:5:\"theme\";s:15:\"twentytwentyone\";s:11:\"new_version\";s:3:\"1.4\";s:3:\"url\";s:45:\"https://wordpress.org/themes/twentytwentyone/\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/theme/twentytwentyone.1.4.zip\";s:8:\"requires\";s:3:\"5.3\";s:12:\"requires_php\";s:3:\"5.6\";}}s:12:\"translations\";a:0:{}}','no'),(123,'_site_transient_timeout_browser_e18d22da38dfa6a6717a3e5e92375000','1629010042','no'),(124,'_site_transient_browser_e18d22da38dfa6a6717a3e5e92375000','a:10:{s:4:\"name\";s:7:\"Firefox\";s:7:\"version\";s:4:\"90.0\";s:8:\"platform\";s:5:\"Linux\";s:10:\"update_url\";s:32:\"https://www.mozilla.org/firefox/\";s:7:\"img_src\";s:44:\"http://s.w.org/images/browsers/firefox.png?1\";s:11:\"img_src_ssl\";s:45:\"https://s.w.org/images/browsers/firefox.png?1\";s:15:\"current_version\";s:2:\"56\";s:7:\"upgrade\";b:0;s:8:\"insecure\";b:0;s:6:\"mobile\";b:0;}','no'),(125,'_site_transient_timeout_php_check_807c8573af5722dc652a2e0e9f9a1135','1629010042','no'),(126,'_site_transient_php_check_807c8573af5722dc652a2e0e9f9a1135','a:5:{s:19:\"recommended_version\";s:3:\"7.4\";s:15:\"minimum_version\";s:6:\"5.6.20\";s:12:\"is_supported\";b:1;s:9:\"is_secure\";b:1;s:13:\"is_acceptable\";b:1;}','no'),(127,'can_compress_scripts','0','no'),(128,'_site_transient_timeout_community-events-e2f2ed925cc0dc7eddd67ec58c0404fa','1628448443','no'),(129,'_site_transient_community-events-e2f2ed925cc0dc7eddd67ec58c0404fa','a:4:{s:9:\"sandboxed\";b:0;s:5:\"error\";N;s:8:\"location\";a:1:{s:2:\"ip\";s:10:\"172.17.0.0\";}s:6:\"events\";a:7:{i:0;a:10:{s:4:\"type\";s:6:\"meetup\";s:5:\"title\";s:66:\"Watch Party + Discussion group: Content Creation with Block Editor\";s:3:\"url\";s:68:\"https://www.meetup.com/learn-wordpress-discussions/events/279774777/\";s:6:\"meetup\";s:27:\"Learn WordPress Discussions\";s:10:\"meetup_url\";s:51:\"https://www.meetup.com/learn-wordpress-discussions/\";s:4:\"date\";s:19:\"2021-08-11 19:00:00\";s:8:\"end_date\";s:19:\"2021-08-11 20:00:00\";s:20:\"start_unix_timestamp\";i:1628733600;s:18:\"end_unix_timestamp\";i:1628737200;s:8:\"location\";a:4:{s:8:\"location\";s:6:\"Online\";s:7:\"country\";s:2:\"US\";s:8:\"latitude\";d:37.779998779297;s:9:\"longitude\";d:-122.41999816895;}}i:1;a:10:{s:4:\"type\";s:8:\"wordcamp\";s:5:\"title\";s:54:\"WordCamp Florianópolis, Santa Catarina – Brazil\";s:3:\"url\";s:34:\"https://floripa.wordcamp.org/2021/\";s:6:\"meetup\";N;s:10:\"meetup_url\";N;s:4:\"date\";s:19:\"2021-08-11 19:30:00\";s:8:\"end_date\";s:19:\"2021-08-12 00:00:00\";s:20:\"start_unix_timestamp\";i:1628721000;s:18:\"end_unix_timestamp\";i:1628737200;s:8:\"location\";a:4:{s:8:\"location\";s:6:\"Online\";s:7:\"country\";s:2:\"BR\";s:8:\"latitude\";d:-27.5953198;s:9:\"longitude\";d:-48.5542927;}}i:2;a:10:{s:4:\"type\";s:6:\"meetup\";s:5:\"title\";s:37:\"WordPress Meetup Zwolle (geannuleerd)\";s:3:\"url\";s:68:\"https://www.meetup.com/Zwolle-WordPress-Meetup/events/nsmmmrycclbqb/\";s:6:\"meetup\";s:23:\"WordPress Meetup Zwolle\";s:10:\"meetup_url\";s:47:\"https://www.meetup.com/Zwolle-WordPress-Meetup/\";s:4:\"date\";s:19:\"2021-08-12 18:45:00\";s:8:\"end_date\";s:19:\"2021-08-12 20:55:00\";s:20:\"start_unix_timestamp\";i:1628786700;s:18:\"end_unix_timestamp\";i:1628794500;s:8:\"location\";a:4:{s:8:\"location\";s:19:\"Zwolle, Netherlands\";s:7:\"country\";s:2:\"nl\";s:8:\"latitude\";d:52.508583068848;s:9:\"longitude\";d:6.0933017730713;}}i:3;a:10:{s:4:\"type\";s:6:\"meetup\";s:5:\"title\";s:23:\"WordPress Meetup Zwolle\";s:3:\"url\";s:68:\"https://www.meetup.com/Zwolle-WordPress-Meetup/events/nsmmmryccmbmb/\";s:6:\"meetup\";s:23:\"WordPress Meetup Zwolle\";s:10:\"meetup_url\";s:47:\"https://www.meetup.com/Zwolle-WordPress-Meetup/\";s:4:\"date\";s:19:\"2021-09-09 18:45:00\";s:8:\"end_date\";s:19:\"2021-09-09 20:55:00\";s:20:\"start_unix_timestamp\";i:1631205900;s:18:\"end_unix_timestamp\";i:1631213700;s:8:\"location\";a:4:{s:8:\"location\";s:19:\"Zwolle, Netherlands\";s:7:\"country\";s:2:\"nl\";s:8:\"latitude\";d:52.508583068848;s:9:\"longitude\";d:6.0933017730713;}}i:4;a:10:{s:4:\"type\";s:6:\"meetup\";s:5:\"title\";s:50:\"WordPress MeetUp Utrecht LIVE op 29 september 2021\";s:3:\"url\";s:65:\"https://www.meetup.com/WordPress-Meetup-Utrecht/events/279931788/\";s:6:\"meetup\";s:24:\"WordPress Meetup Utrecht\";s:10:\"meetup_url\";s:48:\"https://www.meetup.com/WordPress-Meetup-Utrecht/\";s:4:\"date\";s:19:\"2021-09-29 19:00:00\";s:8:\"end_date\";s:19:\"2021-09-29 21:00:00\";s:20:\"start_unix_timestamp\";i:1632934800;s:18:\"end_unix_timestamp\";i:1632942000;s:8:\"location\";a:4:{s:8:\"location\";s:20:\"Utrecht, Netherlands\";s:7:\"country\";s:2:\"nl\";s:8:\"latitude\";d:52.063800811768;s:9:\"longitude\";d:5.1044549942017;}}i:5;a:10:{s:4:\"type\";s:6:\"meetup\";s:5:\"title\";s:23:\"WordPress Meetup Zwolle\";s:3:\"url\";s:68:\"https://www.meetup.com/Zwolle-WordPress-Meetup/events/nsmmmryccnbsb/\";s:6:\"meetup\";s:23:\"WordPress Meetup Zwolle\";s:10:\"meetup_url\";s:47:\"https://www.meetup.com/Zwolle-WordPress-Meetup/\";s:4:\"date\";s:19:\"2021-10-14 18:45:00\";s:8:\"end_date\";s:19:\"2021-10-14 20:55:00\";s:20:\"start_unix_timestamp\";i:1634229900;s:18:\"end_unix_timestamp\";i:1634237700;s:8:\"location\";a:4:{s:8:\"location\";s:19:\"Zwolle, Netherlands\";s:7:\"country\";s:2:\"nl\";s:8:\"latitude\";d:52.508583068848;s:9:\"longitude\";d:6.0933017730713;}}i:6;a:10:{s:4:\"type\";s:6:\"meetup\";s:5:\"title\";s:23:\"WordPress Meetup Zwolle\";s:3:\"url\";s:68:\"https://www.meetup.com/Zwolle-WordPress-Meetup/events/nsmmmryccpbpb/\";s:6:\"meetup\";s:23:\"WordPress Meetup Zwolle\";s:10:\"meetup_url\";s:47:\"https://www.meetup.com/Zwolle-WordPress-Meetup/\";s:4:\"date\";s:19:\"2021-11-11 18:45:00\";s:8:\"end_date\";s:19:\"2021-11-11 20:55:00\";s:20:\"start_unix_timestamp\";i:1636652700;s:18:\"end_unix_timestamp\";i:1636660500;s:8:\"location\";a:4:{s:8:\"location\";s:19:\"Zwolle, Netherlands\";s:7:\"country\";s:2:\"nl\";s:8:\"latitude\";d:52.508583068848;s:9:\"longitude\";d:6.0933017730713;}}}}','no'),(130,'_transient_timeout_feed_9bbd59226dc36b9b26cd43f15694c5c3','1628448444','no'),(131,'_transient_feed_9bbd59226dc36b9b26cd43f15694c5c3','a:4:{s:5:\"child\";a:1:{s:0:\"\";a:1:{s:3:\"rss\";a:1:{i:0;a:6:{s:4:\"data\";s:3:\"\n\n\n\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:7:\"version\";s:3:\"2.0\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:1:{s:0:\"\";a:1:{s:7:\"channel\";a:1:{i:0;a:6:{s:4:\"data\";s:79:\"\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:7:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:27:\"News – – WordPress.org\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:26:\"https://wordpress.org/news\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"WordPress News\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:13:\"lastBuildDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 03 Aug 2021 14:03:52 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"language\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"en-US\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:9:\"generator\";a:1:{i:0;a:5:{s:4:\"data\";s:40:\"https://wordpress.org/?v=5.9-alpha-51561\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"item\";a:20:{i:0;a:6:{s:4:\"data\";s:57:\"\n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:33:\"The Month in WordPress: July 2021\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:68:\"https://wordpress.org/news/2021/08/the-month-in-wordpress-july-2021/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 03 Aug 2021 13:53:13 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Month in WordPress\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=11107\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:334:\"WordPress is global in reach and open source in nature. And you would assume that what allows the software to be used by anyone would also enable it to be built by anyone. After all, your location doesn’t matter, and who employs you also doesn’t matter. And your relative social standing certainly shouldn’t matter. As […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Hari Shanker R\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:15215:\"\n

WordPress is global in reach and open source in nature. And you would assume that what allows the software to be used by anyone would also enable it to be built by anyone. After all, your location doesn’t matter, and who employs you also doesn’t matter. And your relative social standing certainly shouldn’t matter. As long as you can communicate with the others contributing to the project, there should be no obstacle to your participation.

\n\n\n\n

That was Josepha Haden on the “Cherishing WordPress Diversity” episode of the WP Briefing Podcast, speaking about the importance of diversity, equity, and inclusion within the fabric of the WordPress project. Her statement captures the spirit of the WordPress open source project, and we hope it resonates with you. Now, let’s dive in!

\n\n\n\n
\n\n\n\n

Say hello to WordPress 5.8

\n\n\n\n

WordPress version 5.8, “Tatum,” came out on July 20. Version 5.8 is a major release that offers features like block-based widgets, a host of new blocks and patterns, a template editor, a duotone feature to stylize images, theme.json, and support for webP images, to name a few. Read more in the release post, the field guide, and the talking points post for meetup groups.

\n\n\n\n

Want to contribute to WordPress core? 

\n\n\n\n\n\n\n\n

Gutenberg Version 11.0 is released

\n\n\n\n

Contributor teams released the 11th version of Gutenberg on July 9. Version 11.0, which focuses heavily on backports and bug fixes, showcases some cool features such as an editing overlay for template parts and reusable blocks, and support for CSS shorthand properties in theme.json and block attributes. Version 11.1 was also shipped this month, on July 21. The release adds custom block borders as block supports and adds “drag and drop” to the list view. 

\n\n\n\n

Want to get involved in building Gutenberg? Follow the Core Team blog, contribute to Gutenberg on GitHub, and join the #core-editor channel in the Make WordPress Slack. The “What’s next in Gutenberg” post offers more details on the latest updates. 

\n\n\n\n

Returning to in-person WordPress events

\n\n\n\n

The Community Team kicked off work to bring back in-person WordPress events. The team recently announced that in-person WordPress meetups can be organized in a region if the local public health authority allows in-person events and if the region passes the in-person safety checklist. If the region does not meet guidelines on page one of the safety checklist, organizers can plan events for fully vaccinated, recently tested (negative), or recently recovered community members. Subsequently, the team also shared a proposal for the return to in-person WordCamps in places that meet the safety guidelines and the vaccination/testing requirements. Please share your feedback on the post if you have any thoughts. For more context, check out the “In Person!” episode of the WP Briefing Podcast

\n\n\n\n

Want to contribute to the Community Team? Follow the Community Team blog, or join them in the #community channel in the Make WordPress Slack. 

\n\n\n\n

BuddyPress 9.0 is out

\n\n\n\n

The BuddyPress team is busy! Within barely a month of their last major release (version 8.0), the team shipped version 9.0 on July 19. Key features of the release include widget blocks and updates to the BP REST API.  Download it from the WordPress.org plugin directory or check it out from its subversion repository. Want to help build BuddyPress? Follow their developer relations blog, check out their handbook page, or join them in the #buddypress channel in the Make WordPress Slack.

\n\n\n\n

WordPress Event updates

\n\n\n\n\n\n\n\n

Feedback requests from WordPress contributor teams

\n\n\n\n

Please help these WordPress contributor teams by answering their research requests:

\n\n\n\n\n\n\n\n
\n\n\n\n

Further reading

\n\n\n\n\n\n\n\n

Have a story that we should include in the next “Month in WordPress” post? Please submit it using this form

\n\n\n\n

The following folks contributed to July’s Month in WordPress:  @webcommsat @chaion07 @jillbinder @lmurillom @meher

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"11107\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:1;a:6:{s:4:\"data\";s:58:\"\n \n \n \n \n \n \n \n\n \n \n \n \n \n\n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:7:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:61:\"WP Briefing: Episode 14: The Art and Science of Accessibility\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:83:\"https://wordpress.org/news/2021/08/episode-14-the-art-and-science-of-accessibility/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 02 Aug 2021 12:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:1:{i:0;a:5:{s:4:\"data\";s:11:\"wp-briefing\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"https://wordpress.org/news/?post_type=podcast&p=11096\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:463:\"In this episode, Josepha Haden Chomphosy discusses the nuances of building accessible software, the differences between access, usability, and accessibility, and how this all applies to the WordPress project. Have a question you’d like answered? You can submit them to wpbriefing@wordpress.org, either written or as a voice recording. Credits Editor: Dustin Hartzler Logo: Beatriz Fialho Production: Chloé Bringmann Transcription: […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:9:\"enclosure\";a:1:{i:0;a:5:{s:4:\"data\";s:0:\"\";s:7:\"attribs\";a:1:{s:0:\"\";a:3:{s:3:\"url\";s:60:\"https://wordpress.org/news/files/2021/07/WP-Briefing-014.mp3\";s:6:\"length\";s:1:\"0\";s:4:\"type\";s:0:\"\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:17:\"Nicholas Garofalo\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:9393:\"\n

In this episode, Josepha Haden Chomphosy discusses the nuances of building accessible software, the differences between access, usability, and accessibility, and how this all applies to the WordPress project.

\n\n\n\n

Have a question you’d like answered? You can submit them to wpbriefing@wordpress.org, either written or as a voice recording.

\n\n\n\n

Credits

\n\n\n\n\n\n\n\n

References

\n\n\n\n\n\n\n\n

Transcript

\n\n\n\n\n\n\n\n

[contemporary intro music]

\n\n\n\n

Josepha Haden Chomphosy 0:10

\n\n\n\n

Hello, everyone, and welcome to the WordPress Briefing, the podcast where you can catch quick explanations of the ideas behind the WordPress open source project, some insight into the community that supports it, and get a small list of big things coming up in the next two weeks. I’m your host, Josepha Haden Chomphosy. Here we go.

\n\n\n\n

[musical interlude]

\n\n\n\n

Josepha Haden Chomphosy 0:28

\n\n\n\n

This is the second of my big scary topics for this month. I’ll be talking about accessibility, which much like Diversity, Equity and Inclusion, or DEI in the last episode, is one of those areas where the work is never finished. Also, like DEI in last episode, I feel strongly about accessibility and the need for accessible experiences in the world, but I’m aware that this is an area where I’m still learning.

\n\n\n\n

Josepha Haden Chomphosy 1:04

\n\n\n\n

WordPress has both an accessibility statement and team, which makes a lot of sense given that the software supports so many different people, and industries, and cultures. But if you’re not quite bought into the idea that software should be accessible, or that accessible software can’t also be usable, then this is the episode for you.

\n\n\n\n

Josepha Haden Chomphosy 1:25

\n\n\n\n

Before I joined the WordPress project, the majority of my work with accessibility was in the context of the digital divide. Now, when talking about the digital divide, there are three concepts around quote-unquote, “getting things to people,” and those are access, usability, and accessibility. Sometimes these words seem interchangeable, but ultimately they have nuanced differences that address different problems. And I like to think of them this way.

\n\n\n\n

Access is making sure that someone can obtain something.

\n\n\n\n

Usability is making sure that the user experience is understandable or coherent.

\n\n\n\n

And accessibility is making sure that it’s usable by the largest number of people.

\n\n\n\n

I have always considered each as a subset of the one that came before it. So having something everyone can access is good, but easy to access and easy to use is better. Easy to use is good, but easy to use and easily accessible is better.

\n\n\n\n

Josepha Haden Chomphosy 2:27

\n\n\n\n

After joining WordPress, I discovered that accessibility in the context of software building is well, substantially more complicated. There’s no such thing as perfect accessibility, or a site that is 100% accessible, and many aspects are pretty open to interpretation. It turns out that accessibility, like so many things in WordPress, is a complicated intersection of art and science.

\n\n\n\n

As an example, there’s a rule that says, “Ensure that links are recognizable as links.” A fast shorthand to accomplish that, that we see all over the internet, is to underline all links or put that icon next to it that says, “This opens in a new tab.” You know that icon that’s a box with an arrow? That definitely has a name, that I definitely don’t know? That icon. [laughing] But those solutions don’t necessarily fit every context that you’ll find a link in, and that’s where we see that intersection between the art of communication and the science of necessity.

\n\n\n\n

Josepha Haden Chomphosy 3:32

\n\n\n\n

If you came with me earlier on the idea that accessibility is a subset of usability, and it’s not a far leap to say that the choices around accessibility implementations should always include design and the overall user experience.

\n\n\n\n

I know that some of you are thinking, “But we have guidelines! Like, that’s why we have the guidelines, so that not everything has to be a gray area.” And on the one hand, yeah, that’s true. There are a lot of guidelines. There are guidelines for the code, and what the code produces, and the design elements. But I worry that when a solution is driven solely by rules, rather than reasons, we run the risk of throwing out the good along with the bad.

\n\n\n\n

Josepha Haden Chomphosy 4:15

\n\n\n\n

Accessibility has been a consistent topic of debate in the project for as long as I can remember, and based on all of this, it’s really clear why. There are a few big picture questions that still deserve some sort of canonical answer for WordPress, and where possible I dig in and research the positions that everyone has taken in the past. But I also have questions about how to move everything forward, especially as the editing experience gets more and more standardized across the software, which reduces cognitive load, shortens the learning curve, etc.

\n\n\n\n

What is the future possibility for having a series of more niche admin interface options?

\n\n\n\n

What would it be like to be able to account for functional limitations in a way that lets site builders select what is needed for their clients or organization, or just individual situations they know their sites would be maintained under?

\n\n\n\n

What more could we do if part of the setup flow of WordPress was to select some bundle of potential add ons for neuro diversity, or colorblindness, or dyslexia, and more?

\n\n\n\n

It’s a really big question I have.

\n\n\n\n

Josepha Haden Chomphosy 5:26

\n\n\n\n

And I have to be really transparent here and share that my foundational understanding of accessibility and usability is 10 plus years old, and I learned it in the context of people in education, not software. So a lot of my questions about the future of accessibility and WordPress is the result of old knowledge exploring new spaces, which means they are a little untested. And I’m so grateful for the contributors who point out what the current research and thinking is, in this incredibly complex field.

\n\n\n\n

Josepha Haden Chomphosy 6:00

\n\n\n\n

I normally like to wrap up the briefing with a tidy takeaway, but this particular topic doesn’t really lend itself to that. So I’ll leave you with this. I really believe in WordPress’ mission to democratize publishing. And I, for one, will never stop learning about what gives people more access to the software, and what makes the software more usable, and especially how we can combine usability with accessibility in a way that puts form and function on a level playing field.

\n\n\n\n

[musical interlude]

\n\n\n\n

Josepha Haden Chomphosy 6:40

\n\n\n\n

And now, that brings us to our small list of big things.

\n\n\n\n

Thing one, it’s that time of year where many of our community members take a short break to relax and refresh. I’ll be taking a bit of a break during the month of August, and so the WP Briefing will return again starting in September.

\n\n\n\n

And thing two, huge thanks to the production crew that helps me make this podcast every couple of weeks, but a special shout out to our editor Dustin Hartzler, who makes quick work of all of my rambling thoughts.

\n\n\n\n

Josepha Haden Chomphosy 7:09

\n\n\n\n

And that is your small list of big things. Thank you for tuning in today for the WordPress Briefing. I’m your host, Josepha Haden Chomphosy, and I’ll see you again in September.

\n\n\n\n

[contemporary outro music]

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"11096\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:2;a:6:{s:4:\"data\";s:66:\"\n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:40:\"Configuring Theme Design with theme.json\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:76:\"https://wordpress.org/news/2021/07/configuring-theme-design-with-theme-json/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 29 Jul 2021 22:26:13 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:4:{i:0;a:5:{s:4:\"data\";s:6:\"Themes\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:6:\"design\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:11:\"development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:3;a:5:{s:4:\"data\";s:9:\"Gutenberg\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=11060\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:368:\"Starting in WordPress 5.8, a new tool — “theme.json” — is available to use in your theme. Maybe you’re hearing about it for the first time, or maybe you’re testing and developing themes with it already. Either way, I’m glad you’re here because it’s an exciting time for WordPress themes. This post provides a quick introduction […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Jeff Ong\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:21957:\"\n
\"\"
\n\n\n\n

Starting in WordPress 5.8, a new tool — “theme.json” — is available to use in your theme. Maybe you’re hearing about it for the first time, or maybe you’re testing and developing themes with it already. Either way, I’m glad you’re here because it’s an exciting time for WordPress themes.

\n\n\n\n

This post provides a quick introduction to this new framework, and describes what’s possible by sharing a few practical tips and examples.

\n\n\n\n

What’s theme.json?

\n\n\n\n

Technically, theme.json is just a file that lives at the top-level of a theme’s directory. 

\n\n\n\n

Conceptually, it’s a major shift in how themes can be developed. Theme authors now have a centralized mechanism to tailor the WordPress experience for site authors and visitors. Theme.json provides theme authors fine-grained control over global styles, block styles, and the block editor settings.

\n\n\n\n

By providing these settings and controls in a single file, theme.json provides a powerful framework that brings together many aspects of theme design and development. And as the block editor matures and adds more features, theme.json will shine as the backbone for themes and the editor to work together \"💪\"

\n\n\n\n

Why Use it?

\n\n\n\n

It’s the future! But if you’re like me, you might need something more tangible to be convinced. Here are a few reasons why you might use theme.json today:

\n\n\n\n
  • Control editor settings like color, typography, spacing, and layout, and consolidate where these settings are managed.
  • Guarantee that styles apply correctly to blocks and elements across your site.
  • Reduce the amount of boilerplate CSS a theme used to provide. Theme.json won’t replace your stylesheet completely — there will be instances where CSS is needed to give your theme that extra flare (transitions, animations, etc.). But it can greatly reduce the base CSS needed from the theme.
\n\n\n\n

How do I use it?

\n\n\n\n

The rest of this post demonstrates a few theme.json configurations you can try out. The examples use the tt1-blocks theme.jsonthe block-based version of this year’s default theme

\n\n\n\n

If you’re starting with an existing theme, you might try copying a theme.json from the WordPress/theme-experiments repository (for example, the fse-tutorial theme by @poena) and adding it to the root of your theme’s directory.

\n\n\n\n

Change the typography settings of your site globally

\n\n\n
\n"settings": {\n	"typography": {\n		"fontSize": "30px",\n		...\n
\n\n\n

Making the change above in theme.json would result in the following updates to your theme’s body typography styles (before and after):

\n\n\n\n\n\n\n\n

Changing the base color settings of your site globally

\n\n\n
\n"styles": {\n	"color": {\n		"background": "#ffc0cb",\n		"text": "#6A1515"\n	},\n	...\n}\n
\n\n\n\n\n\n\n

Changing spacing / padding settings on specific blocks

\n\n\n
\n"styles": {\n	"blocks": {\n		"core/code": {\n			"spacing": {\n				"padding": {\n					"top": "3em",\n					"bottom": "3em",\n					"left": "3em",\n					"right": "3em"\n				}\n			}\n		}\n	}\n}\n\n
\n\n\n\n\n\n\n

Set a custom color palette in the editor for specific blocks like a button

\n\n\n
\n"settings": {\n    "blocks": {\n		"core/button": {\n			"color": {\n				"palette": [ \n					{\n						"name": "Maroon",\n						"color": "#6A1515",\n						"slug": "maroon"\n					},\n					{\n						"name": "Strawberry Ice Cream",\n						"color": "#FFC0CB",\n						"slug": "strawberry-ice-cream"\n					}\n				]\n			}\n		}\n	}\n}\n
\n\n\n\n\n\n\n

Enable and disable typography controls

\n\n\n\n

In the following example, the ability to supply a custom font size and line height for all heading blocks is disabled:

\n\n\n
\n	"settings": {\n		"blocks": {\n			"core/heading": {\n				"typography": {\n					"customFontSize": false,\n					"customLineHeight": false\n				}\n			}\n		}\n	}\n
\n\n\n\n\n\n\n

What’s Next?

\n\n\n\n

I hope this gives you a sense of what’s possible and where themes are going. The above examples just scratch the surface of what kinds of theme design configurations are possible, and I’m very excited to see what theme authors create.

\n\n\n\n

If you’re interested in learning more, here’s the developer note on theme.json, and here’s the documentation for theme.json in the handbook.

\n\n\n\n
\n\n\n\n

Thanks to @kjellr, @chanthaboune, @priethor, @annezazu for helping with and peer-reviewing this post.

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"11060\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:3;a:6:{s:4:\"data\";s:60:\"\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:19:\"WordPress 5.8 Tatum\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:41:\"https://wordpress.org/news/2021/07/tatum/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 20 Jul 2021 17:43:25 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:2:{i:0;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:3:\"5.8\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=10976\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:277:\"Introducing 5.8 “Tatum”, our latest and greatest release, named in honor of the legendary jazz pianist Art Tatum. This release includes an all new widget editor powered by blocks, major technical tools for building block themes, as well as newly streamlined workflow tools.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Matt Mullenweg\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:54016:\"\n
\n\n\n\n
\"\"
\n\n\n\n

Introducing 5.8 “Tatum”, our latest and greatest release now available for download or update in your dashboard. Named in honor of Art Tatum, the legendary Jazz pianist. His formidable technique and willingness to push boundaries inspired musicians and changed what people thought could be done. 

\n\n\n\n

So fire up your music service of choice and enjoy Tatum’s famous recordings of ‘Tea for Two’, ‘Tiger Rag’, ‘Begin the Beguine’, and ‘Night and Day’ as you read about what the latest WordPress version brings to you.

\n\n\n\n
\n\n\n\n

Three Essential Powerhouses

\n\n\n\n
\n\n\n\n\n\n\n\n

Manage Widgets with Blocks

\n\n\n\n

After months of hard work, the power of blocks has come to both the Block Widgets Editor and the Customizer. Now you can add blocks both in widget areas across your site and with live preview through the Customizer. This opens up new possibilities to create content: from no-code mini layouts to the vast library of core and third-party blocks. For our developers, you can find more details in the Widgets dev note.

\n\n\n\n

Display Posts with New Blocks and Patterns

\n\n\n\n

The Query Loop Block makes it possible to display posts based on specified parameters; like a PHP loop without the code. Easily display posts from a specific category, to do things like create a portfolio or a page full of your favorite recipes. Think of it as a more complex and powerful Latest Posts Block! Plus, pattern suggestions make it easier than ever to create a list of posts with the design you want.

\n\n\n\n

Edit the Templates Around Posts

\n\n\n\n

You can use the familiar block editor to edit templates that hold your content—simply activate a block theme or a theme that has opted in for this feature. Switch from editing your posts to editing your pages and back again, all while using a familiar block editor. There are more than 20 new blocks available within compatible themes. Read more about this feature and how to experiment with it in the release notes.

\n\n\n\n
\n\n\n\n

Three Workflow Helpers

\n\n\n\n
\n\n\n\n\n\n\n\n

Overview of the Page Structure

\n\n\n\n

Sometimes you need a simple landing page, but sometimes you need something a little more robust. As blocks increase, patterns emerge, and content creation gets easier, new solutions are needed to make complex content easy to navigate. List View is the best way to jump between layers of content and nested blocks. Since the List View gives you an overview of all the blocks in your content, you can now navigate quickly to the precise block you need. Ready to focus completely on your content? Toggle it on or off to suit your workflow.

\n\n\n\n

Suggested Patterns for Blocks

\n\n\n\n

Starting in this release the Pattern Transformations tool will suggest block patterns based on the block you are using. Right now, you can give it a try in the Query Block and Social Icon Block. As more patterns are added, you will be able to get inspiration for how to style your site without ever leaving the editor!

\n\n\n\n

Style and Colorize Images

\n\n\n\n

Colorize your image and cover blocks with duotone filters! Duotone can add a pop of color to your designs and style your images (or videos in the cover block) to integrate well with your themes. You can think of the duotone effect as a black and white filter, but instead of the shadows being black and the highlights being white, you pick your own colors for the shadows and highlights. There’s more to learn about how it works in the documentation.

\n\n\n\n
\n\n\n\n

For Developers to Explore

\n\n\n\n
\n\n\n\n
\"\"
\n\n\n\n
\n\n\n\n

Theme.json

\n\n\n\n

Introducing the Global Styles and Global Settings APIs: control the editor settings, available customization tools, and style blocks using a theme.json file in the active theme. This configuration file enables or disables features and sets default styles for both a website and blocks. If you build themes, you can experiment with this early iteration of a useful new feature. For more about what is currently available and how it works, check out this dev note.

\n\n\n\n
\n\n\n\n
\n
\n

Dropping support for IE11

\n\n\n\n

Support for Internet Explorer 11 has been dropped as of this release. This means you may have issues managing your site that will not be fixed in the future. If you are currently using IE11, it is strongly recommended that you switch to a more modern browser.

\n
\n\n\n\n
\n

Adding support for WebP

\n\n\n\n

WebP is a modern image format that provides improved lossless and lossy compression for images on the web. WebP images are around 30% smaller on average than their JPEG or PNG equivalents, resulting in sites that are faster and use less bandwidth.

\n
\n
\n\n\n\n

Adding Additional Block Supports

\n\n\n\n

Expanding on previously implemented block supports in WordPress 5.6 and 5.7, WordPress 5.8 introduces several new block support flags and new options to customize your registered blocks. More information is available in the block supports dev note.

\n\n\n\n
\n\n\n\n

Check the Field Guide for more!

\n\n\n\n

Check out the latest version of the WordPress Field Guide. It highlights developer notes for each change you may want to be aware of: WordPress 5.8 Field Guide.

\n\n\n\n
\n\n\n\n

The Squad

\n\n\n\n

The WordPress 5.8 release was led by Matt Mullenweg, and supported by this highly enthusiastic release squad:

\n\n\n\n\n\n\n\n

This release is the reflection of the hard work of 530 generous volunteer contributors. Collaboration occurred on over 320 tickets on Trac and over 1,500 pull requests on GitHub.

\n\n\n\n5ubliminal, 99w, 9primus, Aaron Jorbin, aaronrobertshaw, abderrahman, Abha Thakor, Abhijit Rakas, achbed, Adam Silverstein, Adam Zielinski, Addie, aduth, Ahmed Chaion, Ahmed Saeed, Ajit Bohra, Alain Schlesser, Alan Jacob Mathew, Albert Juhé Lluveras, Alejandro Perez, Alex Concha, Alex Kirk, Alex Lende, alexstine, allilevine, Amanda Riu, amarinediary, Amogh Harish, Andrea Fercia, Andrei Draganescu, Andrew Ozz, Andrew Serong, Andrey \"Rarst\" Savchenko, André Maneiro, Andy Fragen, Andy Peatling, Andy Skelton, Ankit Gade, annalamprou, Anne McCarthy, anotherdave, anotia, Anthony Burchell, Anton Lukin, Anton Vanyukov, Antonis Lilis, apedog, apokalyptik, arena, Argyris Margaritis, Ari Stathopoulos, ariskataoka, arkrs, Armand, ArnaudBan, Arthur Chu, Arun a11n, Aspexi, atjn, Aurooba Ahmed, Austin Matzko, Ayesh Karunaratne, Barry, bartkalisz, Beatriz Fialho, Bego Mario Garde, Benachi, Benoit Chantre, Bernhard Reiter, Bernhard Reiter, Birgir Erlendsson (birgire), Birgit Pauli-Haack, Blobfolio, bmcculley, Bob Linthorst, bobbingwide, Bogdan Preda, bonger, Boone Gorges, Brad Touesnard, Brandon Kraft, Brecht, Brent Swisher, Brett Shumaker, Bruno Ribaric, Burhan Nasir, Cameron Jones, Cameron Voell, Carike, Carl Alexander, carlomanf, Carlos Garcia Prim, Carolina Nymark, Casey Milne, Cenay Nailor, Ceyhun Ozugur, Chandra M, Chetan Prajapati, Chintan hingrajiya, Chip Snyder, Chloé Bringmann, Chouby, Chris Van Patten, chriscct7, Christopher Churchill, Chuck Reynolds, Clayton Collie, Code Amp, CodePoet, Colin Stewart, Collins Agbonghama, Copons, Corey McKrill, Cory Hughart, Courtney Engle Robertson, crazycoders, critterverse, czapla, Dávid Szabó, Daisy Olsen, damonganto, Dan Farrow, Dani Llewellyn, Daniel Richards, danieldudzic, Daniele Scasciafratte, Danny, David Aguilera, David Anderson, David Artiss, David Baumwald, David Biňovec, David Calhoun, David Herrera, David Kryzaniak, David Smith, dekervit, devfle, devrekli, dhruvkb, Diane Co, dingdang, Dion Hulse, djbu, Dominik Schilling, donmhico, Donna Peplinskie, Doug Wollison, dpik, dragongate, Dreb Bits, Drew Jaynes, eatsleepcode, Ebonie Butler, Edi Amin, Eileen Violini, Ella van Durpe, Emil E, Emilio Martinez, Emmanuel Hesry, empatogen, Enej Bajgorić, Enrique Sánchez, epiqueras, Erik, etoledom, Fabian Kägy, Fabian Pimminger, Fabian Todt, Felipe Elia, Felix Arntz, felixbaumgaertner, Femy Praseeth, fijisunshine, Florian Brinkmann, Florian TIAR, Francesca Marano, Frank Bueltge, frosso1 (a11n), fullofcaffeine, gab81, Gal Baras, Ganga Kafle, Garrett Hyder, Gary Jones, Gary Pendergast, GeekPress, Gennady Kovshenin, Geoffrey, George Hotelling, George Mamadashvili, George Stephanis, geriux, glendaviesnz, Grant M. Kinney, Greg Ziółkowski, gRegor Morrill, Héctor Prieto, Hannah Malcolm, happiryu, Hareesh, Haz, hedgefield, Helen Hou-Sandí, Herm Martini, Herre Groen, herrvigg, htmgarcia, Ian Dunn, ianmjones, icopydoc, Ipstenu (Mika Epstein), Isabel Brison, Ivaylo Draganov, Ivete Tecedor, J.D. Grimes, Jack Lenox, Jake Spurlock, James Bonham, James Koster, James Nylen, James Richards, James Rosado, jamil95, janak Kaneriya, janw.oostendorp, Jason Johnston, Javier Arce, Jayman Pandya, Jean-Baptiste Audras, Jeff Ong, Jeff Paul, Jeffrey Pearce, Jenny Dupuy, Jeremy Felt, Jeremy Herve, Jeremy Yip, jeremy80, JeroenReumkens, jeryj, jillebehm, Jip Moors, Joe Bailey-Roberts, Joe Dolson, Joe McGill, Joen Asmussen, Johan Jonk Stenström, Johannes Kinast, John Blackbourn, John Godley, John James Jacoby, John Sundberg, Jon Brown, Jon Surrell, Jonathan Desrosiers, Jonny Harris, Jono Alderson, Joost de Valk, Jorge Bernal, Jorge Costa, Josee Wouters, Josepha Haden, JoshuaDoshua, Joy, jsnajdr, Juan Aldasoro, Juliette Reinders Folmer, Julio Potier, Justin Ahinon, k3nsai, kaavyaiyer, Kai Hao, Kalpesh Akabari, Kapil Paul, Karolina Vyskocilova, Kelly Choyce-Dwan, Kelly Hoffman, Kerry Liu, Kishan Jasani, Kite, KittMedia, Kjell Reigstad, klevyke, Knut Sparhell, Koen Van den Wijngaert, Konstantin Obenland, Konstantinos Xenos, Kyle Nel, lakrisgubben, Lara Schenck, Larissa Murillo, Laxman Prajapati, LewisCowles, lifeforceinst, linux4me2, Lovro Hrust, Luis Sacristán, Luiz Araújo, Luke Carbis, m0ze, Maedah Batool, Maggie Cabrera, Maja Benke, Marco Ciampini, Marcus Kazmierczak, Marek Hrabe, Marin Atanasov, Marius L. J., Mark Jaquith, Mark Parnell, Marko Heijnen, Marty Helmick, Mary Baum, Mary Job, marylauc, Mathieu Viet, Matias Ventura, Matt Chowning, Matt Mullenweg, Maxime Pertici, mblach, Meet Makadia, Meher Bala, Mel Choyce-Dwan, meloniq, mensmaximus, Michael Babker, Michael Beckwith, Miguel Fonseca, Mikael Korpela, Mike Hansen, Mike Jolley, Mike Martel, Mike Schroder, Mikhail Kobzarev, Milan Dinić, Milana Cap, mkdgs, mmuyskens, mmxxi, Mohamed El Amine DADDOU, Mohammed Faragallah, Monika Rao, Morten Rand-Hendriksen, mrjoeldean, Mukesh Panchal, munyagu, Mustafa Uysal, mweichert, Nadir Seghir, Nalini Thakor, Naoki Ohashi, Naoko Takano, Nazrul Islam Nayan, nderambure, net, nicegamer7, Nicholas Garofalo, Nick Halsey, Nik Tsekouras, ninanmnm, Noah Allen, nvartolomei, oguzkocer, olafklejnstrupjensen, Olga Bulat, Olga Gleckler, Otshelnik-Fm, oxyrealm, Ozh, Paal Joachim Romdahl, palmiak, Panagiotis Angelidis, Paragon Initiative Enterprises, Pascal Birchler, Pascal Knecht, Pat, patricklindsay, Paul Biron, Paul Bunkham, Paul Schreiber, Paul Stonier, Paul Von Schrottky, Paulo Pinto, Pavel I, Paweł, Peter Wilson, Petter Walbø Johnsgård, phena109, Philip Jackson, Pierre SYLVESTRE, Pinar, Piotrek Boniu, Pippin Williamson, Pirate Dunbar, Pramod Jodhani, Presskopp, presstoke, pwallner, pyronaur, Q, Rachel Baker, rafhun, Rajesh Radadiya, Rami Yushuvaev, Ramon Ahnert, ramonopoly, Ravi Vaghela, ravipatel, Refael Iliaguyev, Rene Hermenau, retrofox, reynhartono, Riad Benguella, Rian Rietveld, Rima Prajapati, Rinat, Rnaby, robdxw, Robert Anderson, Robert Chapin, Roger Theriault, rogerlos, roo2, Roy, Russell Aaron, Ryan McCue, Ryan Welcher, Sérgio Gomes, Sören Wrede, Saša, Sabrina Zeidan, Sahil Mepani, Samir Shah, Samuel Wood (Otto), Sandip Mondal, Sanne van der Meulen, sarahricker, sarayourfriend, SASAPIYO, satrancali, savicmarko1985, Scott Lesovic, Scott Reilly, scottconnerly, scruffian, Sean Fisher, Sean Hayes, sebbb, Sergey Biryukov, Sergey Yakimov, SergioEstevao, shaunandrews, Shital Marakana, silb3r, Siobhan, SirStuey, snapfractalpop, spikeuk1, spytzo, stacimc, Stanislav Khromov, Stefan Hüsges, stefanjoebstl, Stefano Minoia, Stefanos Togoulidis, Stephen Bernhardt, Stephen Edgar, Steve Dufresne, Steve Grunwell, Steve Henty, Steven Word, Subrata Sarkar, Sumaiya Siddika, Suman, Sumit Singh, Sumit Singh, Sunny, sushmak, Sybre Waaijer, Synchro, szaqal21, tamlyn, Tammie Lister, Tellyworth, Terri Ann, Tetsuaki Hamano, them.es, Thomas Kräftner, Thomas Patrick Levy, Thomas Vitale, tigertech, Timothy Jacobs, TimoTijhof, Tkama, tmatsuur, tmdk, Tobias Zimpel, TobiasBg, tobifjellner (Tor-Bjorn Fjellner), Tom J Nowell, Toni Viemerö, Tonya Mork, Toro_Unit (Hiroshi Urabe), torres126, Torsten Landsiedel, Toru Miki, Travis Northcutt, trejder, Udit Desai, Ulrich, Utsav tilava, Vicente Canales, Vipul Chandel, Vlad T, wangql, WebDragon, Wendy Chen, Weston Ruter, William Earnhardt, williampatton, Xavi Ivars, Xristopher Anderton, Y_Kolev, Yan Sern, Yui, Yuliyan Slavchev, Yvette Sonneveld, Zack Krida, Zebulan Stanphill, zkancs, and 孙锡源.\n\n\n\n

\n\n\n\n

In addition to these contributors, many thanks to all of the community volunteers who contribute in the support forums. They answer questions from people across the world, whether they are using WordPress for the first time, or they’ve been around since the first release all the way back in 2003. These releases are as successful as they are because of their efforts!

\n\n\n\n

Finally, thanks to all the community translators who help make WordPress available in over 200 languages for every release. 80 languages have translated 80% or more WordPress 5.8 and our community translators are hard at work ensuring more languages are on their way. If contributing to WordPress appeals to you, it’s easy to learn more. Check out Make WordPress or the core development blog.

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"10976\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:4;a:6:{s:4:\"data\";s:58:\"\n \n \n \n \n \n \n \n\n \n \n \n \n \n\n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:7:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:55:\"WP Briefing: Episode 13: Cherishing WordPress Diversity\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:77:\"https://wordpress.org/news/2021/07/episode-13-cherishing-wordpress-diversity/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 19 Jul 2021 12:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:1:{i:0;a:5:{s:4:\"data\";s:11:\"wp-briefing\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"https://wordpress.org/news/?post_type=podcast&p=10949\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:357:\"In this episode, Josepha Haden Chomphosy discusses the importance of Diversity, Equity, and Inclusion to the fabric of the WordPress project and how we can move from a place of welcoming it to cherishing it. Have a question you’d like answered? You can submit them to wpbriefing@wordpress.org, either written or as a voice recording. Credits […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:9:\"enclosure\";a:1:{i:0;a:5:{s:4:\"data\";s:0:\"\";s:7:\"attribs\";a:1:{s:0:\"\";a:3:{s:3:\"url\";s:60:\"https://wordpress.org/news/files/2021/07/WP-Briefing-013.mp3\";s:6:\"length\";s:1:\"0\";s:4:\"type\";s:0:\"\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:15:\"Chloe Bringmann\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:14890:\"\n

In this episode, Josepha Haden Chomphosy discusses the importance of Diversity, Equity, and Inclusion to the fabric of the WordPress project and how we can move from a place of welcoming it to cherishing it.

\n\n\n\n

Have a question you’d like answered? You can submit them to wpbriefing@wordpress.org, either written or as a voice recording.

\n\n\n\n

Credits

\n\n\n\n

Editor: Dustin Hartzler

\n\n\n\n

Logo: Beatriz Fialho

\n\n\n\n

Production: Chloé Bringmann

\n\n\n\n

Song: Fearless First by Kevin MacLeod

\n\n\n\n

References

\n\n\n\n

Diverse Speaker Training Workshop

\n\n\n\n

A WordPress Dinner Party

\n\n\n\n

The Burden of Proof

\n\n\n\n

Leadership At Any Level

\n\n\n\n

Building a Culture of Safety

\n\n\n\n

Leadership Basics: Ethics in Communication

\n\n\n\n

WordPress 5.6

\n\n\n\n

Bonus resource: How to Be a WordPress Ally

\n\n\n\n

Transcript

\n\n\n\n\n\n\n\n

Josepha Haden Chomphosy  00:10

\n\n\n\n

Hello, everyone, and welcome to the WordPress Briefing, the podcast where you can catch quick explanations of the ideas behind the WordPress open source project, some insight into the community that supports it, and get a small list of big things coming up in the next two weeks. I’m your host, Josepha Haden Chomphosy. And before we get started, I have to be honest with you all, this episode and the next one have made me feel really anxious. This one is about Diversity, Equity, and Inclusion in open source, and especially in WordPress. And the next one is about accessibility in WordPress. And I feel like there’s just so much to do, and we don’t do enough, but we do what we can. And still, we will never be done with that work. And if you don’t know what I mean by Diversity, Equity, and Inclusion, you can kind of think of it this way. Diversity is bringing in people with different viewpoints and lived experiences. Equity is making sure everyone has what they need to get a fair chance of success, which is different from equality. And Inclusion is making sure that the environment is built to not only tolerate diverse groups but to celebrate them as well. So remember this as you listen to what I have to say here. We are never where we want to be in either of those spaces. But that shouldn’t stop us from looking at the things we have done to get us in the right direction. All right. Here we go.

\n\n\n\n

Josepha Haden Chomphosy  01:54

\n\n\n\n

I say a lot that we are a project that serves a majority collection of minority voices. WordPress is global in reach and open source in nature. And you would assume that what allows the software to be used by anyone would also enable it to be built by anyone. After all, your location doesn’t matter, and who employs you also doesn’t matter. And your relative social standing certainly shouldn’t matter. As long as you can communicate with the others contributing to the project, there should be no obstacle to your participation. The mission of the WordPress project is to democratize publishing, right? It’s to get the ability to have a website tap into passive income on your web presence. I mean, the job is to level the playing field for everyone. However, it’s my experience that bringing in new voices takes a lot of proactive work on behalf of leaders and contributors. It’s not enough to say, “Hey, I’m having a party,” you also have to say, “I’m having a party, and I’d like you to be there.” It’s not enough to think people will make their own space at this table. You have to make sure that you have table settings for everyone. And even beyond the basics of directing people to you. 

\n\n\n\n

Josepha Haden Chomphosy  03:12

\n\n\n\n

And on toward the next steps, you have to be honest about the fact that open source contribution requires a fair amount of privilege. By privilege, I mean the luxury of extra time or extra funding or just an understanding employer. WordPress supports 41% of the web. I think it’s 42% of the web right now. But less than 1% of people who use WordPress show up to help maintain it. And that 1% that does show up skews toward people who already have a pretty high level of representation and technology. And so, when you look at who is building it versus who is using it, it doesn’t always match. And since what we build so frequently reflects who we are, sometimes what we build doesn’t match the needs of the people who are using what we have.

\n\n\n\n

Josepha Haden Chomphosy  04:10

\n\n\n\n

So what has WordPress done to be proactive on the question of Diversity, Equity, and Inclusion? There are quite a few unseen things that have gone into this over the years and a few pretty visible things. This is a very long list. And it has a whole lot of just reference material. And so the show notes today will come in handy for people, and there will be just a laundry list of linked resources for everyone. 

\n\n\n\n

Josepha Haden Chomphosy  04:39

\n\n\n\n

But the first thing that WordPress has done is that we have accepted the burden of proof. I’m going to share a post about this in the show notes. That means we accept that it’s not the job of underrepresented folks to figure out if they are welcome. It’s up to us to make it clear that they are. So, there are three big little things that the community has done over the years. One is that many teams open their text-based meetings with an explanation of what is done in the meeting, who comes to the meetings, where to find help if you’re lost in the meeting, and for teams that have a specific type of requests that comes into those channels that aren’t handled in those channels. They also will share where people can go to get those requests taken care of. Many teams have also updated their team handbooks to have good beginner docs, limited use of inside jokes or jargon, and good first bugs. And also, there is a code of conduct in the community declaring that everyone is welcome and clarifies what to do if you see folks being unwelcoming. 

\n\n\n\n

Josepha Haden Chomphosy  05:51

\n\n\n\n

A second big thing that folks in the WordPress community have done is written down what was unwritten. Having things clearly documented unlocks institutional knowledge that you’d otherwise have to know someone to get. Clarity and process and the structure help anyone engage with your organization, not just the people who have extra time to figure things out. What that looks like in the WordPress project is that many teams have documented their workflows and their working spaces and just their general team norms. Many teams have also started defining what it means to be a team rep and holding open processes to choose those team reps. Many other community leaders and I have written down countless unspoken rules, guidelines, and philosophical underpinnings so that people don’t have to guess what we’re doing or why we’re doing things, or where we want to do them.

\n\n\n\n

Josepha Haden Chomphosy  06:46

\n\n\n\n

And the more visible thing that the WordPress project has been doing is that we found ways to invite people in, and they’re not failsafe; they’re not foolproof, but it is certainly a step in the right direction. The first one is an ongoing, diverse speaker training initiative. And I’ll include a link to that in the show notes as well. It is run by Jill Binder and a fantastic group of contributors that collaborate with her. And I really have loved watching that particular program grow and flourish and help WordPress make a difference where we absolutely can. 

\n\n\n\n

Josepha Haden Chomphosy  07:27

\n\n\n\n

The second thing that was pretty visible about how we invited people in was at the end of 2020, and we had an all-women and nonbinary release squad for our biggest release of the year; WordPress 5.6. I had a group of probably 70 women and nonbinary identifying folx who joined in the process and joined in learning more about the process. Some of them have continued in the project. Others have stepped away for various reasons. But all of them are welcome to return. And I encourage everyone to return to contribution when time and resources make that possible for you. 

\n\n\n\n

Josepha Haden Chomphosy  08:09

\n\n\n\n

And then the third thing that we’ve done, which I have talked about a lot, is the revival of the testing and triage practices. That has been work that’s been ongoing for a number of years. And it happens across multiple teams. It is not always immediately clear to people why the testing work. And the triage work is identifiable for me as a way to invite people into this process. And so I’ll be briefly clear about it right now. So testing as a practice brings in the users that otherwise don’t have a lot of spare time and that extra privilege to like, figure out what’s going on with WordPress, and contribute their own fixes to problems. They can give back to this project by being co-developers with us, co-creators with our entire process of making WordPress real and usable for the largest number of people that we can because we now support 42% of the web. And then, the triage practice invites in a diverse voice of people. Because you don’t necessarily always need to know everything about a project to help with triage. And when you’re helping with triage, you get active learning through participating in the process. But you also get passive learning from the people who already know huge amounts about the project and the process and everything that goes into it. And so it’s a low key low stress way to get your feet wet and start building that knowledge that sometimes is hard to come by unless you are actively working in it. So the testing practices, the triage practices, I really to the core of my being believe that those are active and ongoing ways for us to invite people who otherwise wouldn’t have a chance to get their voices heard in an open source project. And y’all, as I said at the start, y’all, there’s nothing about this list that I just shared, which makes me feel like our work on this is done. Just like any muscle, you don’t fight to peak fitness, and then hit the big stop button on time and say, “Now, I never have to work out again.” If we did, the world would be a very different place probably. But it does then lead us to the next steps for fostering a community culture that’s as broad as the people who use this software. If you believe in leadership at any level, as I do, there are a ton of things that you can do right now. But I’ll boil them down into three big chunks of things.

\n\n\n\n

Josepha Haden Chomphosy  10:54

\n\n\n\n

First, check your community area, or whatever community you want to apply this to, for things that need a little more proactive work. I will share a post called Building A Culture of Safety that will take you through a list of good first steps. And it is not as hard as it looks. When you say build a culture of safety, there are many really clear-cut minor changes that you can ask people to make and, in like, four or five different areas that can help your community be more welcoming and more open. 

\n\n\n\n

Josepha Haden Chomphosy  11:30

\n\n\n\n

The second thing that you can do is know that small changes add up over time and commit to making those changes where you can. If you are elite at any level, you know that supporting people and processes is the responsibility of everyone in the group. And if you can make your own autonomous decisions and commit to making small changes that make a big difference over time, you will be part of that solution. And that is not specific to any one group that we have in our communities. You can be an ally for anyone, whether they look like you, whether they have your same experiences, or not. And sometimes, it’s as easy as just holding space for the people who haven’t had a chance to talk yet. And on the subject of holding space and the way that we communicate. 

\n\n\n\n

Josepha Haden Chomphosy  12:22

\n\n\n\n

The third thing that I think is incredibly important is that you can take on as a foundational personal practice the concept of ethical communication. I’ll share a post about that as well in the show notes, but the core of it is that you have to know that what you say and don’t say what you do and don’t do has an impact on others and embrace that responsibility. All right, so you made it all the way through, and I am so proud of you. I’m sure you have questions about this. And I encourage you to share those. You can email them to me at wp briefing@wordpress.org.

\n\n\n\n

Josepha Haden Chomphosy  13:10

\n\n\n\n

This brings us to our small list of big things. I’ve got two things for you today. First and foremost, WordPress 5.8 gets released tomorrow. It’s a big release, and lots of people have been working on it. So get your update processes ready and keep an eye on wordpress.org/news for the announcement post. Second, and still pretty important, team reps have been working on their quarterly check-ins so that all other teams can get an idea of what’s happening around the WordPress office. Keep an eye out for that post on make.wordpress.org/updates. And that is your smallest of big things. Thank you for tuning in today for the WordPress Briefing. I’m your host Joseph Hayden Chomphosy, and I’ll see you again in a couple of weeks.

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"10949\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:5;a:6:{s:4:\"data\";s:63:\"\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:33:\"WordPress 5.8 Release Candidate 3\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:69:\"https://wordpress.org/news/2021/07/wordpress-5-8-release-candidate-3/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 14 Jul 2021 01:09:26 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:3:{i:0;a:5:{s:4:\"data\";s:11:\"Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:3:\"5.8\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=10933\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:303:\"The third release candidate for WordPress 5.8 is now available! WordPress 5.8 is slated for release on July 20, 2021, and we need your help to get there—if you have not tried 5.8 yet, now is the time! You can test the WordPress 5.8 release candidate 3 in any of these three ways: Install and […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"Jeffrey Paul\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:3233:\"\n

The third release candidate for WordPress 5.8 is now available!

\n\n\n\n

WordPress 5.8 is slated for release on July 20, 2021, and we need your help to get there—if you have not tried 5.8 yet, now is the time!

\n\n\n\n

You can test the WordPress 5.8 release candidate 3 in any of these three ways:

\n\n\n\n
  • Install and activate the WordPress Beta Tester plugin (select the Bleeding edge channel and then Beta/RC Only stream)
  • Directly download the release candidate version (zip)
  • Use WP-CLI to test: wp core update --version=5.8-RC3
\n\n\n\n

Thank you to all of the contributors who tested the Beta/RC releases and gave feedback. Testing for bugs is a critical part of polishing every release and a great way to contribute to WordPress.

\n\n\n\n

Plugin and Theme Developers

\n\n\n\n

Please test your plugins and themes against WordPress 5.8 and update the Tested up to version in the readme file to 5.8. If you find compatibility problems, please be sure to post to the support forums so we can work to solve them in time for the final release.

\n\n\n\n

For a more detailed breakdown of the changes included in WordPress 5.8, check out the WordPress 5.8 beta 1 post. The WordPress 5.8 Field Guide, which is particularly useful for developers, has all the info and further links to help you get comfortable with the major changes.

\n\n\n\n

How to Help

\n\n\n\n

Can you speak and write in a language other than English?  Help us translate WordPress into more than 100 languages!

\n\n\n\n

If you think you have found a bug, you can post to the Alpha/Beta area in the support forums. We would love to hear from you! If you are comfortable writing a reproducible bug report, file one on WordPress Trac, where you can also find a list of known bugs.

\n\n\n\n

Props to @cbringmann, @chanthaboune, and @marybaum for peer-reviewing!

\n\n\n\n
\n\n\n\n

Code is poetry
Jazz is improvisation
Both are forms of art

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"10933\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:6;a:6:{s:4:\"data\";s:63:\"\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:33:\"WordPress 5.8 Release Candidate 2\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:69:\"https://wordpress.org/news/2021/07/wordpress-5-8-release-candidate-2/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 07 Jul 2021 01:12:57 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:3:{i:0;a:5:{s:4:\"data\";s:11:\"Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:3:\"5.8\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=10912\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:305:\"The second release candidate for WordPress 5.8 is now available! 🎉 WordPress 5.8 is slated for release on July 20, 2021, and we need your help to get there—if you have not tried 5.8 yet, now is the time! You can test the WordPress 5.8 release candidate 2 in any of these three ways: Install […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"Jeffrey Paul\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:3376:\"\n

The second release candidate for WordPress 5.8 is now available! \"🎉\"

\n\n\n\n

WordPress 5.8 is slated for release on July 20, 2021, and we need your help to get there—if you have not tried 5.8 yet, now is the time!

\n\n\n\n

You can test the WordPress 5.8 release candidate 2 in any of these three ways:

\n\n\n\n
  • Install and activate the WordPress Beta Tester plugin (select the Bleeding edge channel and then Beta/RC Only stream)
  • Directly download the release candidate version (zip)
  • Use WP-CLI to test: wp core update --version=5.8-RC2
\n\n\n\n

Thank you to all of the contributors who tested the Beta/RC releases and gave feedback. Testing for bugs is a critical part of polishing every release and a great way to contribute to WordPress.

\n\n\n\n

Plugin and Theme Developers

\n\n\n\n

Please test your plugins and themes against WordPress 5.8 and update the Tested up to version in the readme file to 5.8. If you find compatibility problems, please be sure to post to the support forums, so they can get ready for the final release.

\n\n\n\n

For a more detailed breakdown of the changes included in WordPress 5.8, check out the WordPress 5.8 beta 1 post. The WordPress 5.8 Field Guide, which is particularly useful for developers, has all the info and further links to help you get comfortable with the major changes.

\n\n\n\n

How to Help

\n\n\n\n

Can you speak and write in a language other than English?  Help us translate WordPress into more than 100 languages!

\n\n\n\n

If you think you have found a bug, you can post to the Alpha/Beta area in the support forums. We would love to hear from you! If you are comfortable writing a reproducible bug report, file one on WordPress Trac, where you can also find a list of known bugs.

\n\n\n\n

Props to @lukecarbis for the haiku, @webcommsat and @marybaum for peer reviewing!

\n\n\n\n
\n\n\n\n

Five-eight in two weeks
So test your plugins and themes
Update your readme

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"10912\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:7;a:6:{s:4:\"data\";s:58:\"\n \n \n \n \n \n \n \n\n \n \n \n \n \n\n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:7:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:49:\"WP Briefing: Episode 12: WordPress – In Person!\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:66:\"https://wordpress.org/news/2021/07/episode-12-wordpress-in-person/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 05 Jul 2021 12:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:1:{i:0;a:5:{s:4:\"data\";s:11:\"wp-briefing\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"https://wordpress.org/news/?post_type=podcast&p=10889\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:384:\"In this episode, Josepha Haden Chomphosy talks about WordPress – In Person! The WordPress events that provide the dark matter of connection that helps sustain the open source project. Have a question you’d like answered? You can submit them to wpbriefing@wordpress.org, either written or as a voice recording. Credits Editor: Dustin Hartzler Logo: Beatriz Fialho […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:9:\"enclosure\";a:1:{i:0;a:5:{s:4:\"data\";s:0:\"\";s:7:\"attribs\";a:1:{s:0:\"\";a:3:{s:3:\"url\";s:60:\"https://wordpress.org/news/files/2021/07/WP-Briefing-012.mp3\";s:6:\"length\";s:1:\"0\";s:4:\"type\";s:0:\"\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:15:\"Chloe Bringmann\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:13118:\"\n

In this episode, Josepha Haden Chomphosy talks about WordPress – In Person! The WordPress events that provide the dark matter of connection that helps sustain the open source project.

\n\n\n\n

Have a question you’d like answered? You can submit them to wpbriefing@wordpress.org, either written or as a voice recording.

\n\n\n\n

Credits

\n\n\n\n

Editor: Dustin Hartzler

\n\n\n\n

Logo: Beatriz Fialho

\n\n\n\n

Production: Chloé Bringmann

\n\n\n\n

Song: Fearless First by Kevin MacLeod

\n\n\n\n

References

\n\n\n\n

The tragedy of the commons

\n\n\n\n

WordPress 5.8 Release Candidate announcement

\n\n\n\n

Transcript

\n\n\n\n\n\n\n\n

Josepha Haden Chomphosy  00:11

\n\n\n\n

Hello, everyone, and welcome to the WordPress Briefing, the podcast where you can catch quick explanations of the ideas behind the WordPress open source project, some insight into the community that supports it, and get a small list of big things coming up in the next two weeks. I’m your host, Josepha Haden Chomphosy. Here we go!

\n\n\n\n

Josepha Haden Chomphosy  00:39

\n\n\n\n

Today we’re talking about one of my favorite parts of the project – WordPress events. The in-person component of the project is the dark matter that helps us build resilience and thrive as a group. A lot of what I’m going to share applies to every WordPress event, whether it’s a meetup or workshop, a contributor day, any other sort of format. But I’ll be focused on WordCamps. It’s been a while since we had any in-person WordCamps. Our last two were WordCamp Malaga in Spain and WordCamp Greenville in the US. But that hasn’t stopped anyone from gathering people together online. Which honestly makes a lot of sense for WordPress. Because there are many reasons we gather, the main three reasons are connecting, inspiring, and contributing. It’s true. It says so right in our documentation, “paper rustling.” All WordPress events should connect WordPress users, inspire people to do more with WordPress, and contribute to the WordPress project. As an aside, I’ll tell you that some groups also get to collaborate and educate in there, but connect, inspire, contribute. Those are the big three. And that’s what I’m talking about today. And if you subscribe to this podcast for the back office deep cuts, I’ll also have a few of those for you. 

\n\n\n\n

Josepha Haden Chomphosy  01:57

\n\n\n\n

Alright, so first up, connect. WordCamps are generally annual-ish gatherings organized by local WordPress meetup groups. They’re not meant to be big or fancy. The definition of the minimum viable product for WordCamp is 50 people gathered all day to talk about WordPress. They are intentionally affordable to allow people from all walks of life to attend, meet, share and learn. This is made possible by donations and sponsorships from local businesses and larger businesses in the WordPress ecosystem. And this helps us get people connected to those in their community that works with or are sustained by WordPress. That connection feeds into the overall health of the global WordPress project. 

\n\n\n\n

Josepha Haden Chomphosy  02:45

\n\n\n\n

Next up is inspire. WordCamps do not discriminate. They are open to any WordPress users, developers, designers, or other enthusiasts, regardless of their level of experience. And because of this, sessions generally span a variety of formats. So presentations or live demos to workshops or panels, any other format you can think of. But that also means that there are a variety of skill levels represented. There’s always content about how to use WordPress. That’s a given. But you can also count on content that inspires people to do more with their own dreams and aspirations. When I was still organizing WordCamps, my favorite thing was seeing people who came back year after year, putting into practice something that they learned the year before. It is that Choose Your Own Adventure aspect to WordCamps that lets people see the edge of their ideas and then expand that just a little bit further. 

\n\n\n\n

Josepha Haden Chomphosy  03:42

\n\n\n\n

And finally, contribute. WordCamps often have a contribution component to them. Sometimes it’s just a talk telling you how you can get more involved in the WordPress project. But sometimes, it’s a whole contributor day. And those range in size from single focus, like everyone, will show up and learn how to review a theme or a focus from every team that we have, like at the big flagship events where we gather hundreds of people into a room just to contribute to WordPress and all of the teams that go with it. Getting started with contributing can be daunting, but it is also essential to avoid something called the Tragedy of the Commons, an economic concept. So I’ll share a link to that in the show notes below. But the most important thing, the most important thing to remember, is that WordPress is open source. And we asked people to help us keep this great tool running by giving back a little bit of their time if they have gotten any benefit from the WordPress project or CMS over the course of their careers. 

\n\n\n\n

Josepha Haden Chomphosy  04:40

\n\n\n\n

So that’s it. The three big things you can get from a WordCamp. I know that I can’t wait to get back to them myself because while a lot of these things can still happen online and do, it’s really hard to replace the dark matter of in-person connections for open source projects. And since we’re talking dark matter anyway, let’s dig into it a little.

\n\n\n\n

Josepha Haden Chomphosy  05:01

\n\n\n\n

At the start of the section, I mentioned that WordCamps are local, locally organized, and people are encouraged to attend locally. But I am part of a group that ends up traveling to a lot of WordCamps. If you don’t know about the unseen work of WordPress, this raises eyebrows. So here is some clarification around the back office work that some of these traveling WordCampers often do. When I listed these out, there were about 20 different tasks, 20 different jobs, which was, frankly, a bit overwhelming when I listed them that way. So I’ve grouped them into kind of two genres, each with a group of current versus future types of work. So my two big buckets, big picture stuff, and then community stewardship. 

\n\n\n\n

Josepha Haden Chomphosy  05:50

\n\n\n\n

The big picture stuff, our first big genre here, when you’re looking at current topics, current issues kind of information, when we’re working on big picture stuff, you get the clarification of the mission or vision of WordPress, the sharing of open source methods or processes that we use in the WordPress project, and also sometimes those goal-setting conversations that you have to have both because we have a bunch of teams and team reps, that have a lot of really great ideas about what can be done in their teams to help WordPress succeed. But then also, because when you are working, when you’re contributing to a single team in the project, it can sometimes be hard to know how your work relates to the overall goals and visions of WordPress. And so that’s part of the work that gets done that I do there. 

\n\n\n\n

Josepha Haden Chomphosy  06:43

\n\n\n\n

And when you’re looking at future topics, future issues, the second part of this genre, that stuff like starting conversations or discussions around what the future holds for WordPress, and that’s the project as well as the technology or hearing from people about big things coming up for them. And any content that can support it, anything that I can provide to support those big things. It’s also a good time for me and others to identify trends based on what I see in presentations or what I hear from people at social functions. Really, it’s just a huge opportunity for information gathering to make sure that I know what everyone else in the project is trying to do and if they understand what the project is trying to do. 

\n\n\n\n

Josepha Haden Chomphosy  07:32

\n\n\n\n

And then the second big genre of things that happen in that dark matter kind of work at WordCamps is what I call community stewardship—so taking care of the community itself for the project itself. And a lot of that work is actually incident response kind of work. So conflict resolution, mediation often happens at in-person events, but also uncovering the shared foundations, the shared understanding for upcoming changes. So a lot of really, in the weeds kind of change management work. And for me, it’s certainly doing my best as a cultural liaison when I do see that there has been some miscommunication or gathering context for the latest disagreement that people are having with me so that I can clarify anything that was misunderstood from what I said. And also a little bit of policy clarification, just explaining why we do things and the way we do them. So for community stewardship, that’s kind of the current stuff that we look at. And that I do when I’m traveling for WordCamps. 

\n\n\n\n

Josepha Haden Chomphosy  08:36

\n\n\n\n

And then for the future tasks that we do with community stewardship in the project, that stuff like training, and that’s training team reps, community deputies, or new contributors like it’s, it’s not really one type of training, necessarily. But then also, all of the checking in with our organizers, team reps, volunteers, sponsors, everyone like that, to make sure that what we have in the project and what’s happening in the project, the tools that we have, the experience that contributors have while they are working here, and WordPress is good, and is what they need. We’ve got a lot of tools to get things done in WordPress, and we can always make them better. And so checking in with people to kind of see how those processes are, how the tools are making sure that I have an idea of where our holes are and what needs to be patched, and how we can patch them in the long run. So that’s all of the future planning kind of work and topic stuff, just you know, making sure that WordPress has what it needs to survive long into the future and long after I’m doing anything with it, and long after you’re doing anything with it either. 

\n\n\n\n

Josepha Haden Chomphosy  09:56

\n\n\n\n

So, lots and lots of unseen work being done at our in-person events. But folks who keep a keen eye on the online global work of WordPress will probably recognize that a lot of that work is also done routinely on make.wordpress.org and within the making WordPress Slack. There’s just, I don’t know, there’s just something different about receiving information from a human being with a face rather than an avatar with a photo. So I guess at the end of the day, that means the dark matter that keeps open source together is really an issue of communication. And you’ll get no arguments for me there.

\n\n\n\n

Josepha Haden Chomphosy  10:44

\n\n\n\n

That brings us now to our small list of big things. And there’s really just one big thing. And that’s WordPress 5.8. We are about two weeks away from this big release; the community has been working tirelessly on it. And it’s shaping up to be one of the most tested releases that we’ve had in a long time. Myself, I’m grateful to see so much activity before the release. Since 5.8 and 5.9 releases represent such monumental shifts in our software, I’m incredibly grateful to see so much activity prior to the release, especially in the beta period. We’ve been testing everything for it feels like six or eight months, and we’re really starting to see the positive benefits of that. And I think that we, the WordPress community, should be really proud of everything that we’re going to ship in 2021. Okay, so that was less of a small list of big things and really like one big thing with a generous garnish of encouragement, but you deserve it. So thank you for tuning in today for the WordPress briefing. I’m your host, Josepha Haden Chomphosy, and I’ll see you again in a couple of weeks.

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"10889\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:8;a:6:{s:4:\"data\";s:57:\"\n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:33:\"The Month in WordPress: June 2021\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:68:\"https://wordpress.org/news/2021/07/the-month-in-wordpress-june-2021/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 02 Jul 2021 15:11:24 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Month in WordPress\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=10896\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:334:\"Once you step into contribution time, your main concern is the users of WordPress, or new contributors, or the health of the WordPress ecosystem as a whole or the WordPress project. So you get all this subject matter expertise from competitive forces, collaborating in a very “us versus the problem” way. And when you do […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Hari Shanker R\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:11608:\"\n

Once you step into contribution time, your main concern is the users of WordPress, or new contributors, or the health of the WordPress ecosystem as a whole or the WordPress project. So you get all this subject matter expertise from competitive forces, collaborating in a very “us versus the problem” way. And when you do that, you’re always going to find a great solution.

\n\n\n\n

In the “WordCamp Europe 2021 in Review” episode of the WP Briefing podcast, Josepha Haden talks about the importance of collaboration, which is vital in building WordPress. This edition of The Month in WordPress covers exciting updates that exemplify this philosophy. 

\n\n\n\n
\n\n\n\n

Updates on WordPress 5.8

\n\n\n\n

Get excited, folks! The beta versions and the first release candidate of WordPress 5.8 are out. Beta 1 came out on June 9, followed by Beta 2 on June 15, Beta 3 on June 23, and Beta 4 on June 25. The first release candidate of WordPress 5.8 was published on June 30. You can test the beta versions and the release candidates by downloading them from WordPress.org or by using the WordPress Beta Tester plugin. WordPress 5.8 will be out by July 20, 2021, and is also ready to be translated.

\n\n\n\n

Want to contribute to WordPress core? Check out the Core Contributor Handbook. Don’t forget to join the WordPress #core channel in the Make WordPress Slack and follow the Core Team blog. The Core Team hosts weekly chats on Wednesdays at 5 AM and 8 PM UTC. Help us promote WordPress 5.8 by organizing meetups about the release, producing social media marketing materials for 5.8, or testing the release.

\n\n\n\n

Gutenberg versions 10.8 and 10.9 are out

\n\n\n\n

We said hello to Gutenberg version 10.8 and version 10.9 this month. Version 10.8 adds rich URL previews, enhancements to the list view, and an updated block manager. Version 10.9 offers several performance enhancements, along with more block design tools and template editor enhancements.

\n\n\n\n

Want to get involved in building Gutenberg? Follow the Core Team blog, contribute to Gutenberg on GitHub, and join the #core-editor channel in the Make WordPress Slack. The “What’s next in Gutenberg” post offers more details on the latest updates. 

\n\n\n\n

WordCamp Europe 2021 concludes

\n\n\n\n

One of the biggest and most exciting WordPress events, WordCamp Europe 2021, was held from June 7-9, 2021. A team of 40 members organized the event, which had 3200+ registrations, 42 speakers, and 43 sponsors. What a success! You will find more details in the event recap. One highlight was a Gutenberg demo hosted by Matías Ventura and Matt Mullenweg. You can watch the event recording on the WordCamp Europe YouTube channel, and videos are now available on WordPress.tv as well. The team has announced WordCamp Europe 2022, which is being planned as an in-person event in Porto, Portugal. Want to be a part of the 2022 WCEU organizing team? Their call for organizers is now open. Apply now!

\n\n\n\n

Full Site Editing updates

\n\n\n\n

Don’t miss the latest Full Site Editing (FSE) Outreach program testing call: “Thrive with theme.json”, which is aimed at a developer-centric audience. The deadline is July 14. Also don’t miss a hallway hangout on testing theme.json on July 7 at 5 PM UTC. The team has published a recap of the Published Portfolios testing call, which shares some interesting results. 

\n\n\n\n

BuddyPress 8.0 is out!

\n\n\n\n

The first major BuddyPress release of 2021, version 8.0 “Alfano,” came out on June 6. The short-cycle release offers features such as the ability to recruit new members, an improved registration experience, and profile field types. Download it from the WordPress.org plugin directory or check it out from its Subversion repository.

\n\n\n\n
\n\n\n\n

Further reading

\n\n\n\n\n\n\n\n

Have a story that we should include in the next “Month in WordPress” post? Please submit it using this form

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"10896\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:9;a:6:{s:4:\"data\";s:63:\"\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"WordPress 5.8 Release Candidate\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:67:\"https://wordpress.org/news/2021/06/wordpress-5-8-release-candidate/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 30 Jun 2021 03:47:48 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:3:{i:0;a:5:{s:4:\"data\";s:11:\"Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:3:\"5.8\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=10873\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:364:\"The first release candidate for WordPress 5.8 is now available! 🎉 Please join us in celebrating this very important milestone in the community’s progress towards the final release of WordPress 5.8! “Release Candidate” means the new version is ready for release, but with thousands of plugins and themes and differences in how the millions of […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"Jeffrey Paul\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:4776:\"\n

The first release candidate for WordPress 5.8 is now available! \"🎉\"

\n\n\n\n

Please join us in celebrating this very important milestone in the community’s progress towards the final release of WordPress 5.8!

\n\n\n\n

“Release Candidate” means the new version is ready for release, but with thousands of plugins and themes and differences in how the millions of people use WordPress, it is possible something was missed. WordPress 5.8 is slated for release on July 20, 2021, but your help is needed to get there—if you have not tried 5.8 yet, now is the time!

\n\n\n\n

You can test the WordPress 5.8 release candidate in three ways:

\n\n\n\n
  • Install and activate the WordPress Beta Tester plugin (select the Bleeding edge channel and then Beta/RC Only stream)
  • Directly download the release candidate version (zip)
  • Using WP-CLI to test: wp core update --version=5.8-RC1
\n\n\n\n

Thank you to all of the contributors who tested the Beta releases and gave feedback. Testing for bugs is a critical part of polishing every release and a great way to contribute to WordPress.

\n\n\n\n

What is in WordPress 5.8?

\n\n\n\n

The second release of 2021 continues to progress on the block editor towards the promised future of full site editing with these updates:

\n\n\n\n
  • Manage Widgets with Blocks
  • Display Posts with New Blocks and Patterns
  • Edit Post Templates
  • Overview of the Page Structure
  • Suggested Patterns for Blocks
  • Style and Colorize Images
  • theme.json
  • Dropping support for IE11
  • Adding support for WebP
  • Adding Additional Block Supports
  • Version 10.7 of the Gutenberg plugin
\n\n\n\n

WordPress 5.8 also has lots of refinements to enhance the developer experience. To learn more, subscribe to the Make WordPress Core blog and pay special attention to the developer notes tag for updates on those and other changes that could affect your products.

\n\n\n\n

Plugin and Theme Developers

\n\n\n\n

Please test your plugins and themes against WordPress 5.8 and update the Tested up to version in the readme file to 5.8. If you find compatibility problems, please be sure to post to the support forums, so those can be figured out before the final release.

\n\n\n\n

The WordPress 5.8 Field Guide, due to be published very shortly, will give you a deeper dive into the major changes.

\n\n\n\n

How to Help

\n\n\n\n

Do you speak a language other than English?  Help us translate WordPress into more than 100 languages!  This release also marks the hard string freeze point of the 5.8 release schedule.

\n\n\n\n

If you think you have found a bug, you can post to the Alpha/Beta area in the support forums. We would love to hear from you! If you are comfortable writing a reproducible bug report, file one on WordPress Trac, where you can also find a list of known bugs.

\n\n\n\n

Props to @audrasjb, @cbringmann, @webcommsat, and @pbiron for copy suggestions and final review.

\n\n\n\n
\n\n\n\n

We are almost there,
WordPress 5.8 comes next month.
We need your help: test!

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"10873\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:10;a:6:{s:4:\"data\";s:63:\"\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:20:\"WordPress 5.8 Beta 4\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://wordpress.org/news/2021/06/wordpress-5-8-beta-4/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 25 Jun 2021 17:14:06 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:3:{i:0;a:5:{s:4:\"data\";s:11:\"Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:3:\"5.8\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=10855\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:331:\"WordPress 5.8 Beta 4 is now available for testing! This software is still in development, so it is not recommended to run this version on a production site. Consider setting up a test site to play with it. You can test the WordPress 5.8 Beta 4 in three ways: Install/activate the WordPress Beta Tester plugin (select […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"Jeffrey Paul\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:4104:\"\n

WordPress 5.8 Beta 4 is now available for testing!

\n\n\n\n

This software is still in development, so it is not recommended to run this version on a production site. Consider setting up a test site to play with it.

\n\n\n\n

You can test the WordPress 5.8 Beta 4 in three ways:

\n\n\n\n
  • Install/activate the WordPress Beta Tester plugin (select the Bleeding edge channel and the Beta/RC Only stream).
  • Direct download the beta version here (zip).
  • Using WP-CLI to test: wp core update --version=5.8-beta4
\n\n\n\n

The current target for the final release is July 20, 2021. That’s less than four weeks away, so we need your help to make sure the final release is as good as it can be.

\n\n\n\n

Some Highlights

\n\n\n\n

Since Beta 3, 18 bugs have been fixed. Most tickets focused on polishing existing default themes, fixing bugs in the new block Widget screen, and squashing Editor bugs collected during beta.

\n\n\n\n

How You Can Help

\n\n\n\n

Watch the Make WordPress Core blog for 5.8-related developer notes in the coming weeks, which will break down these and other changes in greater detail.

\n\n\n\n

So far, contributors have fixed 254 tickets in WordPress 5.8, including 91 new features and enhancements, and more bug fixes are on the way.

\n\n\n\n

Do some testing!

\n\n\n\n

Testing for bugs is a vital part of polishing the release during the beta stage and a great way to contribute. \"✨\"

\n\n\n\n

If you think you’ve found a bug, please post to the Alpha/Beta area in the support forums. We would love to hear from you! If you’re comfortable writing a reproducible bug report, file one on WordPress Trac. That’s also where you can find a list of known bugs.

\n\n\n\n

Props to @desrosj @clorith for reviews and @chanthaboune for final edits!

\n\n\n\n
\n\n\n\n

Releasing software
Is complex when open source
Yet WordPressers do

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"10855\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:11;a:6:{s:4:\"data\";s:60:\"\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:20:\"WordPress 5.8 Beta 3\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://wordpress.org/news/2021/06/wordpress-5-8-beta-3/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 23 Jun 2021 02:36:26 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:2:{i:0;a:5:{s:4:\"data\";s:11:\"Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=10843\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:331:\"WordPress 5.8 Beta 3 is now available for testing! This software is still in development, so it is not recommended to run this version on a production site. Consider setting up a test site to play with it. You can test the WordPress 5.8 Beta 3 in three ways: Install/activate the WordPress Beta Tester plugin (select […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:7:\"Josepha\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:5777:\"\n

WordPress 5.8 Beta 3 is now available for testing!

\n\n\n\n

This software is still in development, so it is not recommended to run this version on a production site. Consider setting up a test site to play with it.

\n\n\n\n

You can test the WordPress 5.8 Beta 3 in three ways:

\n\n\n\n
  • Install/activate the WordPress Beta Tester plugin (select the Bleeding edge channel and the Beta/RC Only stream).
  • Direct download the beta version here (zip).
  • Using WP-CLI to test: wp core update --version=5.8-beta3
\n\n\n\n

The current target for the final release is July 20, 2021. That’s just four weeks away, so we need your help to make the final release is as good as it can be.

\n\n\n\n

Some Highlights

\n\n\n\n

Since Beta 2, 38 bugs have been fixed. Here is a summary of some of the included changes:

\n\n\n\n
  • Block Editor: Move caching to endpoint for unique responses. (#53435)
  • Bundled Themes: Improve display of blocks in widget areas. (#53422)
  • Coding Standards: Bring some consistency to HTML formatting in wp-admin/comment.php. (#52627)
  • Editor: Include Cover block in the list of block types registered using metadata files. (#53440)
  • Editor: Include Cover block in the list of block types registered using metadata files. (#53440)
  • Media: Add new functions to return the previous/next attachment links. (#45708)
  • Media: Improve upload page media item layout on smaller screens. (#51754)
  • Media: Update total attachment count when media added or removed. (#53171)
  • REST API: Decode single and double quote entities in widget names and descriptions. (#53407)
  • Twenty Nineteen: Update margins on full- and wide-aligned blocks in the editor. (#53428)
  • Widgets: Add editor styles to the widgets block editor. (#53344)
\n\n\n\n

How You Can Help

\n\n\n\n

Watch the Make WordPress Core blog for 5.8-related developer notes in the coming weeks, which will break down these and other changes in greater detail.

\n\n\n\n

So far, contributors have fixed 254 tickets in WordPress 5.8, including 91 new features and enhancements, and more bug fixes are on the way.

\n\n\n\n

Do some testing!

\n\n\n\n

Testing for bugs is a vital part of polishing the release during the beta stage and a great way to contribute. \"✨\"

\n\n\n\n

If you think you’ve found a bug, please post to the Alpha/Beta area in the support forums. We would love to hear from you! If you’re comfortable writing a reproducible bug report, file one on WordPress Trac. That’s also where you can find a list of known bugs.

\n\n\n\n

Props to @jeffpaul @desrosj @hellofromtonya @pbiron for reviews and final edits!

\n\n\n\n
\n\n\n\n

Esperanza first.
Want to know the next jazzer?
Then please test beta.

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"10843\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:12;a:6:{s:4:\"data\";s:58:\"\n \n \n \n \n \n \n \n\n \n \n \n \n \n\n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:7:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:55:\"WP Briefing: Episode 11: WordCamp Europe 2021 in Review\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:77:\"https://wordpress.org/news/2021/06/episode-11-wordcamp-europe-2021-in-review/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 21 Jun 2021 12:33:22 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:1:{i:0;a:5:{s:4:\"data\";s:11:\"wp-briefing\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"https://wordpress.org/news/?post_type=podcast&p=10837\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:364:\"In this episode, Josepha Haden Chomphosy does a mini deep dive into WordCamp Europe 2021, specifically the conversation between the project’s co-founder, Matt Mullenweg, and Brian Krogsgard formerly of PostStatus. Tune in to hear her take and for this episode’s small list of big things. Have a question you’d like answered? You can submit them […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:9:\"enclosure\";a:1:{i:0;a:5:{s:4:\"data\";s:0:\"\";s:7:\"attribs\";a:1:{s:0:\"\";a:3:{s:3:\"url\";s:60:\"https://wordpress.org/news/files/2021/06/WP-Briefing-011.mp3\";s:6:\"length\";s:1:\"0\";s:4:\"type\";s:0:\"\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:15:\"Chloe Bringmann\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:10500:\"\n

In this episode, Josepha Haden Chomphosy does a mini deep dive into WordCamp Europe 2021, specifically the conversation between the project’s co-founder, Matt Mullenweg, and Brian Krogsgard formerly of PostStatus. Tune in to hear her take and for this episode’s small list of big things.

\n\n\n\n

Have a question you’d like answered? You can submit them to wpbriefing@wordpress.org, either written or as a voice recording.

\n\n\n\n

Credits

\n\n\n\n

Editor: Dustin Hartzler

\n\n\n\n

Logo: Beatriz Fialho

\n\n\n\n

Production: Chloé Bringmann

\n\n\n\n

Song: Fearless First by Kevin MacLeod

\n\n\n\n

References

\n\n\n\n

Gutenberg Highlights 

\n\n\n\n

Matt Mullenweg in conversation with Brian Krogsgard 

\n\n\n\n

5.8 Development Cycle

\n\n\n\n

WordCamp Japan

\n\n\n\n

A recap on WCEU 2021

\n\n\n\n

Transcript

\n\n\n\n\n\n\n\n

Josepha Haden Chomphosy 00:10

\n\n\n\n

Hello, everyone, and welcome to the WordPress Briefing, the podcast where you can catch quick explanations of the ideas behind the WordPress open source project, some insights into the community that supports it, and get a small list of big things coming up in the next two weeks. I’m your host, Josepha Haden Chomphosy. Here we go!

\n\n\n\n

Josepha Haden Chomphosy 00:40

\n\n\n\n

A couple of weeks ago, we hosted WordCamp Europe and had the double pleasure of a demo that showed us a bit about the future of WordPress and an interview that looked back while also looking a bit forward. If you haven’t seen the demo, it was beautiful. And I’ve included a link to it in the show notes. And if you haven’t heard the interview, there were a few specific moments that I’d like to take the time to delve into a little more. Brian Krogsgard, in his conversation with Matt Mullenweg, brought up three really interesting points. I mean, he brought up a lot of interesting points, but there were three that I would particularly like to look into today. The first was about balance. The second was about cohesion. And the third was about those we leave behind.  

\n\n\n\n

Josepha Haden Chomphosy 01:24

\n\n\n\n

So first is this question of balance. Brian brought this up in the context of the overall economic health of the WordPress ecosystem. And in that particular moment, he talked about companies that are coming together, companies that are merging. And in Matt’s answer, the part that I found the most interesting was when he said, “the point at which there is the most commercial opportunity is also the point at which there is the most opportunity for short-termism. He went on to talk about the importance of long-term thinking and collective thinking about what makes us, and us here means probably the WordPress project, more vibrant and vital in 10 or 20 or 30 years. One of the things that he specifically called out in that answer was the responsibility of larger companies in the ecosystem. For instance, like Automattic, to commit fully to giving back, there are many ways now that companies can give back to WordPress so that we all replenish the Commons. They can pay for volunteer contributors’ time; they can create and sponsor entire teams through the Five for the Future program. They can contribute time through our outreach program. And they can even contribute to WordPress’s ability to own our own voice by engaging their audience’s awareness of what’s next in WordPress, or whatever. And I know this balance, this particular balance of paid contributors or sponsored contributors, compared to our volunteer contributors or self-sponsored contributors; I know that this balance is one that people keep an eagle eye on. I am consistently on a tight rope to appropriately balanced those voices. But as with so many things where balance is key, keeping an eye on the middle or the long-distance can really help us get it right.  

\n\n\n\n

Josepha Haden Chomphosy 03:23

\n\n\n\n

The second question was one of cohesion and specifically cohesion over the competition. Brian asked how, if people feel disadvantaged, you can foster a feeling of cohesion rather than competition? And Matt’s first answer was that competition is great. Specifically, he said that competition is great as long as you consider where your collaboration fits into the mission. And he also spent some time exploring how competitors in the ecosystem can still work from a community-first mindset. I personally cannot agree enough about some of the benefits of collaboration alongside your competitors. I remind sponsored contributors from time to time, and I think it’s true for any contributor that you are an employee of your company first and a contributor to WordPress second. However, once you step into contribution time, your main concern is the users of WordPress, or new contributors, or the health of the WordPress ecosystem as a whole or the WordPress project. So you get all this subject matter expertise from competitive forces, collaborating in a very us versus the problem way. And when you do that, you’re always going to find a great solution. It may not be as fast as you want it to build things out in the open in public. And so sometimes we get it wrong and have to come back and fix it but still, given time, we’re going to come out with the best solution because we have so many skilled people working on this.  

\n\n\n\n

Josepha Haden Chomphosy 05:01

\n\n\n\n

And then the third question that I wanted to really touch on is the question of those we leave behind. Brian asked Matt if he thought mid-sized agencies and mid-sized consultants were being squeezed out with the block editor. Matt’s high-level answer was no, and I tend to agree with him. It’s not all mid-sized anything any more than it’s all small-sized anything. His answer continued to look at what stands to change for users with the block editor and who really can stand to benefit. It made me think back to my WordPress 5.0 listening tour. We launched WordPress 5.0, which was, in case anyone forgets, the first release with the block editor in it. I took a six-month-long tour to anywhere that WordPressers were so I could hear their main worries, what Brian is saying in there, and what Matt is saying to really came up all the time in those conversations. And basically, it was that this update takes all the power away from people who are building websites. And in these conversations, and Matt and Brian’s conversation, it was really focused on our freelancers and consultants. But at the same time, all of them heard that this update gives power back to all of the people who could build websites. 

\n\n\n\n

Josepha Haden Chomphosy 06:28

\n\n\n\n

I could not shake the feeling at the time. And honestly, I can’t shake it now that no high-end consultants, or freelancers, or any other developer or site creator sit around just longing for maintenance work. After six months of talking to people, I didn’t hear anyone say, “you know, I just love making the same author card over and over and over.” Or, “updated the footer every week, this month. And that’s why I got into this business.” And more than the feeling that there just wasn’t anyone who just loved maintenance, I got a feeling that there were real problems that needed to be solved for these clients and that they wanted to solve them. And that they also would gladly trade updating footers for the much more interesting work of creating modern and stylish business hubs based on WordPress for the clients who trust them so much. All of that, I guess, is to say that, yes, the block editor does give power back to our clients again, but not at the expense of those who have to build the sites in the first place. I think it stands to restore everyone’s sense of agency more than we truly realize. So that’s my deep dive on WordCamp Europe; I included links to the demo and the talk below, just in case you haven’t seen them yet. And you want to get a little bit of insight into the full context of the conversations that I just did a bit of a deep dive into. 

\n\n\n\n

Josepha Haden Chomphosy 08:15

\n\n\n\n

And now it’s time for our smallest of big things. All right, I have three things for you today. Number one, tomorrow, we package WordPress 5.8 beta three. If you’ve never had a chance to stop by the core channel in slack for the past packaging process, I really encourage you to stop by; we call them release parties. It’s a bunch of people who stand around and help get it done. So you can also see how it gets done. And if you’re feeling brave, you can even try your hand at testing out one of the packages as soon as it’s ready. The second thing is that a week from tomorrow, we reach our first release candidate milestone. So if you have meant to submit any bugs or patches or if you’ve been procrastinating on documentation, or dev notes, right now is the time so that we can have a chance to get everything into the release by the time we reach the release candidate milestone on the 29th. And the third thing is that we are currently right in the middle of WordCamp Japan. That is a great opportunity to meet some contributors and maybe even get started with contributions yourself. So stop by if you haven’t had a chance to check it out already. I will leave a link in the show notes. And that, my friends, is your small list of big things.

\n\n\n\n

Thank you for tuning in today for the WordPress Briefing. I’m your host, Josepha Haden Chomphosy, and I’ll see you again in a couple of weeks.

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"10837\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:13;a:6:{s:4:\"data\";s:60:\"\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:20:\"WordPress 5.8 Beta 2\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://wordpress.org/news/2021/06/wordpress-5-8-beta-2/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 15 Jun 2021 18:34:31 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:2:{i:0;a:5:{s:4:\"data\";s:11:\"Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=10808\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:344:\"WordPress 5.8 Beta 2 is now available for testing! This software is still in development, so it’s not recommended to run this version on a production site. Consider setting up a test site to play with it. You can test the WordPress 5.8 Beta 2 in two ways: Install/activate the WordPress Beta Tester plugin (select the Bleeding […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:19:\"Jonathan Desrosiers\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:6174:\"\n

WordPress 5.8 Beta 2 is now available for testing!

\n\n\n\n

This software is still in development, so it’s not recommended to run this version on a production site. Consider setting up a test site to play with it.

\n\n\n\n

You can test the WordPress 5.8 Beta 2 in two ways:

\n\n\n\n
  • Install/activate the WordPress Beta Tester plugin (select the Bleeding edge channel and the Beta/RC Only stream)
  • Direct download the beta version here (zip).
\n\n\n\n

The current target for the final release is July 20, 2021. That’s just five weeks away, so your help is vital to ensure that the final release is as good as it can be.

\n\n\n\n

Some Highlights

\n\n\n\n

Since Beta 1, 26 bugs have been fixed. Here is a summary of some of the included changes:

\n\n\n\n
  • Block Editor: Remove bundled block patterns and support the patterns directory. (#53246)
  • Block Editor: Add a type property to allow Core to identify the source of the editor styles. (#53175)
  • Build/Test Tools: Adds some tests for Quick Draft section in Dashboard. (#52905)
  • Build/Test Tools: Replaced @babel/polyfill with core-js/stable. (#52941)
  • Coding Standards: Further update the code for bulk menu items deletion to better follow WordPress coding standards. (#21603)
  • External Libraries: Update Underscore to version 1.13.1. (#45785)
  • General: A number of block editor, template mode and widget screen related fixes. (#51149)
  • Login and Registration: Improve the unknown username error message. (#52915)
  • Media: Restore AJAX response data shape in media library. (#50105)
  • Site Health: Display a list of file formats supported by the GD library. (#53022)
  • Twemoji: It’s the new one! (#52852)
\n\n\n\n

How You Can Help

\n\n\n\n

Watch the Make WordPress Core blog for 5.8-related developer notes in the coming weeks, which will break down these and other changes in greater detail.

\n\n\n\n

So far, contributors have fixed 214 tickets in WordPress 5.8, including 87 new features and enhancements, and more bug fixes are on the way.

\n\n\n\n

Do some testing!

\n\n\n\n

Testing for bugs is a vital part of polishing the release during the beta stage and a great way to contribute. \"✨\"

\n\n\n\n

If you think you’ve found a bug, please post to the Alpha/Beta area in the support forums. We would love to hear from you! If you’re comfortable writing a reproducible bug report, file one on WordPress Trac. That’s also where you can find a list of known bugs.

\n\n\n\n

Props to @chanthaboune for revision, @webcommsat, @youknowriad, @jorbin, @felipeelia , and @jeffpaul for proofreading, and @cbringmann for final edits!

\n\n\n\n
\n\n\n\n

Install won’t you please
WordPress 5-8 Beta 2?
We need your help: test!

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"10808\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:14;a:6:{s:4:\"data\";s:60:\"\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:20:\"Gutenberg Highlights\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://wordpress.org/news/2021/06/gutenberg-highlights/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 11 Jun 2021 11:03:04 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:2:{i:0;a:5:{s:4:\"data\";s:8:\"Features\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"WordCamp\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=10779\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:346:\"During WordCamp Europe this past Wednesday Matt and I gathered to discuss the latest developments of Gutenberg and to share a video with some of the current and upcoming highlights. The video is wonderfully narrated by @beafialho and it was a great opportunity to celebrate all the incredible work that contributors are doing around the […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Matias Ventura\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:1401:\"\n

During WordCamp Europe this past Wednesday Matt and I gathered to discuss the latest developments of Gutenberg and to share a video with some of the current and upcoming highlights. The video is wonderfully narrated by @beafialho and it was a great opportunity to celebrate all the incredible work that contributors are doing around the globe to improve the editing and customization experience of WordPress. For those that weren’t able to attend live it’s now available for watching online.

\n\n\n\n
\n\n
\n\n\n\n

Matt also opened a thread for questions on his blog, so be sure to chime in there if you have any!

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"10779\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:15;a:6:{s:4:\"data\";s:63:\"\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:20:\"WordPress 5.8 Beta 1\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://wordpress.org/news/2021/06/wordpress-5-8-beta-1/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 09 Jun 2021 02:47:48 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:3:{i:0;a:5:{s:4:\"data\";s:11:\"Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:3:\"5.8\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=10733\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:50:\"WordPress 5.8 Beta 1 is now available for testing!\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"Jeffrey Paul\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:10110:\"\n

WordPress 5.8 Beta 1 is now available for testing!

\n\n\n\n

This software is still in development, so it is not recommended to run this version on a production site. Instead, we recommend that you run this on a test site to play with the new version.

\n\n\n\n

You can test the WordPress 5.8 Beta 1 in two ways:

\n\n\n\n\n\n\n\n

The current target for the final release is July 20, 2021. This is just six weeks away, so your help is vital to ensure this release is tested properly and as good as it can be.

\n\n\n\n

Keep your eyes on the Make WordPress Core blog for 5.8-related developer notes in the coming weeks, breaking down these and other changes in greater detail.

\n\n\n\n

So what’s new in this 5.8? Let’s start with some highlights.

\n\n\n\n

Highlights

\n\n\n\n

Powerful Blocks

\n\n\n\n
  • Discover several new blocks and expressive tools, including blocks for Page ListsSite TitleLogo, and Tagline. A powerful Query Loop block offers multiple ways for displaying lists of posts and comes with new block patterns that take advantage of its flexibility and creative possibilities.
  • Interacting with nested blocks has been made easier with a permanent toolbar button for selecting a parent. Block outlines are shown when hovering or focusing on the different block type buttons. Block handles are now also present for drag and drop when in “select” mode.
  • Introduces the List View, a panel that can be toggled and helps navigate complex blocks and patterns.
  • Reusable blocks have an improved creation flow and support for history revisions.
  • A cool new duotone block adds images effects which can be used in media blocks or supported in third-party blocks. Color presets can also be customized by the theme.
\n\n\n\n

Handpicked Patterns

\n\n\n\n

Patterns can now also be recommended and selected during block setup, offering powerful new flows. Pattern transformations are also possible and allow converting a block or a collection of blocks into different patterns.

\n\n\n\n

New collection of Patterns and an initial integration with the upcoming Pattern Directory on WordPress.org.

\n\n\n\n

Better Tools

\n\n\n\n
  • New template editor that allows creating new custom templates for a page using blocks.
  • Themes can now control and configure styling with a theme.json file, including layout configuration, block supports, color palettes, and more.
  • New design tools and enhancements to existing blocks, including more color, typography, and spacing options, drag and drop for Cover backgrounds, additions to block transformation options, ability to embed PDFs within the File block, and more.
  • Includes improvements to how the editor is rendered to more accurately resemble the frontend.
\n\n\n\n

Internet Explorer 11

\n\n\n\n

Support for Internet Explorer 11 is ending in WordPress this year. In this release, most of those changes are being merged so use the Beta and RC periods to test!

\n\n\n\n

Blocks in Widgets Area

\n\n\n\n\n\n\n\n

Looking for a change and can’t find it? There are more improvements listed after the break.

\n\n\n\n

How You Can Help

\n\n\n\n

Do some testing!

\n\n\n\n

Testing for bugs is an important part of polishing the release during the beta stage and a great way to contribute.

\n\n\n\n

If you think you’ve found a bug, please post to the Alpha/Beta area in the support forums. We would love to hear from you! If you’re comfortable writing a reproducible bug report, file one on WordPress Trac. That’s also where you can find a list of known bugs.

\n\n\n\n

Thanks for joining us, and happy testing!

\n\n\n\n

Props to @audrasjb, @cbringmann, @youknowriad, @annezazu, @matveb, and @desrosj for editing/proof reading this post, and @chanthaboune for final review.

\n\n\n\n
\n\n\n\n

Full Site Editing
Coming at the end of year
But first, Beta 1

\n\n\n\n\n\n\n\n

Improvements in this Release

\n\n\n\n
  • Improvements to Reusable blocks, Cover block, Table block, List View, Rich text placeholder, Template Editing Mode, Block Inserter, and Top Toolbar
  • Query loop block that uses a query/filter to create a flexible post list based on templates. Best used with patterns.
  • Parity refinement between editor and frontend, Standardization to block toolbars organization
  • Block widgets in the Customizer
  • Introducing the Global Styles and Global Settings APIs: control the editor settings and available customization tools and style blocks using a theme.json file.Template editor opens inside an iframe to more accurately resemble the front end.
  • Ability to transform Media and Text into Columns
  • Embedded PDFs within File block
  • Spacing options for Social Links and Buttons, Spacer block width adjustments
  • Twemoji has been updated to version 13.1, bringing you many new Emoji.
  • Editor performance improvements
  • Hide writing prompt from subsequent empty paragraphs
  • More descriptive publishing UI
  • Added capability to set the default format for image sub-sizes as well as WebP support
  • Added widgets block editor to widgets.php and customize.php
  • Added block patterns to default themes
  • Added ability to mark a plugin as unmanaged
  • Enable revisions for the reusable block custom post type
  • Enqueue script and style assets only for blocks present on the page
  • Abstracted block editor configuration by deprecating existing filters and introducing replacements that are context-aware
  • New sidebars, widget, and widget-types REST API endpoints
  • Added support for modifying the term relation when querying posts in the REST API
  • Site Health now supports custom sub-menus and pages
  • Themes now display the number of available theme updates in the admin menu
  • Speed up cached get_pages() calls
  • Underscore updates from 1.8.3 to 1.9.1
\n\n\n\n

To see all of the features for Gutenberg release in detail check out these posts: 10.0, 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, and 10.7. In addition to those changes, contributors have fixed 215 tickets in WordPress 5.8, including 88 new features and enhancements, with more bug fixes on the way.

\n\n\n\n

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"10733\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:16;a:6:{s:4:\"data\";s:58:\"\n \n \n \n \n \n \n \n\n \n \n \n \n \n\n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:7:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:57:\"WP Briefing: Episode 10: Finding the Good In Disagreement\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:79:\"https://wordpress.org/news/2021/06/episode-10-finding-the-good-in-disagreement/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 07 Jun 2021 12:22:06 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:1:{i:0;a:5:{s:4:\"data\";s:11:\"wp-briefing\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"https://wordpress.org/news/?post_type=podcast&p=10424\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:408:\"To Agree, disagree, and everything in-between. In this episode, Josepha talks about forming opinions and decision-making in the WordPress project. Have a question you’d like answered? You can submit them to wpbriefing@wordpress.org, either written or as a voice recording. Credits Editor: Dustin Hartzler Logo: Beatriz Fialho Production: Chloé Bringmann Song: Fearless First by Kevin MacLeod […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:9:\"enclosure\";a:1:{i:0;a:5:{s:4:\"data\";s:0:\"\";s:7:\"attribs\";a:1:{s:0:\"\";a:3:{s:3:\"url\";s:60:\"https://wordpress.org/news/files/2021/06/WP-Briefing-010.mp3\";s:6:\"length\";s:1:\"0\";s:4:\"type\";s:0:\"\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:15:\"Chloe Bringmann\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:12068:\"\n

To Agree, disagree, and everything in-between. In this episode, Josepha talks about forming opinions and decision-making in the WordPress project.

\n\n\n\n

Have a question you’d like answered? You can submit them to wpbriefing@wordpress.org, either written or as a voice recording.

\n\n\n\n

Credits

\n\n\n\n

Editor: Dustin Hartzler

\n\n\n\n

Logo: Beatriz Fialho

\n\n\n\n

Production: Chloé Bringmann

\n\n\n\n

Song: Fearless First by Kevin MacLeod

\n\n\n\n

References

\n\n\n\n

10/10/10 Rule

\n\n\n\n

The Eisenhower Matrix 

\n\n\n\n

The Maximin Strategy 

\n\n\n\n

WordCamp Europe

\n\n\n\n

WordCamp Japan

\n\n\n\n

WordPress 5.8 Development Cycle

\n\n\n\n

Transcript

\n\n\n\n\n\n\n\n

Josepha Haden Chomphosy  00:10

\n\n\n\n

Hello, everyone, and welcome to the WordPress Briefing, the podcast where you can catch quick explanations of some of the ideas behind the WordPress open source project and the community around it, as well as get a small list of big things coming up in the next two weeks. I’m your host, Joseph Haden Chomphosy. Here we go!

\n\n\n\n

Josepha Haden Chomphosy  00:40

\n\n\n\n

For anyone who has ever organized something, whether it’s a social event, a school project, or an annual family gathering, you know that there are many different opinions. The more opinions you have, the more likely people don’t see eye to eye. And before you know it, you’ve got some disagreements. Some things make disagreements worse, like imbalance of information, lack of showing your work, and sometimes just “too many cooks in the kitchen,” to use a regional phrase. Frankly, sometimes it seems like the second you have more than one cook in your kitchen, you’re going to get some disagreements. But I think that’s a healthy thing. WordPress is huge. And there are huge numbers of people contributing to WordPress or any other open source project you want to name. So there’s a lot of stuff available to disagree about. If we never saw anyone pointing out an area that wasn’t quite right, there would probably be something wrong. If you, like me, think that a healthy tension of collaborative disagreement can be useful when approached thoughtfully, then this quick start guide is for you. 

\n\n\n\n

Step one, prepare to host a discussion. This is, by the way, just the hardest step out there. You have to take a little time to figure out what problem you’re solving with the solution you’re suggesting, any goals that it relates to, and then figure out what the bare minimum best outcome would be and what the wildest dreams magic wand waving outcome would be. And you have to be honest with yourself. 

\n\n\n\n

Step two, host the discussion. The venue will be different for different discussions, but you see a lot of these on team blogs or within the actual tickets where work is being done. Wherever you’re hosting it, state the problem, state your idea for the solution and ask for what you missed. If you’re hosting a discussion in person, like in a town hall format, this can be hard. And generally, hosting discussions in an in-person or voice call or zoom call kind of way is hard. So if you have an opportunity to start doing this in text first and level your way up to in person, that’s my recommendation. 

\n\n\n\n

Step three is to summarize the discussion and post a decision if possible. So organizing a big discussion into main points is a really good practice for the people you’re summarizing it for and yourself. It helps you to confirm your understanding, and it also gives you the chance to pair other solutions with the problem and goals you outlined in step one. If a different solution solves the same problem but with less time or effort, it’s worth taking a second look with less time or effort. There’s something that I say to WordPress contributors frequently, and that is there are a lot of yeses. There are a lot of right ways to do things and only a few clear wrong ways to do things. So be open-minded about whether or not someone else’s right way to do things could still achieve the goals you’re trying to accomplish with your solution. A note on step three where I said, “and post the decision if possible.” Sometimes you’re the person to make that decision, but sometimes you are not the person who can give something the green light, and so you’re preparing a recommendation. Whether you’re making a decision or a recommendation, sometimes you may experience a little decision-making paralysis. I know I do. So here are a few of the tools that I use.

\n\n\n\n

If you’re avoiding the decision, use the 10/10/10 rule; it can help you figure out if you’re stuck on a short-term problem. If there are too many good choices, use the Eisenhower Matrix that can help you to prioritize objectively. If there are too many bad choices, use the Maximin strategy. It can help you to identify how to minimize any potential negative impacts. 

\n\n\n\n

Okay, so you’ve considered your position. You’ve discussed everything. You summarized the big points. Maybe you also worked your way through to a recommendation or a decision. What about everyone who disagreed with the decision? Or have you made a recommendation, and it wasn’t accepted? How do you deal with that? That’s where “disagree and commit” shows up. This phrase was made popular by the folks over at Amazon, I think. But it first showed up, I believe at Sun Microsystems as this phrase, “agreeing, commit, disagree and commit or get out of the way.”

\n\n\n\n

Josepha Haden Chomphosy  05:34

\n\n\n\n

Disagree and commit as a concept works pretty well when everyone agrees on the vision and the goals, but not necessarily how to get to those goals. We’ve had moments in recent history where folks we’re not able to agree, we’re not able to commit, and so then left the project. I hate when that happens. I want people to thrive in this community for the entire length of their careers. But I also understand that situation shows up in the top five learnings of open source when you no longer have interest in the project and handed it off to a competent successor. So there it is – disagreements in open source in WordPress. 

\n\n\n\n

As with so many of the things I discuss on this podcast, this is incredibly complex and nuanced in practice. Taking an argument, distilling facts from feelings, and adjusting frames of reference until the solution is well informed and risk-balanced. That is a skill set unto itself. But one that increases the health of any organization. I’ll share that list of references and general materials in the show notes, including a link explaining each of those decision-making tools that I shared. I’m also going to include the contributor training module on decision-making in the WordPress project. It’s got excellent information. It’s part of a series of modules that I asked team reps to take and sponsored contributors. I don’t require it from anyone, but I do hope that it is useful for you. Also, speaking of useful for you, if you are just here for leadership insights, I included some hot takes after the outro music for you. It’s like an Easter egg, but I just told you about it.

\n\n\n\n

Josepha Haden Chomphosy  07:33

\n\n\n\n

And that brings us to our small list of big things! First off, WordCamp Europe is happening this we; I hope that everybody has an opportunity to attend. If you still haven’t gotten your tickets, they are free, and I think there are still a few left. I will include a link in the show notes as well. There’s going to be a little demo with Matt Mullenweg and Matias Ventura on the WordPress 5.8 release that’s coming up. And then kind of a retrospective discussion between Matt and Brian Krogsgard. I encourage you to join; I think it’s going to be very interesting. 

\n\n\n\n

There’s also WordCamp, Japan coming up June 20 through 26th. I mentioned it last time –  it has a big section of contributing and contribution time. So if you’re looking to get started, some projects are laid out, and I encourage you to take a look at that as well. 

\n\n\n\n

The new thing on this list, and I don’t know how new It is, in general, I hope it’s not too new to you, is that WordPress 5.8 release is reaching its beta one milestone on June 8th, so right in the middle of WordCamp Europe. I encourage every single theme developer, plugin developer that we have, agency owners that we have to really take a look at this release and dig into testing it. It’s a gigantic release. And I have so many questions about what will work and will not work once we get it into a broader testing area. We’ve been doing a lot of testing in the outreach program. But it’s always helpful to get people who are using WordPress daily in their jobs to really give a good solid test to the beta product to the beta package. And put it all through its paces for us. 

\n\n\n\n

So, that my friends, is your small list of big things. Thank you for tuning in today for the WordPress Briefing. I’m your host Josepha Haden Chomphosy, and I’ll see you again in a couple of weeks.

\n\n\n\n

Josepha Haden Chomphosy  10:09

\n\n\n\n

Hey there, you must be here because I told you about this totally not hidden easter egg about my hot takes on organizational health; I have three for you. And if you’ve ever worked with me, none of this will surprise you. But if you haven’t worked with me, hopefully, it kind of gives you some idea about how I approach all of this a bit differently. So, number one, critical feedback is the sign of a healthy organization. And I will never be dissuaded from that opinion. A complete lack of dissent doesn’t look like “alignment.” To me, that looks like fear. And it goes against the open source idea that many eyes make all bugs shallow. 

\n\n\n\n

Tip number two, a bit of tension is good, a bit of disagreement is good. The same thing that I say about women in tech, we’re not all the same. And if we were, then we wouldn’t need to collaborate anyway. But diversity, whether that’s the diversity of thought or of a person or of experience, just doesn’t happen without some misunderstandings. It’s how we choose to grow through those misunderstandings that make all the difference for the type of organization we are. 

\n\n\n\n

And hot take number three, changing your mind isn’t flip-flopping or hypocritical. I think that’s a sign of growth and willingness to hear others. I like to think of my embarrassment at past bad decisions – as the sore muscles of a learning brain. And I, again, probably won’t be dissuaded from that opinion. Although, you know, if I’m sticking true to changing your mind some flip-flopping or hypocritical, maybe I will, but you can always try to, to give me the counter-argument for that, and we’ll see how it goes. Thank you for joining me for my little public easter egg.

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"10424\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:17;a:6:{s:4:\"data\";s:66:\"\n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"People of WordPress: Tijana Andrejic\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:71:\"https://wordpress.org/news/2021/06/people-of-wordpress-tijana-andrejic/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 07 Jun 2021 12:01:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:4:{i:0;a:5:{s:4:\"data\";s:9:\"heropress\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:10:\"Interviews\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:16:\"ContributorStory\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:3;a:5:{s:4:\"data\";s:9:\"HeroPress\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=10427\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:178:\"This month to coincide with WordCamp Europe, we feature Tijana Andrejic from Belgrade, Serbia, about her journey from fitness trainer to the opportunities in the WordPress world.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"webcommsat AbhaNonStopNewsUK\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:14291:\"\n

WordPress is open source software, maintained by a global network of contributors. There are many examples of how WordPress has changed people’s lives for the better. In this monthly series, we share some of the amazing stories.

\n\n\n\n

This month to coincide with WordCamp Europe, we feature Tijana Andrejic from Belgrade, Serbia, about her journey from fitness trainer to the WordPress world, with the freelance and corporate opportunities it introduced.

\n\n\n\n
\"Tijana
\n\n\n\n

As a professional manager with a college degree in Organizational Science and a certified fitness instructor, Tijana is nothing if not driven and goal-oriented. 

\n\n\n\n

Following her time as a fitness trainer, Tijana moved to work in IT around 2016. She first explored content creation and design before focusing on SEO and becoming an independent specialist.  

\n\n\n\n

Tijana was hired as a Customer Happiness Engineer for a hosting company, where she discovered the benefits of having a team. She realized that having close working relationships with colleagues is helpful for business success and accelerates personal growth.

\n\n\n\n

Tijana hopes that by sharing her story, she can help others who are either starting their career or are moving roles. She describes the opportunities she discovered in the WordPress community as ‘a huge epiphany’, especially in the world of freelancing.

\n\n\n\n

She highlights 5 things that helped her to start a new freelancing career. Let’s dive into them.

\n\n\n\n

What motivates me?

\n\n\n\n

“Why am I doing this?” is the first question that Tijana asks herself before starting anything new. This self-review and honesty, she feels, allows her to determine her priorities. She also benchmarks options around her motivations of wanting a flexible schedule and to grow professionally. 

\n\n\n\n

She lists the reasons to make a particular choice, like being a freelancer, to help her choose the right job, pathway, or identify alternatives. 

\n\n\n\n

She recommends that others can take a similar approach. If freelancing is still the best solution after examining all their goals and motivations, Tijana believes a good next step would be to learn WordPress-related skills.

\n\n\n\n
\"WordCamp
\n\n\n\n

Develop WordPress related skills

\n\n\n\n

The next question you may ask: “Why WordPress?”

\n\n\n\n

WordPress is used by more than 40% of websites in some form and offers various roles, many of which are not developer-specific. Tijana highlights a few: 

\n\n\n\n
  • web developer (coding websites, themes, and plugins)
  • web implementor (creating websites from existing themes without coding)
  • web designer (designing website mock-ups, editing images, or creating online infographics)
  • client support professional (helping people with their websites)
  • website maintenance (WordPress, themes, and plugins are maintained and backed up regularly)
  • WordPress trainer (helping clients with how to use the platform or teaching other web professionals)
  • content writer
  • accessibility specialist (making sure standards are met and suggesting solutions for accessibility barriers)
  • SEO consultant (improving search outcomes and understanding)
  • statistics consultant, especially for web shops
  • WordPress assistant (adding new content and editing existing posts)
  • website migration specialist (moving websites from one server to another)
  • web security specialist
\n\n\n\n
\"WCBGD
\n\n\n\n

Tijana emphasized: “Another reason why WordPress is great for freelancers is the strong community that exists around this content management system (CMS).” WordCamps and Meetups are a way to get useful information and meet people from a large and very diverse community and get answers to many questions straight away. 

\n\n\n\n

In the past year, these events have been primarily online. However, the contributors who run them continue to make an effort to provide an experience as close to in-person events as possible. The biggest advantage to online events is that we can attend events from across the world, even if sometimes during these difficult times, it is difficult to get enough time to deeply into this new experience. Since Tijana’s first Meetup, she has attended many WordPress community events and volunteered as a speaker.

\n\n\n\n

Plan in advance

\n\n\n\n

Becoming a freelancer takes time. For Tijana, success came with proper planning and following her plan to ‘acquire or improve relevant skills that will make you stand out in the freelance market.’ She strongly believes that learning and growing as a professional opens more business opportunities. 

\n\n\n\n

If you are considering a freelance career, she advises improving relevant skills or developing new skills related to your hobbies as ‘there is nothing better than doing what you love.’ In cases where no previous experience and knowledge can be used, she suggests choosing ‘a job that has a shorter learning curve and builds your knowledge around that.’

\n\n\n\n

Tijana started as a content creator and learned to become an SEO expert. However, she highlights many alternative paths, including starting as a web implementer and moving to train as a developer. 

\n\n\n\n

She suggests to others: “It would be a good idea to analyze the market before you jump into the learning process.” She also recommends people check the latest trends and consider the future of the skills they are developing.

\n\n\n\n

Visit the new Learn WordPress.org to see what topics are of interest to you. In this newly established resource, the WordPress community aggregates workshops to support those who want to start and improve their skills, provides lesson plans for professional WordPress trainers and helps you create personal learning to develop key skills. There is also material on helping you be part of and organize events for your local community.

\n\n\n\n

Tijana highlights that there are many places for freelancers to find clients. For example, the WordPress Community has a place where companies and individual site owners publish their job advertisements  – Jobs.WordPress.net.

\n\n\n\n

Hurray, it’s time to get a first freelancing job

\n\n\n\n

As a pragmatic person, Tijana recommends: “Save money before quitting your job to become a full-time freelancer. Alternatively, try freelancing for a few hours per week to see if you like it. Although some people do benefit when taking a risk, think twice before you take any irreversible actions.” 

\n\n\n\n

She shared some possible next steps: 

\n\n\n\n
  • use a freelancing platform
  • triple-check your resume
  • professionally present yourself
  • fill up your portfolio with examples
  • use video material
\n\n\n\n

“By using video material, your clients will not see you like a list of skills and previous experiences, but as a real person that has these skills and experiences and that provides a certain service for them.”

\n\n\n\n

She adds: “Have a detailed strategy when choosing your first employer. Choose your first employer wisely, very wisely. I can’t emphasize enough how important this is”.

\n\n\n\n

When Tijana took her first freelancing job, she considered the following:

\n\n\n\n
  • how was the employer rated by other freelancers who worked for him previously
  • how does the employer rate other freelancers
  • how much money had they already spent on the platform
  • the number of open positions for a specific job and the number of freelancers that have already applied 
\n\n\n\n

“The first job is not all about the money. Don’t get greedy on your first job. If you get good recommendations, your second job can pay two to three times more. And your third job can go up to five times more. That was my experience.”

\n\n\n\n

Take responsibility as a freelancer

\n\n\n\n

Tijana reminds us: “Freedom often comes with responsibility; individual responsibility is key when it comes to freelancing.”

\n\n\n\n

She advises others not to take a job if you can not make a deadline and have someone reliable who can help you. 

\n\n\n\n

Missing deadlines will cost your client money and affect the review the client will be willing to leave about your job, and this can have a big impact on your future opportunities or freelance jobs.

\n\n\n\n

She adds: “This can start a downward spiral for your career. However, we are all humans, and unpredictable things can happen. If for some reason you are not able to complete your work in a timely manner, let your client know immediately so they can have enough time to hire someone else”.

\n\n\n\n

Tijana emphasizes the importance of making expectations clear before accepting a job, both what the client is expecting and what you can expect from the client. 

\n\n\n\n

Lastly, she points out that if you are working from home, your friends and family should treat you the way they would if you were in an office. She advises: “Let them know about your working schedule.”

\n\n\n\n

She hopes that these basic guidelines will be useful in launching freelance careers, as they did her, even though there is no universal recipe for all.

\n\n\n\n

Tijana highlights: “It’s just important to stay focused on your goals and to be open to new opportunities.” Freelancing wasn’t the only way she could have fulfilled her goals, but it was an important part of her path, and it helped her be confident in her abilities to make the next big step in her life.

\n\n\n\n

As a freelancer, she was missing close relationships with colleagues and teamwork, which she has now found in her current firm. Her colleagues describe her as a: “walking-talking bundle of superpowers: sports medicine and fitness professional, SEO expert, blogger, designer and a kitty foster mum”.

\n\n\n\n
\"Conference
\n\n\n\n

If you are considering starting your career as a freelancer, take the courses offered at learn.wordpress.org, reach out to companies that you would be interested in working with, and remember that there are a whole host of opportunities in the WordPress project.

\n\n\n\n

The WordPress.org Teams – what they do, when and where they meet

\n\n\n\n

Learn WordPress resource – free to use to expand your knowledge and skills of using the platform and learning about the community around it.

\n\n\n\n

The 3-day WordCamp Europe 2021 online event begins on 7 June 2021. You can discover more about being a contributor in its live sessions and section on ways to contribute to WordPress.

\n\n\n\n

Contributors

\n\n\n\n

Thanks to Olga Gleckler (@oglekler), Abha Thakor (@webcommsat), Chloé Bringmann (@cbringmann), Surendra Thakor (@sthakor), and Meher Bala (@meher) for working on this story. Josepha Haden (@chanthaboune) and also to Topher DeRosia (@topher1kenobe) who created HeroPress. Thank you to Tijana Andrejic (@andtijana) for sharing her #ContributorStory

\n\n\n\n
\"HeroPress
\n\n\n\n

This post is based on an article originally published on HeroPress.com. It highlights people in the WordPress community who have overcome barriers and whose stories would otherwise go unheard.

\n\n\n\n

Meet more WordPress community members in our People of WordPress series.

\n\n\n\n

#ContributorStory #HeroPress

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"10427\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:18;a:6:{s:4:\"data\";s:60:\"\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:40:\"A New Design is Coming to WordPress News\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:76:\"https://wordpress.org/news/2021/06/a-new-design-is-coming-to-wordpress-news/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 03 Jun 2021 20:47:56 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:2:{i:0;a:5:{s:4:\"data\";s:7:\"General\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:7:\"Updates\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=10418\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:324:\"After many years of a tidy, white-space filled design on WordPress.org/news it’s time to bring new life to the way we present our content. So much has changed since this site was first created: the people who read it, the type and variety of what is published, even the way WordPress works has changed. Which […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:7:\"Josepha\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:1591:\"\n

After many years of a tidy, white-space filled design on WordPress.org/news it’s time to bring new life to the way we present our content. So much has changed since this site was first created: the people who read it, the type and variety of what is published, even the way WordPress works has changed.

\n\n\n\n

Which means it makes sense to change our theme.

\n\n\n\n

Earlier this year, Matt requested a new design from Beatriz Fialho (who also created the State of the Word slides for 2020). The design keeps a clean, white-space friendly format while incorporating a more jazzy, playful feeling with a refreshed color palette.

\n\n\n\n
\"\"
\n\n\n\n

More detail on this modern exploration have been posted on make.wordpress.org/design. I encourage you to stop by and read more about the thoughts behind the coming updates; and keep an eye out for the new look here and across WordPress.org!

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"10418\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:19;a:6:{s:4:\"data\";s:57:\"\n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"The Month in WordPress: May 2021\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:67:\"https://wordpress.org/news/2021/06/the-month-in-wordpress-may-2021/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 02 Jun 2021 18:23:11 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Month in WordPress\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=10393\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:366:\"It’s really fun to contribute to something larger than yourself. Matt Mullenweg’s words in “The Commons of Images” episode of the WP Briefing podcast exemplify the core philosophy of the WordPress project,  especially as we inch closer to the next major release (version 5.8). This post covers exciting updates from the month of May. WordPress […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Hari Shanker R\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:11073:\"\n

It’s really fun to contribute to something larger than yourself.

\n\n\n\n

Matt Mullenweg’s words in “The Commons of Images” episode of the WP Briefing podcast exemplify the core philosophy of the WordPress project,  especially as we inch closer to the next major release (version 5.8). This post covers exciting updates from the month of May.

\n\n\n\n
\n\n\n\n

WordPress turns 18

\n\n\n\n

WordPress celebrated the 18th anniversary of its launch on May 27, 2021. To celebrate 40+ releases and WordPress’ support of 40% of the web, the team released 40 milestones to celebrate the anniversary of the software. Here’s to the next 18 and beyond! 

\n\n\n\n

CC Search joins WordPress and is renamed to Openverse

\n\n\n\n

Creative Commons Search has officially joined the WordPress project. Creative Commons Search (CC Search) is a CC0 image search engine with over 500 million openly licensed images. The search product, which is being renamed to Openverse, will eventually live on the URL: https://wordpress.org/openverse. Contributors working on CC Search will continue their work as part of a new dedicated Make team: https://make.wordpress.org/openverse. Check out “The Commons of Images” podcast episode for more information.

\n\n\n\n

WordPress 5.7.2 released

\n\n\n\n

WordPress version 5.7.2, a short-cycle security release, came out on May 13. Get the latest version directly from your WordPress dashboard or by downloading it from WordPress.org.

\n\n\n\n

Want to contribute to WordPress core? Check out the Core Contributor Handbook. Don’t forget to join the WordPress #core channel in the Make WordPress Slack and follow the Core Team blog. The Core Team hosts weekly chats on Wednesdays at 5 AM and 8 PM UTC. 

\n\n\n\n

Gutenberg versions 10.6 and 10.7 are out

\n\n\n\n

Gutenberg version 10.6 and version 10.7 were launched this month. Version 10.6 features experimental Duotone filters (which are shipping with WordPress 5.8), block pattern suggestions in placeholders, and enhancements to the table block. Version 10.7 adds a responsive navigation block, block design tools, and the ability to load block patterns from the directory.

\n\n\n\n

Want to get involved in building Gutenberg? Follow the Core Team blog, contribute to Gutenberg on GitHub, and join the #core-editor channel in the Make WordPress Slack. The latest “What’s next in Gutenberg” post offers more details on the latest updates. If you are unfamiliar with the Gutenberg plugin, learn more in this post.

\n\n\n\n

Full Site Editing updates

\n\n\n\n

Don’t miss the latest Full Site Editing (FSE) Outreach program testing call on building portfolio pages using the Template Editing feature shipping with WordPress 5.8! The deadline is June 9. The team has published a recap of the Query Quest FSE Testing call, which shares some interesting results. The answers to round two of FSE questions are also out.

\n\n\n\n

Countdown starts for WordCamp Europe 2021

\n\n\n\n

The countdown to one of the most anticipated WordPress events, WordCamp Europe 2021 (Online), has started! The full schedule of the event is now available, and the team has exciting plans! Don’t miss this event: get your tickets now before they run out!

\n\n\n\n
\n\n\n\n

Further reading

\n\n\n\n\n\n\n\n

Have a story that we should include in the next “Month in WordPress” post? Please submit it using this form

\n\n\n\n

The following folks contributed to May’s Month in WordPress: @meher and @chaion07

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"10393\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}}}s:27:\"http://www.w3.org/2005/Atom\";a:1:{s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:0:\"\";s:7:\"attribs\";a:1:{s:0:\"\";a:3:{s:4:\"href\";s:32:\"https://wordpress.org/news/feed/\";s:3:\"rel\";s:4:\"self\";s:4:\"type\";s:19:\"application/rss+xml\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:44:\"http://purl.org/rss/1.0/modules/syndication/\";a:2:{s:12:\"updatePeriod\";a:1:{i:0;a:5:{s:4:\"data\";s:9:\"\n hourly \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:15:\"updateFrequency\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"\n 1 \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:4:\"site\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"14607090\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}}}}}}}}s:4:\"type\";i:128;s:7:\"headers\";O:42:\"Requests_Utility_CaseInsensitiveDictionary\":1:{s:7:\"\0*\0data\";a:9:{s:6:\"server\";s:5:\"nginx\";s:4:\"date\";s:29:\"Sun, 08 Aug 2021 06:47:23 GMT\";s:12:\"content-type\";s:34:\"application/rss+xml; charset=UTF-8\";s:25:\"strict-transport-security\";s:11:\"max-age=360\";s:6:\"x-olaf\";s:3:\"⛄\";s:13:\"last-modified\";s:29:\"Tue, 03 Aug 2021 14:03:52 GMT\";s:4:\"link\";s:63:\"; rel=\"https://api.w.org/\"\";s:15:\"x-frame-options\";s:10:\"SAMEORIGIN\";s:4:\"x-nc\";s:9:\"HIT ord 2\";}}s:5:\"build\";s:14:\"20201016172007\";}','no'),(132,'_transient_timeout_feed_mod_9bbd59226dc36b9b26cd43f15694c5c3','1628448444','no'),(133,'_transient_feed_mod_9bbd59226dc36b9b26cd43f15694c5c3','1628405244','no'),(134,'_transient_timeout_feed_d117b5738fbd35bd8c0391cda1f2b5d9','1628448445','no'),(135,'_transient_feed_d117b5738fbd35bd8c0391cda1f2b5d9','a:4:{s:5:\"child\";a:1:{s:0:\"\";a:1:{s:3:\"rss\";a:1:{i:0;a:6:{s:4:\"data\";s:3:\"\n\n\n\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:7:\"version\";s:3:\"2.0\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:1:{s:0:\"\";a:1:{s:7:\"channel\";a:1:{i:0;a:6:{s:4:\"data\";s:61:\"\n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:1:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"WordPress Planet\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"http://planet.wordpress.org/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"language\";a:1:{i:0;a:5:{s:4:\"data\";s:2:\"en\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:47:\"WordPress Planet - http://planet.wordpress.org/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"item\";a:50:{i:0;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:100:\"Gutenberg Times: Modern WordPress Development is hard, Theme Building and more -Weekend Edition #180\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://gutenbergtimes.com/?p=18698\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:108:\"https://gutenbergtimes.com/modern-wordpress-development-is-hard-theme-building-and-more-weekend-edition-180/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:16178:\"

Howdy, my friend!

\n\n\n\n

Greeting from Germany, where we follow a mask mandate again for buildings, shops, and restaurants. The weather is switching rapidly between cold and rain to clear sky’s and heat within hours. We learned quite a bit about power line networking while setting up our home office for two at my parent’s home.

\n\n\n\n

After the break last week, we have plenty of information, discussions, and creative updates for you. Due to vacation time, we didn’t see a big changelog, though. It’s all good. We all can use a breather and catch up on the finer points of Gutenberg development.

\n\n\n\n

Let’s dive in,
Yours, 💕
Birgit

\n\n\n\n
\n\n\n\n

Gutenberg 11.2

\n\n\n\n

Gutenberg 11.2 was released. You can read up about it on the release post, as mentioned above, there were many small but powerful changes to blocks, site editor. Sarah Gooding has the skinny for you on the WordPress Tavern.

\n\n\n\n

Grzegorz Ziolkowski and I recorded the Gutenberg changelog episode #49 yesterday.

\n\n\n\n\n

📢 New Episode #49 is now available! 🎙️
Birgit Pauli-Haack and Grzegorz Ziolkowski discuss Gutenberg plugin release 11.2, drag and drop, flex layout, core data shortcuts and modern WordPress development.

\n\n\n\n

Subscribe to the Gutenberg Changelog podcast
🎙️ Spotify | Google | iTunes | PocketCasts | Stitcher |
🎙️ Pod Bean | CastBox | Podchaser | RSS Feed 

\n\n\n\n\n\n\n\n\n

Modern WordPress Development is Hard!

\n\n\n\n

My friend, Chris Wiegman, started an interesting, multi-faceted discussion on a changing WordPress ecosystem for developers on Twitter. Others chimed in, like Matias Ventura, Alain Schlesser, Victor Ramirez, Rich Tabor, Mark Wilkinson, Jessica Lyschik and many more.

\n\n\n\n\n\n\n\n

Since the tweet and the blog post, Chris Wiegman wrote another blog post “Learn React Fast”, raving about the ReactJS for Beginners Course by Wes Bos.

\n\n\n\n

Stack Overflow published their annual survey results. Here are some numbers.

\n\n\n\n
  • This year, React.js (40.1%) surpassed jQuery (34.4%) as the most commonly used web framework.
  • JavaScript completes its ninth year in a row as the most commonly used programming language.
  • Technology: 22.54% of Professional Developers work in PHP, 68.62% work in JavaScript.
\n\n\n\n

It’s quite reassuring that WordPress is not stuck where it was 10 years ago (v 3.2w3tech 13.1%). The web has evolved exponentially since then, and so has WordPress and the surrounding community.

\n\n\n\n

I am eagerly awaiting to read through all the various branches of the twitter thread where more developers shared their experiences and their lessons learned. The discussion is, of course, ongoing. It seems to be coming in waves.

\n\n\n\n\n

 “Keeping up with Gutenberg – Index 2021” 
A chronological list of the WordPress Make Blog posts from various teams involved in Gutenberg development: Design, Theme Review Team, Core Editor, Core JS, Core CSS, Test and Meta team from Jan. 2021 on. Updated by yours truly. The index 2020 is here

\n\n\n\n\n

Content Creation and #nocode WordPress

\n\n\n\n

Gutenberg has opened the eco-system to many possibilities that haven’t been there before, at least not without in-depth knowledge in software programming

\n\n\n\n

Preparing for a talk at a non-WordPress conference, Chris Lema published parts of his slidedeck in Using WordPress Without Writing Any Code. Lema also inspired me to look at Uncanny’s Automator for WordPress plugin.

\n\n\n\n
\n\n\n\n

Tammy Lister wrote a tutorial on Creating a page to display content from across multiple sites. She gives you a tour of the RSS Block, how to add it and combine it with other blocks. Lister also shows you how to style it via theme.json and how to build a page template in the new site editor. In conclusion, she wrote: “Creating a collection of content on a page previously took a lot more to do. You would either have had to know development or used a plugin. Now, you can use a block that core provides, and it has styling out of the box ready to go. “

\n\n\n\n
\n\n\n\n

B.J. Keeton of Elegant Themes wrote a tutorial on How to Use the WordPress Event Block by Automattic. There are plenty of occasions, when you don’t need a big event’s management plugin to announce and market your events on your website. More often than none, event registration and attendee management is better handled by other SaaS products. With the event block, you can highlight your event and guide the future audience to the right place for more information, registration, and payment.

\n\n\n\n
\n\n\n\n

In his latest video, Nick Diego, walks us through how to manage the visibility of block content using the Block Visibility WordPress plugin, while making live edits to the plugin’s website.

\n\n\n\n
\n\n\n\n

Chris Wiegman wrote a comparison theme review: Blocksy vs GeneratePress. The article is helpful not only because of those two themes. It’s a good blueprint, on a decision-making process for selecting a theme for your site. Wiegman describes clearly the problem to be solved and why he took the approach he took.

\n\n\n\n

Block-based Theme Development

\n\n\n\n

Jeff Ong posted Configuring Theme Design with theme.json on WordPress.org News section. A deep dive into the new method to configure themes and support features of the block editor.

\n\n\n\n
\n\n\n\n

The state of Full-Site Editing was the topic of last month’s Hallway Hangout with Anne McCarthy and theme developers around the globe. McCarthy provides a summary of the topic and the recording is available on YouTube

\n\n\n\n
\n\n\n\n

Brian Gardner, former StudioPress, now building block-based themes at Frost. Take a look at the just released Starter Sites.

\n\n\n\n
\n\n\n\n

Channing Ritter of the design team published additional details on block-based Widgets in WordPress 5.8 and Beyond. In this post, Ritter highlighted a few cool things that are now possible with widgets, and she took a look at where things may be heading next.

\n\n\n\n
\n\n\n\n

Theme creation is now easier, found Tammie Lister in her post, while Justin Tadlock points out the obvious in his article: (…) we are not there yet.

\n\n\n\n
\n\n\n\n

Joe Casabona has joined Carolina Nymark and Fränk Klein in offering an online course on Full-Site Editing: Master Full-Site Editing. Casabona offers a 50% discount for now.

\n\n\n\n
\n\n\n\n

Eric Karkovack asked, Will Full Site Editing Help WordPress Themes Finally Reach Their Potential?”. He wrote: “Instead of offering completely rendered designs, a theme might include an array of options for the header, footer, navigation, and content area. From there, a website owner can choose the options that best fit their needs and fill in the blanks with content.

\n\n\n\n
\n\n\n\n

Carolina Nymark updated her Block Markup VSCode extension. It includes autocomplete snippets that helps you add blocks to your templates faster. For the latest update, Nymark included the change from Query Loop to Post template and added the Search Block and Query Pagination.

\n\n\n\n\n

Need a plugin .zip from Gutenberg’s main (trunk) branch?
Gutenberg Times provides daily build for testing and review.
Have you been using it? Hit reply and let me know.

\n\n\n\n

\"GitHub

\n\n\n\n\n

Building Blocks for Gutenberg

\n\n\n\n

Alex Standiford chimes in with “Blocks Have Changed How We Approach Building Themes – Here’s How.

\n\n\n\n
\n\n\n\n

Rich Tabor helps you Manage WordPress publishing tasks with the Todo List Block. After creating the Markdown Comment plugin, he also created a To-Do list block for content creators.

\n\n\n\n

I list it under the Block Building headline because Tabor has been an early adopter of Gutenberg with CoBlocks which GoDaddy bought even before the Block Editor was merged into WordPress Core in 2018. Studying his code and approach will make you a better block builder.

\n\n\n\n

Tabor has been busy writing tutorials for building and extending blocks on his blog

\n\n\n\n\n\n\n\n\n
\n\n\n\n

Don’t want to miss the next Weekend Edition?

\n\n\n\n

We hate spam, too and won’t give your email address to anyone except Mailchimp to send out our Weekend Edition

Thanks for subscribing.
\n\n\n\n
\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 07 Aug 2021 22:18:34 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Birgit Pauli-Haack\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:1;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:79:\"WPTavern: Automattic Releases Quadrat, a Block-Based Podcasting WordPress Theme\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=121215\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:201:\"https://wptavern.com/automattic-releases-quadrat-a-block-based-podcasting-wordpress-theme?utm_source=rss&utm_medium=rss&utm_campaign=automattic-releases-quadrat-a-block-based-podcasting-wordpress-theme\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4914:\"\n\n\n\n

A few weeks ago, Automattic released Quadrat on the WordPress.org theme directory. It is now the company’s fourth block theme. Like its predecessors, it is a child of Blockbase, a project that serves as a foundation for the work of Automattic’s Theme Team.

\n\n\n\n

After spending a couple of months diving deep into the world of block themes, I was beginning to feel a little burned out. When I wasn’t sleeping, eating, or doing yard work in my off-duty time, I was building or exploring one project or another. Soon, it all had become a blur. I knew I needed to take a small break, and I have not touched themes for a couple of weeks since, at least not outside of work.

\n\n\n\n

However, Quadrat appealed to the theme developer within me. I am not sure if it was the soothing color scheme or just seeing the work the professional designers had put into it, but it offered a pathway for easing myself back into the block theme world.

\n\n\n\n

Outside of the work by Anariel Design with Naledi and Clove, most block themes have felt more like proof of concepts or starting points. Quadrat can now be added to the list of those with some personality.

\n\n\n\n

It does not push any particular boundaries, but it is a well-designed blogging and podcasting theme. Mostly, I am just a fan of the color scheme — sometimes you just need something other than black, white, and gray to get yourself out of a funk.

\n\n\n\n

One of the other reasons I have been following the work of the Quadrat theme was because it was the first showcase of header patterns I had seen. Kjell Reigstad shared what this system would look like in June.

\n\n\n\n
\n\n
\n\n\n\n

The goal is to include the patterns shown in the video in core WordPress, so they are not currently included in the theme. However, there is still an open ticket for header patterns in Quadrat.

\n\n\n\n

The only real trouble I ran into with the theme is with fully aligned blocks in the content. There is an overflow issue in version 1.1.1 that creates a horizontal scrollbar.

\n\n\n\nHorizontal scrollbar appears with full-width Cover block.\n\n\n\n

Quadrat includes nine custom patterns. The focus for most is on podcasting, but some are general-purpose enough for other use cases, such as “Media and text with button”:

\n\n\n\nMedia and text with button pattern.\n\n\n\n

The development team missed a prime opportunity with its podcast-related patterns. Instead of integrating with a podcasting solution, they are simple, static blocks from core WordPress.

\n\n\n\n

For example, the Latest Episodes pattern is a two-column layout that features Image, Heading, and Paragraph blocks. That is acceptable as a base pattern for users without a podcasting plugin. However, it may be practically useless for those with one enabled. Or, it creates unnecessary work because users must manually update their page content anytime they publish a new episode.

\n\n\n\nLatest Episodes block pattern\n\n\n\n

Given Automattic’s recent bet on Castos as part of a $756K pre-seed fundraising round, it would make sense to integrate with the podcasting company’s plugin, Seriously Simple Podcasting (SSP).

\n\n\n\n

If the development team wanted to take the Latest Episodes pattern to the next level, they would create it with the Query Loop block and display the latest podcast episodes from the plugin. For users without SSP installed, simply fall back to the current pattern. Or, offer both. Right now, it is little more than eye candy and not nearly as useful as it could be for real-world use cases.

\n\n\n\n

I often talk about the need for theme authors to elevate their game. Not only would such integration be beneficial to podcasters, but it would also showcase the power and flexibility of the block system.

\n\n\n\n

All of this is to say: If you are going to build a podcasting theme, build a podcasting theme. Quadrat appears to be one. However, when you peek behind the curtain, it is just a well-designed blogging theme. It has the potential to be so much more.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 07 Aug 2021 03:20:31 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:2;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:131:\"WPTavern: Gutenberg 11.2 Expands Color Support for Search and Pullquote Blocks, Introduces Experimental Flex Layout for Group Block\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=121142\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:305:\"https://wptavern.com/gutenberg-11-2-expands-color-support-for-search-and-pullquote-blocks-introduces-experimental-flex-layout-for-group-block?utm_source=rss&utm_medium=rss&utm_campaign=gutenberg-11-2-expands-color-support-for-search-and-pullquote-blocks-introduces-experimental-flex-layout-for-group-block\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4610:\"

Gutenberg 11.2.0 was released today with expanded color support for the Search and Pullquote blocks. Historically, customizing these elements has been out of reach for most users if their themes didn’t include them as options. This release introduces color support and border color support for the search button.

\n\n\n\n
\n\n\n\n

Pullquotes are getting a similar treatment with border and color support, enabling some creative design options for those who enjoy taking the reins on customization.

\n\n\n\n
\n\n\n\n

It’s these kinds of minute style changes that web developers would have been paid to perform back in the earlier days of theme customization gigs. Now the block editor enables anyone to jump in and do it themselves.

\n\n\n\n

These color support additions are part of a larger effort to improve the editor’s design tools to provide consistent application across blocks.

\n\n\n\n

“Another important goal of design tools is ensuring a wide range of exquisitely crafted patterns are possible; that best practices are not only possible but encouraged; and that customizing blocks is a consistent and natural experience,” Gutenberg Lead Architect Matias Ventura said in the ticket tracking design tool tasks.

\n\n\n\n

Gutenberg 11.2 also introduces support for a new experimental flex layout. The need for additional layouts was described by Rick Banister in a ticket submitted a year ago, requesting a “display horizontal” option for the Group block:

\n\n\n\n

When building patterns or trying to achieve a layout with multiple elements arranged horizontally it would help to have a parent block that would automatically arrange its children on a single line. Columns can be used to arrange things side-by-side, but they add quite a lot of extra nesting if you only need to arrange one set of blocks.

We could leverage the Group block and add a ‘display horizontally’ or ‘act as a row’ option to it. It would wrap its children and act as a ‘flex container’ (display:flex; flex-direction:row;). Further flex parameters could be optional to align and distribute objects.

\n\n\n\n

A flex layout option has the potential to remove some of the complexity in nesting blocks. This early prototype shows a rough, unfinished UI for a layout switcher. It shows the difference between a flex layout and the default “flow” layout, which displays children one after the other vertically without any specific styles. The PR included in Gutenberg 11.2 makes it possible for blocks to support multiple layouts. Gutenberg engineer Riad Benguella said the plan is to introduce more layouts, such as “grid” and “absolute positioning container.”

\n\n\n\n
\n\n\n\n

Adding “flex” layout support for the group block is the first step towards proving how multi-layout options can work in the block editor.

\n\n\n\n

“In the previous WordPress release, we introduced the layout config and the __experimentalLayout prop for inner blocks,” Benguella said. “The initial reason for these was to make alignments and content widths more declarative for themes. While this was an ambitious goal on its own and a hard one to achieve for the default layout, the goal has always been to absorb and support more kinds of layouts in the editor than the regular vertical list of blocks.”

\n\n\n\n

This experimental flex layout support can be useful for theme developers and makes sense in certain use cases with the Cover block, headers, social icons, columns, and other applications. The layout switcher UI is hidden in this release while the Gutenberg team works on a better design and wording for the feature.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 06 Aug 2021 03:59:26 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:3;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:75:\"WPTavern: First Commercial Content Pack for Launch With Words Now Available\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=121149\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:195:\"https://wptavern.com/first-commercial-content-pack-for-launch-with-words-now-available?utm_source=rss&utm_medium=rss&utm_campaign=first-commercial-content-pack-for-launch-with-words-now-available\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4571:\"

Marketing consultant Bridget Willard announced the first commercial content pack for her Launch With Words project. Last week, she released a set of 12 blog posts for roofing contractors, but there are more on the way for industry-specific content.

\n\n\n\n

In January, alongside Ronald Huereca of MediaRon, Willard launched the Launch With Words plugin. The initial project supported a single “starter pack” of draft blog posts to prompt website owners to publish something new each month to build their brand. The plugin itself is primarily an importer.

\n\n\n\n

For the developer crowd, Huereca has a post that covers the technical details of the project. It is well worth a read to see how he approached building the plugin.

\n\n\n\n

The idea was unique. Willard had written starter content for both the default Twenty Nineteen and Twenty Twenty WordPress themes. She then asked why no one was doing the same for post content. Thus, a new product was born.

\n\n\n\n

The roofing content pack carries a price tag of $497. Companies can publish the posts directly on their sites or customize the content for their locale.

\n\n\n\n

The imported content is a set of 12 blog posts specific to the roofing industry, each set as a draft that users can publish on their own schedule. Each is around 500+ words and includes headings, links, and quotes.

\n\n\n\nPreview of a daft post.\n\n\n\n

“So many roofing contractors don’t address the frequently asked questions from property owners,” said Willard. “These blog posts address 12. Having content that is turnkey ready allows them to have more content to share on social media as well as helping their SEO efforts.”

\n\n\n\n

She has been writing about the construction industry for over 20 years, so this was an easy jumping-in point. The challenge was creating this first pack while also publishing two new books and wrangling client work. With things settling down a bit, she thinks monthly pack releases are a more realistic target.

\n\n\n\n

Future Content and Starter Packs

\n\n\n\n

Willard is already working on a new content pack that focuses on general contractors, which she may split into two products between residential and commercial. She plans to have at least one ready by the end of the month.

\n\n\n\n

The long-term goal is to hire other writers to cover industries where she has less knowledge. First, she needs a few more sales to bring others on board.

\n\n\n\n

She may also create some industry-specific blogging prompts similar to the starter pack that is available for free. These would also come at a lower price point of around $97.

\n\n\n\n

“The starter pack (blog prompts) aren’t mutually exclusive with the premium packs,” said Willard. “They can be used together. Ideally, they should be used together. Because the content packs are JSON files, and the posts are imported as drafts, they can be written (prompts) or localized (premium) and scheduled. It’s the best of both worlds.”

\n\n\n\n

Writing, Writing, and More Writing

\n\n\n\n

“Writing is the way I can teach and solidify my legacy,” said Willard. “It’s super important for me to create a life worth living. Sadly, I found this out after a mental health emergency in February of 2020.”

\n\n\n\n

Her most recent book is The Only Online Marketing Book You Need for Your Nonprofit, co-authored by Warren Laine-Naida. Adrian Tobey, the founder of Groundhogg.io, also contributed an extra chapter.

\n\n\n\n

“You can’t create unless you consume,” said Willard when asked how she kept up her pace and the creative juices flowing. “I prioritize reading fiction and nonfiction, watching documentaries, taking walks in my neighborhood, going to a museum or a park alone to think and reflect and spend time with my friends laughing and playing card games.

\n\n\n\n

“The best thing for a writer to do is to write. Don’t worry about whether other people already talked about your subject. Don’t worry about what people will say. This is why we love WordPress. Start publishing.”

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 06 Aug 2021 01:09:16 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:4;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:115:\"WPTavern: From eCommerce Integration to Location-Based Controls, Block Visibility Pro Expands Upon Its Free Version\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=121122\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:273:\"https://wptavern.com/from-ecommerce-integration-to-location-based-controls-block-visibility-pro-expands-upon-its-free-version?utm_source=rss&utm_medium=rss&utm_campaign=from-ecommerce-integration-to-location-based-controls-block-visibility-pro-expands-upon-its-free-version\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:5198:\"

It has been several months since I last dived into Nick Diego’s Block Visibility plugin, and it is now one year since the initial release. Recently moved on from his past job into the WordPress product space, he has been building one of the best context-based plugins for showing or hiding content.

\n\n\n\n

In January, Diego touted some of the ideas he had for a yet-to-be-released Block Visibility Pro. He was already fulfilling user needs, but there was so much left to be explored.

\n\n\n\n

“As Block Visibility grows, there will be advanced and/or niche functionality that will be useful for certain users,” he said at the time. “Think integrations with other third-party plugins. There will always be a free version of the plugin but some of these additional features will ultimately be provided by a premium (paid) add-on called Block Visibility Pro.”

\n\n\n\n

Diego quietly released the pro add-on in June, which does not take away from the free version. Everything in it is a pure value-add and helps specific sets of users.

\n\n\n\n

Last week, he released Block Visibility Pro 1.1.0, and I managed to get a test copy to play around with. In short, I am more impressed than I was when I first covered the free version in January.

\n\n\n\n

Pro Additions

\n\n\n\n

Early versions of the free plugin had visibility controls for all visitors, user roles, and start-and-stop dates. Since then, Diego has beefed up the options to include screen size, logged-in status, and user accounts. It also integrates with Advanced Custom Fields and WP Fusion. That is more than many other content-visibility solutions will offer before needing to upgrade to a commercial or pro version.

\n\n\n\n

The current pro version includes conditional controls for the following:

\n\n\n\n
  • Location (Query and Post)
  • Time-based and day of week
  • WooCommerce
  • Easy Digital Downloads
  • Browser and Device
  • URL Path
  • Referral Source
\n\n\n\n

The Location controls are what I have found myself tinkering with the most. They are handy at the moment but will offer more power when used in conjunction with WordPress’s upcoming site editor.

\n\n\n\nLocation, query-based visibility controls.\n\n\n\n

The Location controls are essentially query-based visibility options. Users can choose to show or hide blocks based on post type, taxonomy, and more. Everything from individual post attributes to the archive type is available. Users can also create multiple rule sets, combining various location-based options.

\n\n\n\n

For shop owners, the WooCommerce and Easy Digital Downloads integrations are extensive. Users can display blocks based on shopping cart content, customer metrics, and product metrics. This could come in handy for promotions, coupons, and similar features.

\n\n\n\n

One of my favorite features, which is also included in the free version, is a popup option for selecting which visibility settings should appear in the sidebar.

\n\n\n\nToggling visibility controls in the Visibility tab.\n\n\n\n

This feature reduces the footprint of the plugin’s Visibility tab in the block sidebar panel while giving users control over which options they would like to use.

\n\n\n\n

It looks similar to a current proposal for the Gutenberg plugin that would allow users to toggle specific controls:

\n\n\n\nProposal for toggling block typography controls.\n\n\n\n

The differences between the two are in the location of the “ellipsis” button to open the popup. The Gutenberg proposal has it at the top of the tab. Block Visibility adds it as a control within its Visibility tab. However, the concept is the same, and the plugin provides a real-world test of how the feature could work. Thus far, I am happy with the result. It allows me to hide options that I would rarely use. I am eager for something similar to eventually work its way into core WordPress.

\n\n\n\n

From Developer to Developer

\n\n\n\n

If I am being honest, I am a bit envious of the work Diego has done. Many do not know this, but I also built a similar solution to Block Visibility in 2019. It was before I joined the staff here at WP Tavern. Before seeing that project mature, I handed it over as part of a larger IP sale.

\n\n\n\n

I point this out because I understand the complexities of building a solution that works from a technical standpoint while also being user-friendly. It is not easy, but Block Visibility seems to hit the right balance.

\n\n\n\n

And I do not say this often, but Diego’s work far exceeds anything I had built or even had in the pipeline. It is on another level, so a part of me is glad that he and I are not competing in this space. At the same time, I wish I could go back and implement some of these ideas on my former project.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 05 Aug 2021 02:15:57 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:5;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:47:\"HeroPress: My Life Before & After WordPress\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://heropress.com/?post_type=heropress-essays&p=4001\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:134:\"https://heropress.com/essays/my-life-before-after-wordpress/#utm_source=rss&utm_medium=rss&utm_campaign=my-life-before-after-wordpress\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:7202:\"\"Pull

Early Days

\n

I have always had a knack for technology. I still remember the summer of 2006 when I bought a PC for the first time. I would try to install Windows XP many times so to make Windows work smoothly but without any luck. It was those stubborn viruses, which would only be removed by running a virus scan, not a fresh Windows install, something I figured out later.

\n

Although, it took me another decade – right after my MBA in 2015 – to turn my curiosity for technology into a passion after I stumbled upon web technologies from the development perspective. It is when I started learning WordPress while still working in an administrative and support capacity at an organization in my hometown.

\n

Daydreaming

\n

Being an introvert in nature, the thought of working remotely providing value using technology with the freedom to choose my own work hours has always fascinated me. While becoming a digital nomad exploring nature felt like touching the sky. I knew it was quite possible after finding real stories online but I had no path to follow to turn my dream into a reality.

\n

The Challenge

\n

After spending tons of time online, figuring out the way was the easy step. Now that I look back during my initial days when I was getting started, the biggest challenge I have come to realize was to stay motivated as being all alone with the Imposter Syndrome – which I am sure every developer has faced during their careers – did take a toll on me.

\n

I think it is not easy to stay motivated when there aren’t immediate rewards for the hard work we do. Sometimes, weeks would go by for me to not do anything but try to stay motivated and don’t just give up.

\n

Humble Beginnings

\n

I could easily recall the evening of my last MBA exam day when I started exploring web technologies. Even just before that, I spent a good 2-3 months learning and then finding projects for web design on 99Designs until I realized that I am not very passionate about becoming a designer.

\n

I started learning HTML, CSS, basic JavaScript with jQuery but learning these technologies alone could only go so far without a clear path. I was looking for a tool that could help me build a website from scratch and for that, I explored many tools and technologies along the way including WordPress.

\n

While celebrating the 68th independence day of Pakistan online I came across this amazing article by Ahmad Awais (big props) which really helped me to make a definite decision to choose WordPress over other online publishing tools.

\n

After basic learning, I started right away working as a WordPress Power User, mostly delivering theme customizing projects for the clients in the local market while still working a day job.

\n

All the Way WordPress

\n

It took me another two years to finally choose WordPress as my full-time career. I moved to the capital and after many failed attempts at getting hired and desperate moments followed afterward, I finally received an offer letter from a digital agency, Centangle Interactive, where I joined as a Web Developer focused on the WordPress platform.

\n

I consider joining Centangle as one of the best decisions of my life as it helped me with my professional growth by becoming familiar with the whole WordPress ecosystem in a supportive environment. I was being valued for my opinions in the web projects I was involved with. I was also appreciated and encouraged for the open-source work I did for the company.

\n

During the pandemic last year, I joined a startup viz. UPTEK. The company provides web development services to its international clientele. I have been trusted with the opportunity to work on some of the premium freelancing platforms on behalf of the company.

\n

While apart from the developer role at the company, I am also involved in client communication and project management which has been an exciting journey for me so far with lots of learning almost every day.

\n

WordPress Community

\n

WordPress introduced me to the world of open-source software and the WordPress community itself. WordPress community connects WordPress enthusiasts via monthly Meetups, annual WordCamps, virtual collaborations like contributions to the WordPress project, and a whole lot more.

\n

The WordPress community made me a firm believer in the power of open-source software and an enthusiast who enjoys a great deal to contribute back to the WordPress community via writing, speaking, and helping organize meetups.

\n

Over the years, I have had the opportunity to write open-source software for the WordPress platform and feel humbled to contribute to the WordPress core. I have also had the privilege to speak as well as help organize the monthly WordPress Meetups and the annual WordCamp(s) for the Islamabad/Rawalpindi WordPress community.

\n

I was lucky enough to have the opportunity to help start the Elementor Community Islamabad Chapter – which organizes monthly Elementor Meetups. Yet that is not it, I have met some really humble people over the years, whom I proudly call my besties. I met these fine folks on a train on my way to WordCamp Karachi 2018 which was the very first WordCamp in Pakistan. It is all made possible by WordPress and its community and for that, I am forever grateful.

\n

Now fast forward to the present, I have been traveling and exploring every corner of the country almost every other month with my train buddies by fulfilling my dream of traveling.

\n

Takeaway

\n

If anything, one of the main takeaways, why I shared my story, is to stay persistent. I know it is hard to stay motivated and break into this industry. But if you are determined, then WordPress will surely reward you as It can’t be said in any better words than by the words of the very Chris Lema himself:

\n

“WordPress will change your life if you let it”

\n

So, if you are starting out then get yourself a clear path and just dive in doing WordPress as things will get better for you over time as they were for me, I promise. Good Luck!

\n

The post My Life Before & After WordPress appeared first on HeroPress.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 04 Aug 2021 03:00:18 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:15:\"Ihtisham Zahoor\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:6;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:93:\"WPTavern: Full Page Patterns Are Still the Missing Piece of Block WordPress Theme Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120067\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:231:\"https://wptavern.com/full-page-patterns-are-still-the-missing-piece-of-block-wordpress-theme-development?utm_source=rss&utm_medium=rss&utm_campaign=full-page-patterns-are-still-the-missing-piece-of-block-wordpress-theme-development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:6251:\"

It was the early days of the Gutenberg project. Many on the Theme Review Team and those in design circles were trying to wrap their heads around this new concept called blocks. In particular, we wanted to know how it could be applied to theme development. There were many discussions on the pros and cons of the early editor. Overall, there was a bit of cautious excitement in the air, our optimism tempered by a buggy version of alpha-level software.

\n\n\n\n

The block system could potentially solve one of the biggest hurdles of theme development: inserting default/demo content for a full page into the editor.

\n\n\n\n

I cannot remember who initially explained the idea, but it was a lightbulb moment for many at the time. The general concept was pre-building a custom homepage or any page design that users could choose visually. It would all be done through a standardized block system, and we would no longer need to rely on piecemeal theme options, third-party plugins, or attempt to work around the review team’s “do not create content” guideline.

\n\n\n\n

No one really knew how this would work in practice, but we understood the theory of how it would make the life of a theme developer much simpler.

\n\n\n\n

In October 2019, Automattic developer Jorge Bernal opened a ticket titled Starter Page Templates. His team was working on a template selector for mobile apps, and the WordPress.com Editing Toolkit already had the feature. The goal was to bring it to the core platform, allowing third-party theme designs to build on top of it.

\n\n\n\nStarter page templates idea initially shared in the ticket.\n\n\n\n

Because the term “template” is overused in the WordPress space, I will refer to these as “page patterns.” This naming convention was coined by Noah Allen, a software engineer for Automattic, in the ticket. It makes sense because we are actually talking about a page’s content rather than the wrapping template.

\n\n\n\n

The Genesis Blocks plugin is one of the best ways to understand the page pattern concept. It has a Layouts button at the top of the editor that, when clicked, creates an overlay of designs to choose from.

\n\n\n\nSelecting a full-page layout from Genesis Blocks.\n\n\n\n

These designs are split between sections and layouts. Sections are the same thing as patterns in core WordPress: small, reusable pieces of starter content. Layouts are full-page starting points for users to create various types of pages.

\n\n\n\n

The StudioPress/Genesis team was not the first to market this concept. However, they have created a well-rounded user experience on top of the WordPress editor.

\n\n\n\n

You will find similar experiences via GoDaddy’s onboarding process for its managed hosting service. The Redux Framework allows much the same, and Editor Plus offers templates and patterns from the Extendify library.

\n\n\n\n

That initial excitement has waned a bit. It felt like that early promise was a dream that would never be a reality.

\n\n\n\n

Theme authors, especially in the commercial space, have long offered home-brewed solutions for the one-click insertion of full-page content. Whether via a ThemeForest project or a popular theme on WordPress.org, there are endless examples of everyone solving the same problem. One might even argue that these custom inserters are so ingrained into theme agency systems that anything WordPress offers at this point will not appeal to those who have already brought their solutions to market. Where the core platform has failed to meet user demands, our development community has stepped up.

\n\n\n\n

Some of you may be thinking that the current block patterns system works for this. Yes, and no. Theme authors could shoehorn full-page designs into it, but the user experience is lacking compared to third-party solutions. Patterns today are one of the best theming tools available, but they fall short of what is needed to see this thing through.

\n\n\n\n

The foundation of this feature exists via the Patterns API. From the theme author’s perspective, they merely need a method for flagging a pattern as a full-page layout, separate from the others. However, the UI and UX flow need an overhaul. The flyout panel for the current inserter does not cut it, especially on large screens. A fullscreen overlay has become the de facto standard among other systems.

\n\n\n\n

Users should also have another option between selecting from an existing page pattern or starting empty upon creation.

\n\n\n\n

“I think this would be so useful to have in the core,” wrote Ana Segota of Anariel Design in a recent comment on the ticket. “I created 2 FSE themes so far and also our latest premium theme is made with block patterns and this is exactly what I thought and talked with few people about. It would be great when a user opens a new page, to chose design/page patterns however we called it and it starts editing it right away. Most of the users just want to add a page, choose a layout and start adding their content.”

\n\n\n\n

Of course, this is not a revelation to the average theme author who works with end-users daily. Inserting or importing entire page designs into WordPress is one of the most common requests. WordPress is almost there with its current patterns system. We just need to take it to the next level.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 03 Aug 2021 22:49:30 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:7;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"WordPress.org blog: The Month in WordPress: July 2021\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=11107\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:68:\"https://wordpress.org/news/2021/08/the-month-in-wordpress-july-2021/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:15193:\"

WordPress is global in reach and open source in nature. And you would assume that what allows the software to be used by anyone would also enable it to be built by anyone. After all, your location doesn’t matter, and who employs you also doesn’t matter. And your relative social standing certainly shouldn’t matter. As long as you can communicate with the others contributing to the project, there should be no obstacle to your participation.

\n\n\n\n

That was Josepha Haden on the “Cherishing WordPress Diversity” episode of the WP Briefing Podcast, speaking about the importance of diversity, equity, and inclusion within the fabric of the WordPress project. Her statement captures the spirit of the WordPress open source project, and we hope it resonates with you. Now, let’s dive in!

\n\n\n\n
\n\n\n\n

Say hello to WordPress 5.8

\n\n\n\n

WordPress version 5.8, “Tatum,” came out on July 20. Version 5.8 is a major release that offers features like block-based widgets, a host of new blocks and patterns, a template editor, a duotone feature to stylize images, theme.json, and support for webP images, to name a few. Read more in the release post, the field guide, and the talking points post for meetup groups.

\n\n\n\n

Want to contribute to WordPress core? 

\n\n\n\n\n\n\n\n

Gutenberg Version 11.0 is released

\n\n\n\n

Contributor teams released the 11th version of Gutenberg on July 9. Version 11.0, which focuses heavily on backports and bug fixes, showcases some cool features such as an editing overlay for template parts and reusable blocks, and support for CSS shorthand properties in theme.json and block attributes. Version 11.1 was also shipped this month, on July 21. The release adds custom block borders as block supports and adds “drag and drop” to the list view. 

\n\n\n\n

Want to get involved in building Gutenberg? Follow the Core Team blog, contribute to Gutenberg on GitHub, and join the #core-editor channel in the Make WordPress Slack. The “What’s next in Gutenberg” post offers more details on the latest updates. 

\n\n\n\n

Returning to in-person WordPress events

\n\n\n\n

The Community Team kicked off work to bring back in-person WordPress events. The team recently announced that in-person WordPress meetups can be organized in a region if the local public health authority allows in-person events and if the region passes the in-person safety checklist. If the region does not meet guidelines on page one of the safety checklist, organizers can plan events for fully vaccinated, recently tested (negative), or recently recovered community members. Subsequently, the team also shared a proposal for the return to in-person WordCamps in places that meet the safety guidelines and the vaccination/testing requirements. Please share your feedback on the post if you have any thoughts. For more context, check out the “In Person!” episode of the WP Briefing Podcast

\n\n\n\n

Want to contribute to the Community Team? Follow the Community Team blog, or join them in the #community channel in the Make WordPress Slack. 

\n\n\n\n

BuddyPress 9.0 is out

\n\n\n\n

The BuddyPress team is busy! Within barely a month of their last major release (version 8.0), the team shipped version 9.0 on July 19. Key features of the release include widget blocks and updates to the BP REST API.  Download it from the WordPress.org plugin directory or check it out from its subversion repository. Want to help build BuddyPress? Follow their developer relations blog, check out their handbook page, or join them in the #buddypress channel in the Make WordPress Slack.

\n\n\n\n

WordPress Event updates

\n\n\n\n\n\n\n\n

Feedback requests from WordPress contributor teams

\n\n\n\n

Please help these WordPress contributor teams by answering their research requests:

\n\n\n\n\n\n\n\n
\n\n\n\n

Further reading

\n\n\n\n\n\n\n\n

Have a story that we should include in the next “Month in WordPress” post? Please submit it using this form

\n\n\n\n

The following folks contributed to July’s Month in WordPress:  @webcommsat @chaion07 @jillbinder @lmurillom @meher

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 03 Aug 2021 13:53:13 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Hari Shanker R\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:8;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:107:\"WPTavern: Termly Acquires GDPR/CCPA Cookie Consent Banner, Turns Free Plugin Into a Commercial SaaS Product\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=121058\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:257:\"https://wptavern.com/termly-acquires-gdpr-ccpa-cookie-consent-banner-turns-free-plugin-into-a-commercial-saas-product?utm_source=rss&utm_medium=rss&utm_campaign=termly-acquires-gdpr-ccpa-cookie-consent-banner-turns-free-plugin-into-a-commercial-saas-product\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:5330:\"

Company A sells its plugin. Company B picks it up and moves forward with an overhauled version that looks and feels much different than the original. Users are outraged by the changes. It seems to be a repeating theme in 2021, almost as a rule rather than an exception.

\n\n\n\n

Last month, Termly announced its acquisition of the GDPR/CCPA Cookie Consent Banner plugin. The plugin was a simple tool for adding and styling a consent banner for the front end. It is now a SaaS (Software as a Service) product that requires a Termly account to operate.

\n\n\n\n

According to the team’s blog post, such changes were necessary. “Termly’s products, including the cookie consent management platform, are designed to cover the EU GDPR, the ePrivacy Directive, UK GDPR, and the CCPA. These laws require more than just a cookie consent banner to be compliant. Termly can help you build a privacy policy, create a Data Subject Access Request form, and comply with other privacy law requirements.”

\n\n\n\n

In the past couple of weeks, users have taken to the WordPress.org review system, handing out 21 of the plugin’s 29 total one-star ratings. The project has over 200,000 users, so more should be expected if the general consensus is that this was a poor move by the company.

\n\n\n\n

One of the complaints from users is the commercialization of the plugin. In the past, it was completely free to use. While there is still a free tier, users are limited to a mere 100 monthly unique visitors on a single domain. After hitting that limit, the banner will stop collecting consent records. The next level up costs $15 per month if paid annually.

\n\n\n\nNew pricing options for the Termly service.\n\n\n\n

As Pattaya Web Services pointed out via Twitter, “GDPR/CCPA Cookie Consent Banner for #Wordpress has been purchased by #Termly and will now cost most website owners $180 per year.”

\n\n\n\n

Termly must get a return on its investment. The company has developers to pay, and they have families to feed. But, I suspect the average user will not warm up to the so-limiting-that-it-is-free-in-name-only introduction level. Having to pay for features that have been free for years will not sit well with many.

\n\n\n\n

Of course, there is always the option of using the old version, but Termly has no plans of maintaining it or ensuring that it meets compliance. The only alternative for small site owners who cannot afford to pay is to opt for another solution.

\n\n\n\n

“I guess GDPR Cookie Consent banner, now operated by @Termly_io didn’t learn anything from [the] fiasco with WP User Avatar plugin reported by @wptavern earlier this year,” wrote user Gennady Kurushin on Twitter.

\n\n\n\n

I believe they did. There are differences, and Termly’s handling of this showed a willingness to be transparent.

\n\n\n\n

And, I cannot stress this enough: the new plugin is not an entirely different one unrelated to its core purpose. It was overhauled and turned into a SaaS product. At the end of the day, it is still a cookie consent management plugin — just different and costs a lot more for most users.

\n\n\n\n

Unlike Dark Mode and ProfilePress, Termly did not make the changes in the dead of night. At least the company was upfront about everything. The team included an announcement in a point release two weeks before sending out the overhauled version. It disabled automatic updates so that users would not accidentally upgrade without being aware of what was coming. It even published a public blog post detailing what was happening.

\n\n\n\nPrior notice of upcoming changes in 3.0 and disabled auto-updates.\n\n\n\n

If anything, Termly took just about all the necessary steps it could have taken to prepare its user base. If a “right” way existed for a complete and utter makeover of a plugin, the company did as much.

\n\n\n\n

That level of honesty is a bit more than we have seen in the past. The changes may still leave a bitter taste in the mouths of many users, but Termly should at least get a few points for making them in the light of day.

\n\n\n\n

The result may be the same: fundamental changes in how the plugin operates, but users had a chance to ditch it or continue using the old version before anything went into effect. For some users, it may not be much, but that’s worth something.

\n\n\n\n

I won’t be breaking out my pitchfork today, but I do not use the plugin. As more and more users upgrade to 3.0+ and realize they are essentially on the line for $180 per year, the reviews could get ugly.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 02 Aug 2021 22:04:23 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:9;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:81:\"WordPress.org blog: WP Briefing: Episode 14: The Art and Science of Accessibility\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"https://wordpress.org/news/?post_type=podcast&p=11096\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:83:\"https://wordpress.org/news/2021/08/episode-14-the-art-and-science-of-accessibility/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:9391:\"

In this episode, Josepha Haden Chomphosy discusses the nuances of building accessible software, the differences between access, usability, and accessibility, and how this all applies to the WordPress project.

\n\n\n\n

Have a question you’d like answered? You can submit them to wpbriefing@wordpress.org, either written or as a voice recording.

\n\n\n\n

Credits

\n\n\n\n\n\n\n\n

References

\n\n\n\n\n\n\n\n

Transcript

\n\n\n\n\n\n\n\n

[contemporary intro music]

\n\n\n\n

Josepha Haden Chomphosy 0:10

\n\n\n\n

Hello, everyone, and welcome to the WordPress Briefing, the podcast where you can catch quick explanations of the ideas behind the WordPress open source project, some insight into the community that supports it, and get a small list of big things coming up in the next two weeks. I’m your host, Josepha Haden Chomphosy. Here we go.

\n\n\n\n

[musical interlude]

\n\n\n\n

Josepha Haden Chomphosy 0:28

\n\n\n\n

This is the second of my big scary topics for this month. I’ll be talking about accessibility, which much like Diversity, Equity and Inclusion, or DEI in the last episode, is one of those areas where the work is never finished. Also, like DEI in last episode, I feel strongly about accessibility and the need for accessible experiences in the world, but I’m aware that this is an area where I’m still learning.

\n\n\n\n

Josepha Haden Chomphosy 1:04

\n\n\n\n

WordPress has both an accessibility statement and team, which makes a lot of sense given that the software supports so many different people, and industries, and cultures. But if you’re not quite bought into the idea that software should be accessible, or that accessible software can’t also be usable, then this is the episode for you.

\n\n\n\n

Josepha Haden Chomphosy 1:25

\n\n\n\n

Before I joined the WordPress project, the majority of my work with accessibility was in the context of the digital divide. Now, when talking about the digital divide, there are three concepts around quote-unquote, “getting things to people,” and those are access, usability, and accessibility. Sometimes these words seem interchangeable, but ultimately they have nuanced differences that address different problems. And I like to think of them this way.

\n\n\n\n

Access is making sure that someone can obtain something.

\n\n\n\n

Usability is making sure that the user experience is understandable or coherent.

\n\n\n\n

And accessibility is making sure that it’s usable by the largest number of people.

\n\n\n\n

I have always considered each as a subset of the one that came before it. So having something everyone can access is good, but easy to access and easy to use is better. Easy to use is good, but easy to use and easily accessible is better.

\n\n\n\n

Josepha Haden Chomphosy 2:27

\n\n\n\n

After joining WordPress, I discovered that accessibility in the context of software building is well, substantially more complicated. There’s no such thing as perfect accessibility, or a site that is 100% accessible, and many aspects are pretty open to interpretation. It turns out that accessibility, like so many things in WordPress, is a complicated intersection of art and science.

\n\n\n\n

As an example, there’s a rule that says, “Ensure that links are recognizable as links.” A fast shorthand to accomplish that, that we see all over the internet, is to underline all links or put that icon next to it that says, “This opens in a new tab.” You know that icon that’s a box with an arrow? That definitely has a name, that I definitely don’t know? That icon. [laughing] But those solutions don’t necessarily fit every context that you’ll find a link in, and that’s where we see that intersection between the art of communication and the science of necessity.

\n\n\n\n

Josepha Haden Chomphosy 3:32

\n\n\n\n

If you came with me earlier on the idea that accessibility is a subset of usability, and it’s not a far leap to say that the choices around accessibility implementations should always include design and the overall user experience.

\n\n\n\n

I know that some of you are thinking, “But we have guidelines! Like, that’s why we have the guidelines, so that not everything has to be a gray area.” And on the one hand, yeah, that’s true. There are a lot of guidelines. There are guidelines for the code, and what the code produces, and the design elements. But I worry that when a solution is driven solely by rules, rather than reasons, we run the risk of throwing out the good along with the bad.

\n\n\n\n

Josepha Haden Chomphosy 4:15

\n\n\n\n

Accessibility has been a consistent topic of debate in the project for as long as I can remember, and based on all of this, it’s really clear why. There are a few big picture questions that still deserve some sort of canonical answer for WordPress, and where possible I dig in and research the positions that everyone has taken in the past. But I also have questions about how to move everything forward, especially as the editing experience gets more and more standardized across the software, which reduces cognitive load, shortens the learning curve, etc.

\n\n\n\n

What is the future possibility for having a series of more niche admin interface options?

\n\n\n\n

What would it be like to be able to account for functional limitations in a way that lets site builders select what is needed for their clients or organization, or just individual situations they know their sites would be maintained under?

\n\n\n\n

What more could we do if part of the setup flow of WordPress was to select some bundle of potential add ons for neuro diversity, or colorblindness, or dyslexia, and more?

\n\n\n\n

It’s a really big question I have.

\n\n\n\n

Josepha Haden Chomphosy 5:26

\n\n\n\n

And I have to be really transparent here and share that my foundational understanding of accessibility and usability is 10 plus years old, and I learned it in the context of people in education, not software. So a lot of my questions about the future of accessibility and WordPress is the result of old knowledge exploring new spaces, which means they are a little untested. And I’m so grateful for the contributors who point out what the current research and thinking is, in this incredibly complex field.

\n\n\n\n

Josepha Haden Chomphosy 6:00

\n\n\n\n

I normally like to wrap up the briefing with a tidy takeaway, but this particular topic doesn’t really lend itself to that. So I’ll leave you with this. I really believe in WordPress’ mission to democratize publishing. And I, for one, will never stop learning about what gives people more access to the software, and what makes the software more usable, and especially how we can combine usability with accessibility in a way that puts form and function on a level playing field.

\n\n\n\n

[musical interlude]

\n\n\n\n

Josepha Haden Chomphosy 6:40

\n\n\n\n

And now, that brings us to our small list of big things.

\n\n\n\n

Thing one, it’s that time of year where many of our community members take a short break to relax and refresh. I’ll be taking a bit of a break during the month of August, and so the WP Briefing will return again starting in September.

\n\n\n\n

And thing two, huge thanks to the production crew that helps me make this podcast every couple of weeks, but a special shout out to our editor Dustin Hartzler, who makes quick work of all of my rambling thoughts.

\n\n\n\n

Josepha Haden Chomphosy 7:09

\n\n\n\n

And that is your small list of big things. Thank you for tuning in today for the WordPress Briefing. I’m your host, Josepha Haden Chomphosy, and I’ll see you again in September.

\n\n\n\n

[contemporary outro music]

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 02 Aug 2021 12:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:17:\"Nicholas Garofalo\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:10;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:80:\"WPTavern: Open Survey for WordPress Theme Authors on JSON Files and Block Themes\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120949\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:205:\"https://wptavern.com/open-survey-for-wordpress-theme-authors-on-json-files-and-block-themes?utm_source=rss&utm_medium=rss&utm_campaign=open-survey-for-wordpress-theme-authors-on-json-files-and-block-themes\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:11356:\"

WordPress 5.8 introduced an opt-in system for themes to configure block settings, styles, templates, and more. It is done through a new theme.json file that authors can put at the root of their theme folders. Anne McCarthy, the lead of the FSE Outreach Program, announced a survey earlier today to get feedback from developers on this feature.

\n\n\n\n

“Since this new mechanism is an early step towards a comprehensive style system for the future of WordPress, it’s important to hear from everyone who is currently using theme.json to learn more about how folks are using this tool and what might make sense to include in Core going forward,” she wrote in the announcement.

\n\n\n\n

The survey is open to all theme authors who have used theme.json, giving them a chance to put in some early feedback and help steer the ship going forward.

\n\n\n\n

Because I have worked extensively with this system over the past few months, I had a few things to say. Plus, I just like participating in WordPress-related surveys. I also decided it would be an opportunity to share some of my unfiltered thoughts from a development perspective on the current state of theme.json.

\n\n\n\n

What follows are my responses to the survey’s questions — well, the tidied-up version.

\n\n\n\n

Note: This is a developer-centric post that might not universally appeal to all of our readers. I have attempted to explain some things in user-friendly terminology, but some prerequisite knowledge of theme development may be necessary.

\n\n\n\n

Experience

\n\n\n\n

The first question of the survey is pretty cut-and-dry. It asks what your experience is with building block themes or using theme.json. It provides four choices (and an “other” option):

\n\n\n\n
  • I have built and launched block themes.
  • I have experimented with building block themes.
  • I have explored using theme.json with a classic theme.
  • I have used a block theme, but I have not built one yet.
\n\n\n\n

I chose the first option because I have already built two block themes for family and friends. These were simple personal sites that I already maintain for free — honestly, I need to start charging. I am also working on a theme that I hope to release publicly.

\n\n\n\n

How It Started and How It’s Going

\n\n\n\n

The second question asks how one got started with block themes and theme.json. The choices are between forking an existing theme, using the Empty Theme, or starting from scratch.

\n\n\n\n

Again, this is one of those things where I have experimented with each direction, but I cannot remember the exact starting point. The bulk of my work has come from forking a theme that I last worked on in 2019.

\n\n\n\n

I plan to release this as a new theme for free at some point. I am mostly waiting on the following:

\n\n\n\n
  • Navigation block development to settle down
  • The Post Author block to be split into smaller blocks
  • A robust set of comment-related blocks
  • Post Featured Image block to have a size option
\n\n\n\n

I think I could realistically release a use-at-your-own-risk beta version of my theme today if those items were addressed.

\n\n\n\n

Templates and Template Parts

\n\n\n\n

The survey asked which templates and template parts themers always include in their block-based themes. There was a freeform comment field — steps upon soapbox…

\n\n\n\n

I have a love/hate relationship with block templates at the moment. The static nature of HTML templates reminds me of simpler times when theme development was less complicated. However, this also presents a problem in a dynamic system.

\n\n\n\n

I cannot remember the last time I have built a traditional, PHP-based theme with more than one top-level template: index.php. The dynamic pieces have always been the guts of the thing, which are template parts. With PHP, it is easy to set some variable or use a function call to contextually load the templates parts necessary for whichever page a visitor is currently viewing on a site.

\n\n\n\n

The block template system does not work like that. It essentially forces developers into breaking the Don’t Repeat Yourself (DRY) principle.

\n\n\n\n

For example, if a designer wanted to display a different header template part for pages and posts, they would only need to create a header-page.php or header-post.php template in traditional themes. However, because the block template system is different, they must now create two top-level templates, single.html (post) and page.html, to accomplish the same thing.

\n\n\n\n

This is a “bad thing” because theme authors must duplicate all the other code in each of the top-level templates. There is no way to contextually load different template parts.

\n\n\n\n

To answer the question: I am using almost all of the possible top-level templates out of necessity.

\n\n\n\n

I also answered the second part of the question and listed my most commonly used template parts (broken down by hierarchy):

\n\n\n\n
  • Header
  • Content
    – Loop
    – Sidebar
  • Footer
\n\n\n\n

The content-*.html and loop-*.html template parts are those with the most variations.

\n\n\n\n

Defining Colors

\n\n\n\n

The next section of the survey asks how theme authors define their color palette slugs in theme.json. Believe it or not, naming colors may be the most controversial topic in the theming world in years. The only two things generally agreed upon are “background” and “foreground” colors.

\n\n\n\n

Morten Rand-Hendriksen opened a ticket in 2018 for standardizing a theme color naming scheme. It was not the first discussion and has not been the last. The problem it was meant to address was the slugs for colors in the system, which is how themes define their palettes. Once a user makes use of a preset color, the slug is hardcoded into their content. Switch to another theme with different slugs, and the old colors disappear and do not automatically change to the new theme’s colors.

\n\n\n\n

I use semantic names that follow something that closely resembles the Tailwind CSS framework’s shading system. Instead of red-medium (descriptive), I would use primary-500 (semantic), for example. A semantic approach would allow theme authors to define a set of colors that are updated each time a user switches themes.

\n\n\n\n

Of course, there are other schools of thought, and even everyone who prefers semantic naming does not agree on the same system. I have described my approach in more detail in a more recent GitHub ticket and have a theme.json Gist for others who might want to try it.

\n\n\n\n

Other Theme JSON Settings

\n\n\n\n

Outside of colors and typography, the survey asks what other settings theme authors have used. This is another scenario where I typically use everything — if there is an option for it, I am defining it.

\n\n\n\n

One use case that WordPress does not currently have a preset for is global spacing. Most theme authors use a single value for most vertical margins (whitespace between blocks and elements). It is also often used for default vertical and horizontal padding.

\n\n\n\n

I am unsure if I want a preset because I do not know how WordPress will use it. It is something that others have asked for, and it is nearly ubiquitous in use. Defining an entire system around it could cause headaches down the road, but I would still like to see some discussion around implementing at least a standard global spacing preset.

\n\n\n\n

Per-Block Settings and Styles

\n\n\n\n

This survey section was a yes/no question, simply asking if theme authors included per-block settings or styles in their theme.json files. Of course, I left some additional comments later in the optional comment section.

\n\n\n\n

I am happy with the system when it comes to settings, which allows themers to define which features are enabled globally or on a per-block basis. However, I am not sold on adding styles via theme.json.

\n\n\n\n

Writing CSS in JSON, essentially what we are talking about, feels wrong on so many levels. Currently, it is limited to merely a few configurable styles, so anything beyond that requires diving into an actual CSS file anyway. That is problematic because half of the theme’s CSS code is divided between theme.json and a separate CSS file. From a development standpoint, it makes the codebase harder to maintain.

\n\n\n\n

Initially, I started down the path of configuring per-block and element styles from theme.json. However, I have since moved my styling back to CSS files. It feels more natural, and I have the added benefit of all the tooling I am accustomed to. Right now, I cannot imagine a scenario where I would move back.

\n\n\n\n

Besides saving a few bytes of code, I have not seen many benefits to adding styles for most things via JSON. Maybe that will change in the future, and I will be a convert. For now, I am sticking primarily with CSS.

\n\n\n\n

Other Feedback: A PHP Layer

\n\n\n\n

I have said it before, but it bears repeating. We need a PHP layer for this theme.json configuration system. There is currently an open ticket for addressing this.

\n\n\n\n

There are two main benefits to such a system. Having a PHP API for piecing together configuration will feel far more natural to traditional theme developers. I look at it as a bit of an olive branch, a show of good faith that the core/Gutenberg developers recognize that many theme authors will have an easier time easing into FSE features via a familiar programming language.

\n\n\n\n

The second advantage is that there is an untold number of plugin ideas to extend global styles, site editing, and more if there is an easy way to hook into the theme JSON system and overwrite things. A simple filter hook would make this painless.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 31 Jul 2021 03:03:03 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:11;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:52:\"WPTavern: PublishPress Adopts Organize Series Plugin\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120910\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:149:\"https://wptavern.com/publishpress-adopts-organize-series-plugin?utm_source=rss&utm_medium=rss&utm_campaign=publishpress-adopts-organize-series-plugin\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:3043:\"

PublishPress, makers of the PublishPress and PublishPress Blocks plugins, have adopted the Organize Series plugin from Darren Ethier. Organize Series is a 15-year-old plugin for organizing and displaying posts in a series, useful for novel writers, educators, magazine sites, and anyone breaking their longer content up into a series.

\n\n\n\n
image credit: PublishPress
\n\n\n\n

PublishPress is also adopting seven extensions for the plugin that add features like custom post type support, shortcodes, the ability to add a post to multiple series, bulk publishing, and more.

\n\n\n\n

Ethier, who works as an engineer at Automattic, said he began losing interest in maintaining the plugin and knew it was time to search for a new owner.

\n\n\n\n

“Most of you have noticed that I haven’t been actively contributing to Organize Series or it’s extensions for some time now and it’s been bugging me,” he said. “I’ve been gradually losing interest in maintaining the plugin as I’ve expanded my developer horizons and as a result, I’ve struggled with making the time to work on it.”

\n\n\n\n

Ethier connected with PublishPress by describing his situation in a post on the Post Status community and agreed to transfer his plugin and extensions in exchange for a donation to a charity.

\n\n\n\n

“Darren asked us to make a charitable donation as part of the handover,” PublishPress founder Steve Burge said. “We chose the American Journalism Project. Over 2,100 communities in the U.S. have lost their local newspaper since 2004. The AJP is trying to reverse that trend. It is a non-profit that is investing in local news. Their goal is to help grow newsrooms that hold the powerful accountable, combat disinformation, and deepen civic participation.”

\n\n\n\n

Burge assured current users that the free version of Organize Series will remain free on WordPress.org with all of its current features and some improvements. The company will also keep the extensions freely available on GitHub but Burge said they plan to release a commercial version with updated versions of the extensions.

\n\n\n\n

With the adoption of Organize Series, PublishPress now has nine plugins available in its niche collection of publishing extensions as part of its mission to “help WordPress publishers succeed.” In the near future, Organize Series’ website content will be transferred over and the company will be changing the plugin’s name to “PublishPress Series.”

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 30 Jul 2021 21:54:22 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:12;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:82:\"WPTavern: Refined.blog: A Curated List of RSS Feeds for Software Engineering Blogs\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120771\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:207:\"https://wptavern.com/refined-blog-a-curated-list-of-rss-feeds-for-software-engineering-blogs?utm_source=rss&utm_medium=rss&utm_campaign=refined-blog-a-curated-list-of-rss-feeds-for-software-engineering-blogs\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:7197:\"

In one of the most apropos uses of a .blog domain, Refined.blog is a new website that promotes personal blogging with a curated list of software engineering blogs. It’s a simple site with an index of blogs, their Hacker News scores, tags, and a link to each blog’s RSS feed. The search function is very fast and applies to all columns in the index (with the exception of the feed URL). Columns can be ordered alphabetically, by tag, or by HN points.

\n\n\n\n
\n\n\n\n

“Experience is gold,” Refined.blog creator Musa Ünal wrote in the site’s introduction. “There are many different social media platforms on the internet but we need personal blogs again. It’s hard to find blogs so let’s create this blog list together!”

\n\n\n\n

It’s true – discovering new blogs isn’t easy. If you’re not following the right people on Twitter or don’t happen to be around when a person links to their posts on social media, then you are usually out of luck. Personal blogs are often not very well optimized for search and can get lost in the haystack.

\n\n\n\n

Google Search doesn’t provide a way to narrow results to personal blogs. The Wiby search engine is about the closest you can get for searching these types of websites, although it seems to be limited to older style pages that are based on one subject of interest. Wiby uses Microsoft Bing’s search results combined with Wiby.me results without sending your IP and user agent to Microsoft. Wiby’s about page explains the problem that sites like Refined.blog are aiming solve:

\n\n\n\n

In the early days of the web, pages were made primarily by hobbyists, academics, and computer savvy people about subjects they were personally interested in. Later on, the web became saturated with commercial pages that overcrowded everything else. All the personalized websites are hidden among a pile of commercial pages. Google isn’t great at finding them, its focus is on finding answers to technical questions, and it works well; but finding things you didn’t know you wanted to know, which was the real joy of web surfing, no longer happens. In addition, many pages today are created using bloated scripts that add slick cosmetic features in order to mask the lack of content available on them. Those pages contribute to the blandness of today’s web.

The Wiby search engine is building a web of pages as it was in the earlier days of the internet.

\n\n\n\n

Refined.blog brings more exposure to some of these single-person curated websites. Its creator, Musa Ünal, is considering branching out from an index of software engineering blogs to separate indexes for different topics.

\n\n\n\n

“For example, I am big fan of history bloggers, but it’s very hard to find these kinds of blogs,” he said in response to a question on Hacker News. “If you know such of blogs, please contribute to the project. If we have enough bloggers listed, we can create subdomains like history.refined.blog or art.refined.blog.”

\n\n\n\n

Hacker News comments on the project range from people discovering RSS for the first time and looking for reader recommendations, to people returning to RSS to get their news after becoming jaded by news algorithms and social media platforms. Other commenters shared that they, too, maintain their own lists of curated blogs. Refined.blog used some existing Engineering and Security blog lists as sources for the index.

\n\n\n\n

“I love this,” one person commented on Hacker News. “I’m in the ultrarunning community and I love reading everyone’s blog posts/trip reports/race reports/adventures. But everyone stopped updating them over the past 5 years or so. Now that sort of thing is just an Instagram photo with a paragraph or two. The depth and character of those old blog posts have been lost. I wish in depth blog posts would come back, but in reality, I don’t think they are.”

\n\n\n\n

Another commenter echoes the sentiments of others who have given up on promoting their blogs in the age of social media:

\n\n\n\n

I’ve completely given up on promoting my stuff. It used to be very easy and straightforward. Like minded folks could find new stuff without a problem. Nowadays, there’s just way too much content, the vast majority of very low effort, and you get lost in the noise immediately.

For example, I have an old blog post that got featured in podcasts, on dailyjs, HN, is linked to from MDN, etc. When I wrote it in 2014 I pretty much just submitted it to Reddit, that’s it. Nowadays I couldn’t recreate that exposure — or even a tiny fraction of it — if my life depended on it.

\n\n\n\n

Regardless of whether the site takes off or not, I think it’s important to catalog these attempts to restore the magic of that earlier era where websites offered a real window into people’s knowledge and interests. It may not look the same as many of us remember the old school “vintage” internet, but the blogosphere will continue to evolve as long as bloggers at heart keep experimenting with projects like this. So much of this style of writing has gone to email newsletters, but content that lives publicly on the web has a longer life cycle that can be rejuvenated through linked conversations. Writers can and should be able to embrace both methods of distribution.

\n\n\n\n

Refined.blog is hosted on GitHub and is open to feature suggestions and contributions. One person submitted an issue, suggesting the site add one or more OPML feed links so people can subscribe to all or some of the blogs at once. Ünal said he is working on making an OMPL export for selected blogs.

\n\n\n\n

If you’re looking to beef up your RSS reader with active software engineering blogs, Refined.blog might be a good place to search. There are no blogs referencing WordPress development yet, but the site does have several that focus on tooling, JavaScript, React, PHP, and other technologies that WordPress developers use. The index is specifically designated for personal blogs and company blogs are not permitted. Anyone can submit a blog for inclusion by following the instructions on the main Github project repo or by filling out the Google form with the same information.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 30 Jul 2021 02:58:57 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:13;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:66:\"WPTavern: TeslaThemes Rebrands, Shifts Focus to Real Estate Market\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120849\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:175:\"https://wptavern.com/teslathemes-rebrands-shifts-focus-to-real-estate-market?utm_source=rss&utm_medium=rss&utm_campaign=teslathemes-rebrands-shifts-focus-to-real-estate-market\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4961:\"

Earlier this month, TeslaThemes announced that it was rebranding to WPRealEstate. The company wanted to focus its efforts on a single niche in the theming market and cut back on the library of projects it was maintaining.

\n\n\n\n

In 2017, Imagely acquired TeslaThemes. The shop was created in 2013 and had grown its library to 68 themes. Last year, Imagely was acquired, and Nathan Singh was named CEO of the company.

\n\n\n\n

Eric Danzer, the founder and former CEO of Imagely, continued running TeslaThemes and its sister site ShowThemes since the acquisition. He is now ready to turn the page and jump into the next chapter of running a successful WordPress business.

\n\n\n\n

“I’ve decided that, as a business, we’ll do better focusing our energy on a specific niche rather than trying to be all things to all people,” he said.

\n\n\n\n

After several years of running a generic theme shop, the company ran into a brick wall that so many others in the industry I have talked to had hit. It is the realization that maintaining so many disparate projects puts an almost insurmountable burden on the development and support teams.

\n\n\n\n

“TeslaThemes has historically tried hard to serve a lot of small niches,” wrote Danzer in the announcement post. “We’ve had themes for real estate, recipes, musicians, eCommerce stores, photographers, event management, local business listings, and many other use cases. For each of those, we were embedding plugin-level functionality in each separate theme. That created a highly complicated product line that’s difficult to maintain and keep up to date.”

\n\n\n\n

The team had run into the Jack-of-all-trades-master-of-none problem. Tightening the focus would allow the company to focus on and become one of the best in a specific niche. Thus, the shift to real estate.

\n\n\n\n

“As I move on from Imagely, I wanted another big project to focus on,” Danzer added in a personal note. “I wanted it to be something I’m passionate about. I’m passionate about nearly every aspect of real estate. I own multiple rental properties, and I’m working toward a real estate license.”

\n\n\n\n

The company had already been doing well in the real estate market with its previous Realtor theme. It was one of its most popular options.

\n\n\n\n

“On the market side, the real estate market is large enough to sustain a great theme shop,” wrote Danzer. “Yet, it’s also a unique niche — real estate professionals have specific, challenging, hard-to-solve needs.”

\n\n\n\n

Existing TeslaThemes customers will continue receiving support and have access to any products purchased in the past. They will also be able to get the new real estate plugin and theme.

\n\n\n\n

The legacy themes, those created before the 2017 acquisition, are no longer under active development. The company replaced those in November 2020 with the Tesla Pro framework, which Danzer said his team plans to maintain and support for at least another year.

\n\n\n\n

WPRealEstate Plugin and Theme

\n\n\n\nMap, search, and listings blocks in a theme demo.\n\n\n\n

The team built the plugin on top of the block editor. They also created it alongside the RESO Web API, a modern standard for transporting data in the real estate world.

\n\n\n\n

While there is no public demo of the backend or even any editor screenshots, a peek under the hood reveals several custom blocks. The theme previews showcase map, search, and listings solutions. They also seem to blend the output with the Kadence Blocks plugin.

\n\n\n\n

Instead of launching multiple themes, the company will focus on building a single project with several design options out of the box. Users can import prebuilt content and data as part of the onboarding process.

\n\n\n\n

Danzer said that the new WPRealEstate theme is still a traditional, customizer-based theme. “We’ll start working on a new FSE theme almost immediately though. Between the work needed and waiting for FSE core functionality to mature, I don’t think we’d release that until sometime in 2022.”

\n\n\n\n

As far as I am aware, there are few, if any, robust block-based real estate solutions for WordPress at the moment. Custom post types and metadata serve as the foundation. However, a well-designed layer of blocks on top of that system could make it far easier for agents to build their sites.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 30 Jul 2021 01:44:52 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:14;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:60:\"WordPress.org blog: Configuring Theme Design with theme.json\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=11060\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:76:\"https://wordpress.org/news/2021/07/configuring-theme-design-with-theme-json/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:9733:\"\"\"\n\n\n\n

Starting in WordPress 5.8, a new tool — “theme.json” — is available to use in your theme. Maybe you’re hearing about it for the first time, or maybe you’re testing and developing themes with it already. Either way, I’m glad you’re here because it’s an exciting time for WordPress themes.

\n\n\n\n

This post provides a quick introduction to this new framework, and describes what’s possible by sharing a few practical tips and examples.

\n\n\n\n

What’s theme.json?

\n\n\n\n

Technically, theme.json is just a file that lives at the top-level of a theme’s directory. 

\n\n\n\n

Conceptually, it’s a major shift in how themes can be developed. Theme authors now have a centralized mechanism to tailor the WordPress experience for site authors and visitors. Theme.json provides theme authors fine-grained control over global styles, block styles, and the block editor settings.

\n\n\n\n

By providing these settings and controls in a single file, theme.json provides a powerful framework that brings together many aspects of theme design and development. And as the block editor matures and adds more features, theme.json will shine as the backbone for themes and the editor to work together \"💪\"

\n\n\n\n

Why Use it?

\n\n\n\n

It’s the future! But if you’re like me, you might need something more tangible to be convinced. Here are a few reasons why you might use theme.json today:

\n\n\n\n
  • Control editor settings like color, typography, spacing, and layout, and consolidate where these settings are managed.
  • Guarantee that styles apply correctly to blocks and elements across your site.
  • Reduce the amount of boilerplate CSS a theme used to provide. Theme.json won’t replace your stylesheet completely — there will be instances where CSS is needed to give your theme that extra flare (transitions, animations, etc.). But it can greatly reduce the base CSS needed from the theme.
\n\n\n\n

How do I use it?

\n\n\n\n

The rest of this post demonstrates a few theme.json configurations you can try out. The examples use the tt1-blocks theme.jsonthe block-based version of this year’s default theme

\n\n\n\n

If you’re starting with an existing theme, you might try copying a theme.json from the WordPress/theme-experiments repository (for example, the fse-tutorial theme by @poena) and adding it to the root of your theme’s directory.

\n\n\n\n

Change the typography settings of your site globally

\n\n\n
\n\"settings\": {\n	\"typography\": {\n		\"fontSize\": \"30px\",\n		...\n
\n\n\n

Making the change above in theme.json would result in the following updates to your theme’s body typography styles (before and after):

\n\n\n\n\n\n\n\n

Changing the base color settings of your site globally

\n\n\n
\n\"styles\": {\n	\"color\": {\n		\"background\": \"#ffc0cb\",\n		\"text\": \"#6A1515\"\n	},\n	...\n}\n
\n\n\n\n\n\n\n

Changing spacing / padding settings on specific blocks

\n\n\n
\n\"styles\": {\n	\"blocks\": {\n		\"core/code\": {\n			\"spacing\": {\n				\"padding\": {\n					\"top\": \"3em\",\n					\"bottom\": \"3em\",\n					\"left\": \"3em\",\n					\"right\": \"3em\"\n				}\n			}\n		}\n	}\n}\n\n
\n\n\n\n\n\n\n

Set a custom color palette in the editor for specific blocks like a button

\n\n\n
\n\"settings\": {\n    \"blocks\": {\n		\"core/button\": {\n			\"color\": {\n				\"palette\": [ \n					{\n						\"name\": \"Maroon\",\n						\"color\": \"#6A1515\",\n						\"slug\": \"maroon\"\n					},\n					{\n						\"name\": \"Strawberry Ice Cream\",\n						\"color\": \"#FFC0CB\",\n						\"slug\": \"strawberry-ice-cream\"\n					}\n				]\n			}\n		}\n	}\n}\n
\n\n\n\n\n\n\n

Enable and disable typography controls

\n\n\n\n

In the following example, the ability to supply a custom font size and line height for all heading blocks is disabled:

\n\n\n
\n	\"settings\": {\n		\"blocks\": {\n			\"core/heading\": {\n				\"typography\": {\n					\"customFontSize\": false,\n					\"customLineHeight\": false\n				}\n			}\n		}\n	}\n
\n\n\n\n\n\n\n

What’s Next?

\n\n\n\n

I hope this gives you a sense of what’s possible and where themes are going. The above examples just scratch the surface of what kinds of theme design configurations are possible, and I’m very excited to see what theme authors create.

\n\n\n\n

If you’re interested in learning more, here’s the developer note on theme.json, and here’s the documentation for theme.json in the handbook.

\n\n\n\n
\n\n\n\n

Thanks to @kjellr, @chanthaboune, @priethor, @annezazu for helping with and peer-reviewing this post.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 29 Jul 2021 22:26:13 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"Jeff Ong\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:15;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:70:\"Gutenberg Times: Join the WordPress Full-Site Editing Outreach program\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://gutenbergtimes.com/?p=18636\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:81:\"https://gutenbergtimes.com/join-the-wordpress-full-site-editing-outreach-program/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:8136:\"

Anne McCarthy, developer relations wrangler for the open-source WordPress project, spearheads the Full-Site Editing experimental Outreach program.

\n\n\n\n

The goal of the program is to get all the new tools for full-site editing that are coming to WordPress in the near future into the hands of site builders and implementers for testing and feedback.

\n\n\n\n

Given enough eyeballs, all bugs are shallow!

Linus’ Law by Eric S. Raymond
\n\n\n\n

In this short video, McCarthy explains the program and answer a few questions.

\n\n\n\n

The hope is that you, dear reader and listener, will seize the opportunity to contribute and get a look behind the scenes and share your experiences with the Gutenberg developer team.

\n\n\n\n

I joined a few calls for testing. It was great fun to learn more how the new Site Editor works and push the limits of the user interface. Sometimes it felt a little rough around the edges and I got lost a few times. I found my struggles and confusions, in the feedback summaries and quite a few bugs were found and squashed because of the people testing.

\n\n\n\n

Use the comment section below, to let us know what you think or if you have questions we can answer.

\n\n\n\n
\n
\n
\n\n\n\n

Transcript:

\n\n\n\n
Anne McCarthy
\n\n\n\n

Howdy. My name is Anne McCarthy. I’m a Developer Relations Wrangler working for Automattic. I want to share a bit today about the Full Site Editing outreach program.

\n\n\n\n

This is a program that I’m currently working on building out, so I hope by the end you feel compelled to join in on the fun. But let’s jump into some big picture questions, and know, I welcome questions as well in the comments below. I’ll also link to some resources.

\n\n\n\n

What is the Full-Site Editing Outreach program?

\n\n\n\n

So to start what is it? As the name suggests, it’s a program focused on Full Site Editing. Full Site Editing is a major part of phase two of Gutenberg right now.

\n\n\n\n

Currently, it’s in the form of a Slack channel in the wordpress.org slack community with

\n\n\n\n
  • Curated calls for testing,
  • feedback summary posts, and
  • various educational opportunities, like
  • live streams of people building block themes or
  • hallway hangouts, where we talk about Full Site Editing related issues.
\n\n\n\n

What is the Goal of the FSE Outreach Program?

\n\n\n\n

The goal is to ultimately help improve the Full Site Editing experience by gathering feedback from people who use WordPress, specifically WordPress site builders. But while the group was originally started solely to focus on this feedback loop, there’s actually a really neat education component in place where people can join in to start building your own awareness and understanding of what’s to come as well as share what they’re working on and what problems they’re running into.

\n\n\n\n

Why was it started?

\n\n\n\n

It was started originally in May 2020, with about 100 people who signed up to participate. It was intended to help create better engagement with users to get better feedback to developers more seamlessly, especially for change as big as those being brought on with Full Site Editing, it felt important to create a new pathway. And this was also a big lesson that was learned with WordPress 5.0 that we wanted to make better.

\n\n\n\n

What happens in the Program?

\n\n\n\n

As mentioned, there are calls for testing that happen every couple of weeks, followed by a summary post, which I’ll share links to later. And interspersed between that there are things like calls for questions where we’ll do a call for questions, people can submit their questions, and then I’ll go through and find answers for all of them to share the answers openly.

\n\n\n\n

And there’s also some hallway hangouts. There’s also some different educational opportunities and opportunities to give ad-hoc feedback. So for example, launching soon is going to be a survey asking folks who have built things with theme.json to share what they’d like to see in the future.

\n\n\n\n

Do I need to be technical to join?

\n\n\n\n

So this is something I hear a lot is what level of technical ability do I need to have in order to participate in this? So to kind of give you a lay of the land, this is what we typically need for each testing flow.

\n\n\n\n
  • You need to be able to set up a test site,
  • you need to be able to be using the latest version of WordPress, so you know how to update things and keep things up to date,
  • you need to use the Gutenberg plugin, which is just a matter of installing and activating the plug in, and
  • you need to use the TT1 blocks theme.
\n\n\n\n

Otherwise, you don’t need to be hyper technical to join this, we will not be going into code most of the time.

\n\n\n\n

Most calls for testing are very much end user-friendly and site builder friendly. So if this resonates, this feels like something you can do, I highly encourage you to join in.

\n\n\n\n

How to join?

\n\n\n\n

So it’s very simple, you dive into Make Slack and head to the FSE outreach experiment channel #fse-outreach-experiment, which you can see here. And from there, you’re all set.

\n\n\n\n

You just pay attention to pings from yours truly.

\n\n\n\n

And if you’d like you can subscribe to the Make Test blog is that’s where I post both the calls for testing and any other sorts of check ins.

\n\n\n\n

So let’s say you want to learn more and kind of actually see some of the stuff that we’ve done.

\n\n\n\n

Resources to learn more

\n\n\n\n

Here are the different links that you can follow. And I’ll drop these in the description of this video. But there’s the testing calls and summaries, the hallway hangouts, and the Q and A’s.

\n\n\n\n\n\n\n\n

Stay connected!

\n\n\n\n

Finally, if you want to stay connected with me, I’m @annezazu You can also find me at nomad.blog.

\n\n\n\n

I really hope you join the program if this resonated at all and if you are someone who uses WordPress on a regular basis to build sites for yourself or others.

\n\n\n\n

I really hope you join because we do need your feedback to make this a success.

\n\n\n\n

And WordPress is all about the community, and I’d love to continue to grow that community. Hope to hear from you soon and hope to see you join.

\n\n\n\n

Note: Feel free to leave your questions in the comment section below. I will get them to Anne McCarthy for answers. — Birgit

\n\n\n\n

Featured Image: Justin Tadlock’s exploration for the FSE Call for Testing #4

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 29 Jul 2021 20:46:05 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Birgit Pauli-Haack\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:16;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:65:\"WPTavern: Theme Creation Will Be Easier, But We Are Not There Yet\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120793\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:173:\"https://wptavern.com/theme-creation-will-be-easier-but-we-are-not-there-yet?utm_source=rss&utm_medium=rss&utm_campaign=theme-creation-will-be-easier-but-we-are-not-there-yet\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:6523:\"

“The way that themes have evolved within WordPress has made creating them easier,” wrote Tammie Lister in the opening line of her article titled Theme creation is now easier. “That feels like a bold statement, but it’s true.”

\n\n\n\n

It is not a stretch to say that many would be asking for this secret-sauce recipe of easy theme creation. If anything, WordPress theming is at its most complex stage in history. It is a weird mix of APIs and years upon years of legacy baggage. Jumping into traditional theme development today carries with it a high barrier to entry, especially if you want to build anything grander in scope than any of the default Twenty* themes.

\n\n\n\n

But Lister is talking about the WordPress of the future, a platform that will render its front-end output via blocks.

\n\n\n\n

The thing about blocks is that they put this veil over a lot of the messy legacy stuff, creating a new standard where anyone who wants to build a theme does not have to worry about a lot of the history that got us from Point A to Point B. That is a Good Thing. Standardization of the system was long overdue, but we are still in the process of making that final leap forward. It is a tough time to be a developer. It can also be an exciting new adventure if we stop thinking about themes from a traditional mindset.

\n\n\n\n

Lister made sure to point out the difference between theme “creation” and “development.” In almost two decades of WordPress, we have only ever had WordPress theme developers. Only those with the minimum knowledge of HTML, CSS, PHP, and [sometimes] JavaScript could build a theme. And, that is absolutely still true today.

\n\n\n\n

However, it will not be true tomorrow.

\n\n\n\n

The act of front-end design does not have to be an all-or-nothing affair. Creators can build custom patterns and soon be able to submit them to the official pattern directory. WordPress 5.8 launched the template editor, so anyone can dip their toes into the shallow end of the template-creation pool. Global styles, a feature yet to be released, carries with it the promise of customizing fonts, colors, backgrounds, borders, and much more.

\n\n\n\n

From a developer’s perspective, some of these features can seem limiting. We dive into code and see the world around us changing. Nothing is like the WordPress of old. There are moments when things are more complicated — sometimes by magnitudes.

\n\n\n\n

However, for people who have never written a line of code in their lives, there is something magical brewing. WordPress is lowering the barrier to entry to almost nothing for the “regular” folks.

\n\n\n\n

I remember how empowering it was to create my first personal blog design on top of WordPress. It was a fork of a theme by Tung Do, the former owner of the now-defunct WP Designer blog. I knew enough HTML and CSS to hack my way through most of it and just enough PHP to break my site several dozen times. It was a life-changing experience for me that played no small part in launching my career.

\n\n\n\n

However, I also think about all the people who never got to build their own site designs because they did not have the prerequisite knowledge, the available time, or ran into some other blocker that disallowed their entry into the experience. WordPress is positioned to change that with new tools, building a runway that allows more people to become a part of our collective design community.

\n\n\n\n

It is not only about building personal blog designs. It is about allowing anyone who wants to contribute to this open-source experiment, founded on the idea that we can share with our neighbors.

\n\n\n\n

The pattern directory, which is only a few days old, is an early example of that. As we continue removing barriers for non-developers, it opens an entire world of possibilities and, perhaps, allows some who did not previously have the privilege of contributing an opportunity to do so. Or, it could even be the launchpad of a new business for some.

\n\n\n\n

There is also a two-year-old ticket on starter page templates that is picking up steam. It is a sort of companion to block patterns, tackling entire pages instead of sections. The initial goal would be for themers to bundle these in their themes, but I envision a future where users can create and share these freely with their peers via WordPress.org.

\n\n\n\n

But, it is rough going for theme authors today — plugin developers too, but we’ll save that for another post.

\n\n\n\n

Traditional themes carry all the legacy baggage mentioned earlier, and some of the new block-related tools have added to the load. The current phase often breaks classic projects or forces developers into mixing compounds and waiting to see if the amalgamation explodes.

\n\n\n\n

And, the promised future of easy theming with blocks is still in its infancy. The moment developers get into anything slightly more “advanced” than a simple blog, there are hurdles and pitfalls aplenty. For example, if you want to use different image sizes and orientations in various sections of a front-page template, that is impossible with the Post Featured Image block.

\n\n\n\n

Or, maybe you have a theme user who wants to put a dynamic profile/account link for registered users on their own site. It is not happening without building a plugin or finding one to handle the job. It can also be a tough sell when four lines of PHP code worked just fine in the past.

\n\n\n\n

These are merely simple examples of an array of issues that theme authors deal with on a day-to-day basis. They are problem-solvers for the masses, but they do not yet have a robust enough set of tools. Foundationally, the block system can handle most problems and even provide better solutions in some cases, but not all of the necessary blocks or options are in place yet.

\n\n\n\n

As we continue solving these problems and adding the missing pieces, theme creation will be easier for everyone from the weekend tinkerer to the million-dollar theme shop. It will be a bit before we get there, but I find it hard not to look at what is upcoming and not be excited about the prospect of theming in the next few years.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 29 Jul 2021 02:18:45 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:17;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"HeroPress: From WordPress to Freedom\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://heropress.com/?post_type=heropress-essays&p=3984\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:124:\"https://heropress.com/essays/from-wordpress-to-freedom/#utm_source=rss&utm_medium=rss&utm_campaign=from-wordpress-to-freedom\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:3775:\"\"Pull

Hello there! Do you know that having a WordPress knowledge can change your life for good? Yes! It can.

\n

In the last half of 2020 which of course can be said as the pandemic year, I made more than $750 (300,000) creating websites with WordPress. Perhaps I could have made more even as a beginner, but I also had a full time job which didn’t make it easy for me as a beginner at that time. I didn’t quit my job at that time and I still haven’t cos WordPress is now easier and I started managing both ends well enough after few months.

\n

How I Started

\n

I was already a graduate of Computer Science and finished my service year by October 2019 but as regards employability I only had a beginner knowledge in HTML and CSS, of course I had pages created with that but I couldn’t make them really interactive cos I didn’t know enough JavaScript and I also had little knowledge of PHP. Here in my country, no one really hires Junior developers with no JS knowledge, then I needed money to keep myself learning.

\n

The bail out, I understood I needed to be skilled, so I began to see what I can do. One morning in May/June 2020 I decided to rearrange my workspace, then I found an old jotter of mine. Going through it, I found my jottings from watching a video on 4 professions you can learn on your own and get skilled with it (Note -not exactly the video title). On the list was WordPress, I went online and started searching on becoming a WordPress developer as a beginner. At this time, I already had a job, the pay was low which is also why I was thinking of learning new skills, meanwhile, pandemic also joined.

\n

The most helpful resource for me during my search then and till now is the WP Beginner website.

\n

With the little internet/data I had, I started reading, learning and practicing. I learnt how to register a domain, get a host and build with WordPress. I saved some money, registered 2 imaginary domain names, hosted them and built them with WordPress and Elementor, this was already early 2020.

\n

What next, I had to show people what I knew and what I have done with what I knew, cos no one would know if I didn’t show it. I posted the 2 websites on twitter, got some likes and comments, then got some messages to create 3 websites for some clients, I kept building and showing it, and the rest as they say is history.

\n

By the end of 2020, I already created about 10 websites and since then I have been making some side income as a Website creator aside my full-time job as a stock/store manager.

\n

My challenges 

\n

No active WordPress community here to support, and sometimes I have a block as to what to learn next and how to get clients.

\n

I solve what to learn with trying new things or interests, I recently enrolled in a UI/UX design class and I can say I really explored, cos I will be finishing an online internship this week of writing in July, 2021.

\n

In summary, learning about WordPress is something you can turn to a skill, a full time job, a side hustle and other cool things. Learn, build and show the world what you have.

\n

With WordPress, you can create amazing things and earn more.

\n

Thank you for reading.

\n

The post From WordPress to Freedom appeared first on HeroPress.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 28 Jul 2021 07:00:50 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Yusuf Omotoso\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:18;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:124:\"WPTavern: WordCamp US Online Set for October 1, 2021, as Community Team Weighs Proposal for Returning to In-Person WordCamps\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120610\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:289:\"https://wptavern.com/wordcamp-us-online-set-for-october-1-2021-as-community-team-weighs-proposal-for-returning-to-in-person-wordcamps?utm_source=rss&utm_medium=rss&utm_campaign=wordcamp-us-online-set-for-october-1-2021-as-community-team-weighs-proposal-for-returning-to-in-person-wordcamps\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4996:\"

WordCamp US will be held online this year on October 1, 2021. Organizers are planning a free, one-day event that will feature networking opportunities, speaker sessions, and workshops. Michelle Frechette, one of the organizers, said the team is planning on hosting a contributor day and will add more information to the event’s website over the next few weeks. In August, WCUS will send out the calls for speakers, sponsors, and volunteers.

\n\n\n\n

Planning for the 2020 virtual WCUS ended up as somewhat of a debacle after organizers decided to cancel due to pandemic stress and online event fatigue. The cancellation came after volunteers had already invested hundreds of hours of free time in planning the unfortunately timed event. Outbreaks in the US were worsening and political tensions were at an all-time high ahead of what went down as one of the most contentious presidential elections in US history.

\n\n\n\n

Bringing back WordPress’ flagship WordCamp as an online event was a necessity in 2021, as COVID-19 cases rise and ICU’s are filling up in US hot spot regions where vaccination rates are lower. The delta variant has thrown the world another curve ball in what has become one of the most stressful and traumatic 18 months in recent memory.

\n\n\n\n

Despite the continued public health crisis, the WordPress community is eager to restart in-person events. Rocio Valdivia published a proposal today, summarizing the Community Team’s discussions on how to establish a path for returning to in-person WordCamps. The proposal is based on using the current guidelines for meetups with a few additional guidelines pertinent to WordCamps. It uses the same decision-making flow chart that applies to green lighting in-person meetups:

\n\n\n\n\n\n\n\n

After these guidelines for meetups were announced in early July, in-person meetups have been held in six countries, including Russia, US, New Zealand, Uganda, Australia and the Netherlands.

\n\n\n\n

“Resetting expectations for WordCamps may be necessary, as the world has changed significantly,” Valdivia said in the proposal. “This is a great opportunity to rebuild the program by restarting locally, and then building back up to the levels we had in 2019.”

\n\n\n\n

WordCamps had mostly fallen into a fairly predictable format before the pandemic, but the Community Team is now keen on organizers experimenting with new formats and content. One example suggested in the proposal is delivering WordCamp content entirely online, followed by an in-person social gathering, for a more inclusive experience that makes it possible for those who cannot attend to participate in the educational aspects of the event.

\n\n\n\n

The Community Team is embracing the current hardships as an opportunity to improve WordCamps and rekindle the community spirit after such a lengthy absence from in-person events:

\n\n\n\n

Additionally, the normal WordCamp application process requires that there be an active local community in place. As the community has faced many changes this year, Deputies are thinking about how to handle this requirement. One possibility could  be more flexibility with WordCamp applications, allowing communities that had a meetup pre-COVID to host a WordCamp, even if they weren’t as active in the last year, to help build excitement and restart community activity again.

\n\n\n\n

The proposal includes a list of more practical considerations, such as securing fully-refundable venues, providing individually-packaged food instead of buffets, and limiting capacity to provide for social distancing. It also notes that WordCamps taking place during this transitional period would need to be prepared to cover 100% of their expenses, as WordCamps are currently exempt from the 2021 Global Sponsorship Program. Inclusion in the Global Sponsorship Program will be reconsidered once WordPress returns to in-person camps in all regions.

\n\n\n\n

The Community Team is inviting feedback on the proposal, which is still under active discussion. If you have ideas that you think should be included in the guidelines or suggestions for this transition period for in-person WordCamps, leave a comment on the proposal.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 28 Jul 2021 02:39:52 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:19;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:64:\"WPTavern: Create a Publishing Task List With the Todo List Block\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120470\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:173:\"https://wptavern.com/create-a-publishing-task-list-with-the-todo-list-block?utm_source=rss&utm_medium=rss&utm_campaign=create-a-publishing-task-list-with-the-todo-list-block\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4615:\"

Rich Tabor, the Senior Product Manager of WordPress Experience at GoDaddy, has been on a bit of a publishing productivity and workflow kick as of late. The co-creator of the Iceberg Editor plugin released a Markdown Comments block last month, allowing users to write editor-only notes. Last week, he launched the Todo List Block plugin.

\n\n\n\n

The latest plugin is yet another simple, editor-only tool. The goal is to allow publishers to create and keep track of tasks on a per-post basis. It is essentially a way to create a publishing checklist directly in the editor’s content canvas.

\n\n\n\nAdding a Todo List to a post.\n\n\n\n

For solo writers, it should work well as a standalone plugin. Larger teams might consider coupling it with a plugin like Post Descriptions for a more robust solution.

\n\n\n\n

One annoyance when using the block is that clicking the Enter button twice on the keyboard does not break you out of the Todo List. This is how lists work in core WordPress, allowing users to create a new paragraph or add a different block. I am not sure how to move out of the Todo List via the keyboard.

\n\n\n\n

The issue could be related to how the plugin builds the list. Technically, it creates two separate blocks. The Todo List block is a wrapper for individual Todo Items. However, I am generally a fan of this approach because it allows developers to create block options for each item (e.g., different colors for each), a feature I have needed on occasion with the core List block.

\n\n\n\n

Plugin + Theme Integration

\n\n\n\nTheme JSON integration.\n\n\n\n

One of the hardest things about developing plugins in past years was having no standardized method for themes to style plugin output. Every plugin author had their own system, which would often change from version to version, and theme authors had to keep up.

\n\n\n\n

Tabor may have just struck the perfect balance with the Todo List block. It defines its own styles but leans on the new theme.json standard available since WordPress 5.8.

\n\n\n\n

Almost anything a theme designer might want to style is easily configurable via JSON, and the plugin has an example bundled within it. Theme authors can simply copy the code wholesale, paste it, and modify it to suit their design. Or, they can just use the bits they want. I only wanted to change the text color, so it was as simple as plugging in a single custom value.

\n\n\n\n

This is the sort of forward-thinking that we need in this new era of blocks. And, this solution might just be the standard that other plugin authors should follow. It provides themers with an uncomplicated method for customizing plugin output and does not require nested styles to overwrite rules with high specificity.

\n\n\n\n

A Checklist Block Type in WordPress

\n\n\n\n

My initial interest in the Todo List Block plugin was its similarity to checklists (also called task lists). Essentially, these are unordered lists with a checkbox input for each item.

\n\n\n\n

For transparency, I mostly just want to build a recipe block pattern with a checklist. This would let readers check each step in the instructions as complete.

\n\n\n\nCreating a task list of recipe instructions.\n\n\n\n

It is a relatively standard feature in Markdown editors to be able to create checklists by typing something like the following:

\n\n\n\n
- [ ] Incomplete task.\n- [x] Completed task
\n\n\n\n

There is a ticket to bring a similar feature to the Gutenberg plugin. It was opened in 2019. However, other than a few people chiming in, it has not seen much traction in the two years since.

\n\n\n\n

Gutenberg project lead Matías Ventura shared a concept he had tried out early in the ticket:

\n\n\n\n
\n\n
\n\n\n\n

Given the similarity with the Todo List block, maybe we can give Tabor a little nudge and have him bring a checklist solution to the masses.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 27 Jul 2021 23:08:40 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:20;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:117:\"WPTavern: Colorado Becomes First State to Require State and Local Government Websites to Meet Accessibility Standards\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120625\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:279:\"https://wptavern.com/colorado-becomes-first-state-to-require-state-and-local-government-websites-to-meet-accessibility-standards?utm_source=rss&utm_medium=rss&utm_campaign=colorado-becomes-first-state-to-require-state-and-local-government-websites-to-meet-accessibility-standards\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4046:\"

Today marks the 31st anniversary of the Americans with Disabilities Act (ADA), a civil rights law passed in 1990 that prohibits discrimination against people with physical or mental impairments that substantially limit a major life activity. The legislation continues to help disabled people gain equal access to employment, schools, transportation, government services, and public accommodations.

\n\n\n\n

In a speech at the Rose Garden today, President Joe Biden announced guidance that would extend the ADA protections to COVID-19 long haulers who experience lingering symptoms that qualify as a disability.

\n\n\n\n

“We’re bringing agencies together to make sure Americans with long COVID who have a disability have access to the rights and resources that are due under the disability law,” he said. “Which includes accommodations and services in the workplace and school, and our health care system, so they can live their lives in dignity and get the support they need as they continue to navigate these challenges.”

\n\n\n\n

The Biden administration is continuing its commitment to accessibility which was first declared publicly on WhiteHouse.gov. When Biden took office, the site relaunched on WordPress with an accessibility statement, highlighting its ongoing accessibility efforts towards conforming to the Web Content Accessibility Guidelines (WCAG) version 2.1, level AA criteria.

\n\n\n\n

Last week, Colorado became the first US state to require state and local government websites to meet accessibility standards as established by the state’s Chief Information Officer. The bill states that the accessibility standards are to be identified using “the most recent web content accessibility guidelines promulgated and published by the world wide web consortium web accessibility initiative or the international accessibility guidelines working group.

\n\n\n\n

Each state agency in Colorado is required to submit an accessibility plan to the office before July 1, 2022. The office will review the plan and work collaboratively to set an implementation methodology. State agencies are required to fully implement the plan before July 1, 2024. Any agency not in full compliance will be considered in violation of laws that prevent discrimination against individuals with a disability. The bill also makes it easier for an individual with a disability to bring a civil suit against noncompliant agencies and the agency’s $3,500 statutory fine would be payable to the plaintiff.

\n\n\n\n

“This bill will give our local governments the resources to make sure they’re complying with the ADA,” Julie Reiskin, Executive Director of the Colorado Cross-Disability Coalition, told Colorado Public Radio. “Particularly after the year we just had. People who were blind couldn’t sign up for vaccines, get information online, sign language interpreters weren’t widely available. Failing to fund this says people with disabilities don’t matter.”

\n\n\n\n

WordPress web developers responsible for Colorado state or local websites should be ready to deliver accessible websites on the timeline laid out in the bill. It applies to any department, agency, special district, or other instrumentality. All of the state agency websites are currently running on Drupal 7, but the state has more than 4,268 active local governments. Many of them use WordPress and those responsible for these local sites will need to begin the process of creating a plan to ensure they are accessible before July 1, 2024.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 27 Jul 2021 03:59:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:21;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:105:\"WPTavern: Block Widgets, Template Editing, Media, and More: Enabling and Disabling WordPress 5.8 Features\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120605\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:247:\"https://wptavern.com/block-widgets-template-editing-media-and-more-enabling-and-disabling-wordpress-5-8-features?utm_source=rss&utm_medium=rss&utm_campaign=block-widgets-template-editing-media-and-more-enabling-and-disabling-wordpress-5-8-features\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:6051:\"

WordPress 5.8 was one of the most feature-packed updates that the community has seen in ages. There was just about a little something for everyone. And, there were plenty of things that some users would rather live without.

\n\n\n\n

Big releases on the CMS that powers 40% of the web mean that some users will want or need to disable new features. Whether it is turning on classic widgets, bringing back infinite scrolling in the media library, or enabling the template editor, there is bound to be a solution. Some say there is a plugin for everything, so we are about to test that theory against the WordPress 5.8 features list.

\n\n\n\n

Enable the Template Editor

\n\n\n\nCreating a landing page in the template editor.\n\n\n\n

The template editor is one of the highlights of WordPress 5.8, but the majority of users cannot use it right now. Weeks before the latest update, the release team decided to make this an opt-in feature. This put the responsibility on theme authors to test their themes and enable it. However, users could be waiting for weeks, months, or even longer to see if their theme author switches the feature on.

\n\n\n\n

Not every theme will work well with the template editor. Much of this comes down to how each was designed. However, many will work just fine with the new feature even if the theme author has not yet sent out an update that enables it. The only way most users can know is to turn it on and test it themselves.

\n\n\n\n

The Template Editor plugin by Webd Ltd does just this. There are no settings; just activate and give it a test run.

\n\n\n\n

Keep in mind that results may vary. If template editing does not work out, just disable the plugin.

\n\n\n\n

WebP and Controlling Image Formats

\n\n\n\nModern Images WP settings.\n\n\n\n

WordPress 5.8 introduced support for WebP images. This image type could reduce file sizes by 25-34%, depending on the original format. While WordPress supports WebP, it does not automatically change it upon upload. However, it now has the image_editor_output_format hook that plugin authors can filter.

\n\n\n\n

The Modern Images WP plugin by Adam Silverstein builds on top of that hook. It allows users to decide how their uploaded images are formatted on a case-by-case basis via the Media Settings screen. For example, users can transform their JPEG images to WebP or leave it as the default format.

\n\n\n\n

Classic Widgets

\n\n\n\nBlock widgets screen in WordPress 5.8.\n\n\n\n

Square peg, meet round hole. That is how I have often described the block-based widgets system introduced in WordPress 5.8. It is meant as a temporary transitional phase between classic and block themes. For many, myself included, it is one best avoided.

\n\n\n\n

Block widgets simply do not work with all themes, and some people just want the traditional widgets experience. Whatever the case, there is no shortage of options:

\n\n\n\n\n\n\n\n

For users who would still rather simply avoid all things related to blocks, the Disable Gutenberg plugin by Jeff Starr is your best bet. It is the most robust solution available, allowing site owners to fine-tune the experience.

\n\n\n\n

Enable Infinite Scrolling for the Media Library

\n\n\n\nMedia library with load more button.\n\n\n\n

WordPress 5.8 replaced infinite scrolling in the media library in favor of an Ajax-powered load more button. This change limited each “page” of images and other media to 40 items. This was a necessary change for keyboard users attempting to reach content appended to the screen and those who rely on audible feedback for navigation. Infinite loading was also a performance issue for those on slower connections.

\n\n\n\n

Accessibility and performance should always trump bells and whistles, but the WordPress development team provided a filter hook for plugin authors to tap into and reenable the feature.

\n\n\n\n

The change was slated for the WordPress 5.7 release but did not quite make the cut. David Baumwald released the Media Library Enable Infinite Scrolling plugin months ago in anticipation of it. The plugin still works great with WordPress 5.8 and is the solution for those who want to load images in the media library without clicking a button.

\n\n\n\n

The one missing plugin would let users control the number of media items displayed. For some, they are OK dropping infinite scrolling but want to bump up that 40-item limit. There is currently no way for plugin developers to hook in and change this, at least until an open ticket works its way through the system.

\n\n\n\n

Maybe there is not a plugin for everything yet, but it is close enough.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 26 Jul 2021 21:11:14 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:22;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:84:\"WordPress Foundation: Announcement: Online do_action hackathons in India and Nigeria\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:41:\"https://wordpressfoundation.org/?p=191803\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:99:\"https://wordpressfoundation.org/2021/announcement-online-do_action-hackathons-in-india-and-nigeria/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:5036:\"

Following the success of online do_action events worldwide in 2020, the WordPress Foundation is doubling down on its mission by supporting more charity hackathons in 2021. Even as COVID-19 continues to wreck havoc around the world, our community organizers in India and Nigeria are working hard to empower local non profits by helping them build a stellar online presence. We are excited to announce do_action Karnataka 2021 and do_action Nigeria 2021!

\n\n\n\n

do_action Karnataka (India) 2021

\n\n\n\n

do_action Karnataka will be a week-long online hackathon which is being planned on: 07 – 15 Aug 2021. WordPress enthusiasts in the state of Karnataka, India are coming together to organize this event, and the efforts are led by the WordPress Bengaluru meetup group. Bengaluru, the capital city of Karnataka, has already seen a successful do_action event in 2019.

\n\n\n\nA snapshot from do_action Bengaluru 2019\n\n\n\n

The hackathon has shortlisted three Non-profits: Luv Kush Foster Home (a foster home that aims to care for animals in need), Peacespark Foundation (which aims to support the education of underprivileged children), and Vridhi Foundation (Women and children welfare). The event has also put forth its call for participants/volunteers – if you would like to support non-profits by helping them build websites, simply fill up the form on the event website. Read the participant’s guide for more details on what is expected of you when you sign up. You can also support the event by signing up as a sponsor. Please email the organizers at: karnataka@doaction.org if you are interested in sponsoring the event.

\n\n\n\n

You can find more details about the event in their website:

\n\n\n\n\n\n\n\n

do_action Nigeria 2021

\n\n\n\n

Following the spectacular success of do_action Nigeria 2020, the vibrant WordPress community of Nigeria is back once again to organize an online do_action charity hackathon from October 25 through October 31, 2021! For the last three years, local communities in Nigeria have organized in-person do_action WordPress Charity Hackathons in several cities, where they had spent an entire day building brand new websites for a selection of local charities and NGOs. This year, for the second annual regional do_action Nigeria event, the team aims to repeat the same in an online format, for a handful of charitable organizations! 

\n\n\n\nParticipants are building websites for non-profits at do_action Lagos 2019.\n\n\n\n

do_action Nigeria has currently opened up its call for non-profits. If you represent a non-profit based out of Nigeria which does not have an online presence, please submit the application on the event website. Applications close on the 15th September 2021. You can also support the event by sponsoring the event, please visit the do_action Nigeria website for more details. You can also email the organizers at: nigeria@doaction.org if you would like to support the event.

\n\n\n\n\n\n\n\n

Organize a do_action charity hackathon in your region

\n\n\n\n

Are you excited about these upcoming do_action events? Would you like to support your local community by organizing a do_action event for your region? Send in your application right away! You can read more about do_action in the event handbook. Don’t  hesitate to ask any questions you may have in the comments. 

\n\n\n\n

Thank you for all that you do to empower the global community through WordPress!

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 26 Jul 2021 15:32:45 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"Hari Shanker\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:23;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:128:\"Gutenberg Times: Releases Galore in WordPress open-source projects, Business Case of Gutenberg and more — Weekend Edition #179\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://gutenbergtimes.com/?p=18564\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:133:\"https://gutenbergtimes.com/releases-galore-in-wordpress-open-source-projects-business-case-of-gutenberg-and-more-weekend-edition-179/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:15404:\"

Howdy, friend!

\n\n\n\n

Today’s weekend edition is a double-feature, so to speak. I’ll skip next week because of traveling overseas. First trip in 20 months. I am so excited and also busy to get ready. I will be back into your inbox on August 7th, 2021.

\n\n\n\n

This week was an exciting week for the WordPress open-source project and its many hundreds of contributors. One release after another! Just wow! Let’s dive right in.

\n\n\n\n

Stay well and keep safe!

\n\n\n\n

Yours, 💕
Birgit

\n\n\n\n\n\n
\n\n\n\n

WordPress open-source project Releases in July 2021

\n\n\n\n

WordPress 5.8

\n\n\n\n

Five hundred thirty awesome contributors worked on WordPress 5.8 and the release team let it loose on Tuesday as Tatum, after Art Tatum, a renown American jazz pianist.

\n\n\n\n

Need to catch up on all the features in this new version?

\n\n\n\n\n\n\n\n

BuddyPress 9.0

\n\n\n\n

In time for the block-based widget editor, the BuddyPress team released their block widgets in their 9.0 version this week. The new BP Widget Blocks are Legacy Widgets, rebuilt as BP Blocks. You can also access them in the Block Editor for use in your posts or pages!

\n\n\n\n\n\n\n\n

WordPress Pattern Directory

\n\n\n\n

The Meta Team has been collaborating with the Design team and designers in the community on the first version of the WordPress Pattern Directory. They released it officially on Tuesday night. Justin Tadlock has the skinny.

\n\n\n\n

I found a few to add to my favorites. What are your favorite block patterns? These initial 80+ patterns are also a great inspiration for theme builders who look to include themes styled patterns in their themes.

\n\n\n\n

If you are interested in creating block patterns from scratch, browse through this list of resources around block patterns.

\n\n\n\n

Gutenberg Plugin Version 11.1

\n\n\n\n

The Gutenberg Team released another version of the Gutenberg plugin, version 11.1.

\n\n\n\n

Grzegorz Ziolkowski and I discussed its many of the changes on 48th episode of the Gutenberg Changelog

\n\n\n\n

Justin Tadlock wrote: Gutenberg 11.1 Adds Drag-and-Drop Support for List View and Upgrades Block Borders

\n\n\n\n\n

 “Keeping up with Gutenberg – Index 2021” 
A chronological list of the WordPress Make Blog posts from various teams involved in Gutenberg development: Design, Theme Review Team, Core Editor, Core JS, Core CSS, Test and Meta team from Jan. 2021 on. Updated by yours truly. The index 2020 is here

\n\n\n\n\n
\n\n\n\n

Theme building for Full-Site Editing

\n\n\n\n

Tammie Lister shares here theme design journey on the site Ephemeral Themes. This week, she posted “Tips for creating a theme in the site editor” and explained the importance of testing early and often. Well worth your time!

\n\n\n\n\n

Need a plugin .zip from Gutenberg’s main (trunk) branch?
Gutenberg Times provides daily build for testing and review.
Have you been using it? Hit reply and let me know.

\n\n\n\n

\"GitHub

\n\n\n\n

\n\n\n\n\n
\n\n\n\n

Kjell Reigstad has the weekly round-up of issues, updates and discussions around Gutenberg and Themes for you. In this post Reigstad covered the most recent PR on FSE Blocks, General theme building and Global Styles. The list of overview issues is a great start if you need to catch up on the overall concepts and ideas.

\n\n\n\n
\n\n\n\n

Carolina Nymark, team rep on the Theme Review Team, ask for your comments on the newly proposed Theme requirements for inclusion into the Theme directory on WordPress.org. You can also read them in more details on GitHub issue #12 on the Theme Requirements repository of the Theme Review team.

\n\n\n\n

Deadline for the first round of comments is July 26th, 2021.

\n\n\n\n

On July 28th, 2pm CET. The team will conduct a Zoom interview with theme authors about the requirements. Spots are already full. Hopefully, the interviews will be recorded to educate more than a few theme developers about the requirements.

\n\n\n\n

Justin Tadlock provides background and more context as to the initiative via his post Next Phase of the WordPress Theme Review Overhaul.

\n\n\n\n
\n\n\n\n

Rich Tabor published The Ultimate Guide to WordPress Block Templates in Gutenberg and provides a comprehensive tutorial on how block-based theme template fit into WordPress template hierarchy and how they help WordPress users controls their site. Tabor also provided details instructions on how to build block-based templates and leverage them in your theme.

\n\n\n\n
\n\n\n\n

In his post Universal Themes: Customization on ThemeShaper, Ben Dwyer explored about how to make Global Styles and the Customizer work together. Dwyer looks at how to use classic WordPress tools (in this case the Customizer) to customize a block theme, while saving these changes in Global Styles – making a universal theme!

\n\n\n\n
\n\n\n\n

Developing Blocks and Plugins for the block editor

\n\n\n\n

Last month, Dmitry Mayorov, Senior Front-End Engineer at 10up, published a crash-course in WordPress Block Filters. Mayorov shows you how to extend core blocks with filters. He also helps you with the decision between extending a core or build a custom block instead.

\n\n\n\n
\n\n\n\n

Michael LaRoy wrote a tutorial on creating blocks with Advanced Custom Fields. He wrote: “By providing a PHP solution to block creation, a developer already familiar with ACF can efficiently create new custom blocks without writing any JavaScript.”

\n\n\n\n
\n\n\n\n

Bill Erickson has a tutorial on how to use Inner Blocks with ACF Blocks, to expand on the usefulness of the plugin for more complex layouts.

\n\n\n\n
\n\n\n\n

Alex Standiford explained in his post “How Gutenberg Blocks Work the basic concepts of how the block-editor stores content, why HTML comments and how is it rendered.

\n\n\n\n

Business Case for Gutenberg

\n\n\n\n

Artur Grabowski, co-founder of Extendify, a Gutenberg first product start-up, was Joe Howard‘s guest on episode 153 of WPMRR Podcast: Going Big by Solving WordPress’ Biggest Roadblock. Grabowski, like many other business development people in the WordPress space, regards the missing new user onboarding experience as the biggest roadblock for even bigger growth of the WordPress ecosystem. Howard and Grabowski had an honest and nuanced conversation about the business case for Gutenberg First approach to WordPress products.

\n\n\n\n

Grabowski took a historic view to the ongoing debate about Gutenberg being the right path for WordPress. Back in 2016, while working with Adobe and its product Spark, Grabowski became aware of many innovative web building tools. They were all block-based. It is only a fairly new concept for WordPress. “There is a lot less unknown here about the end state than some people realize.” If you are interested in the WordPress product space, I recommend you follow the link and dive into the details of things.

\n\n\n\n

The future is here. It’s just not evenly distributed.

Artur Grabowski
\n\n\n\n

Incidentally, Cory Miller, Post Status partner and Jeff Meziere talked to Chris Lubkert, also co-founder of Extendify, on their Webinar for the Business Value Academy. Webinar: Mergers & Acquisitions with Chris Lubkert

\n\n\n\n

Before co-founding Extendify, Chris Lubkert and Artur Grabowski worked in the Merger & Aquisitions department of Automattic. Tammie Lister also joined Extendify as their head of design. Extendify is the new home for a series of block-editor plugins and tools: Editor Plus, Redux Framework, Editors Kit, Gutenberg Hub, Gutenberg Forms, ACF Blocks, and Block Slider to name a few.

\n\n\n\n\n

Episode #48 is now available with transcript.
Next recording August 6th, 2021

\n\n\n\n

Subscribe to the Gutenberg Changelog podcast
🎙️ Spotify | Google | iTunes | PocketCasts | Stitcher |
🎙️ Pod Bean | CastBox | Podchaser | RSS Feed 

\n\n\n\n\n\n\n\n\n\n
\n\n\n\n

Don’t want to miss the next Weekend Edition?

\n\n\n\n

We hate spam, too and won’t give your email address to anyone except Mailchimp to send out our Weekend Edition

Thanks for subscribing.
\n\n\n\n
\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 24 Jul 2021 18:42:16 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Birgit Pauli-Haack\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:24;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:95:\"WPTavern: Next Phase of the WordPress Theme Review Overhaul: Open Meeting and Call for Feedback\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120311\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:233:\"https://wptavern.com/next-phase-of-the-wordpress-theme-review-overhaul-open-meeting-and-call-for-feedback?utm_source=rss&utm_medium=rss&utm_campaign=next-phase-of-the-wordpress-theme-review-overhaul-open-meeting-and-call-for-feedback\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:7104:\"

The WordPress.org Themes Team announced an open discussion and date for a Zoom meeting with theme authors. The team is proposing a new set of guidelines that reduces and simplifies what is currently in place. Comments on the proposal are open through July 26, and the meeting is set for July 28, 2 pm CET.

\n\n\n\n

This is the next step in an ongoing plan to revamp the review system and make it easier for the WordPress community to submit themes. It comes after months of waiting to see the results of earlier discussions unfold.

\n\n\n\n

In January, the state of the theme review system seemed to have reached a crossroads. The Themes Team, a group of gatekeepers that oversees submissions to the official WordPress.org theme directory, had been making strides in the previous couple of years. Its members had cleaned up most of the submissions backlog, but they still had a lot of work ahead to smooth out the review process. On the whole, a series of incremental improvements seemed to be working at the time, albeit slowly.

\n\n\n\n

Then, WordPress project lead Matt Mullenweg dropped a bombshell via the Post Status Slack:

\n\n\n\n

The .org theme directory is particularly bad when you compare it to any half-decent commercial theme marketing page, or the designs available on other site building services or Themeforest directories. The .org theme directory rules and update mechanism have driven out creative contributions, it’s largely crowded out by upsell motived contributions.

\n\n\n\n

It was an age-old discussion of whether the theme review guidelines were too high of a barrier for entry into the directory.

\n\n\n\n

Were WordPress users missing out on the best themes because the most innovative theme authors were not playing in the .ORG sandbox? If so, were the rules driving them away?

\n\n\n\n

No one can know if a more lenient, free-for-all atmosphere would have unleashed a mountain of creativity paralleling or besting commercial theme producers. But, perhaps if the team opened things up, it would test the theory.

\n\n\n\n

That initial post led to a series of discussions and a decision to overhaul the system. However, the Themes Team would need some help from the Meta Team to implement more automation of its grunt work, such as security and other code checks. Behind the scenes, pieces of that system have been put into place in the months since.

\n\n\n\n

Guidelines Proposal and Questions

\n\n\n\n\n\n\n\n

Themes Team representative Carolina Nymark listed a set of 13 overarching guidelines, each with sub-guidelines of their own. The proposal significantly simplifies the current rules for submission into the directory.

\n\n\n\n

She asks that theme authors review the proposal and answer the following questions in the comments ahead of the meeting:

\n\n\n\n
  • Will the updated requirements make it easier for you to submit themes?
    – If no, what is making it difficult for you to submit themes?
  • Will the updated requirements make it easier for you to review submitted themes?
    – If no, what is making it difficult for you to review themes?
  • Are there requirements that need to be removed, and why?
  • Is there anything in the list of requirements that is unclear? Describe the issue.
  • Can the formatting of the page be improved to make it easier to read?
\n\n\n\n

The current proposal is more expansive than the shortlist of guardrails WordPress executive director Josepha Haden Chomphosy mentioned in a post that laid out the next steps. Most of these were not meant as blockers for submission.

\n\n\n\n

“Rather we should use the list to flag themes that have/don’t have each thing and show them in results accordingly,” she wrote. “Likely exceptions to this would be proper licensing, adherence to fair use of the trademark, and a ban on child pornography or other images of anyone unable to provide consent.”

\n\n\n\n

The goal was to put more responsibility into the hands of users, granting them privileges to say whether a theme was working or not. This would take a lot of the work off the shoulders of the review team.

\n\n\n\n

Another part of the original proposal was to mark themes with “quality tags” that went above and beyond the baseline for approval. For example, internationalization (i18n) and accessibility (A11Y) are items that do not stop a theme from technically working. Instead of making these requirements, themes would merely be tagged if they met those standards.

\n\n\n\n

Presumably, there would be incentives for taking those extra steps for theme authors, such as higher search rankings, the ability to be featured, and more. It is not that i18n and A11Y standards are unimportant, but they are sometimes hindrances to first-time authors. And, they definitely fall within the range of things that end-users can dock themes for in the ratings.

\n\n\n\n

Many will take a hard stance on i18n and A11Y, but they are merely examples. A less controversial guideline might be the one that proposes that themes can only recommend plugins directly hosted on WordPress.org. Why should that be a blocker for inclusion in the directory? Some will say there is no good reason for it since themes are disallowed from installing plugins anyway. There are no technical issues with allowing such recommendations.

\n\n\n\n

It is these sorts of rules that have plagued the theme review process over the years. Often, it moves discussions into ideological territory that most users do not care about. They just want themes that work.

\n\n\n\n

Under the new proposal, moving to 100% blocks would further reduce requirements for developers. Currently, classic themes have a more extensive list of rules they must adhere to. Many of these are unnecessary for block themes, essentially cutting everything back to including a few required files. Most of this can and should be automated in the long term since they are necessary for a functioning theme.

\n\n\n\n

Right now, the 13 guidelines (and their sub-guidelines) are only a proposal. Theme authors have a voice, but they must use it. As is so often the case, decisions are made by those who show up. Far too often, the team is shouting into the void, awaiting a response that rarely comes.

\n\n\n\n

For theme authors who are invested in the future of the WordPress theme directory, that July 28 meeting is a can’t miss opportunity. Early responses via the comments on that post will also help shape the conversation.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 24 Jul 2021 02:20:53 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:25;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:87:\"WPTavern: WooCommerce 5.5.2 Fixes Performance Issues Found After Forced Security Update\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120467\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:219:\"https://wptavern.com/woocommerce-5-5-2-fixes-performance-issues-found-after-forced-security-update?utm_source=rss&utm_medium=rss&utm_campaign=woocommerce-5-5-2-fixes-performance-issues-found-after-forced-security-update\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:3187:\"

WooCommerce has shipped version 5.5.2 as a follow-up to the forced security update that patched a SQL Injection vulnerability last week. The vulnerability impacted versions 3.3 to 5.5 of the WooCommerce plugin, as well as versions 2.5 to 5.5 of the WooCommerce Blocks feature plugin. The team created a patch for more than 90 releases, which was sent as a forced security update from WordPress.org, due to the potential severity of impact for millions of WooCommerce installations.

\n\n\n\n

Shortly after the automatic update rolled out, many store owners started reporting serious performance issues on both WordPress.org and GitHub. Some users reported database crashes after receiving the automatic security patch in 5.5.1. One user reported a painfully slow, endless query that was “crippling to our operations,” with similar reports on GitHub of this same query “causing the entire server to go down.”

\n\n\n\n

Those with a large number of products in their databases were impacted more frequently. “We run a fairly big DB – 17k products,” one user said. “This has been a nightmare.”

\n\n\n\n

Store owners affected by this issue had resorted to downgrading to the previous releases at WooCommerce’s recommendation. They shared temporary workarounds to disable the query while WooCommerce investigated the issue. The problem was reported so frequently that it became a high priority for the team to fix.

\n\n\n\n

A week ago, WooCommerce developer Adrian Duffell reported back that they had determined the cause was twofold:

\n\n\n\n
  1. A slow SQL query used to retrieve the products that are low in stock. This SQL has been in WooCommerce for a number of releases.
  2. A REST API request, which executes this SQL query, is called more frequently in WooCommerce 5.5 than in previous versions.
\n\n\n\n

A combination of these factors was causing the degraded server performance when users updated to WooCommerce 5.5. A fix was released in WooCommerce Admin 2.4.4 three days ago, and the fix was also added to core today in 5.5.2. Users who had put workarounds in place are advised to remove them after updating to the latest release.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 24 Jul 2021 01:13:07 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:26;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:82:\"WPTavern: Revisions Extended Plugin Lets Users Schedule Updates to Published Posts\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=119935\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:209:\"https://wptavern.com/revisions-extended-plugin-lets-users-schedule-updates-to-published-posts?utm_source=rss&utm_medium=rss&utm_campaign=revisions-extended-plugin-lets-users-schedule-updates-to-published-posts\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:3972:\"

WordPress has long had the ability to schedule content to be published in the future, but it can only make immediate changes to posts that are already published. If you want to schedule changes to published content, a plugin is necessary. Corey McKrill, a full-time sponsored contributor to the WordPress.org Meta team, has developed a plugin, with the help of contributor Steven Dufresnethat, which is now in use on WordPress.org.

\n\n\n\n

Revisions Extended allows users to schedule revisions, or updates, for posts that have already been published. It extends WordPress’ revision system to include a “future” post status as a revision post type. McKrill recorded a gif to demonstrate the UI:

\n\n\n\n
\nhttps://cloudup.com/cOHLm_77ECk\n
\n\n\n\n

Although there are existing plugins which already perform this functionality, McKrill said they were either inadequate for WordPress.org’s needs or add extra functionality that they don’t need. Revisions Extended supports the following for any post type that supports revisions:

\n\n\n\n
  • From the block editor, make changes to an already-published post and schedule those changes to go live at a later date.
  • In the block editor UI as well as other admin screens, indicate when a post has a scheduled update.
  • View a list of all scheduled updates
  • Delete a scheduled update or trash/unpublish a post with a scheduled update
  • Edit scheduled updates, including the content and the future publish date.
  • Compare scheduled update content to the current published content.
\n\n\n\n

The ability to schedule updates is especially useful for ensuring that software documentation is updated when a new release is available or when API changes go into effect.

\n\n\n\n

The plugin entered the testing phase in March and is now used on multiple sites across the WordPress.org network. It makes it easier to schedule updates to lesson plans on the Learn WordPress site after a new version of WordPress is released. It also makes updates to HelpHub and DevHub more efficient.

\n\n\n\n

“If you need to schedule updates for published WordPress post/page/CPT without changing what’s already published (nor switching to draft), this is something we recently started using at the WordPress Docs Team and it’s a game changer,” contributor Milana Cap said.

\n\n\n\n

Revisions Extended is currently being developed on GitHub. McKrill said it may be be submitted to the official plugin directory someday when it is more ready for that level of exposure.

\n\n\n\n

“It’s a possibility,” McKrill said. “There’s a bit more functionality I think should be added first, namely the ability to create updates in a ‘draft or ‘pending’ status to go alongside the current ‘future’ status. Adding it to the plugin directory would allow a lot more people to try it out and give feedback, but it might also greatly increase the support and maintenance burden. So that has to be part of the calculation when deciding if/when to add it.”

\n\n\n\n

McKrill believes Revisions Extended could be a useful addition to core but there is not currently an active plan to bring it into WordPress.

\n\n\n\n

“Something like this might get traction during Gutenberg Phase 3, which will focus on collaboration tools,” McKrill said.

\n\n\n\n

For now, those who are interested to use Revisions Extended can download it and/or contribute to its development on GitHub.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 23 Jul 2021 03:02:19 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:27;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:92:\"WPTavern: Gutenberg 11.1 Adds Drag-and-Drop Support for List View and Upgrades Block Borders\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120386\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:229:\"https://wptavern.com/gutenberg-11-1-adds-drag-and-drop-support-for-list-view-and-upgrades-block-borders?utm_source=rss&utm_medium=rss&utm_campaign=gutenberg-11-1-adds-drag-and-drop-support-for-list-view-and-upgrades-block-borders\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:6299:\"

The Gutenberg plugin continues to march forward. Yesterday’s release, coming merely a day after the launch of WordPress 5.8, brings several new features and nearly three dozen bug fixes. The big-ticket items are drag-and-drop blocks in the list view and a much-needed upgrade for border support.

\n\n\n\n

Theme authors should enjoy the ability to control the Columns block’s stacking on mobile and some updated design controls for nav menus. While labeled an “enhancement,” themers should also check their designs against a breaking change to the RSS block’s updated styles.

\n\n\n\n

Drag and Drop Blocks in List View

\n\n\n\nDragging a block around in list view.\n\n\n\n

Drumroll, please. The moment we — or at least many of us — have been waiting for has finally arrived. The editor’s list view has become a powerhouse for managing long documents with many blocks. Over the past dozen or so releases, the development team has continued to tack on necessary feature after necessary feature.

\n\n\n\n

In version 11.1, users can drag and drop blocks from within the list view to order and organize content. However, users are not merely limited to moving things around within the list view itself. They can drag blocks from the list over into the content canvas and vice versa.

\n\n\n\n

I do not often use emoji, but sometimes I like to dole out a slow clap for a job well done. 👏 👏

\n\n\n\n

Border Support

\n\n\n\nAdding a dashed border to a Group block.\n\n\n\n

I have already been having a bit of fun with the new border options. Lately, I have been in the holiday spirit because I was getting ahead and buying my Christmas tree in July (when you find the good deals). This inspired me to create a coupon code block pattern, and the Group block’s border support was perfect for this.

\n\n\n\n

Gutenberg 11.1 refines the user experience for border options. The development team tightened the UI and placed the settings into logical groupings.

\n\n\n\n

Only the following core blocks have partial or complete border support:

\n\n\n\n
  • Button
  • Group
  • Image
  • Search
  • Table
\n\n\n\n

Users can also define individual corners with the border-radius option in this update. I would love to see the same treatment for the top, right, bottom, and left borders in the future. I also would not mind seeing a double-border style.

\n\n\n\n

Columns Block: Stack on Mobile

\n\n\n\nAdding post metadata to an unstacked set of columns.\n\n\n\n

By default, individual Column blocks will stack on top of each other in mobile views. However, users can now disable this via the parent Columns block on a case-by-case basis. This has also been one of the missing pieces for more layout control in block themes.

\n\n\n\n

One of the primary use cases for a Columns block that does not break on mobile devices is post metadata sections that should be inline. For example, theme authors often want to align the post author, date, and comments link in a single row below the post title.

\n\n\n\n

This toggle switch sort of moves us in that direction. However, it is a stopgap solution that does not afford theme designers the flexibility they are accustomed to with CSS (this is not generally a complicated affair).

\n\n\n\n

Before block themes and the site editor are rolled into core WordPress, theme developers will need fine-tuned responsive control over the Columns block and, perhaps, some type of row/inline/flex block to go along with it.

\n\n\n\n

Theme authors who need to target the Columns block based on whether mobile stacking is disabled can use the .is-not-stacked-on-mobile class.

\n\n\n\n

Post Terms and Tag Clouds

\n\n\n\nControlling the number of tags output.\n\n\n\n

The development team has crossed one of my months-long pet peeves off the list. In past releases of the plugin, the Post Terms block (variations of Post Tags and Post Categories) has displayed a pipe (|) separator between individual items by default. It now shows a comma, followed by a space.

\n\n\n\n

Theme authors can change this in their block templates, and users can customize it from the editor. The setting is located under the “Advanced” tab in the block options sidebar.

\n\n\n\n

The Tag Cloud block got a small but much-needed upgrade. Users can now set a limit on the number of tags to display. By default, it is set to show 45 tags.

\n\n\n\n

Navigation Submenu Colors

\n\n\n\n\n\n\n\n

The Gutenberg development team added two new color options for the Navigation block. Aside from its existing text and background colors, users can now change the text and background colors for submenu items.

\n\n\n\n

The Navigation block, while improved, still seems to be one of the trickiest pieces of the site-editing puzzle. It is trying to be the Jack of all trades, mastering few — if any — solutions. And, there is already a ticket gaining traction that would allow users to stuff a wider range of inner blocks into it.

\n\n\n\n

But, we have submenu text and background colors, which is a win. Only, they are named “Overlay Text” and “Overlay Background.” I am unsure whether it works as part of the mobile responsive menu. Gutenberg seems to have once again failed to bundle its front-end navigation JavaScript.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 23 Jul 2021 02:03:50 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:28;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:65:\"WPTavern: Stockfish Contributors Sue ChessBase for GPL Violations\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120248\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:175:\"https://wptavern.com/stockfish-contributors-sue-chessbase-for-gpl-violations?utm_source=rss&utm_medium=rss&utm_campaign=stockfish-contributors-sue-chessbase-for-gpl-violations\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:7065:\"image credit: Sebastian Voortman\n\n\n\n

A legal reckoning is brewing in the world of open source chess engines. Stockfish, a GPL-licensed chess engine widely recognized as one of the strongest in the world, has filed a lawsuit against ChessBase. The German-based company makes and sells chess software that relies heavily on the Stockfish engine, maintains a prominent chess news site, and runs a chess server for online games.

\n\n\n\n

Stockfish’s announcement, published this week on International Chess Day, claims that ChessBase has violated the GPL by not releasing the corresponding modifications of its products that are derivative works:

\n\n\n\n

We have come to realize that ChessBase concealed from their customers Stockfish as the true origin of key parts of their products. Indeed, few customers know they obtained a modified version of Stockfish when they paid for Fat Fritz 2 or Houdini 6 – both Stockfish derivatives – and they thus have good reason to be upset. ChessBase repeatedly violated central obligations of the GPL, which ensures that the user of the software is informed of their rights. These rights are explicit in the license and include access to the corresponding sources, and the right to reproduce, modify, and distribute GPLed programs royalty-free.

\n\n\n\n

In 2020, Stockfish added support for NNUE (Efficiently Updatable Neural Networks). ChessBase’s Fat Fritz 2 product includes a neural network that the company has not released. Stockfish’s previous statement on Fat Fritz 2 identifies these net weights as a derivative:

\n\n\n\n

“This chess engine is a Stockfish derivative, with a few lines of code modification (engine name, authors list and a few parameters), and a new set of NNUE net weights considered proprietary,” current Stockfish maintainer Joost VandeVondele said. “ChessBase’s communication on Fat Fritz 2, claiming originality where there is none, has shocked our community. Furthermore, the engine Fat Fritz 2 fails to convince on independent rating lists, casting doubt on the usefulness of those modifications. Indeed, we feel that customers buying Fat Fritz 2 get very little added value for money. Claims to the contrary appear misleading.”

\n\n\n\n

The GPLv3 permits ChessBase to sell its chess engine but requires the company to make its modifications available, along with all information needed to build the program. Stockfish informed Albert Silver, author of the neural net in Fat Fritz 2, of the license violation, resulting in ChessBase releasing its C++ sources but not the net weights. “Obviously, we condemn the approach taken,” VandeVondele said.

\n\n\n\n

Stockfish contributors have been working with a certified copyright and media law attorney in Germany to enforce their license and were able to force a recall of the Fat Fritz 2 DVD and the termination of the sales of Houdini 6. They are now pursuing the Termination clause of the GPL that would shut down ChessBase’s ability to distribute Stockfish in its products.

\n\n\n\n

“Due to Chessbase’s repeated license violations, leading developers of Stockfish have terminated their GPL license with ChessBase permanently,” the Stockfish team said in the most recent statement. “However, ChessBase is ignoring the fact that they no longer have the right to distribute Stockfish, modified or unmodified, as part of their products.”

\n\n\n\n

In a post titled, “Fat Fritz 2 is a rip-off,” published earlier this year, the Stockfish, Leela Chess Zero, and Lichess teams called out the product as a Stockfish clone, repackaged with a different neural network and “minimal changes that are neither innovative nor appear to make the engine stronger.”

\n\n\n\n

“It is sad to see claims of innovation where there has been none, and claims of improvement in an engine that is weaker than its open-source origins,” the teams wrote. “It is also sad to see people appropriating the open-source work and effort of others and claiming it as their own.” 

\n\n\n\n

Lichess, a free and open-source Internet chess server run by a non-profit organization that also uses Stockfish as a critical part of its infrastructure, has published multiple posts in support of Stockfish revoking ChessBase’s license to sell derivatives of the popular engine. Lichess also publishes the source code of everything they create using Stockfish so its users can see, modify, and redistribute it.

\n\n\n\n

Even if you’re not a connoisseur of chess drama, Lichess’ most recent statement of support for Stockfish identifies why this case is important to the greater open source community:

\n\n\n\n

Free open-source software offers essential freedoms that benefit developers and users alike, and those freedoms should have been extended to users of Fat Fritz 1, 2, and Houdini. Failing that, free-software licenses are only meaningful if they are enforced, making this an important case not only for Stockfish, but also for the open source community as a whole. We are happy that the Stockfish developers have the will and means to take action.

\n\n\n\n

Stockfish’s lawsuit may become an important landmark case for proving that the GPL can be enforced. It will also be interesting to see whether the courts regard the neural network weights that ChessBase trained as a derivative work that must be released as source code in order to be in compliance with the GPL.

\n\n\n\n

Stockfish has gained broad support from the project’s maintainers and developers who have stated they “have the evidence, the financial means, and the determination to bring this lawsuit to a successful end.” The team has promised to update their statement once the case makes progress.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 22 Jul 2021 04:30:45 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:29;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:63:\"WPTavern: The WordPress.org Block Pattern Directory Is Now Live\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120264\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:165:\"https://wptavern.com/the-wordpress-org-block-pattern-directory-now-live?utm_source=rss&utm_medium=rss&utm_campaign=the-wordpress-org-block-pattern-directory-now-live\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4519:\"

Yesterday, the WordPress pattern directory went live to the world as the development team behind it put the finishing touches on the project. It will work similarly to the theme and plugin directories in time. Along with WordPress 5.8, users can browse and use block patterns directly from the post editor.

\n\n\n\n

Officially, the pattern directory shipped as part of the WordPress 5.8 release. The Tavern did not include this in its coverage yesterday because it was still listed as an “in-progress” project until several hours later. The team was still wrapping up several issues yesterday for the initial launch.

\n\n\n\nPattern directory homepage.\n\n\n\n

The current patterns in the directory are a curated list of designs from over 20 volunteers. The team called upon the community in early June, and it answered. To date, there are over 70 patterns across six categories to choose from:

\n\n\n\n
  • Buttons
  • Columns
  • Gallery
  • Header
  • Images
  • Text
\n\n\n\n

Thus far, translations are complete for 12 languages. Others are at varying completion percentages, but there are dozens more that are incomplete. This would be an easy entry point for anyone who wants to give something back to the WordPress project.

\n\n\n\n

I had a hand in building the About Me Cards and Team Social Cards patterns, but I cannot take all the credit. Kjell Reigstad and Mel Choyce-Dwan took my initial ideas and ran with them. It was a rewarding experience just peaking a bit into how other designers work. I only wish I could have put in more time during the initial submission window.

\n\n\n\n
About Me Columns (left) and Team Social Cards (right) patterns\n\n\n\n

I look forward to submitting more patterns when submissions are open to everyone, the project’s next phase.

\n\n\n\n

“Work is now beginning on the next milestone, which will enable patterns to be submitted by anyone, similar to the Theme and Plugin Directories,” wrote Kelly Choyce-Dwan in the announcement.

\n\n\n\n

I am excited to see where the overall community can take the directory. Submissions have been limited and held to a specific aesthetic that will not be universally appealing. It may be hard for some users to look beyond centuries-old artwork, flowers, and the current fling with offset columns to see how a specific layout would work for their site. For others, it is perfect.

\n\n\n\n

Even I struggle with this. I can see the structure beneath the default images and text, but I am not inspired to use most of the patterns because they simply do not fit my personal style. When selecting one, I want to feel like the designer was building something just for me. I suspect that will play a part in winning over more users and bringing some holdouts over to the block system.

\n\n\n\nGallery-categorized patterns.\n\n\n\n

One limitation of the pattern directory is the imagery. Now that services like Unsplash, Pexels, and Pixabay have put limitations on their licensing, it can be tough to find photos and artwork that meet the guidelines for submissions to WordPress.org. However, that could open up a bit with the potential integration of Openverse, formerly the Creative Commons search engine. Making it easier for pattern designers to find the perfect images to build out their visions would improve the overall quality.

\n\n\n\n

What will eventually make the pattern directory a worthwhile venture is when the best designers from the WordPress ecosystem step up and begin competing. I eagerly await a breadth of authors putting their own stylistic spin on submissions.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 21 Jul 2021 22:37:53 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:30;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:40:\"HeroPress: More Than Just Joost’s Wife\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://heropress.com/?post_type=heropress-essays&p=3965\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:126:\"https://heropress.com/essays/more-than-just-joosts-wife/#utm_source=rss&utm_medium=rss&utm_campaign=more-than-just-joosts-wife\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:18682:\"\"Pull

Dit essay is ook beschikbaar in het Nederlands.

\n

My WordPress story is closely entangled with my Love story. Joost de Valk – my husband- led me to WordPress and the WordPress Community. And, while I love being Joost’s wife, I am much more than just Joost’s wife. My story on how I found my way in WordPress is also a story on how I stepped out of the shadows of Joost, without stepping away from (or on top of the toes of) my husband. It’s a story about my journey and my struggles in growing towards a leadership role. And, it’s a story about the wonderful inviting and inclusive world that WordPress is. But, there’s always room for some improvement!

\n

The early days – Marieke before Yoast

\n

I am extremely competitive and ambitious. Always have been. I was a highly competitive teenager, wanting to be the best at everything. I was president of the student council, editor of the school newspaper, and participated in debate clubs (that’s where I met Joost). After graduating high school (cum laude), I began studying Sociology and Communication Science. I obtained two bachelors and did a Masters in Sociology (all of it cum laude). And then, I decided to do my PhD in Criminology. I wrote my own research proposal and got funding to do my PhD. I was pretty keen on a scientific career. One year after I started my PhD I got pregnant…

\n

Joost and I were shocked by my pregnancy, but almost immediately decided that we wanted to have this baby. Joost quit his job and found a job closer to our home. This was his first job as an SEO consultant, a rather significant career move :-). He was working 4 days a week, as was I, which allowed us both to spend time and take care of our son Tycho. Joost and I got married.

\n

The pregnancy changed me. And it changed how people looked at me.

\n

All of a sudden, I wasn’t the high potential anymore. I was the girl that got pregnant during her PhD. I tried my best to prove that I could still do the same amount of work. But with a baby that was hardly sleeping and work piling up, I collapsed. I was diagnosed with burnout and depression. But I got better. I finished my PhD at a slightly slower pace. We decided that I wanted another baby and gave birth to our daughter Wende. I started to work as a teacher and a researcher. We had another son, Ravi. Yes, we really like children ;-). And Joost started his own business- Yoast.

\n

Joost was heavily involved in WordPress. His plugins had over one million users. He was speaking at all these conferences in the WordPress world and the SEO world. He was also doing consultancy. I helped him with his planning. I brainstormed with him about new business ideas. As of 2012, Joost started hiring people to work for him. He started working from an office. I helped with hiring. I did some research at Yoast. I liked being at the office. Thinking of ways to get a fun company culture.

\n

Finding my place at Yoast

\n

In 2013, I decided to join Yoast. I was having more fun at the Yoast offices than in my job as a teacher. It was a good decision, although it meant leaving my scientific career behind. That was hard. I started writing at Yoast. Writing about writing, about content SEO. I wrote an eBook, I launched Yoast Academy and I came up with the idea for a readability analysis within Yoast SEO. We had our fourth child, another son -Borre-, in 2015. At the same time I was doing a lot of work in setting up an inclusive and fun company culture for Yoast, inspired heavily by the WordPress community.

\n

At Yoast, I really was Joost’s wife for the first time. I felt that not everyone would take me seriously. People outside of Yoast often assumed that I was Joost’s assistant or his secretary. That never happened to me before. I struggled with those prejudices. My resume clearly showed that I had some brains, but some people did not seem to look beyond my marital status. People working within Yoast sometimes questioned my expertise too. Within Yoast, over time, that really changed. As I worked at Yoast for a longer period of time, people started to judge me on my track record within the company.

\n

Taking a leadership role

\n

In 2015, I started talking at conferences. At Yoast, I got my own team. I became a manager. A leader. That was new for me, uncomfortable even. Giving feedback, explaining to people what needed improvement or what I wanted different, that is challenging for me. Even today. I have a strong desire for people to like me. And, I was really insecure about my own skills. Who was I to tell people how to do their work? In my first years as a manager, I was super nervous whenever I needed to correct people. And, I often did not do that well. I was afraid of the confrontation, would postpone it and eventually addressed the issue when it had become this whole big thing. For everyone who worked with me and recognizes this: I am so sorry.

\n

Over time, I got more comfortable and less insecure. I was more confident that I knew what I was doing.

\n

Working hard and studying a lot pays off. I became an SEO expert. I felt comfortable talking about it on stage. As I became an expert in SEO and in marketing, it became more natural to give feedback or to ask coworkers to do something for me.

\n

I did a lot of the architecture of our company culture, our benefits and our HR plans.The WordPress community is well known for its diversity, for the openness and the acceptance. These are things that are really important within Yoast as well. Yoast breathes WordPress. Our core values are inspired by the WordPress community.

\n

Becoming CEO in a big WordPress organisation

\n

\"MariekeIn 2019, I became CEO of Yoast. Once again, I was faced with the prejudice of only getting the job because I am Joost’s wife. That threw me off my game a little bit. I felt like I had proved myself having enough capabilities to fill the role of CEO. I had founded Yoast Academy, written so many blog posts, talked at so many big conferences. I had designed the entire company culture and came up with a few really important product ideas. I didn’t feel like an imposter myself. I was shocked to find out that other people did see me as a puppet on a string.

\n

When I began as CEO, I was the only woman in our board and in our management team. I wanted to change that. I promised myself that I would change that. I began an inhouse coaching program for women that wanted to grow. And, we did our best to recruit more senior women. I succeeded.

\n

Nowadays, half of our management team consists of women. The board of directors (5 people) now consists of 3 men and 2 women. We are getting there.

\n

Also, we were trying our best to hire more people from traditionally underrepresented groups. We have a lot to learn and improve there. We launched a diversity fund to sponsor diversity at WordCamps.

\n

For me, having half of our management-team consisting of women seemed like something all companies are heading towards. However, being a CEO of a rather large WordPress company taught me otherwise. The number of women I encounter on my many partnership calls is really, really low. It often makes me uncomfortable being the only woman on a call yet again.

\n

WordPress is the most inviting, equal community I know. It’s the best! I know a lot of companies care about diversity. But that level of diversity is not yet reached at the level of management teams in WordPress companies. And that matters! Female leadership within WordPress means more than having women talk at WordCamps. We need to have more female leaders in WordPress companies as well. So, that’s my new mission ;-)!

\n

What a place to work!

\n

I love working in the WordPress world. I love working at Yoast. Most of the time, I enjoy being a leader, although I also struggle with the role. There’s a lot to gain in terms of diversity (and that’s more than gender of course) in the boardrooms of WordPress companies. And, although I struggle with being judged by my marital status, I wouldn’t dream of ever changing that. Joost has been a terrific ally in helping me with my struggles. We run Yoast together and we run our family together. I wouldn’t want it any other way.

\n

Meer dan de vrouw van Joost.

\n

Mijn WordPress verhaal en mijn liefdesleven lopen flink in elkaar over. Joost de Valk- mijn man- is degene die mij kennis heeft laten maken met WordPress en de WordPress community. Ik hou ontzettend veel van mijn man en ik vind het fantastisch om met hem getrouwd te zijn. Tegelijkertijd ben ik meer dan alleen maar de vrouw van Joost. Mijn WordPress verhaal is een verhaal van hoe ik uit de schaduw van Joost ben gestapt, zonder op zijn tenen te gaan staan of hem te moeten verlaten. Het is ook een verhaal over de moeite die het me heeft gekost om een leiderschapsrol te pakken. En het is een verhaal over hoe mooi open en inclusief de WordPress community is. Maar dat er tegelijkertijd nog werk aan de winkel is.

\n

Het begin: Marieke voor Yoast

\n

Ik wil altijd de beste zijn. Ik ben super ambitieus. Dat is altijd al zo geweest. Als middelbare scholier was ik voorzitter van de leerlingenraad, eindredacteur van de schoolkrant en deed ik mee aan het Europees Jongeren Parlement (daar heb ik Joost ook ontmoet). Na het behalen van mijn VWO diploma (cum laude) heb ik Sociologie en Communicatiewetenschappen gestudeerd. Ik heb beide bachelors gedaan en de master in Sociologie (alles cum laude). Daarna wilde ik gaan promoveren in de Criminologie. Mijn onderzoeksvoorstel kreeg NWO-subsidie, mijn wetenschappelijke carrière stond in de startblokken. En toen raakte ik zwanger…

\n

Dat was flink schrikken voor Joost en voor mij. Toch besloten we eigenlijk direct dat we heel graag een kindje wilden. Joost zocht een nieuwe baan dichterbij huis. Een baan als SEO consultant, wat achteraf een belangrijke carrière-switch is gebleken. Joost en ik gingen beiden 4 dagen in de week werken en zorgden gezamenlijk voor onze zoon Tycho. Een paar jaar later trouwden we.

\n

De zwangerschap en het moederschap was heftig voor mij. Ik veranderde erdoor.

\n

Maar het veranderde ook heel erg hoe andere mensen mij zagen, hoe andere mensen mij benaderden. Ik was ineens dat meisje dat ongepland zwanger was geworden. Ik was niet meer dat meisje met die hoge cijfers die altijd alles ‘volgens het boekje’ deed. Ik werkte keihard om niet onder te doen voor mijn collega’s en probeerde hetzelfde werktempo aan te houden als voordat ik moeder werd. Dat lukte niet. Tycho sliep heel slecht en alle veranderingen braken me op. Ik kreeg een depressie en een flinke burnout. Maar ik herstelde daarvan. Ik besloot het wat rustiger aan te doen. Maar ik maakte mijn proefschrift wel af en Joost en ik kregen nog een kindje, een dochter, Wende. Ik ben op het HBO gaan werken als onderzoeker en docent. Daarna kregen we nog een kindje, onze zoon Ravi (ja, wij houden dus erg van kinderen). Joost begon voor zichzelf en startte Yoast.

\n

Joost was enorm betrokken bij WordPress. Al vanaf 2006. Zijn plugins hadden ondertussen miljoenen gebruikers. Hij sprak op allerlei conferenties, zowel in de WordPress wereld, maar ook in de SEO wereld, waar hij inmiddels een grote naam was geworden. Hij deed een heleboel consultancy werk. Ik hielp hem. Ik hielp hem met zijn planning, ik brainstormde met hem over nieuwe business ideeën. Vanaf 2012 begon Joost ook mensen aan te nemen en vanuit een kantoor te werken. Ik hielp met de sollicitaties, ik deed ook wat onderzoek bij Yoast en schreef wat posts. Ik vond het heel erg leuk om op kantoor te zijn en om de bedrijfscultuur vorm te geven.

\n

Mijn plek bij Yoast vinden

\n

Het werken bij Yoast was eigenlijk leuker dan mijn werk op het HBO. In 2013 besloot ik om echt fulltime bij Yoast te gaan werken. Dat betekende dus dat ik mijn wetenschappelijke carrière afbrak. Dat was best heftig. Maar bij Yoast ging ik iets doen wat ik altijd heel erg leuk heb gevonden. Ik begon met schrijven. Ik ging schrijven over ‘hoe moet je nou eigenlijk schrijven’ en deed veel onderzoek naar content SEO. Ik schreef een eBook, ik lanceerde Yoast Academy en ik bedacht de readability analyse voor Yoast SEO. Joost en ik kregen nog een zoon, Borre, in 2015. Bij Yoast was ik ook druk met het opzetten van een leuke en inclusieve bedrijfscultuur. Daarvoor is de WordPress community een enorme inspiratiebron geweest.

\n

Toen ik bij Yoast kwam werken, werd ik voor het eerst ook echt ‘Joost zijn vrouw’. Voor mijn gevoel werd ik niet door iedereen serieus genomen. Mensen buiten Yoast gingen er ontzettend vaak vanuit dat ik Joost zijn assistent was, of zijn secretaresse. Dat was me nooit eerder overkomen. Ik vond dat mega ingewikkeld. Uit mijn CV blijkt toch dat ik capaciteiten heb? Sommige mensen lijken niet verder te kijken dan mijn burgerlijke staat. Ook binnen Yoast overkwam het me dat mensen twijfelden aan mijn expertise. Dat is echt wel veranderd in de afgelopen tijd. Nu ik langer bij Yoast werk, beoordelen mensen me gewoon op het werk dat ik bij Yoast heb gedaan.

\n

Een leiderschapsrol

\n

Gaandeweg kreeg ik een grotere rol. Ik ging spreken op conferenties en ik werd manager van een eigen marketing team. Ik werd een leider. Dat vond ik spannend. Feedback geven of vertellen tegen mensen wat anders moet is iets wat ik ingewikkeld vind. Nog steeds. Ik wil gewoon graag dat mensen me aardig vinden. En, ik was lange tijd heel erg onzeker over mijn eigen capaciteiten. Wie was ik om mensen te vertellen hoe ze hun werk moesten doen? In die eerste jaren als een manager was ik echt heel onzeker als ik mensen feedback moet geven. Ik vond confrontaties vaak te moeilijk en ging die dan uit de weg. Dan liet ik dingen uit de hand lopen en was het heel groot geworden voordat ik de feedback besprak. Voor iedereen die met me heeft gewerkt en zich daarin herkent: super sorry!

\n

Ik wende aan mijn leiderschapsrol en werd gaandeweg veel minder onzeker. Ik kreeg vertrouwen in mezelf, in mijn eigen capaciteiten.

\n

Door mijn deep dive in content SEO ben ik ook echt een SEO expert geworden. Ik werd gevraagd voor allerlei talks. Daarmee werd het ook veel natuurlijker voor mij om feedback aan collega’s te geven.

\n

Een groot deel van de bedrijfscultuur, onze arbeidsvoorwaarden en onze HR plannen komen uit mijn koker. De dingen die belangrijk zijn voor WordPress: diversiteit, openheid en inclusiviteit zijn ook de dingen die belangrijk zijn voor ons bedrijf. Yoast ademt WordPress. Onze core values zijn heel erg geinspireerd op de waarden in de WordPress community.

\n

CEO worden in een groot WordPress bedrijf

\n

En toen in 2019 werd ik CEO van Yoast. Wederom waren er mensen die zich afvroegen of ik die baan alleen had gekregen omdat ik Joost zijn vrouw ben. Dat kwetste me destijds. Ik had het idee dat ik me nu echt wel bewezen had. Ik had Yoast Academy gelanceerd, zoveel blog posts geschreven en op ontelbare conferenties gesproken. Ik ben verantwoordelijk voor de gehele bedrijfscultuur en ik heb ook een heel aantal belangrijke productideeën geïnitieerd. Ik had zelf geeneens meer last van een imposter syndroom en toch hadden mensen het idee dat ik een soort marionet van Joost zou zijn. Dat was even een tegenvaller.

\n

Maargoed, ik begon aan de taak als CEO en had al snel een extra missie te pakken. Toen ik CEO werd in 2019 was ik de enige vrouw in de directie van Yoast en ook de enige vrouw is ons MT. Ik wilde dat veranderen. Ik begon een inhouse coachingsprogramma voor vrouwen bij Yoast – het empowerwoment-project. Maar we gingen ook beter ons best doen in ons sollicitatieproces. En dat heeft echt gewerkt! We hebben nu 2 vrouwen in onze directie en de helft van ons MT bestaat uit vrouwen. Er is meer werk aan de winkel wat betreft het aannemen van mensen uit traditioneel onder gepresenteerde groepen. Daar moeten we bij Yoast nog meer mee aan de slag! In de WordPress wereld hebben we het diversity fund geïnitieerd wat voor nog meer diversiteit op WordCamps en in de WordPress community moet zorgen.

\n

Ik was altijd onder de indruk dat het belang dat wij bij Yoast aan diversiteit hangen iets is dat alle WordPress bedrijven onderschrijven. En misschien is dat wel zo, maar dat zie ik niet terug in de meeste boardrooms. Nu ik CEO van een groot WordPress bedrijf ben, merk ik dat ik heel vaak de enige vrouw in de vergadering ben. Dat vind ik nog steeds lastig. Ik voel me erg ‘anders’.

\n

WordPress is zo’n ontzettende open, uitnodigende cultuur om in te werken voor vrouwen. En ik weet dat heel veel bedrijven het belang van diversiteit zien en belangrijk vinden. Leiderschap door vrouwen betekent echter wel meer dan alleen veel vrouwelijke sprekers op WordCamps. We hebben die directeuren ook nodig! Dus dat wordt nu mijn nieuwe missie :-).

\n

Zo’n gave plek om te werken!

\n

Het is zo gaaf om met WordPress te werken! Het is geweldig om met de WordPress mensen te werken! En het is echt fantastisch om bij Yoast te werken! En ik vind het meestal ook heel leuk om een leider in de WordPress wereld te zijn, hoewel ik het ook vaak moeilijk vindt. Er is nog veel te verbeteren in die boardrooms van al die grote WordPress bedrijven en daar wordt ik enthousiast van!

\n

En, hoewel het getrouwd zijn met Joost soms iets is waar ik soms wat mee worstel, zou ik het echt niet anders willen. Joost is mijn bondgenoot en heeft mij zo geholpen met alle stappen in mijn carrière. Samen met hem run ik Yoast, samen met hem run ik ons fantastische gezin. I wouldn’t want it any other way!

\n

The post More Than Just Joost’s Wife appeared first on HeroPress.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 21 Jul 2021 06:00:06 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:19:\"Marieke van de Rakt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:31;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:64:\"WPTavern: BuddyPress 9.0.0 Transforms Legacy Widgets Into Blocks\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120209\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:173:\"https://wptavern.com/buddypress-9-0-0-transforms-legacy-widgets-into-blocks?utm_source=rss&utm_medium=rss&utm_campaign=buddypress-9-0-0-transforms-legacy-widgets-into-blocks\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:2305:\"

BuddyPress 9.0 was released one day before WordPress 5.8. As all major BuddyPress releases are named for pizza joints, this one has been dubbed “Mico” in honor of Pizzéria Chez Mico, a small restaurant on the French riviera, where you just may find capers and anchovies on your pie.

\n\n\n\n

This short release cycle was laser focused on getting all of the BP component widgets ready to be used as blocks to ensure that they work with WordPress 5.8’s new block widgets experience. BuddyPress 9.0 introduces 10 new BuddyPress blocks to be used in place of the legacy widgets.

\n\n\n\n
New BuddyPress Blocks in 9.0.0
\n\n\n\n

This release also enables users to transform legacy widgets into a block with two clicks, while preserving all of their settings and automatically importing them. The availability of these new blocks is an important milestone that BP contributing developer David Cavins said is “the first step toward the progressive retirement” of BuddyPress widgets.

\n\n\n\n

All this functionality that used to only be available in widgetized areas can now easily be used as blocks inside content areas. The blocks vastly expand BuddyPress’ flexibility, enabling site owners to do many things that used to require custom development. Designing unique landing pages for communities is now easier than it has ever been.

\n\n\n\n

“My coworkers are pretty excited to have these new BP blocks,” Cavins said during a chat in the BuddyPress development channel on Slack. “For instance, with the login form block, you can pretty well replace login form customization plugins and put the form in your landing page with ease.”

\n\n\n\n

The release also includes a new Sitewide Notices endpoint for the BP REST API that will enable site admins to create, edit, or delete notices and let users fetch the active notice. For a full list of the improvements and bug fixes included in 9.0.0, check out the release notes in the codex.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 21 Jul 2021 02:56:01 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:32;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:112:\"WPTavern: WordPress 5.8 “Tatum” Introduces Block Widgets, Duotone Media Filters, New Emoji Support, and More\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120192\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:251:\"https://wptavern.com/wordpress-5-8-tatum-introduces-block-widgets-duotone-media-filters-new-emoji-support-and-more?utm_source=rss&utm_medium=rss&utm_campaign=wordpress-5-8-tatum-introduces-block-widgets-duotone-media-filters-new-emoji-support-and-more\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:7541:\"

WordPress 5.8 “Tatum,” named in honor of jazz pianist Art Tatum, landed earlier today. It is the second major release in 2021. It includes duotone media filters, block-based widgets, theme-related blocks, template editing, and theme JSON file support.

\n\n\n\n

The release also ships tons of other notable features, such as support for new Emoji and an Update URI field for plugin authors to offer custom updates. The latest update also drops support for IE11, saying goodbye to the era of Internet Explorer.

\n\n\n\n

Matt Mullenweg led the WordPress 5.8 release, which saw contributions from 530 volunteers. The entire release team closed 320 Trac tickets and over 1,500 GitHub pull requests.

\n\n\n\n

The official release squad members were:

\n\n\n\n
  • Release Co-Coordinator: Jeffrey Paul
  • Release Co-Coordinator: Jonathan Desrosiers
  • Editor Tech Lead: Riad Benguella
  • Marketing and Communications Lead: Josepha Haden Chomphosy
  • Documentation Lead: Milana Cap
  • Test Lead: Piotrek Boniu
  • Support Lead: Mary Job
\n\n\n\n

Duotone and Media Improvements

\n\n\n\nDuotone filter + gradient overlay on a Cover block.
\n\n\n\n

The Image and Cover blocks received a new duotone feature. It is a filter that allows users to lay two colors over their media, creating unique effects. The colors overwrite the shadows and highlights of the image or video. Users can use WordPress’s defaults, theme-defined colors, or create their own mixes.

\n\n\n\n

WordPress 5.8 also introduces several upgrades to the media library. The development team replaced infinite scrolling with a “load more” button, improving the experience for screen-reader and keyboard users. End-users can now copy media file URLs from the Add New media screen.

\n\n\n\n

The latest release offers WebP image format support for the first time, and developers have a new image_editor_output_format filter hook to fine-tune the experience.

\n\n\n\n

Block Widgets

\n\n\n\nWidgets screen with a Gallery block in the Footer sidebar.
\n\n\n\n

For the first time since the block system launched with WordPress 5.0 nearly three years ago, blocks are no longer confined to the post content editor. Users can now use them in any available sidebar. This is a stepping stone in the Full Site Editing experience that will eventually lead to block themes and the site editor. In the meantime, it is a way for users to begin trying out blocks in new ways.

\n\n\n\n

However, those experiences may vary, depending on the active theme. Some older projects may not hold up well with this system. Authors may need to opt-out of the feature. Users who do not want to use block widgets or run into trouble can install the Classic Widgets plugin.

\n\n\n\n

Query Loop and Theme Blocks

\n\n\n\nQuery Loop pattern inserter: carousel view.\n\n\n\n

The power to create lists, grids, and other designs around a group of posts has long been solely in the wheelhouse of developers. Users had to rely on their themes or specialized plugins to make such changes. This is no longer the case. Users will have the power to create almost any type of post list they want from now and far into the future with the Query Loop block.

\n\n\n\n

And, this is just the beginning. WordPress 5.8’s new block is merely an introduction to what will eventually be one of the foundational elements to Full Site Editing in the coming years. As more and more blocks continue to mature, users and theme authors will continue building all sorts of layouts from this simple starting point.

\n\n\n\n

The Query Loop block will also be the first introduction of the pattern inserter to many users. This is a new tool that allows users to scroll through block patterns, choose one, and customize. In the future, it will become a more prominent feature.

\n\n\n\n

Inserting lists of posts is just scratching the surface. WordPress 5.8 ships a new “Theme” category of blocks for users to play around with. Many of these are primarily for use within the Query Loop, such as the Post* blocks. However, others like Site Title and Site Tagline will be handy in the template editor.

\n\n\n\n

Template Editor

\n\n\n\nCreating a custom landing page template.\n\n\n\n

The new template editor provides users with a method of creating reusable templates. And, they do not need a 100% block theme to do it. The feature opens an overlay from the content-editing screen for users to customize their page header, footer, and everything in between.

\n\n\n\n

This is essentially a scaled-back version of the upcoming site editor. With 5.8, its primary use case will be for creating custom landing pages. It is a lot of power in the hands of the average user. And, it helps WordPress inch closer to its goal of not only democratizing publishing but also design.

\n\n\n\n

The downside to this feature? It is currently opt-in. The active theme must declare support for users to access it. Many will not see it until developers submit updates.

\n\n\n\n

Developers: theme.json Support

\n\n\n\nReal-world theme.json file.\n\n\n\n

WordPress 5.8 lets theme authors begin tapping into global styles and settings configuration via the new theme.json system. In the coming years, this will be the foundation of how themers build their projects.

\n\n\n\n

Essentially, the new file is a bridge between themes, WordPress, and users, a standardized method of communication that puts them all on the same page. Theme authors define which settings it supports and its default styles. WordPress reflects these via the editing interfaces and on the front end. And, users can overwrite them on a per-block basis or, eventually, through the Global Styles feature.

\n\n\n\n

Right now, it is an opt-in feature that both traditional and block themes can utilize. Themers will want to start moving their projects over to using it now that WordPress 5.8 is on the doorstep.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 20 Jul 2021 19:56:02 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:33;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:39:\"WordPress.org blog: WordPress 5.8 Tatum\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=10976\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:41:\"https://wordpress.org/news/2021/07/tatum/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:48451:\"
\n\n\n\n\"\"\n\n\n\n

Introducing 5.8 “Tatum”, our latest and greatest release now available for download or update in your dashboard. Named in honor of Art Tatum, the legendary Jazz pianist. His formidable technique and willingness to push boundaries inspired musicians and changed what people thought could be done. 

\n\n\n\n

So fire up your music service of choice and enjoy Tatum’s famous recordings of ‘Tea for Two’, ‘Tiger Rag’, ‘Begin the Beguine’, and ‘Night and Day’ as you read about what the latest WordPress version brings to you.

\n\n\n\n
\n\n\n\n

Three Essential Powerhouses

\n\n\n\n
\n\n\n\n\n\n\n\n

Manage Widgets with Blocks

\n\n\n\n

After months of hard work, the power of blocks has come to both the Block Widgets Editor and the Customizer. Now you can add blocks both in widget areas across your site and with live preview through the Customizer. This opens up new possibilities to create content: from no-code mini layouts to the vast library of core and third-party blocks. For our developers, you can find more details in the Widgets dev note.

\n\n\n\n

Display Posts with New Blocks and Patterns

\n\n\n\n

The Query Loop Block makes it possible to display posts based on specified parameters; like a PHP loop without the code. Easily display posts from a specific category, to do things like create a portfolio or a page full of your favorite recipes. Think of it as a more complex and powerful Latest Posts Block! Plus, pattern suggestions make it easier than ever to create a list of posts with the design you want.

\n\n\n\n

Edit the Templates Around Posts

\n\n\n\n

You can use the familiar block editor to edit templates that hold your content—simply activate a block theme or a theme that has opted in for this feature. Switch from editing your posts to editing your pages and back again, all while using a familiar block editor. There are more than 20 new blocks available within compatible themes. Read more about this feature and how to experiment with it in the release notes.

\n\n\n\n
\n\n\n\n

Three Workflow Helpers

\n\n\n\n
\n\n\n\n\n\n\n\n

Overview of the Page Structure

\n\n\n\n

Sometimes you need a simple landing page, but sometimes you need something a little more robust. As blocks increase, patterns emerge, and content creation gets easier, new solutions are needed to make complex content easy to navigate. List View is the best way to jump between layers of content and nested blocks. Since the List View gives you an overview of all the blocks in your content, you can now navigate quickly to the precise block you need. Ready to focus completely on your content? Toggle it on or off to suit your workflow.

\n\n\n\n

Suggested Patterns for Blocks

\n\n\n\n

Starting in this release the Pattern Transformations tool will suggest block patterns based on the block you are using. Right now, you can give it a try in the Query Block and Social Icon Block. As more patterns are added, you will be able to get inspiration for how to style your site without ever leaving the editor!

\n\n\n\n

Style and Colorize Images

\n\n\n\n

Colorize your image and cover blocks with duotone filters! Duotone can add a pop of color to your designs and style your images (or videos in the cover block) to integrate well with your themes. You can think of the duotone effect as a black and white filter, but instead of the shadows being black and the highlights being white, you pick your own colors for the shadows and highlights. There’s more to learn about how it works in the documentation.

\n\n\n\n
\n\n\n\n

For Developers to Explore

\n\n\n\n
\n\n\n\n\"\"\n\n\n\n
\n\n\n\n

Theme.json

\n\n\n\n

Introducing the Global Styles and Global Settings APIs: control the editor settings, available customization tools, and style blocks using a theme.json file in the active theme. This configuration file enables or disables features and sets default styles for both a website and blocks. If you build themes, you can experiment with this early iteration of a useful new feature. For more about what is currently available and how it works, check out this dev note.

\n\n\n\n
\n\n\n\n
\n
\n

Dropping support for IE11

\n\n\n\n

Support for Internet Explorer 11 has been dropped as of this release. This means you may have issues managing your site that will not be fixed in the future. If you are currently using IE11, it is strongly recommended that you switch to a more modern browser.

\n
\n\n\n\n
\n

Adding support for WebP

\n\n\n\n

WebP is a modern image format that provides improved lossless and lossy compression for images on the web. WebP images are around 30% smaller on average than their JPEG or PNG equivalents, resulting in sites that are faster and use less bandwidth.

\n
\n
\n\n\n\n

Adding Additional Block Supports

\n\n\n\n

Expanding on previously implemented block supports in WordPress 5.6 and 5.7, WordPress 5.8 introduces several new block support flags and new options to customize your registered blocks. More information is available in the block supports dev note.

\n\n\n\n
\n\n\n\n

Check the Field Guide for more!

\n\n\n\n

Check out the latest version of the WordPress Field Guide. It highlights developer notes for each change you may want to be aware of: WordPress 5.8 Field Guide.

\n\n\n\n
\n\n\n\n

The Squad

\n\n\n\n

The WordPress 5.8 release was led by Matt Mullenweg, and supported by this highly enthusiastic release squad:

\n\n\n\n\n\n\n\n

This release is the reflection of the hard work of 530 generous volunteer contributors. Collaboration occurred on over 320 tickets on Trac and over 1,500 pull requests on GitHub.

\n\n\n\n5ubliminal, 99w, 9primus, Aaron Jorbin, aaronrobertshaw, abderrahman, Abha Thakor, Abhijit Rakas, achbed, Adam Silverstein, Adam Zielinski, Addie, aduth, Ahmed Chaion, Ahmed Saeed, Ajit Bohra, Alain Schlesser, Alan Jacob Mathew, Albert Juhé Lluveras, Alejandro Perez, Alex Concha, Alex Kirk, Alex Lende, alexstine, allilevine, Amanda Riu, amarinediary, Amogh Harish, Andrea Fercia, Andrei Draganescu, Andrew Ozz, Andrew Serong, Andrey \"Rarst\" Savchenko, André Maneiro, Andy Fragen, Andy Peatling, Andy Skelton, Ankit Gade, annalamprou, Anne McCarthy, anotherdave, anotia, Anthony Burchell, Anton Lukin, Anton Vanyukov, Antonis Lilis, apedog, apokalyptik, arena, Argyris Margaritis, Ari Stathopoulos, ariskataoka, arkrs, Armand, ArnaudBan, Arthur Chu, Arun a11n, Aspexi, atjn, Aurooba Ahmed, Austin Matzko, Ayesh Karunaratne, Barry, bartkalisz, Beatriz Fialho, Bego Mario Garde, Benachi, Benoit Chantre, Bernhard Reiter, Bernhard Reiter, Birgir Erlendsson (birgire), Birgit Pauli-Haack, Blobfolio, bmcculley, Bob Linthorst, bobbingwide, Bogdan Preda, bonger, Boone Gorges, Brad Touesnard, Brandon Kraft, Brecht, Brent Swisher, Brett Shumaker, Bruno Ribaric, Burhan Nasir, Cameron Jones, Cameron Voell, Carike, Carl Alexander, carlomanf, Carlos Garcia Prim, Carolina Nymark, Casey Milne, Cenay Nailor, Ceyhun Ozugur, Chandra M, Chetan Prajapati, Chintan hingrajiya, Chip Snyder, Chloé Bringmann, Chouby, Chris Van Patten, chriscct7, Christopher Churchill, Chuck Reynolds, Clayton Collie, Code Amp, CodePoet, Colin Stewart, Collins Agbonghama, Copons, Corey McKrill, Cory Hughart, Courtney Engle Robertson, crazycoders, critterverse, czapla, Dávid Szabó, Daisy Olsen, damonganto, Dan Farrow, Dani Llewellyn, Daniel Richards, danieldudzic, Daniele Scasciafratte, Danny, David Aguilera, David Anderson, David Artiss, David Baumwald, David Biňovec, David Calhoun, David Herrera, David Kryzaniak, David Smith, dekervit, devfle, devrekli, dhruvkb, Diane Co, dingdang, Dion Hulse, djbu, Dominik Schilling, donmhico, Donna Peplinskie, Doug Wollison, dpik, dragongate, Dreb Bits, Drew Jaynes, eatsleepcode, Ebonie Butler, Edi Amin, Eileen Violini, Ella van Durpe, Emil E, Emilio Martinez, Emmanuel Hesry, empatogen, Enej Bajgorić, Enrique Sánchez, epiqueras, Erik, etoledom, Fabian Kägy, Fabian Pimminger, Fabian Todt, Felipe Elia, Felix Arntz, felixbaumgaertner, Femy Praseeth, fijisunshine, Florian Brinkmann, Florian TIAR, Francesca Marano, Frank Bueltge, frosso1 (a11n), fullofcaffeine, gab81, Gal Baras, Ganga Kafle, Garrett Hyder, Gary Jones, Gary Pendergast, GeekPress, Gennady Kovshenin, Geoffrey, George Hotelling, George Mamadashvili, George Stephanis, geriux, glendaviesnz, Grant M. Kinney, Greg Ziółkowski, gRegor Morrill, Héctor Prieto, Hannah Malcolm, happiryu, Hareesh, Haz, hedgefield, Helen Hou-Sandí, Herm Martini, Herre Groen, herrvigg, htmgarcia, Ian Dunn, ianmjones, icopydoc, Ipstenu (Mika Epstein), Isabel Brison, Ivaylo Draganov, Ivete Tecedor, J.D. Grimes, Jack Lenox, Jake Spurlock, James Bonham, James Koster, James Nylen, James Richards, James Rosado, jamil95, janak Kaneriya, janw.oostendorp, Jason Johnston, Javier Arce, Jayman Pandya, Jean-Baptiste Audras, Jeff Ong, Jeff Paul, Jeffrey Pearce, Jenny Dupuy, Jeremy Felt, Jeremy Herve, Jeremy Yip, jeremy80, JeroenReumkens, jeryj, jillebehm, Jip Moors, Joe Bailey-Roberts, Joe Dolson, Joe McGill, Joen Asmussen, Johan Jonk Stenström, Johannes Kinast, John Blackbourn, John Godley, John James Jacoby, John Sundberg, Jon Brown, Jon Surrell, Jonathan Desrosiers, Jonny Harris, Jono Alderson, Joost de Valk, Jorge Bernal, Jorge Costa, Josee Wouters, Josepha Haden, JoshuaDoshua, Joy, jsnajdr, Juan Aldasoro, Juliette Reinders Folmer, Julio Potier, Justin Ahinon, k3nsai, kaavyaiyer, Kai Hao, Kalpesh Akabari, Kapil Paul, Karolina Vyskocilova, Kelly Choyce-Dwan, Kelly Hoffman, Kerry Liu, Kishan Jasani, Kite, KittMedia, Kjell Reigstad, klevyke, Knut Sparhell, Koen Van den Wijngaert, Konstantin Obenland, Konstantinos Xenos, Kyle Nel, lakrisgubben, Lara Schenck, Larissa Murillo, Laxman Prajapati, LewisCowles, lifeforceinst, linux4me2, Lovro Hrust, Luis Sacristán, Luiz Araújo, Luke Carbis, m0ze, Maedah Batool, Maggie Cabrera, Maja Benke, Marco Ciampini, Marcus Kazmierczak, Marek Hrabe, Marin Atanasov, Marius L. J., Mark Jaquith, Mark Parnell, Marko Heijnen, Marty Helmick, Mary Baum, Mary Job, marylauc, Mathieu Viet, Matias Ventura, Matt Chowning, Matt Mullenweg, Maxime Pertici, mblach, Meet Makadia, Meher Bala, Mel Choyce-Dwan, meloniq, mensmaximus, Michael Babker, Michael Beckwith, Miguel Fonseca, Mikael Korpela, Mike Hansen, Mike Jolley, Mike Martel, Mike Schroder, Mikhail Kobzarev, Milan Dinić, Milana Cap, mkdgs, mmuyskens, mmxxi, Mohamed El Amine DADDOU, Mohammed Faragallah, Monika Rao, Morten Rand-Hendriksen, mrjoeldean, Mukesh Panchal, munyagu, Mustafa Uysal, mweichert, Nadir Seghir, Nalini Thakor, Naoki Ohashi, Naoko Takano, Nazrul Islam Nayan, nderambure, net, nicegamer7, Nicholas Garofalo, Nick Halsey, Nik Tsekouras, ninanmnm, Noah Allen, nvartolomei, oguzkocer, olafklejnstrupjensen, Olga Bulat, Olga Gleckler, Otshelnik-Fm, oxyrealm, Ozh, Paal Joachim Romdahl, palmiak, Panagiotis Angelidis, Paragon Initiative Enterprises, Pascal Birchler, Pascal Knecht, Pat, patricklindsay, Paul Biron, Paul Bunkham, Paul Schreiber, Paul Stonier, Paul Von Schrottky, Paulo Pinto, Pavel I, Paweł, Peter Wilson, Petter Walbø Johnsgård, phena109, Philip Jackson, Pierre SYLVESTRE, Pinar, Piotrek Boniu, Pippin Williamson, Pirate Dunbar, Pramod Jodhani, Presskopp, presstoke, pwallner, pyronaur, Q, Rachel Baker, rafhun, Rajesh Radadiya, Rami Yushuvaev, Ramon Ahnert, ramonopoly, Ravi Vaghela, ravipatel, Refael Iliaguyev, Rene Hermenau, retrofox, reynhartono, Riad Benguella, Rian Rietveld, Rima Prajapati, Rinat, Rnaby, robdxw, Robert Anderson, Robert Chapin, Roger Theriault, rogerlos, roo2, Roy, Russell Aaron, Ryan McCue, Ryan Welcher, Sérgio Gomes, Sören Wrede, Saša, Sabrina Zeidan, Sahil Mepani, Samir Shah, Samuel Wood (Otto), Sandip Mondal, Sanne van der Meulen, sarahricker, sarayourfriend, SASAPIYO, satrancali, savicmarko1985, Scott Lesovic, Scott Reilly, scottconnerly, scruffian, Sean Fisher, Sean Hayes, sebbb, Sergey Biryukov, Sergey Yakimov, SergioEstevao, shaunandrews, Shital Marakana, silb3r, Siobhan, SirStuey, snapfractalpop, spikeuk1, spytzo, stacimc, Stanislav Khromov, Stefan Hüsges, stefanjoebstl, Stefano Minoia, Stefanos Togoulidis, Stephen Bernhardt, Stephen Edgar, Steve Dufresne, Steve Grunwell, Steve Henty, Steven Word, Subrata Sarkar, Sumaiya Siddika, Suman, Sumit Singh, Sumit Singh, Sunny, sushmak, Sybre Waaijer, Synchro, szaqal21, tamlyn, Tammie Lister, Tellyworth, Terri Ann, Tetsuaki Hamano, them.es, Thomas Kräftner, Thomas Patrick Levy, Thomas Vitale, tigertech, Timothy Jacobs, TimoTijhof, Tkama, tmatsuur, tmdk, Tobias Zimpel, TobiasBg, tobifjellner (Tor-Bjorn Fjellner), Tom J Nowell, Toni Viemerö, Tonya Mork, Toro_Unit (Hiroshi Urabe), torres126, Torsten Landsiedel, Toru Miki, Travis Northcutt, trejder, Udit Desai, Ulrich, Utsav tilava, Vicente Canales, Vipul Chandel, Vlad T, wangql, WebDragon, Wendy Chen, Weston Ruter, William Earnhardt, williampatton, Xavi Ivars, Xristopher Anderton, Y_Kolev, Yan Sern, Yui, Yuliyan Slavchev, Yvette Sonneveld, Zack Krida, Zebulan Stanphill, zkancs, and 孙锡源.\n\n\n\n

\n\n\n\n

In addition to these contributors, many thanks to all of the community volunteers who contribute in the support forums. They answer questions from people across the world, whether they are using WordPress for the first time, or they’ve been around since the first release all the way back in 2003. These releases are as successful as they are because of their efforts!

\n\n\n\n

Finally, thanks to all the community translators who help make WordPress available in over 200 languages for every release. 80 languages have translated 80% or more WordPress 5.8 and our community translators are hard at work ensuring more languages are on their way. If contributing to WordPress appeals to you, it’s easy to learn more. Check out Make WordPress or the core development blog.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 20 Jul 2021 17:43:25 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Matt Mullenweg\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:34;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:41:\"WPTavern: Makers of TinyMCE Acquire Setka\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120116\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:127:\"https://wptavern.com/makers-of-tinymce-acquire-setka?utm_source=rss&utm_medium=rss&utm_campaign=makers-of-tinymce-acquire-setka\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:3035:\"

Tiny, the makers of TinyMCE, have acquired Setka, a content design and editing platform, for an undisclosed amount. Founders Katya Bazilevskaya, Alexey Ametov, Vasily Esmanov, Roman Khudonogov, and the rest of the Setka team will join Tiny as part of the agreement.

\n\n\n\n

Tiny has been tracking an increasing developer demand for rich text editing components, citing 8.1 million TinyMCE downloads (up 77%) and 106 million downloads of rich text editing components in general from NPM in the last 12 months (up 53% YoY).

\n\n\n\n

“TinyMCE has typically focused on the average business user or knowledge worker; someone familiar with Microsoft Word or Google Docs,” Tiny founder and CEO Andrew Roberts said. 

\n\n\n\n

“With Setka, we can now serve professional content creators and designers who want more advanced options.”

\n\n\n\n

TinyMCE is used by millions of WordPress users, most visibly in the Classic Editor plugin as well as the Advanced Editor Tools plugin, previously known as TinyMCE Advanced. Advanced Editor Tools adds a “Classic Paragraph” block to the block editor that gives access to the TinyMCE editor with configurable rows and buttons. It provides a stepping stone for those who are not quite ready to switch to the block editor.

\n\n\n\n

While Tiny is a widely recognized leader in rich text editing, Setka allows for more interactive content creation with design capabilities for arranging text, images, and other visual elements. It allows users to create and save post templates and easily reuse design elements throughout the WYSIWYG design process. Tiny plans to merge TinyMCE and Setka for a combined platform that will offer more than either product alone.

\n\n\n\n

“Modern day content creators are much more ambitious, and Setka allows us to meet more demanding use cases,” Roberts said. 

\n\n\n\n

“Over time, we envisage a combined editor platform that is both easy to use and powerful.”

\n\n\n\n

Setka currently offers integrations for several CMS’s, document management tools, and CRMs, including WordPress, Drupal, Magento, Ghost, Microsoft Sharepoint, and Hubspot. The Setka WordPress plugin integrates with the block editor and provides its own content block that can work together with other blocks on the page.

\n\n\n\n

Former CEO Kate Bazilevskaya, who will be assuming the role of director of business development and partnerships at Tiny, said the team intends to focus on the CMS space.

\n\n\n\n

“Through an array of integrations, we hope to make this visual building technology more accessible to businesses who already have a CMS in place, yet want more power in their editing tools,” Bazilevskaya said.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 20 Jul 2021 04:39:28 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:35;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:39:\"BuddyPress: BuddyPress 9.0.0 “Mico”\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"https://buddypress.org/?p=320072\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"https://buddypress.org/2021/07/buddypress-9-0-0-mico/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:7905:\"

9.0.0 is named after Mico’s Pizza in Sanary, a little town on the french riviera. The story of Mico starts in 1968 when Liliane and Jean-Louis bought a restaurant looking like a swiss chalet. “Mico” is the nickname customers gave to Liliane (Jean-Louis’s wife) because of the remarkable outfits and big colorful hats she used to wear. Their son Romuald, twelve years after following in his parents’ footsteps, continues the tradition and offers us a moment of happiness around a table that is always excellent, friendly and so uncommon, just like BuddyPress 9.0.0 \"🍕\"

\n\n\n\n
\"Mico\'s@imath took this picture 3 years ago \"📸\"
\n\n\n\n\n\n\n\n
\n\n\n\n

You can get it clicking on the above button, downloading it from the WordPress.org plugin directory, installing or updating it directly from your WordPress dashboard or checking it out from our Subversion repository.

\n\n\n\n

\"👉\" If you’re upgrading from a previous version of BuddyPress, it’s always a good idea to back-up your WordPress database and files ahead of time.

\n\n\n\n

You can review all of the changes in this 9.0.0 release in the release notes. Below are the key features we believe you are going to enjoy most!

\n\n\n\n
\n\n\n\n

It’s all about Widget Blocks!

\n\n\n\n\"Illustration\n\n\n\n

WordPress 5.8 is right around the corner and debuts a brand new way to manage widgets: the Widget Block Editor. With BuddyPress 9.0.0, we have introduced 10 new BuddyPress Blocks, so you can continue to use your favorite BP Widgets with the new WP Block approach.

\n\n\n\n

The new BP Widget Blocks are simply Legacy Widgets we’ve rebuilt as BP Blocks, which means you can also access them in the Block Editor for use in your posts or pages!

\n\n\n\n\"Illustration\n\n\n\n

PS: Have you noticed that the icons for BuddyPress Blocks are now bright red?

\n\n\n\n
\n\n\n\n

Convert a Legacy Widget into a Block Widget in two clicks \"😎\"

\n\n\n\n\"Illustration\n\n\n\n

As shown in the image above, it’s very easy to transform a Widget into a Block. Your existing Widget settings will automagically be imported into your shiny, new BP Block.

\n\n\n\n

NB: Creating a BP Block for each existing BP Legacy Widget marks the first step toward the progressive retirement of these tiny pieces of BuddyPress content.

\n\n\n\n
\n\n\n\n

The BP REST API: Improved endpoints and a new one!

\n\n\n\n

This BuddyPress release was built in a short time frame to be ready for the release of WordPress 5.8.

\n\n\n\n

While doing the work on BP Widget Blocks, we’ve also manipulated many of our REST API endpoints and took this opportunity to improve several of them. We’re also introducing a new Sitewide Notices endpoint to allow site admins to create, edit, or delete notices and let all of your users fetch the active notice.

\n\n\n\n
\n\n\n\n
\n\n\n\n

Under the hood

\n\n\n\n

9.0.0 comes with fewer changes than most of our releases but includes fixes for issues which appeared in 8.0.0 and BP Nouveau Template Pack improvements.

\n\n\n\n
\n\n\n\n
\n\n\n\n

Many thanks to the 24 contributors who helped us build & translate BuddyPress 9.0.0

\n\n\n\n

Boone B Gorges (boonebgorges), Brajesh Singh (sbrajesh), David Cavins (dcavins), Dan Caragea (dancaragea), Ian Barnes (ianbarnes), Javier Esteban (nobnob), John James Jacoby (johnjamesjacoby), leahkoerper, marbaque, Mark Robson (markscottrobson), Mathieu Viet (imath), modemlooper, Nifty (niftythree), Paul Gibbs (DJPaul), Pieterjan Deneys (nekojonez), r-a-y, Renato Alves (espellcaste), shanebp, shawfactor, Slava Abakumov (slaffik), Stephen Edgar (netweb), tamarazambrana, TKServer, Varun Dubey (vapvarun).

\n\n\n\n
\n\n\n\n

Your feedback

\n\n\n\n

How are you using BuddyPress? Receiving your feedback and suggestions for future versions of BuddyPress genuinely motivates and encourages our contributors. Please share your feedback about this version of BuddyPress on our website.

\n\n\n\n

Thank you for using BuddyPress!

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 19 Jul 2021 22:45:07 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"David Cavins\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:36;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:87:\"WPTavern: WPBeginner Releases a Comment Moderator Solution Often Needed for Large Teams\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120195\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:219:\"https://wptavern.com/wpbeginner-releases-a-comment-moderator-solution-often-needed-for-large-teams?utm_source=rss&utm_medium=rss&utm_campaign=wpbeginner-releases-a-comment-moderator-solution-often-needed-for-large-teams\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:3607:\"

Last week, WPBeginner released Comment Moderation Role to the WordPress plugin directory. The plugin does a simple job of creating a single user role that can only moderate comments.

\n\n\n\n

The most common use case for such a role — named “WPB Comment Moderator” in the admin — is for larger teams that need a separate user account to tackle moderation. WordPress has no built-in way of handling this. For one of the most extendable CMSs on the planet, this is one area where it has always fallen short.

\n\n\n\n

It almost feels like yesterday. In reality, it was 10 years ago when I stumbled upon a (then) year-old ticket for a bug that was a breaking point in a project I was working on. I needed to grant specific users on a WordPress site permission to moderate comments but not allow them to edit other things in the admin.

\n\n\n\n

Some of you may be thinking that the moderate_comments capability should allow that. And, you would be correct in thinking that it should. However, that is not how it works at all. For users to edit comments, they must also be able to edit posts. It is a bit of a convoluted mess if you do a deep dive into the core code only to find hard-coded permissions checks that are impossible to override without rewriting large chunks of code.

\n\n\n\n

I would run into the same issue multiple times in the years since. I have built a few hacky, one-off workarounds for specific projects, but they were never ideal. And, I was never interested in maintaining a plugin that solved this problem because I knew it had the potential to be a bit of a pain.

\n\n\n\n

While I have seen a few other solutions, each fundamentally flawed, I am happy to see someone tackling this without exposing permissions issues.

\n\n\n\n

WPBeginner’s Comment Moderation Role plugin works in the same way that I think such a plugin should work, at least with the roadblocks that WordPress currently puts in the way.

\n\n\n\n

Site administrators can add WPB Comment Moderator to any account via the user management admin screen. The process is the same as adding or removing any other role in WordPress.

\n\n\n\nGranting the WPB Comment Moderator role to a user.\n\n\n\n

After adding the role to a user, that user can access the Comments admin screen. They can also see both the Dashboard and their own Profile in the admin. Except in the cases where they have another role added via a different plugin, they will not have permission to access other screens.

\n\n\n\nComments admin screen for user with the WPB Comment Moderator role\n\n\n\n

Because of core WordPress’s hard-coded permissions check, the plugin must create its own comments management screen. Most users will not notice this because it is all under the hood. The plugin only adds it when necessary, and it does not look or function any differently than the default screen. It is just a lot of code work and duplication to fix an 11-year-old reported bug in WordPress.

\n\n\n\n

Until the foundational issue is addressed in core WordPress, Comment Moderation Role is the best plugin for this job. After extensive testing, I can now say that it is now nestled firmly in my toolbox, ready to pull out when needed for a project.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 19 Jul 2021 22:13:22 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:37;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:77:\"Gutenberg Times: List of WordPress Themes for Full-Site Editing and Resources\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://gutenbergtimes.com/?p=18502\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:88:\"https://gutenbergtimes.com/list-of-wordpress-themes-for-full-site-editing-and-resources/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:8014:\"

A few people ask about WordPress Themes that are already working with the Full-Site Editing system and the new Site Editor. Here is a List as of July 2021.

\n\n\n\n

The Themes are all built while Full-Site Editing is under active development and many features are experimental. Do not use in production or live site. Expect the themes to be wonky at times, until developers have a chance to update the themes for new Gutenberg plugin version. In short: There will be Dragons! 🐉

\n\n\n\n

Oh, yes. You also need to install the Gutenberg plugin.

\n\n\n\n

For the lastest updates pre-release, use the Gutenberg Nightly

\n\n\n\n

Themes for Full-Site Editing in the WordPress repository

\n\n\n\n

I only used TT1 Blocks Theme for FSE-Testing. I rely mostly on Justin Tadlock or others to provide more insights on the various themes. The articles are linked with the theme header.

\n\n\n\n

Armando by Carolyn Newmark

\n\n\n\n

Armando WordPress Theme Provides Insight Into the Current State of Full Site Editing

\n\n\n\n

Block Base by Automattic

\n\n\n\n

Using Blockbase for a theme experiment (ThemeShaper) by Kjell Reigstad

\n\n\n\n

The Automattic Theme Team Announces Blockbase, Its New Block Parent Theme (WordPress Tavern) by Justin Tadlock

\n\n\n\n

Blockbase: A parent theme for block themes (ThemeShaper) by Ben Dwyer

\n\n\n\n

Child themes of Block Base

\n\n\n\n

Mayland Blocks by Automattic

\n\n\n\n

Seedlet Blocks by Automattic

\n\n\n\n

Automattic Launches Mayland Blocks, Its Second FSE Theme on WordPress.org

\n\n\n\n

Block-Based Bosco by Fränk Klein

\n\n\n\n

What I Learned Building a Full-Site Editing Theme

\n\n\n\n

Implementing Global Styles in Block-Based Bosco

\n\n\n\n

Block-Based Bosco, Second Full-Site Editing Theme Lands in the WordPress Directory

\n\n\n\n

Clove by Anariel Design

\n\n\n\n

Clove: A Showcase of Block Patterns by Anariel Design (WPTavern)

\n\n\n\n

Hansen by Uxl Themes

\n\n\n\n

Build a Full WordPress Site via Block Patterns With the Hansen Theme

\n\n\n\n

Naledi by Anariel Design

\n\n\n\n

Anariel Design Launches Naledi, a Block-Based WordPress Theme (WordPress Tavern)

\n\n\n\n

by Ari Stathopoulos

\n\n\n\n

Exploring Full-Site Editing With the Q WordPress Theme

\n\n\n\n

Rick by WPEntire

\n\n\n\n

TT1 Blocks by WordPress contributors

\n\n\n\n

This is the FSE sibling of the Twenty-Twenty-One Theme

\n\n\n\n

If you find any theme missing in this list, let me know.

\n\n\n\n

WordPress Themes team resources

\n\n\n\n

The themes team share their experiments on GitHub. Some listed themes made it as stand-alone theme into the repository listed above.

\n\n\n\n

Contributors also included a script to generate a theme with the minimum necessary to build your own block theme: php new-empty-theme.php.

\n\n\n\n

Every other week, the themes team meets discussion Block-based themes: 2nd and 4th Tuesday at 15:00 UTC (11am EDT) wp-slack channel #themereview

\n\n\n\n

Every week, the Themes team published a roundup post about newly merged changes, and what is discussed on the GitHub repo for Gutenberg. The post also has a few overview issues so you can always catch up on what is in the works. Follow the #gutenberg-themes-roundup tag on the make-blog/themes

\n\n\n\n

Anne McCarthy, developer relations and program manage for the FSE outreach published a post on ThemeShaper with more Resources for block theme development

\n\n\n\n

DevNotes for WordPress 5.8

\n\n\n\n\n\n\n\n

Developer Documentation

\n\n\n\n\n\n\n\n

Courses and Tutorials

\n\n\n\n\n\n\n\n
\n\n\n\n

Updated 7/21 to add Rich Tabor’s article on Block Templates

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 19 Jul 2021 12:31:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Birgit Pauli-Haack\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:38;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:75:\"WordPress.org blog: WP Briefing: Episode 13: Cherishing WordPress Diversity\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"https://wordpress.org/news/?post_type=podcast&p=10949\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:77:\"https://wordpress.org/news/2021/07/episode-13-cherishing-wordpress-diversity/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:14888:\"

In this episode, Josepha Haden Chomphosy discusses the importance of Diversity, Equity, and Inclusion to the fabric of the WordPress project and how we can move from a place of welcoming it to cherishing it.

\n\n\n\n

Have a question you’d like answered? You can submit them to wpbriefing@wordpress.org, either written or as a voice recording.

\n\n\n\n

Credits

\n\n\n\n

Editor: Dustin Hartzler

\n\n\n\n

Logo: Beatriz Fialho

\n\n\n\n

Production: Chloé Bringmann

\n\n\n\n

Song: Fearless First by Kevin MacLeod

\n\n\n\n

References

\n\n\n\n

Diverse Speaker Training Workshop

\n\n\n\n

A WordPress Dinner Party

\n\n\n\n

The Burden of Proof

\n\n\n\n

Leadership At Any Level

\n\n\n\n

Building a Culture of Safety

\n\n\n\n

Leadership Basics: Ethics in Communication

\n\n\n\n

WordPress 5.6

\n\n\n\n

Bonus resource: How to Be a WordPress Ally

\n\n\n\n

Transcript

\n\n\n\n\n\n\n\n

Josepha Haden Chomphosy  00:10

\n\n\n\n

Hello, everyone, and welcome to the WordPress Briefing, the podcast where you can catch quick explanations of the ideas behind the WordPress open source project, some insight into the community that supports it, and get a small list of big things coming up in the next two weeks. I’m your host, Josepha Haden Chomphosy. And before we get started, I have to be honest with you all, this episode and the next one have made me feel really anxious. This one is about Diversity, Equity, and Inclusion in open source, and especially in WordPress. And the next one is about accessibility in WordPress. And I feel like there’s just so much to do, and we don’t do enough, but we do what we can. And still, we will never be done with that work. And if you don’t know what I mean by Diversity, Equity, and Inclusion, you can kind of think of it this way. Diversity is bringing in people with different viewpoints and lived experiences. Equity is making sure everyone has what they need to get a fair chance of success, which is different from equality. And Inclusion is making sure that the environment is built to not only tolerate diverse groups but to celebrate them as well. So remember this as you listen to what I have to say here. We are never where we want to be in either of those spaces. But that shouldn’t stop us from looking at the things we have done to get us in the right direction. All right. Here we go.

\n\n\n\n

Josepha Haden Chomphosy  01:54

\n\n\n\n

I say a lot that we are a project that serves a majority collection of minority voices. WordPress is global in reach and open source in nature. And you would assume that what allows the software to be used by anyone would also enable it to be built by anyone. After all, your location doesn’t matter, and who employs you also doesn’t matter. And your relative social standing certainly shouldn’t matter. As long as you can communicate with the others contributing to the project, there should be no obstacle to your participation. The mission of the WordPress project is to democratize publishing, right? It’s to get the ability to have a website tap into passive income on your web presence. I mean, the job is to level the playing field for everyone. However, it’s my experience that bringing in new voices takes a lot of proactive work on behalf of leaders and contributors. It’s not enough to say, “Hey, I’m having a party,” you also have to say, “I’m having a party, and I’d like you to be there.” It’s not enough to think people will make their own space at this table. You have to make sure that you have table settings for everyone. And even beyond the basics of directing people to you. 

\n\n\n\n

Josepha Haden Chomphosy  03:12

\n\n\n\n

And on toward the next steps, you have to be honest about the fact that open source contribution requires a fair amount of privilege. By privilege, I mean the luxury of extra time or extra funding or just an understanding employer. WordPress supports 41% of the web. I think it’s 42% of the web right now. But less than 1% of people who use WordPress show up to help maintain it. And that 1% that does show up skews toward people who already have a pretty high level of representation and technology. And so, when you look at who is building it versus who is using it, it doesn’t always match. And since what we build so frequently reflects who we are, sometimes what we build doesn’t match the needs of the people who are using what we have.

\n\n\n\n

Josepha Haden Chomphosy  04:10

\n\n\n\n

So what has WordPress done to be proactive on the question of Diversity, Equity, and Inclusion? There are quite a few unseen things that have gone into this over the years and a few pretty visible things. This is a very long list. And it has a whole lot of just reference material. And so the show notes today will come in handy for people, and there will be just a laundry list of linked resources for everyone. 

\n\n\n\n

Josepha Haden Chomphosy  04:39

\n\n\n\n

But the first thing that WordPress has done is that we have accepted the burden of proof. I’m going to share a post about this in the show notes. That means we accept that it’s not the job of underrepresented folks to figure out if they are welcome. It’s up to us to make it clear that they are. So, there are three big little things that the community has done over the years. One is that many teams open their text-based meetings with an explanation of what is done in the meeting, who comes to the meetings, where to find help if you’re lost in the meeting, and for teams that have a specific type of requests that comes into those channels that aren’t handled in those channels. They also will share where people can go to get those requests taken care of. Many teams have also updated their team handbooks to have good beginner docs, limited use of inside jokes or jargon, and good first bugs. And also, there is a code of conduct in the community declaring that everyone is welcome and clarifies what to do if you see folks being unwelcoming. 

\n\n\n\n

Josepha Haden Chomphosy  05:51

\n\n\n\n

A second big thing that folks in the WordPress community have done is written down what was unwritten. Having things clearly documented unlocks institutional knowledge that you’d otherwise have to know someone to get. Clarity and process and the structure help anyone engage with your organization, not just the people who have extra time to figure things out. What that looks like in the WordPress project is that many teams have documented their workflows and their working spaces and just their general team norms. Many teams have also started defining what it means to be a team rep and holding open processes to choose those team reps. Many other community leaders and I have written down countless unspoken rules, guidelines, and philosophical underpinnings so that people don’t have to guess what we’re doing or why we’re doing things, or where we want to do them.

\n\n\n\n

Josepha Haden Chomphosy  06:46

\n\n\n\n

And the more visible thing that the WordPress project has been doing is that we found ways to invite people in, and they’re not failsafe; they’re not foolproof, but it is certainly a step in the right direction. The first one is an ongoing, diverse speaker training initiative. And I’ll include a link to that in the show notes as well. It is run by Jill Binder and a fantastic group of contributors that collaborate with her. And I really have loved watching that particular program grow and flourish and help WordPress make a difference where we absolutely can. 

\n\n\n\n

Josepha Haden Chomphosy  07:27

\n\n\n\n

The second thing that was pretty visible about how we invited people in was at the end of 2020, and we had an all-women and nonbinary release squad for our biggest release of the year; WordPress 5.6. I had a group of probably 70 women and nonbinary identifying folx who joined in the process and joined in learning more about the process. Some of them have continued in the project. Others have stepped away for various reasons. But all of them are welcome to return. And I encourage everyone to return to contribution when time and resources make that possible for you. 

\n\n\n\n

Josepha Haden Chomphosy  08:09

\n\n\n\n

And then the third thing that we’ve done, which I have talked about a lot, is the revival of the testing and triage practices. That has been work that’s been ongoing for a number of years. And it happens across multiple teams. It is not always immediately clear to people why the testing work. And the triage work is identifiable for me as a way to invite people into this process. And so I’ll be briefly clear about it right now. So testing as a practice brings in the users that otherwise don’t have a lot of spare time and that extra privilege to like, figure out what’s going on with WordPress, and contribute their own fixes to problems. They can give back to this project by being co-developers with us, co-creators with our entire process of making WordPress real and usable for the largest number of people that we can because we now support 42% of the web. And then, the triage practice invites in a diverse voice of people. Because you don’t necessarily always need to know everything about a project to help with triage. And when you’re helping with triage, you get active learning through participating in the process. But you also get passive learning from the people who already know huge amounts about the project and the process and everything that goes into it. And so it’s a low key low stress way to get your feet wet and start building that knowledge that sometimes is hard to come by unless you are actively working in it. So the testing practices, the triage practices, I really to the core of my being believe that those are active and ongoing ways for us to invite people who otherwise wouldn’t have a chance to get their voices heard in an open source project. And y’all, as I said at the start, y’all, there’s nothing about this list that I just shared, which makes me feel like our work on this is done. Just like any muscle, you don’t fight to peak fitness, and then hit the big stop button on time and say, “Now, I never have to work out again.” If we did, the world would be a very different place probably. But it does then lead us to the next steps for fostering a community culture that’s as broad as the people who use this software. If you believe in leadership at any level, as I do, there are a ton of things that you can do right now. But I’ll boil them down into three big chunks of things.

\n\n\n\n

Josepha Haden Chomphosy  10:54

\n\n\n\n

First, check your community area, or whatever community you want to apply this to, for things that need a little more proactive work. I will share a post called Building A Culture of Safety that will take you through a list of good first steps. And it is not as hard as it looks. When you say build a culture of safety, there are many really clear-cut minor changes that you can ask people to make and, in like, four or five different areas that can help your community be more welcoming and more open. 

\n\n\n\n

Josepha Haden Chomphosy  11:30

\n\n\n\n

The second thing that you can do is know that small changes add up over time and commit to making those changes where you can. If you are elite at any level, you know that supporting people and processes is the responsibility of everyone in the group. And if you can make your own autonomous decisions and commit to making small changes that make a big difference over time, you will be part of that solution. And that is not specific to any one group that we have in our communities. You can be an ally for anyone, whether they look like you, whether they have your same experiences, or not. And sometimes, it’s as easy as just holding space for the people who haven’t had a chance to talk yet. And on the subject of holding space and the way that we communicate. 

\n\n\n\n

Josepha Haden Chomphosy  12:22

\n\n\n\n

The third thing that I think is incredibly important is that you can take on as a foundational personal practice the concept of ethical communication. I’ll share a post about that as well in the show notes, but the core of it is that you have to know that what you say and don’t say what you do and don’t do has an impact on others and embrace that responsibility. All right, so you made it all the way through, and I am so proud of you. I’m sure you have questions about this. And I encourage you to share those. You can email them to me at wp briefing@wordpress.org.

\n\n\n\n

Josepha Haden Chomphosy  13:10

\n\n\n\n

This brings us to our small list of big things. I’ve got two things for you today. First and foremost, WordPress 5.8 gets released tomorrow. It’s a big release, and lots of people have been working on it. So get your update processes ready and keep an eye on wordpress.org/news for the announcement post. Second, and still pretty important, team reps have been working on their quarterly check-ins so that all other teams can get an idea of what’s happening around the WordPress office. Keep an eye out for that post on make.wordpress.org/updates. And that is your smallest of big things. Thank you for tuning in today for the WordPress Briefing. I’m your host Joseph Hayden Chomphosy, and I’ll see you again in a couple of weeks.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 19 Jul 2021 12:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:15:\"Chloe Bringmann\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:39;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:110:\"Gutenberg Times: Theme creation, Block plugin development and the Future of WordPress – Weekend Edition #178\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://gutenbergtimes.com/?p=18531\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:114:\"https://gutenbergtimes.com/theme-creation-block-plugin-development-and-the-future-of-wordpress-weekend-edition-17/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:12172:\"

Howdy, my friends!

\n\n\n\n\n\n

WordPress 5.8 will be release next week. Are you ready? Well, if you didn’t get any chance to test things, you should still be alright. If you know your customers will be fiddling with their site’s widget section, do yourself a favor and install the Classic Widget plugin, so there are no surprises.

\n\n\n\n

For last-minute testing, use the Release Candidate number 4. The final release is scheduled for Tuesday, July 20, 2021. The Field Guide covers all changes.

\n\n\n\n

Wishing you all the best for the upgrade! Holler if you need any help!

\n\n\n\n

Yours, 💕
Birgit

\n\n\n\n

Gutenberg and the Future of WordPress

\n\n\n\n

In this week’s Jukebox episode, host Nathan Wrigley discussed with Robert Jacobi the Future of WordPress in the era of Gutenberg. Jacobi explained why he is persuing a Gutenberg first approach. You can listen on WordPress Tavern or your favorite podcast app.

\n\n\n\n

From the section “Neither Gutenberg nor WordPress News”: I am excited about the acquisition of Pocket Casts by Automattic. I tested many other podcast apps, but Pocket Casts has been my favorite for many, many years.

\n\n\n\n

Nathan da Silva, founder of Silva Web Designs, wrote about the Future of Page Builders and concludes, there are still pieces missing before Gutenberg makes 3rd Party page builders obsolete. Da Silva mentions, Full-Site Editing is not there yet and there are not as many add-on available as Elementor or Beaver Builder provide for their site builders workflow.

\n\n\n\n\n

Episode #47 is now available with transcript.
Next recording July 23, 2021

\n\n\n\n

Subscribe to the Gutenberg Changelog podcast
🎙️ Spotify | Google | iTunes | PocketCasts | Stitcher |
🎙️ Pod Bean | CastBox | Podchaser | RSS Feed 

\n\n\n\n\n\n\n\n\n

Block-editor for Content Creators

\n\n\n\n

On July 29th, 10 a.m. PT / 1 p.m. ET / 5 p.m. UTC. WordPress VIP will hold a webinar with the title Gutenberg Full-Site Editing: Unlocking Agility for Enterprise WordPress. James Proctor will share lessons from the cutting edge of implementation. “By taking Gutenberg blocks beyond the post editor, these new features allow content creators unprecedented agility and control over the entire site experience. “ Any site owner and agency will be able to take advantage of the knowledge shared at scale.

\n\n\n\n
\n\n\n\n

Deborah Edwards-Onoro posted a great tutorial on how to Manage your Block Editor preferences and increase productivity and comfort.

\n\n\n\n
\n\n\n\n

WordPress 5.8 brings Duotone Filters to images of the block editor. Justin Tadlock takes you on a tour of this fabulous new feature: Duotone Filters: WordPress 5.8 Puts a Powerful Image-Editing Tool Into Users’ Hands‘.

\n\n\n\n
\n\n\n\n

Developing Plugins for the Block Editor

\n\n\n\n

After the Primer last week, Rich Tabor posted How to Build & Publish Gutenberg Block Plugins to the WordPress Block Directory. Tabor guides you through the process from create block scaffolding and running the block plugin checker to uploading your block to WordPress repository and get it approved for the Block Directory.

\n\n\n\n
\n\n\n\n

Marcus Kazmierczak wrote a series of posts on how to Conditionally Load Block Assets when building block plugins. There are quite a few different ways to skin that proverbial cat. Start at the latest post, explaining the new WordPress 5.8 way to handle this. Kazmierczak also provides a video walk through.

\n\n\n\n

This helped me to understand the feature Ari Stathopoulos worked on and described in his Dev Note: Block-styles loading enhancements in WordPress 5.8

\n\n\n\n
\n\n\n\n

Riad Benguella has a few more Miscellaneous block editor API additions in WordPress 5.8 – it covers:

\n\n\n\n
  • Contextual patterns for easier creation and block transformations
  • Pattern Registration API
  • BlockControls group prop
\n\n\n\n\n

 “Keeping up with Gutenberg – Index 2021” 
A chronological list of the WordPress Make Blog posts from various teams involved in Gutenberg development: Design, Theme Review Team, Core Editor, Core JS, Core CSS, Test and Meta team from Jan. 2021 on. Updated by yours truly. The index 2020 is here

\n\n\n\n\n

Gutenberg and Themes

\n\n\n\n

Jason Crist published this week’s Gutenberg + Themes roundup. Two issues caught my eye:

\n\n\n\n\n\n\n\n

There is of course, much more going on. Another great round-up post from the Theme Team!

\n\n\n\n
\n\n\n\n

Anne McCarthy shared Resources for block theme development on ThemeShaper. She wrote: “Whether you’re just starting out or already deep in the block theme world, the following resources should help you be aware of what’s to come and how to get involved in shaping the future.”

\n\n\n\n
\n\n\n\n

Tammie Lister published here process on how to create a theme and what she encountered. She wrote: “I am still like many discovering how I create themes using site editing, but I wanted to share my current process and some observations I’ve made along the way. “

\n\n\n\n
\n\n\n\n

Nick Diego collected three small fixes to his theme to change the breakpoint for the column block to become responsive, how to change the order of the mobile columns and how to disable responsive columns completely. For the latter, Diego uses a solution by Andy Serong, that is already merged to Gutenberg and will be released with the plugin version 11.2 on July 21st, 2021. Details in Disable Responsive Columns in Gutenberg and Other Tips

\n\n\n\n
\n\n\n\n

Rob Stinson posted about WordPress 5.8 Widgets Changes and How they Impact the Genesis Framework. He wrote: “To help navigate this for the 100,000’s of sites that run on the Genesis Framework we have implemented an opt-in experience in version 3.3.4 for whenever anyone updates to WordPress 5.8.”

\n\n\n\n\n

Need a plugin .zip from Gutenberg’s main (trunk) branch?
Gutenberg Times provides daily build for testing and review.
Have you been using it? Hit reply and let me know.

\n\n\n\n

\"GitHub

\n\n\n\n

\n\n\n\n\n\n
\n\n\n\n

Don’t want to miss the next Weekend Edition?

\n\n\n\n

We hate spam, too and won’t give your email address to anyone except Mailchimp to send out our Weekend Edition

Thanks for subscribing.
\n\n\n\n
\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 17 Jul 2021 23:19:47 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Birgit Pauli-Haack\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:40;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:71:\"WPTavern: Identify and Select Blocks via the Wayfinder WordPress Plugin\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120070\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:187:\"https://wptavern.com/identify-and-select-blocks-via-the-wayfinder-wordpress-plugin?utm_source=rss&utm_medium=rss&utm_campaign=identify-and-select-blocks-via-the-wayfinder-wordpress-plugin\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:6962:\"

Christopher John, a Seattle-based designer and UX engineer, released his first project to the plugin directory yesterday. Announced via Twitter to high praise, Wayfinder is a block outline solution for the WordPress editor.

\n\n\n\n

Like similar plugins, the goal is to make it easier for end-users to select nested blocks, which can sometimes be tough to pin down. Wayfinder outlines each block in the editor on hover. It then displays the block name at the upper left of the box.

\n\n\n\n

My favorite feature that you will not find elsewhere is the addition of each block’s classes at the bottom right of the box. This makes it easy for designers or users who want to quickly find a class for styling.

\n\n\n\nOutline of a Heading block.\n\n\n\n

Users can also enable or disable the pieces of the UI they want to appear via the plugin’s setting screen. However, any changes affect all of the site’s user experiences. Currently, there are no per-user settings.

\n\n\n\n

At first glance, the plugin seemed to work great. The hover outline experience felt smooth, and I did not need to change the default options. Wayfinder almost seemed to be everything one might look for in a block-outline solution. It was besting existing plugins in nearly every way.

\n\n\n\n

However, things soon began rolling downhill when writing a typical blog post with nothing other than Heading, Paragraph, and Image blocks. I first noticed that I could not type the same number of words as usual on one line. My perfectly-tuned typography was breaking sooner than it should have. Spacing between paragraphs seemed a bit too large. My wide-aligned images were just a little smaller than usual.

\n\n\n\n

The user experience still felt good until this point, but the little oddities were stacking up. Something was not right. The plugin had been showered with praise on Twitter and already received three five-star reviews in its first 24 hours. Maybe my custom theme was the issue. However, similar problems arose when testing several others, such as Twenty Twenty-One, Nutmeg, and Eksell — each a well-rounded theme catered to the block editor.

\n\n\n\n

As clean as the plugin’s UI is, it more often than not wrecks the theme’s default block spacing. This becomes more noticeable as users begin adding nested layers of blocks.

\n\n\n\n

The problem is the plugin adds 18 pixels of padding around every block via its stylesheet.

\n\n\n\n
.wp-block:not(.block-list-appender) {\n    position: relative;\n    outline: 1px dashed transparent;\n    padding: 18px;\n    overflow: visible !important;\n}
\n\n\n\n

To the untrained eye, this may not be a visible issue in many cases. It will affect each site differently, but 18 pixels of extra padding on every block will undoubtedly mess things up to some degree unless the theme itself uses that exact same spacing in its design.

\n\n\n\n

The more noticeable issues are seen with blocks like Social Icons:

\n\n\n\nHoly moly! Those are some gigantic social icons!\n\n\n\n

But, even something as basic as a List block can be misaligned:

\n\n\n\nList block shifted out of alignment.\n\n\n\n

Theme authors can write custom CSS to overrule the plugin’s padding. However, the last thing the WordPress community needs is a specificity war between themes and plugins. Themers already have to do this enough to wrangle blocks now.

\n\n\n\n

Removing that one padding rule from the plugin’s editor-style.css killed 99% of its issues. Afterward, things were running like a well-oiled machine.

\n\n\n\n

As a developer, I would explore outline-offset for spacing between the block and its outline, maybe cutting that 18px down a bit. Because outlines are not a part of the CSS box model, it would not affect spacing. Adjustments may be necessary on a per-block basis, especially when those blocks are nested or small (e.g., Social Icons, Navigation). It would carry its own challenges but should be a less destructive course.

\n\n\n\n

To a lesser extent, the plugin’s overflow rule breaks the theme design from time to time. Its position and outline rules could overrule some edge-case block styles too, but they are necessary for the plugin to actually do its job. In particular, I could see positioning being problematic with sticky headers as we get into site editing.

\n\n\n\n

The only other issue might be themes that use ::before and ::after pseudo-elements on blocks, but the plugin also needs to overwrite those to display the block name and classes list. This is likely another edge case.

\n\n\n\n

Despite the issues, the plugin is ahead of the pack at this point.

\n\n\n\n

Gutenberg Editor Full Width Blocks Border (a bit of a mouthful), another recent plugin to offer similar functionality, breaks custom theme design across the board. It does accomplish the job of making blocks easier to select, but the sacrifice of a WYSIWYG is not worth it.

\n\n\n\n

The Editor Block Outline plugin has been my go-to recommendation for a while. It has a few design issues of its own, but some of those are adjustable on a per-user basis. However, as of late, it has made the editor feel sluggish. Plus, its misuse of the WordPress admin notice system for Twitter followers makes it something I’d prefer to steer clear of.

\n\n\n\n

EditorsKit has a similar “block guidelines” feature that uses a box-shadow instead of padding and an outline. It does not muck up most theme layouts with that technique. However, I have hit other style conflicts with the plugin. Plus, EditorsKit is overkill for users who simply want just one feature.

\n\n\n\n

That leaves us with Wayfinder. Warts and all, it is the best standalone option right now. Maybe that’s not saying much, but it is saying something. This is a feature that is hard to nail down. I do not envy the developers who are trying to make miracles happen.

\n\n\n\n

It is sure to please many who have been on the lookout for a block outline solution. It is in a position to pull farther ahead of the competition with its relatively solid first outing. With more thorough theme testing and a bit of adjustment to its approach, it could be even better. I am eager to test future iterations.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 17 Jul 2021 01:56:53 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:41;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"WordPress.org blog: People of WordPress: Tijana Andrejic\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=10427\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:71:\"https://wordpress.org/news/2021/06/people-of-wordpress-tijana-andrejic/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:13617:\"

WordPress is open source software, maintained by a global network of contributors. There are many examples of how WordPress has changed people’s lives for the better. In this monthly series, we share some of the amazing stories.

\n\n\n\n

This month to coincide with WordCamp Europe, we feature Tijana Andrejic from Belgrade, Serbia, about her journey from fitness trainer to the WordPress world, with the freelance and corporate opportunities it introduced.

\n\n\n\n\"Tijana\n\n\n\n

As a professional manager with a college degree in Organizational Science and a certified fitness instructor, Tijana is nothing if not driven and goal-oriented. 

\n\n\n\n

Following her time as a fitness trainer, Tijana moved to work in IT around 2016. She first explored content creation and design before focusing on SEO and becoming an independent specialist.  

\n\n\n\n

Tijana was hired as a Customer Happiness Engineer for a hosting company, where she discovered the benefits of having a team. She realized that having close working relationships with colleagues is helpful for business success and accelerates personal growth.

\n\n\n\n

Tijana hopes that by sharing her story, she can help others who are either starting their career or are moving roles. She describes the opportunities she discovered in the WordPress community as ‘a huge epiphany’, especially in the world of freelancing.

\n\n\n\n

She highlights 5 things that helped her to start a new freelancing career. Let’s dive into them.

\n\n\n\n

What motivates me?

\n\n\n\n

“Why am I doing this?” is the first question that Tijana asks herself before starting anything new. This self-review and honesty, she feels, allows her to determine her priorities. She also benchmarks options around her motivations of wanting a flexible schedule and to grow professionally. 

\n\n\n\n

She lists the reasons to make a particular choice, like being a freelancer, to help her choose the right job, pathway, or identify alternatives. 

\n\n\n\n

She recommends that others can take a similar approach. If freelancing is still the best solution after examining all their goals and motivations, Tijana believes a good next step would be to learn WordPress-related skills.

\n\n\n\n\"WordCamp\n\n\n\n

Develop WordPress related skills

\n\n\n\n

The next question you may ask: “Why WordPress?”

\n\n\n\n

WordPress is used by more than 40% of websites in some form and offers various roles, many of which are not developer-specific. Tijana highlights a few: 

\n\n\n\n
  • web developer (coding websites, themes, and plugins)
  • web implementor (creating websites from existing themes without coding)
  • web designer (designing website mock-ups, editing images, or creating online infographics)
  • client support professional (helping people with their websites)
  • website maintenance (WordPress, themes, and plugins are maintained and backed up regularly)
  • WordPress trainer (helping clients with how to use the platform or teaching other web professionals)
  • content writer
  • accessibility specialist (making sure standards are met and suggesting solutions for accessibility barriers)
  • SEO consultant (improving search outcomes and understanding)
  • statistics consultant, especially for web shops
  • WordPress assistant (adding new content and editing existing posts)
  • website migration specialist (moving websites from one server to another)
  • web security specialist
\n\n\n\n\"WCBGD\n\n\n\n

Tijana emphasized: “Another reason why WordPress is great for freelancers is the strong community that exists around this content management system (CMS).” WordCamps and Meetups are a way to get useful information and meet people from a large and very diverse community and get answers to many questions straight away. 

\n\n\n\n

In the past year, these events have been primarily online. However, the contributors who run them continue to make an effort to provide an experience as close to in-person events as possible. The biggest advantage to online events is that we can attend events from across the world, even if sometimes during these difficult times, it is difficult to get enough time to deeply into this new experience. Since Tijana’s first Meetup, she has attended many WordPress community events and volunteered as a speaker.

\n\n\n\n

Plan in advance

\n\n\n\n

Becoming a freelancer takes time. For Tijana, success came with proper planning and following her plan to ‘acquire or improve relevant skills that will make you stand out in the freelance market.’ She strongly believes that learning and growing as a professional opens more business opportunities. 

\n\n\n\n

If you are considering a freelance career, she advises improving relevant skills or developing new skills related to your hobbies as ‘there is nothing better than doing what you love.’ In cases where no previous experience and knowledge can be used, she suggests choosing ‘a job that has a shorter learning curve and builds your knowledge around that.’

\n\n\n\n

Tijana started as a content creator and learned to become an SEO expert. However, she highlights many alternative paths, including starting as a web implementer and moving to train as a developer. 

\n\n\n\n

She suggests to others: “It would be a good idea to analyze the market before you jump into the learning process.” She also recommends people check the latest trends and consider the future of the skills they are developing.

\n\n\n\n

Visit the new Learn WordPress.org to see what topics are of interest to you. In this newly established resource, the WordPress community aggregates workshops to support those who want to start and improve their skills, provides lesson plans for professional WordPress trainers and helps you create personal learning to develop key skills. There is also material on helping you be part of and organize events for your local community.

\n\n\n\n

Tijana highlights that there are many places for freelancers to find clients. For example, the WordPress Community has a place where companies and individual site owners publish their job advertisements  – Jobs.WordPress.net.

\n\n\n\n

Hurray, it’s time to get a first freelancing job

\n\n\n\n

As a pragmatic person, Tijana recommends: “Save money before quitting your job to become a full-time freelancer. Alternatively, try freelancing for a few hours per week to see if you like it. Although some people do benefit when taking a risk, think twice before you take any irreversible actions.” 

\n\n\n\n

She shared some possible next steps: 

\n\n\n\n
  • use a freelancing platform
  • triple-check your resume
  • professionally present yourself
  • fill up your portfolio with examples
  • use video material
\n\n\n\n

“By using video material, your clients will not see you like a list of skills and previous experiences, but as a real person that has these skills and experiences and that provides a certain service for them.”

\n\n\n\n

She adds: “Have a detailed strategy when choosing your first employer. Choose your first employer wisely, very wisely. I can’t emphasize enough how important this is”.

\n\n\n\n

When Tijana took her first freelancing job, she considered the following:

\n\n\n\n
  • how was the employer rated by other freelancers who worked for him previously
  • how does the employer rate other freelancers
  • how much money had they already spent on the platform
  • the number of open positions for a specific job and the number of freelancers that have already applied 
\n\n\n\n

“The first job is not all about the money. Don’t get greedy on your first job. If you get good recommendations, your second job can pay two to three times more. And your third job can go up to five times more. That was my experience.”

\n\n\n\n

Take responsibility as a freelancer

\n\n\n\n

Tijana reminds us: “Freedom often comes with responsibility; individual responsibility is key when it comes to freelancing.”

\n\n\n\n

She advises others not to take a job if you can not make a deadline and have someone reliable who can help you. 

\n\n\n\n

Missing deadlines will cost your client money and affect the review the client will be willing to leave about your job, and this can have a big impact on your future opportunities or freelance jobs.

\n\n\n\n

She adds: “This can start a downward spiral for your career. However, we are all humans, and unpredictable things can happen. If for some reason you are not able to complete your work in a timely manner, let your client know immediately so they can have enough time to hire someone else”.

\n\n\n\n

Tijana emphasizes the importance of making expectations clear before accepting a job, both what the client is expecting and what you can expect from the client. 

\n\n\n\n

Lastly, she points out that if you are working from home, your friends and family should treat you the way they would if you were in an office. She advises: “Let them know about your working schedule.”

\n\n\n\n

She hopes that these basic guidelines will be useful in launching freelance careers, as they did her, even though there is no universal recipe for all.

\n\n\n\n

Tijana highlights: “It’s just important to stay focused on your goals and to be open to new opportunities.” Freelancing wasn’t the only way she could have fulfilled her goals, but it was an important part of her path, and it helped her be confident in her abilities to make the next big step in her life.

\n\n\n\n

As a freelancer, she was missing close relationships with colleagues and teamwork, which she has now found in her current firm. Her colleagues describe her as a: “walking-talking bundle of superpowers: sports medicine and fitness professional, SEO expert, blogger, designer and a kitty foster mum”.

\n\n\n\n\"Conference\n\n\n\n

If you are considering starting your career as a freelancer, take the courses offered at learn.wordpress.org, reach out to companies that you would be interested in working with, and remember that there are a whole host of opportunities in the WordPress project.

\n\n\n\n

The WordPress.org Teams – what they do, when and where they meet

\n\n\n\n

Learn WordPress resource – free to use to expand your knowledge and skills of using the platform and learning about the community around it.

\n\n\n\n

The 3-day WordCamp Europe 2021 online event begins on 7 June 2021. You can discover more about being a contributor in its live sessions and section on ways to contribute to WordPress.

\n\n\n\n

Contributors

\n\n\n\n

Thanks to Olga Gleckler (@oglekler), Abha Thakor (@webcommsat), Chloé Bringmann (@cbringmann), Surendra Thakor (@sthakor), and Meher Bala (@meher) for working on this story. Josepha Haden (@chanthaboune) and also to Topher DeRosia (@topher1kenobe) who created HeroPress. Thank you to Tijana Andrejic (@andtijana) for sharing her #ContributorStory

\n\n\n\n\"HeroPress\n\n\n\n

This post is based on an article originally published on HeroPress.com. It highlights people in the WordPress community who have overcome barriers and whose stories would otherwise go unheard.

\n\n\n\n

Meet more WordPress community members in our People of WordPress series.

\n\n\n\n

#ContributorStory #HeroPress

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 16 Jul 2021 22:45:03 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"webcommsat AbhaNonStopNewsUK\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:42;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:42:\"WPTavern: Automattic Acquires Pocket Casts\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120114\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:129:\"https://wptavern.com/automattic-acquires-pocket-casts?utm_source=rss&utm_medium=rss&utm_campaign=automattic-acquires-pocket-casts\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:3288:\"

Automattic has acquired Pocket Casts, a popular podcast listening, search, and discovery app for Android and iOS. Australian co-founders Russell Ivanovic and Philip Simpson are staying on to continue leading Pocket Casts as a part of the acquisition.

\n\n\n\n

The app allows users to keep all of their podcast subscriptions together in one place and sync between platforms. Previously a commercial-only app, Pocket Casts has been free since it switched to the freemium model in September 2019. Its creators have been monetizing the app through its Pocket Cast Plus tier, which gives users access to desktop apps, cloud storage, watch playback, and themes and icons for $9.99/year.

\n\n\n\n

In May 2018, Pocket Casts was acquired by public media organizations NPR, WNYC Studios, WBEZ Chicago, and This American Life. BBC Studios also held a small ownership stake in the platform prior to Automattic’s acquisition.

\n\n\n\n

Despite being widely regarded as one of the best podcasting apps available, NPR’s financial statements and auditor’s report from 2020 shows a net loss of more than $800K. The board governing the company met in December 2020 and agreed to sell Pocket Casts.

\n\n\n\n

No financial details of the acquisition were disclosed but Automattic may have gotten a bargain on Pocket Casts if its other owners were also losing money. After acquiring Tumblr and Day One, Automattic is starting to gain a reputation for buying up apps that people love to use and giving them a fighting chance at financial stability and longevity. The company has also demonstrated a growing interest in podcasting-related technologies with its recent investment in Castos and partnership with Spotify’s Anchor podcast creation platform.

\n\n\n\n

Acquisition announcements often include assurances of no changes for current customers but Automattic’s post made no promises and did not share many details regarding its plans for Pocket Casts. Integration with WordPress.com may be on the horizon but it’s currently in the exploration stage.

\n\n\n\n

“As part of Automattic, Pocket Casts will continue to provide you with the features needed to enjoy your favorite podcasts (or find something new),” Automattic’s Head of Apps Eli Budelli said. “We will explore building deep integrations with WordPress.com and Pocket Casts, making it easier to distribute and listen to podcasts. We’re thrilled that we can continue to give our users a multitude of ways to tell and engage with stories that matter.”

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 16 Jul 2021 22:39:02 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:43;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:97:\"WPTavern: Google Concludes FLoC Origin Trial, Does Not Intend to Share Feedback from Participants\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=119872\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:237:\"https://wptavern.com/google-concludes-floc-origin-trial-does-not-intend-to-share-feedback-from-participants?utm_source=rss&utm_medium=rss&utm_campaign=google-concludes-floc-origin-trial-does-not-intend-to-share-feedback-from-participants\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:6127:\"

Google quietly concluded its FLoC (Federated Learning of Cohorts) origin trial this week. The trial was part of Google’s Privacy Sandbox initiative, a suite of new technologies designed to replace third-party cookies, fingerprinting, and other commonly-used tracking mechanisms. This particular experiment groups people together based on browsing habits and labels them using machine learning.

\n\n\n\n

FLoC’s trial was scheduled to end Jul 13, 2021, and Google has decided to remove the project from the testing phase while analyzing feedback.

\n\n\n\n

“We’ve decided not to extend this initial Origin Trial,” Google senior software engineer Josh Karlin said in thread on Chromium’s Blink Developers group forum. “Instead, we’re hard at work on improving FLoC to incorporate the feedback we’ve heard from the community before advancing to further ecosystem testing.”

\n\n\n\n

The controversial experiment has been met with opposition from privacy advocates like makers of the Brave browser and EFF who do not perceive FLoC to be a compelling alternative to the surveillance business model currently used by the advertising industry. Amazon, GitHub, Firefox, Vivaldi, Drupal, Joomla, DuckDuckGo, and other major tech companies and open source projects have already opted to block FLoC by default.

\n\n\n\n

So far, Twitter has been the first major online platform that appears to be on board with FLoC after references to it were recently discovered in the app’s source code.

\n\n\n\n

Google’s initial efforts in presenting FLoC failed to gain broad support, which may have contributed to the company putting the brakes on its plan to phase out third-party cookies in Chrome by 2022. As the advertising industry yields to pressure from the last few years of privacy legislation, third-party cookies will be on their way out in what is colloquially known as the “Cookie Apocalypse.” Google has postponed this milestone for Chrome to begin in mid-2023 and end in late 2023. 

\n\n\n\n

“We need to move at a responsible pace,” Chrome Privacy Engineering Director Vinay Goel said. “This will allow sufficient time for public discussion on the right solutions, continued engagement with regulators, and for publishers and the advertising industry to migrate their services. This is important to avoid jeopardizing the business models of many web publishers which support freely available content.”

\n\n\n\n

Discussion on a proposal for WordPress to block FLoC has stalled in Trac but may have been premature in the first place if FLoC doesn’t end making it to further testing. Proponents of blocking FLoC saw WordPress’ support or opposition as critical to the success or failure of FLoC adoption on the web.

\n\n\n\n

A recent article on the WordPress.com VIP blog titled “Goodbye, Third-Party Cookies, Hello Google’s FloC,” indicates that Automattic may be straddling the fence on the controversial new technology:

\n\n\n\n

FLoC has its plus points. But it isn’t as privacy-focused as we would like, and can lead to discriminatory practices, as described above. Then there’s the concern of letting Google dominate yet another aspect of tech. Google also plans to charge any third-party tracking company for use of any of the data it has collected.

\n\n\n\n

For the time being, it looks like major tech platforms are off the hook for taking an active position on FLoC since it has been sent back for major modifications. In the most recently updated timeline for Privacy Sandbox milestones, Vinay Goel said Google received “substantial feedback from the web community during the origin trial for the first version of FLoC.”

\n\n\n\n

At the conclusion of its origin trial, FLoC seems far from ready for adoption, having failed to gain a foothold in the industry. The concern is that Google may ram FLoC through anyway using the weight of Chrome’s market share, despite the web community’s chilly reception. Although these proposed changes to ad tech will impact the entire industry, as well as regular internet users, Google does not intend to disclose any of the private feedback the company received during FLoC’s origin trial.

\n\n\n\n

“The main summary of that feedback will be the next version, and you can surmise based on what features (and the reasoning for these changes) are available in the next version,” Google mathematician Michael Kleber said during a recent Web Commerce Interest Group (WCIG) meeting

\n\n\n\n

Privacy advocates want to see more transparency incorporated into this process so that major concerns are not left unaddressed, instead of leaving it to stakeholders across the web to try to deduce what Google has solved in the next version of FLoC. Overhauling the advertising industry with new technologies should be done in the open if these changes are truly intended to protect people’s privacy.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 16 Jul 2021 03:26:21 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:44;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:88:\"WPTavern: Edupack Is Tackling Higher Ed With WordPress, Looking for Development Partners\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=119928\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:219:\"https://wptavern.com/edupack-is-tackling-higher-ed-with-wordpress-looking-for-development-partners?utm_source=rss&utm_medium=rss&utm_campaign=edupack-is-tackling-higher-ed-with-wordpress-looking-for-development-partners\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:6721:\"

“We’re basically building the Jetpack for Higher Ed,” said Blake Bertuccelli as he pitched me on the idea of Edupack, a project still in its early stages.

\n\n\n\n

He and his team are looking for more advisors to join the eighth round of their once-monthly braintrust events. It is a project they began in November 2020, now coming to fruition. Feedback is crucial to pushing such undertakings out of the gate, and the team needs more of it.

\n\n\n\n

Bertuccelli listed several focal points for the Edupack project:

\n\n\n\n
  • Onboarding: New campus users can set up a beautiful campus WordPress site with a few clicks.
  • Archiving: Stale sites are automatically archived to save campus resources.
  • Reporting: Accessibility, plagiarism, and resource usage can be accessed from the Edupack dashboard.
  • Brand and Content Management: Approved Higher Ed content patterns and universal brand controls keep sites beautiful and consistent.
  • Configuration Management: Cloud-controlled configuration settings means admins can control millions of sites from one place.
\n\n\n\nOnboarding form with Tulane-branded elements.\n\n\n\n

“Our onboarding form offers pre-built sites for users to start from,” said Bertuccelli. “So, if a scientist needs a new site for their lab, the scientist can select a pre-built lab site from our onboarding form then add in their unique content.”

\n\n\n\n

Bertuccelli is Edupack’s CEO. He called himself a “forever learner” and is currently reading A History of Western Philosophy by Bertrand Russell.

\n\n\n\n

“I paid for my Tulane education by coding WordPress themes,” said Bertuccelli. “After college, I founded one of New Orleans’ first WordPress dev shops (Decubing). A year ago, I presented on building a self-publishing platform with Multisite at WP Campus. The feedback was phenomenal, and two blokes from Birmingham offered to work on a plugin with me. A few months later, we launched Edupack’s MVP. Since then, folks from Harvard, Dartmouth, and about 17 other universities have been working with us to make WordPress an even better CMS for Higher Ed pros.”

\n\n\n\n

The “two blokes” he is referring to are his co-founders, Nathan Monk and Matt Lees. They run a WordPress shop called SMILE. Monk is serving as Edupack’s CTO. Lees is the Chief Creative Officer — Bertuccelli called him “Lord of the UX.” Altogether, the three co-founders have over 30 years of experience working with Higher Ed and WordPress.

\n\n\n\n

The Edupack team is making accessible content a priority, which is a primary issue for Higher Ed. The goal is to offer A11Y reports inside of the WordPress dashboard and tie them into publishing workflows. This would notify users of errors as they publish content.

\n\n\n\n

“Our accessibility reports tie into another feature we are launching this month: site archiving,” said Bertuccelli. “Campus users graduate and often forget about their sites. Edupack sends a notification to a user if the site hasn’t been accessed, then adds an “archived” meta value to the site that super administrators can take action from.

\n\n\n\nSetting up automated archiving.\n\n\n\n

“Devs often recode thousands of sites to add new Campus branding,” said Bertuccelli on the reasons behind Edupack. “Department budgets are drained on resources for stale sites. Institutions are sued over inaccessible content or misused branding.

\n\n\n\n

“Edupack intends to automate website management so that Higher Ed pros can focus on supporting education.”

\n\n\n\n

The following video is an introduction to Edupack:

\n\n\n\n
\n\n
\n\n\n\n

Join the Braintrust Session

\n\n\n\n

Every third Wednesday of each month, Edupack holds a “Braintrust” event. Bertuccelli says it is the best way to get involved. The session lasts for an hour over a Zoom video chat. The next event is scheduled for July 21, 10 am – 11 am (CDT).

\n\n\n\n

Each session focuses on a single question. Next week’s question: “How can we enhance WordPress blocks for Higher Ed?”

\n\n\n\n

“We’ll demo Edupack updates, brainstorm solutions for block enhancements, then wrap up with action steps for us to do by next month,” said Bertuccelli. “Folks who manage WordPress sites for global institutions and companies have attended our last seven braintrusts. Any Higher Ed pro is welcome!”

\n\n\n\n

Those interested can also keep track of progress via the Edupack blog.

\n\n\n\n

Pricing and the Future

\n\n\n\n

There is currently no publicly available pricing list. The project’s FAQs page says the team is still tuning the costs, and Bertuccelli remained quiet on any hard numbers.

\n\n\n\n

“Community colleges can’t afford tech used by bigger schools,” he said. “That’s not fair. Edupack will be priced so that every institution can afford the service. We haven’t thought about pricing beyond that.”

\n\n\n\n

Universities that wish to get check out the project should schedule a demo from the site’s homepage.

\n\n\n\n

Edupack has around 20 institutions serving as development partners and guiding the roadmap. The team invites new schools to join every few months. Currently, Tulane and the University of Gloucestershire are using Edupack. Harvard and Dartmouth should be next.

\n\n\n\n

The service is limited to universities and colleges at the moment. However, the team would eventually like to expand across the education sector. After that, we will have to see.

\n\n\n\n

“Edupack’s features can be applied to any industry where users run lots of sites,” said Bertuccelli. “I could see ad agencies using Edupack, hosting companies integrating our tools, and School Districts running their site network via Edupack and WordPress.”

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 16 Jul 2021 02:07:52 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:45;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:46:\"BuddyPress: BuddyPress 9.0.0 Release Candidate\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"https://buddypress.org/?p=319979\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:66:\"https://buddypress.org/2021/07/buddypress-9-0-0-release-candidate/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4379:\"

Important note: this BuddyPress release was built in a short time frame (we even skipped the beta release) to be ready for the release of WordPress 5.8. Our team’s primary goal for 9.0.0 was to migrate the BP Legacy Widgets to new BP Widget Blocks. You don’t necessarily need the latest WordPress 5.8 pre-release to test the BuddyPress 9.0.0 Release Candidate, but we’d be happy if you could use both pre-release versions to have your feedback about your experience with managing the BP Widget Blocks within the Widget Block Editor.

\n\n\n\n
\n\n\n\n\n\n\n\n
\n\n\n\n

“Release Candidate” means that we believe the new version is ready for release, but with more than 200,000 active installs, hundreds of BuddyPress plugins and Thousands of WordPress themes, it’s possible something was missed. BuddyPress 9.0.0 is slated for release on July 19, 2021, but your help is needed to get there \"🙏\".

\n\n\n\n

You can test the 9.0.0-RC1 pre-release in 4 ways :

\n\n\n\n\n\n\n\n

A detailed changelog will be part of our official release note. In the meantime, you can check the 9.0.0 milestone changes list from our Trac environment.

\n\n\n\n
\n\n\n\n

In one picture, here’s what to expect in 9.0.0

\n\n\n\n
\"\"
\n\n\n\n

The 10 BuddyPress legacy widgets will have their corresponding BP Blocks so that you can fully enjoy them within the next Widget Block editor and of course inside your Post/Page Block Editor.

\n\n\n\n

The BP Block collection is going to be tripled from 5 to 15 Blocks \"🙌\"

\n\n\n\n
\n\n\n\n

How you can help

\n\n\n\n

This is really important: this release also marks the string freeze point of the 9.0.0 release schedule. And we have less than 4 days to update BuddyPress translation.

\n\n\n\n

So if you speak a language other than English, please help us translate BuddyPress into as many languages as possible!

\n\n\n\n

PS: If you think you’ve found a bug, you can share it with us replying to this support topic or if you’re comfortable writing a reproducible bug report, file one on BuddyPress Trac.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 15 Jul 2021 20:45:06 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"Mathieu Viet\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:46;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:67:\"WPTavern: WordPress 5.8 Media Library Changes You Should Know About\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120010\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:179:\"https://wptavern.com/wordpress-5-8-media-library-changes-you-should-know-about?utm_source=rss&utm_medium=rss&utm_campaign=wordpress-5-8-media-library-changes-you-should-know-about\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:5914:\"

It is hard not to look through a list of upcoming WordPress 5.8 changes and not find at least a little something to whet your appetite. With so many enhancements headed our way, even we have not been able to keep up with them all here at WP Tavern. The next release will bring a few much-needed media-related upgrades.

\n\n\n\n

Users should enjoy WebP image format support and a copy-to-clipboard button on the media upload screen. Developers have a new hook for filtering the image output format, and the platform is dropping infinite scrolling.

\n\n\n\n

WordPress 5.8 is scheduled to ship on July 20, so these changes will be landing in less than a week. If you have not already done so, give WordPress 5.8 Release Candidate 3 a test run and report any issues.

\n\n\n\n

Infinite Scroll Replaced With Ajax Button

\n\n\n\n
Media Library screen (first) and overlay (second) with “load more” buttons. \n\n\n\n

The upcoming core release will drop infinite scrolling for media in favor of an Ajax-powered “Load more” button. The admin screen and editor’s media overlay will cap the initial and subsequent “pages” to 40 media items each.

\n\n\n\n

This change is a part of an effort from the WordPress accessibility team to improve the experience for end-users. Team member and core contributor Andrea Fercia noted two a11y problems with infinite scrolling. The first is that it is impossible or nearly for keyboard users to reach content appended to the screen. Second, there is no audible feedback or instructions about how infinite scrolling works for screen readers.

\n\n\n\n

He also noted usability and performance issues. Infinite scroll can break the browser’s history, and there is no JavaScript fallback. And loading hundreds or more large-sized images increases the memory footprint.

\n\n\n\n

While the media library is getting the Ajax treatment in WordPress 5.8, we should expect similar updates for other areas in the future, including:

\n\n\n\n
  • Add Themes Screen
  • Customizer > Add Menu Items
  • Editor > Link > Search
\n\n\n\n

Copy URL From Add New Media Screen

\n\n\n\nCopy URL to clipboard button on the Add New Media screen.\n\n\n\n

This change is an enhancement that rids the platform of a small but noticeable nuisance that has plagued it for years. When uploading an image from the Media > Add New screen in the WordPress admin, there was no way to grab its URL without clicking over to the edit screen.

\n\n\n\n

WordPress 5.8 introduces a “Copy URL to clipboard” button that appears after the image has been uploaded. No need to leave the page and track down the URL. The change also makes the user experience consistent with the Media Library screen and overlay in the post editor.

\n\n\n\n

More often than not, browsing Trac means seeing many of the same names. This time around, it seems that a regular user wanted a feature. They created an account — perhaps for this purpose alone –, wrote a support forum post, was directed to Trac, and created their first ticket. It took eight months to work its way into WordPress, but it is one of those success stories of an average user making things happen by just providing feedback. Thanks for the contribution, @anotia.

\n\n\n\n

WebP Image Format Support

\n\n\n\n

WordPress is allowing a new image format. And, no, it is not SVG (technically not an image). There are still security hurdles to jump for that to ever happen. However, it now supports WebP, which carries with it the promise of better performance for those who use it.

\n\n\n\n

As Sarah Gooding reported for WP Tavern last month:

\n\n\n\n

This modern image file format was created by Google in September 2010, and is now supported by 95% of the web browsers in use worldwide. It has distinct advantages over more commonly used formats, providing both lossless and lossy compression that is 26% smaller in size compared to PNGs and 25-34% smaller than comparable JPEG images.

\n\n\n\n

In the report, she noted that only 1.6% (currently at 1.8%) of the top 10 million websites used the WebP format. With WordPress now adding support, that percentage is likely to rise in the coming years.

\n\n\n\n

Developers: Image Editor Output Format Hook

\n\n\n\n

For developers who want to transform images with one mime type to another, 5.8 introduces the image_editor_output_format filter hook. Plugin authors can convert all newly uploaded images or only overwrite specific formats.

\n\n\n\n

The following example converts JPG images to the new WebP format:

\n\n\n\n
add_filter( \'image_editor_output_format\', function( $formats ) {\n        $formats[\'image/jpeg\'] = \'image/webp\';\n\n        return $formats;\n} );
\n\n\n\n

The output format will be applied to all image sub-sizes as they are created. However, this will only work for WebP images if the webserver supports it.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 15 Jul 2021 03:09:34 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Justin Tadlock\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:47;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:103:\"WPTavern: WooCommerce Patches Critical Vulnerability, Sending Forced Security Update from WordPress.org\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=120008\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:249:\"https://wptavern.com/woocommerce-patches-critical-vulnerability-sending-forced-security-update-from-wordpress-org?utm_source=rss&utm_medium=rss&utm_campaign=woocommerce-patches-critical-vulnerability-sending-forced-security-update-from-wordpress-org\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:3619:\"

WooCommerce has patched an unspecified, critical vulnerability identified on July 13, 2021, by a security researcher through Automattic’s HackerOne security program. The vulnerability impacts versions 3.3 to 5.5 of the WooCommerce plugin, as well as version 2.5 to 5.5 of the WooCommerce Blocks feature plugin.

\n\n\n\n

“Upon learning about the issue, our team immediately conducted a thorough investigation, audited all related codebases, and created a patch fix for every impacted version (90+ releases) which was deployed automatically to vulnerable stores,” WooCommerce Head of Engineering Beau Lebens said in the security announcement.

\n\n\n\n

WordPress.org is currently pushing out forced automatic updates to vulnerable stores, a practice that is rarely employed to mitigate potentially severe security issues impacting a large number of sites. Even with the automatic update, WooCommerce merchants are encouraged to check that their stores are running the latest version (5.5.1).

\n\n\n\n

Since WooCommerce backported this security fix to every release branch back to 3.3, store owners using older versions of WooCommerce can safely update to the highest number in their current release branch even if not running the very latest 5.5.1 version.

\n\n\n\n

At the time of publishing, only 7.2% of WooCommerce installations are using version 5.5+. More than half of stores (51.7%) are running on a version older than 5.1. WordPress.org doesn’t offer a more specific breakdown of the older versions, but it’s safe to say without these backported security fixes, the majority of WooCommerce installs might be left vulnerable.

\n\n\n\n
\n\n\n\n

The security announcement indicates that WooCommerce cannot yet confirm that this vulnerability has not been exploited:

\n\n\n\n

Our investigation into this vulnerability and whether data has been compromised is ongoing. We will be sharing more information with site owners on how to investigate this security vulnerability on their site, which we will publish on our blog when it is ready. If a store was affected, the exposed information will be specific to what that site is storing but could include order, customer, and administrative information.

\n\n\n\n

For those who are concerned about possible exploitation, the WooCommerce team is recommending merchants update their passwords after installing the patched version as a cautionary measure.

\n\n\n\n

The good news for WooCommerce store owners is that this particular critical vulnerability was responsibly disclosed and patched within one day after it was identified. The plugin’s team has committed to being transparent about the security issue. In addition to publishing an announcement on the plugin’s blog, WooCommerce also emailed everyone who has opted into their mailing list. Concerned store owners should keep an eye on the WooCommerce blog for a follow-up post on how to investigate if their stores have been compromised.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 15 Jul 2021 01:51:24 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:48;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:68:\"WPTavern: #5 – Robert Jacobi on Why He’s Putting Gutenberg First\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:48:\"https://wptavern.com/?post_type=podcast&p=119987\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:173:\"https://wptavern.com/podcast/5-robert-jacobi-on-why-hes-putting-gutenberg-first?utm_source=rss&utm_medium=rss&utm_campaign=5-robert-jacobi-on-why-hes-putting-gutenberg-first\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:56963:\"

About this episode.

\n\n\n\n

On the podcast today we have Robert Jacobi.

\n\n\n\n

Robert is Director of WordPress at Cloudways. He’s been working with open source software for almost twenty years, and has been the president of Joomla, a member of Make WordPress Hosting and contributor to ICANN At-Large. He is well known for his public speaking about open source and so the discussion today is broad and thought provoking.

\n\n\n\n

We talk about Robert’s ‘Gutenberg First’ approach in which he places the WordPress Block Editor at the heart of all that he does. He sees Gutenberg as a critical component for WordPress’ future; a future in which as yet unimagined technologies will be built on top of Gutenberg and leverage the ‘atomic’ way data is stored.

\n\n\n\n

This leads to a discussion on how 3rd party developers will be able to use Gutenberg as an application platform, with unique pathways to create, store and display content.

\n\n\n\n

The heritage of Gutenberg’s development is also discussed. Right from the start we knew that the intention of the project was ambitious; it’s aim to become a full site editor was explained at the outset. This has led to comparisons with other editing tools and Robert takes on why he thinks that the incremental steps that the Gutenberg project has taken are making it a vital part of WordPress.

\n\n\n\n

We also look forward and get into the subject of how technology never stands still. The underpinnings of WordPress are shifting. New skills and tools will need to be learned, but that does not mean that existing ones are obsolete.
Shifting gears, we move into community events and how we’ve managed events during the last year. Robert is a huge proponent of in-person events, and is hoping for their return. He loves the accidental situations which arise when you’re in the same space as so many other like-minded people. Perhaps though, there’s a place for hybrid events; events in which there’s in-person and online happening at the same time?

\n\n\n\n

Towards the end we chat about the plethora of mergers and acquisitions which are happening right now, as well as a discussion of Openverse, a search engine for openly licensed media, which was launched with little fanfare recently.

\n\n\n\n

Useful links.

\n\n\n\n

Openverse

\n\n\n\n

Robert’s website

\n\n\nTranscript
Nathan Wrigley [00:00:00]

Welcome to the fifth edition of the Jukebox podcast from WP Tavern. My name is Nathan Wrigley. Jukebox is a podcast all about WordPress and the community surrounding it. Every month, we’re bringing you someone from that community to discuss a topic of current importance. If you like the podcast, why not subscribe on your podcast player?

\n

You can do that by going to WP Tavern dot com forward slash feed forward slash podcast. If you have any thoughts about the podcast, perhaps a suggestion of a potential guest or subject, then head over to WP Tavern dot com forward slash contact forward slash jukebox. There’s a contact form there, and we’d certainly welcome your input.

\n

Okay, so on the podcast today, we have Robert Jacobi. Robert is director of WordPress at Cloudways. He’s been working with open source software for almost 20 years and has been president of Joomla, a member of Make WordPress Hosting and contributor to ICANN At-Large. He’s well known for his public speaking about open source, and so the discussion today is broad and thought provoking. We talk about Robert’s Gutenberg first approach in which he places the WordPress block editor at the heart of all that he does. He sees Gutenberg as a critical component for WordPress’ future, a future in which as yet unimagined technologies will be built on top of Gutenberg and leverage the atomic way that data is stored.

\n

This leads to a discussion of how third party developers will be able to use Gutenberg as an application platform with unique pathways to create, store and display content. The heritage of Gutenberg’s development is also discussed. Right from the start we knew that the intention of the project was ambitious. It’s aim to become a full site editor was explained at the outset. This has led to comparisons with other editing tools and Robert takes on why he thinks that the incremental steps that the Gutenberg project has taken are making it a vital part of WordPress.

\n

We also look forward and get into the subject of how technology never stands still. The underpinnings of WordPress are shifting. New skills and tools will need to be learned, but that does not mean that existing ones are obsolete.

\n

Shifting gears, we move into the community events and how we’ve managed events during the last year. Robert is a huge proponent of in-person events and is hoping for their return. He loves the accidental situations which arrive when you’re in the same space as so many other like-minded people. Perhaps though there’s a place for hybrid event. Events in which there’s in-person and online happening at the same time. Towards the end, we chat about the plethora of mergers and acquisitions, which are happening right now, as well as a discussion of Openverse, a search engine for openly licensed media, which launched with little fanfare recently.

\n

If any of the points raised in this podcast resonate with you, be sure to head over and find the post at WP Tavern dot com forward slash podcast, and leave a comment there.

\n

And so without further delay, I bring you Robert Jacobi.

\n

I am joined by Robert Jacobi on the podcast today. How are you Robert?

\n
Robert Jacobi [00:04:06]

Doing well. Fantastic to be here. Thank you Nathan.

\n
Nathan Wrigley [00:04:09]

Would you mind introducing yourself? Tell us who you are and what’s your relationship with technology and work?

\n
Robert Jacobi [00:04:15]

I’m Robert Jacobi director of WordPress at Cloudways. I’ve been in the open source space, wow, for almost 20 years, I’m feeling old and actually got my raising on open source with the Joomla project, which is a hundred percent volunteer, open source content management system as well, and picked up WordPress slowly got into there. And boy, that’s a lot of ands.

\n

I love the community. I love the greater goal. That open source, espouses and tries to reach. And we’re never, always successful. But having code and information more freely accessible is something I really believe in. And I think empowers people globally and provides opportunities that wouldn’t happen if these ones and zeros were siloed away in golden towers. I’m always just so tickled to talk about open source and all the interesting things we can do with it. It powers communities, it powers, politics, powers, freedoms, it powers companies. It’s really amazing. And we talk about WordPress all the time as one of the defining tools in this space. You look at something like Linux, which pretty much literally everything uses these days. It’s crazy how, to use Matt Mullenweg’s, favorite phrase, these things democratize all of us in so many different ways.

\n
Nathan Wrigley [00:05:39]

We’ve got a really broad pallet of things that we’re going to discuss today, ranging from Gutenberg, right through to WordCamps and all sorts. So we’ll crack on with the smorgasbord of what we’ve got to discuss. The first of our little laundry list is Gutenberg. You wanted to talk to us a bit today about Gutenberg, what you think of it, and so on. There was an event that I attended recently, which you were also in attendance at, and you were on a panel there, and you mentioned that in the face of proprietary page builders, you always had the approach that Gutenberg should be the first relation. It should come first. And I’m curious to know, what did you mean by that? What is Gutenberg first? What is this approach?

\n
Robert Jacobi [00:06:17]

So Gutenberg first to me is that we recognize the benefits of Gutenberg, and don’t try to subvert them or sneak around them. I think Gutenberg is one of the most critical backend, frontend changes that has happened to WordPress in its last umpteen years and the potential for all the interesting future forward things that Gutenberg can do should be taken into account. So page builders are wonderful. They offer all this functionality, ease of use, but I think that, they should also take and utilize Gutenberg concurrently.

\n

The advantages are, one, that Gutenberg’s not going anywhere. So God bless all the classic editor folk who loved that experience. More than just being deprecated, it’s just, that is not going to be the way of the future.

\n

And secondly, the potential, what can happen when you start making all that content a bit more atomic. I come from a lot of database work. So you think of atomic data points and Gutenberg does that sort of automagically for you? So there are opportunities in the future with Gutenberg to start parcing that data more finely.

\n

That’s why I think it’s very exciting and why everything should be Gutenberg first. Again, that doesn’t mean get rid of page builders or different types of themes and theming systems. It’s just that at the base, Gutenberg should be a core building block of what you’re working with going forward.

\n
Nathan Wrigley [00:07:51]

The way that I think many people are using Gutenberg at the moment, I should probably say the block editor, but if you’re using the Gutenberg plugin, you’ll obviously have an enhanced experience. But if you’re using the block editor at the moment, it feels as if it’s prime time for editing text, inserting images and some pretty basic stuff like that. But I can see on the horizon a whole plethora of interesting, curious, let’s call them plug-ins for now, because that’s what they are. Different block components, different plugins, which adapt and amend the capability of Gutenberg. And it feels to me as if that’s where its strength might lie. I know we’ve got the full site editing and all of that coming down the road, but it feels to me that, there’s going to be a whole plethora of third-party tools, bringing all sorts of added benefits into the ecosystem, a block for this thing, and a block for that thing. And whilst that might create some kind of bloat, that to me is an exciting area, and I just wondered if that’s something you’re interested in, if there’s any plugins or blocks that you’ve been looking at and thinking, oh, that’s curious. That seems to be stretching things a little bit.

\n
Robert Jacobi [00:08:55]

So, you make a, first of all, great point that there’s block editor and then Gutenberg platform as a whole, and what end users typically experience is the block editor, but the Gutenberg API, Gutenberg platform as a whole is going to allow for all sorts of crazy third party integrations. That’s great. And it might even be a little, you said the perfect word, there might be a bit of bloat and craziness. I’ll say that’ll probably exist for the next 12 to 24 months. Sure, that’s fine. As people figure out what works and doesn’t. This is a dawn of a new age around taking WordPress to the next step. We’ve talked about for many years, WordPress is just a blog, blah, blah, blah. Okay. We’ve gotten past WordPress as a blog. Now WordPress as a CMS. That’s great. I think what happens with Gutenberg is we look at it and say, WordPress is an application platform, and this is just another API that we can take advantage of in very different ways. So we can have forums that are much more catered to content creators, that get rid of all the WordPress backend and admin stuff. Okay, you’re authenticated. You’re logged in. Here’s your daily news forum that you’re going to add content to. And because we’re using Gutenberg, that makes it a lot easier to publish that content and gets rid of the technical cruft, and allows developers and third-party plugin providers to have wholly unique and valuable experiences around that. And that’s where the magic I think of Gutenberg really comes into play is where will all these third parties start finding those unique value propositions for specific content, whether it’s an, a vertical, like travel or e-commerce, in a generic sense or news or publications or whatnot. It’s really expanded the opportunities to create workflows and interfaces and make content production speedier and safer.

\n
Nathan Wrigley [00:10:55]

I think one of the curious things that I’ve observed over the last couple of years about it is that perhaps if we had the magic rewind button, we could go back a couple of years and potentially not really get into a conversation where it was… okay, we’ve got stage 1, 2, 3, and 4, and stages two, three, and four, start to add in functionality that things like page builders, can currently do, full site editing and all that. If it had just been touted as, we’ve got a new editor for you, here it is, I think it would have taken people along for the ride much more easily, but we’ve got this problem now, this impasse where, it got sold as it’s going to become a page builder, but the pace of development and the fact that they’ve got the legacy of 40 percent of the web, 40 plus percent of the web, to protect and so on it hasn’t been able to move in that direction potentially at the speed that people thought… well, it’s going to be a page builder. It hasn’t been able to mature at the rate that they would have liked to have done. And so I’m just curious in the next year, two years, whether it will do those things, but also I wish we could rewind and say look, slow down. Let’s get the editor experience sussed out first, then we’ll do the full site editing and don’t expect it to be all these things. Beause at the minute I hear a lot of people saying it’s not as good as the tool I’ve got over here, and it’s not as good as the tool I’ve got over there. Speaking of which do you think there’s a case where it isn’t the best tool where you would say actually, do you know what, I’m just going to relegate that and not use it first. Or is it literally, always the first thing in your toolkit for WordPress?

\n
Robert Jacobi [00:12:28]

It is literally the first thing in my toolkit, because it will provide the greatest longevity in whatever’s built. Gutenberg’s not going anywhere. There was a massive commitment to it from the project side of the universe. And to answer one of your earlier questions about, has it done enough? I think it’s exceeded all expectations and this is where I’ll get to it. They’re always going to be a voices like, okay, it doesn’t make bacon and eggs for me in the morning. Okay, That’s fine, it doesn’t. I think, and I truly believe what the magic of Gutenberg is, is the paradigm shift in forcing people to look at other things. So it’s hard to make a giant feature change in anything, whether it’s proprietary project, open source project. There are going to be plenty of people who are like, no, this works for me. This is great. Please don’t change. I get that. But technology moves forward. People’s expectations increase. Ten years ago, we barely had iPhones. All of a sudden we do, and now we expect everything to be infinitely easier and simpler and more responsive. I guess it doesn’t do everything that page builders do. That’s great. That’s fine. We’re not trying to cut out the middle man here, and I say we, I’m not actually involved directly in Gutenberg at any point, but it moves the technological user experience goal posts forward. All things being equal, the page builders of the world, Beaver Builder, Elementor, they’re all going to go their own way. Having Gutenberg as a critical component, soon enough, it will be just a mandatory component, that’s the end of the conversation. Says, listen, everyone, this is what we need as part of the ecosystem. This is how you’re going to connect with tools. You can absolutely go around those, but why would you want to, because this will be supported by a worldwide community.

\n

It’s not just going to be supported by the Beaver Builder community or the Elementor community, yada yada, this is now the new core and that’s very difficult to do, and it’s not, jumping back to what I said earlier about it, I think just making that change in and of itself and committing to that change is more important than full site editor or anything else. There’ll be incremental steps, but that was the big milestone step. Wow. Okay. This is the new tech, and we’re going to have to take advantage of it.

\n
Nathan Wrigley [00:14:45]

You said two words in that last little bit, well you certainly said paradigm shift and you said atomic. And I think for me, the atomic bit is really interesting because what I think many people haven’t had a chance to get to grips with is literally the atomic nature of it. This little section of your blog post or whatever it may be. You can just have this little interactive thing. It might be that you’ve got a block which does, I don’t know, lead generation, or you’ve got a block, like the cover block, which will just take care of the top of your posts. And each one of those things will have a different array of settings and it doesn’t have to be built inside a proprietary thing. It’s being built inside of the default editor for WordPress. So it’s going to bring a ton of functionality and a ton of interesting things. Some of it will be bloated. I’m sure there’ll be many people who fall into the trap of installing fifty times more than they need to, or five times more than they need to. But for those of us who were curious and check things out and look and see what the end result is, you’re going to be able to create really unique experiences on this one surface, and that to me is really exciting, but have the feeling that the community got left behind in the conversation about this a little bit. So the confusion that it was going to be a page builder leads me to the whole community conversation. I know you’re all about community. This is something that you thrive on. You love the WordPress community, as you have had loved many other communities in the past. Do you have any feelings around whether there’s been enough involvement. Asking the questions, what should it look like? How should it behave? What do we want to leave on the floor and edit out that we just, it was a blind alley, we shouldn’t have had that because there are some things that I think a really excellent, there are some things that I think I’m not sure anybody’s actually going to make use of that, but there it is. And just wondering what your thoughts were around, whether the community had been involved, whether it could have been involved more.

\n
Robert Jacobi [00:16:38]

I’m getting chuckles about a lot of these things. Could there have been more all the editing and whatnot. Since community is, especially in WordPress, a huge word, it’s always difficult to get every stakeholder, give them the space, give them the time given the vote.

\n

What I like about what happened with Gutenberg is that it did move, in my mind, relatively quickly, and expeditiously and said, this is what we’re doing. And I think it’s too easy to be bogged down in the politics of community to actually get stuff done. So if things fall to the wayside, if things were not edit out properly, that’s where I think, the greater ecosystem can come into play and say, we’re going to tweak this, with a plugin that makes this just a bit better. It takes this out and we have such a robust economy in WordPress. That yeah, go for it. I like to see a bit more activism from people as a whole on these projects, but it’s hard. We all have day jobs. We all have stuff to do, and I’m not going to blame the leaders of the project for trying to get stuff done. In fact, I’m going to give them kudos to just doing it because it’s very easy to get pulled back and say you didn’t listen to so and so, at some point we have to fish or cut bait, we need to do something and we need to move the technology forward because everyone else is doing it. And open source projects have a tendency, especially at their, let’s say late teens, early adult stages, getting sucked into managing the community more than managing the project and pushing it forward.

\n

You have to do both. It’s such a tricky balance. All kudos to everyone at Make dot WordPress, that they were able to do this. And it’s a large scale change and get it done. Fine, if you want to complain, that’s great. Guess what? No software lives, at that moment in time, it’s always updated and tweaked and there are still opportunities to make changes, advocate or different functionality. Expand the API, shrink the API, all those kinds of things. I do love that WordPress was able to cut bait and just go with it.

\n
Nathan Wrigley [00:18:43]

One of the underpinnings of WordPress since the inception really was PHP. And obviously now we’re moving into an era where these technologies are being inspected, and improvements have been created along the way. And so now we’re moving into an era where other technologies, for example, React is coming along and that requires quite a bit of relearning, you’ve really got to down tools, get the manuals out, start to read again. Do you have any concern that that kind of thing could be a bit of a roadblock? It will be a bit of have a roadblock for certain people, but the technology has to move forward. Just curious as to what your thoughts are about how that’s being implemented and whether or not we’re taking it at a slow enough pace or whether we should have just stuck with good old PHP?

\n
Robert Jacobi [00:19:29]

I like to use the right tool for the right projects, And I’ve been a coder, developer, engineer in multiple languages. I’ve actually never done anything with React, that’s one of the first ones. And that’s okay. We evolve. If we hadn’t evolved all these still using C from 1969 or whenever it came out. So this stuff has to move forward. And if React is the best solution to do that on the front end, that’s great.

\n

Some people will be excited by that. Okay. I can expand my personal knowledge and horizons by adding to React. Honestly, a lot of the headless stuff that we see these days is also React. So it’s not a bad thing to learn if you want to learn that. If you don’t want to learn it. Okay, that’s fine. There are plenty of opportunities to still expand your WordPress activities solely with PHP. Okay. Those are more personal choices. Do I want to learn another language? Do I want to improve on what I already have? Yes. Those are choices you have to make, but none of this lives in isolation. So we have to understand that a WordPress, plain old PHP site, might still need to connect up to a bunch of different things and not all those things are going to be on PHP. You still might be connecting up to something with Perl or Python. No, one’s forcing you to learn it. Granted Gutenberg injects this react universe into your face, but you can focus on the core things that you need to do without necessarily running into React. It’s a tool that more people are… here’s the trick, there are plenty of new people who are entering coding, development, open source communities, and they like React. So it makes sense to take advantage of all this new found wealth, and then also draw them back into the community. Great, you love running with all this JS stuff. Fantastic. Hey, by the way, did you know you could actually implement that as part and parcel with an old-school PHP content management system? Yeah, we can do that. That’s great. And look how you can expand your horizon. Yeah, it stinks if you don’t want to learn any kind of Node, React stuff. Okay. But, it’s sort of the nature of code. If we really want to take the analogy to the extreme, why aren’t we still coding on punch cards with ones and zeros. We’re going to abstract it and find the best tool to implement the functionality we want to see.

\n

And I get it me personally, I’m not going to go out and learn React today. Me twenty years ago, though, I would have added it into my tool belt in a heartbeat, just because it was just one of those things that you needed at that time, that was the case. People are going to go through their own personal and professional sort of life cycles of what they think they need to have on their knee or in their tool belt to be successful. We can’t stop for people who don’t want to do anything outside of PHP.

\n
Nathan Wrigley [00:22:04]

We’re going to shift gears now and talk about in-person events. Under the auspices of things like WordCamp Europe, which is depending on when you’re listening to this podcast that may just have happened, or it may be it’s coming around in a year’s time or something like that.

\n

Clearly we’ve been through a period that has really shaken the community. I feel that as a community, we were probably as well-prepared as any community could be because we were already working via the internet. We all had our computers out and so on. And yet still there is a concern. And I know that for example, people like Josepha Haden Chomposy has mentioned things like this, that the community in the absence of in-person events, there’s been a modest disengagement. And what I mean by that, this is the project, the WordPress project was propelled forward in a large part by those in-person events. So you’ve got contrib day, you’ve just got the handshaking, you can actually meet people for the first time. You can build relationships and so on. And none of that’s happened. We’ve had a year out. We don’t know quite when that is coming back, hopefully at some point in the near future, but we don’t know. And so just curious about your thoughts on that. What do you have to say about events coming back and how a project as big as WordPress, where there’s no central office where there’s no boss telling everybody what to do. So if you’re on the payroll, you’ve got to do this today and fix this thing, but that’s not how it works. And so the open source model, there may be a chink in its armor here where in-person events don’t happen, that camaraderie and those solutions don’t present themselves. And so the project, I’m going to use the word stalls, that’s a complete over-exaggeration, but bits of the project stalled because nobody’s meeting up.

\n
Robert Jacobi [00:23:49]

I am a huge, huge advocate of in-person anything. Whether you’re extrovert or introvert, there’s always going to be someone that you really want to talk to sit down in a corner, or have a cup of coffee with and build that relationship. I’m no anthropologist or anything, but feel that those kinds of human connections help us grow stronger in light of all the mundane things we do day to day. I don’t think the project has suffered because of a lack of in-person events over the last year. I think it’s suffered because everyone else has had a lot on their mind and there’ll be a, certainly a renaissance of activity as soon as we get into in person but this is one of those things where I don’t think correlation and causation match up. If you are worried about friends and family getting ill, did the economy, my personal economies take a downturn. That’s going to weigh a lot more on someone than, oh, did I catch up on the latest WordPress dot org, Slack notification about Full Site Editing. So I don’t think they’re completely tied together, but I will certainly tell you that as those in-person meetups start ramping up, I think that’ll be a flurry of excitement and activity. Part of that will be just because we’re not still trapped in our tiny little Covid bubbles.

\n
Nathan Wrigley [00:25:12]

What personally do you miss from the in-person events? You mentioned about having a coffee and sitting in a corner with somebody and so on, but anything that you find you’re missing, it could be something quite banal or it could be something a lot deeper.

\n
Robert Jacobi [00:25:24]

It’s really the accidents that happen at in person events. With a completely regimented online experience, I know I’m going to be talking with Nathan at such and such time. I know I’m going to be talking to whoever everything’s organized, calendars. Okay, there’s digital here, digital there. We may edit ourselves more on these platforms. When you’re in-person accidents happen. We may be walking through the sponsor hall and accidentally bump shoulders. And it’s oh my goodness, Nathan, great to see you. I haven’t seen you in 14 months. This is amazing. And you just start a conversation and those kinds of conversations are organic and random and not necessarily so overly planned and well thought out. And at those moments, I think unique ideas, exciting things can happen that just don’t happen in a much more shrunken space. I love the distributed world. And to your point, I think WordPress is not only just gone through well, it’s actually succeeded because we’ve already been in that position. We’re already ready to be online and take care of the day to day.

\n

We need those accidental bumpings of atoms to create new kinds of alloys. Oh my goodness. carbon and oxygen linked together. Oh, no, look what happened here. I don’t know what they do, I’m not a chemist! But my point being is when you’re in person and I’m going to keep calling them accidents, but not like in a pejorative kind of way, accidents happen, and it allows for very random, unique ideas, conversations, thoughts, whatever to happen, or just even a personal pick me up. Like you do remember me from being on slack for the last year. That’s fantastic. There’s an affirmation I think that happens for all of us when we’re in that kind of proximity with other like-minded people.

\n
Nathan Wrigley [00:27:21]

I think one of the, there’s two points about the online events that I seem to keep coming back to. And the first one is that I feel it’s taught us that we ought to have hybrid going forward. What I mean by that is that WordCamp EU, I feel it’s going to be difficult to put the genie back in the box of you have to go to the place where the event is. I feel that the future is going to be, sure enough, if you want to turn up and you want to benefit from the hallway and all of those things, go for it. But also if you’re living halfway around the world, that now needs to be a door which is not closed to you, you need to have it open. There needs to be streaming of those talks that are happening each day so that everybody can take part. That’s one of the things that I feel is going to happen.

\n
Robert Jacobi [00:28:03]

I completely agree. There are events that I would have never been able to attend on a very regular basis without there being an online component. Someone will solve this puzzle, but I think it’s going to be difficult to do a online and in-person event concurrently. I feel that you’ll get the worst of both worlds in that case. What I’d like to see, let’s take WordCamp Europe 2022. There’s going to be a three, four day in person spectacle. That’s fantastic. What I would like to see is maybe two days before the in-person starts. There’s a whole online portion of that. I’d be concerned about trying to do them concurrently. Are we really going to have, we can do all the live video for example, but how interactive can we make those live portions? Oh, look from online, we have a question to the speakers. Okay. That works. But outside of those sessions, how are we going to integrate the sponsor hall, the hallway track as we talk about it? Those are those accidents that I like to refer back to just walking up and down and bumping into each other. I don’t think that’s an easy problem to solve, but I’d love to see some kind of greater online kickoff onboarding experience, where you can meet the speakers, do some quick Q and A’s, and conversely, have the speakers say, make sure you don’t miss my session on such and such date and time, then that will, of course be also livestreamed.

\n

It’s going to be expensive. It’s going to be complicated. And I think there’s going to be multiple variations of attempts at making that succeed. I like to go with baby steps to see results. And I think just starting out with maybe a one or two day virtual camp tied to the in-person camp would be a good starter.

\n
Nathan Wrigley [00:29:46]

That’s what I was meaning really is just basically a camera at the back of the room where there’s a presentation going on with the possibility of questions coming, not just from the audience, sat in the auditorium, but from people in a different part of the world. And in fact, I feel it in a way, these kind of like skeuomorphic pieces of software, which tries to replicate the real world, you’ve got these AI representations of the hall. It’s nice. It’s a bit of fun. I feel it’s a dead end. Nobody ought to be under the illusion that’s what they’re going to do. But I do like the idea of just, here’s the talk, you can watch it at the same time as everybody else. And then maybe you and your pals can hang out. You can do your bit online and we can do our bit in the real world, and so it goes. It’s really just an opening up so that you don’t have to attend because the problem there would be that nobody actually makes the attempt to attend, but I don’t feel that’s the case. And my second point is that I feel that we need this stuff back just because the online stuff, there’s a fatigue associated with that, and I don’t for a minute think that everybody’s fatigued and I don’t for a minute, think the online events don’t have merit because they have enormous merit and they’ve been an amazing bridge, but I feel that there’s a proportion of the people who would love to be at live events who just can’t make the transition to the virtual events. There’s something about it. Something stifles them, perhaps they have the best will in the world, and then it’s on the screen. But then something in the real world occurs to them. The cat decides to chew up the sofas, so off you go, you’ve got to deal with the cat. You get distracted, you want to go and make a cup of tea, so you get distracted. Whereas if you’re at the WordCamp, you’re fully there. You’ve engaged, you’ve committed. You’ve potentially got on a plane. You’ve booked a hotel, all of that. And there’s no substitute for that. So that really was my second point is that I want to get the people who’ve been disengaged back in and ready to take on all of the challenges that we’ve got.

\n
Robert Jacobi [00:31:42]

Yeah. I think we’re on the same page. I can do virtual events. I certainly prefer in person. And the best example of how we know that in-person is very valuable is when you go to a lot of these virtual events, the networking spaces are generally very empty. People aren’t having those conversations, those random accidental conversations that they would add an in-person event because at an in-person event, you are physically, quote unquote, stuck in that space. If you don’t want to talk to someone, you’re just going to go your own way. That’s great. But if you do, who knows who’s next to you and you’re going to overhear things and interrupt the conversation and be interrupted and that’s that magic that occurs.

\n
Nathan Wrigley [00:32:29]

Okay. Let’s talk about the third point that we wanted to discuss today. I’m straying into an area where I don’t have a great deal of experience because I watch these things happen from afar. There’s nothing that really concerned me. That concerned me in the sense that I might be a consumer of some of the things that are being bought up. But you wanted to talk about, as you described it, the WordPress economy acquisition madness. Now, what did you mean by that? Just kick us off. Explain what you mean by that phrase.

\n
Robert Jacobi [00:32:56]

Here’s the beauty of being a successful project, people with money will find ways to make money from it. And that’s okay, and that’s a good thing. We’re seeing the likes of Automattic, WP Engine, GoDaddy, Liquid Web, Cloudways, yada, yada, yada. All these companies, wink wink, they’re all hosting companies because they’ve been in the space for awhile under different platforms and have recurring streams of revenue and cash on hand, they’re going to look to grow their businesses, and one of the easiest ways is to find valuable niche projects, that not only will bring cool bit of code into what they’re trying to do, but also allow them to reach out to all the people who have installed that plugin.

\n
Nathan Wrigley [00:33:45]

Do you have concern then that certain parts of the WordPress, let’s say plugin or theme space, are going to be consumed by these bigger entities as you described? In many cases, there will be hosting companies for reasons you’ve just explained. Do you have a feeling that silos in the future are going to occur? Where if you really want a decent, let’s go for, I dunno, membership experience, you really are better off going in the direction of that company, with the brands that it’s acquired over time. Or if you want to go for a WooCommerce experience, your best bet is going to be over here, and everything else is a poor relation of that. So we get silos, which we haven’t had until now.

\n
Robert Jacobi [00:34:28]

I think that’ll happen in the short term, but when that happens, a vacuum is created in the overall ecosystem. So if hosting company X has a, quote unquote, monopoly on that membership plugin, you know what, first of all, it’s all open source. All it takes is company Y to be like, we want to be in that space as well, and we’re going to re-imagine the underlying open source code base in XYZ format. Yes, a lot of letters there, but it’ll happen. These kinds of acquisitions and changes in economy I feel are okay. We’re all working from an open source code base. If this was all proprietary stuff that you can never take advantage of, I think that would be bad for the community as a whole, but that’s not the case. It’s just one company saying we’re going to be owners of this project. You can still fork that project any day of the week, don’t forget. Cause it’s all GPL. So I don’t think we’re losing anything in the long run. There’ll be short term hiccups. People won’t be happy. If that plugin doesn’t do exactly what they want, but they probably wouldn’t necessarily be happy even if it wasn’t taken over by someone else. I think there’s a percentage of people that will always want to see all this independent software, but all these companies are technically, okay maybe they’re not all independent because some of them are actually listed on public exchanges, but the opportunity hasn’t been taken away, and if such and such plugin gets acquired by such and such hosting company, I certainly see another hosting company looking for that competitor also happening.

\n
Nathan Wrigley [00:36:01]

Do you feel that, okay, again, rewinding the clock for the second time in this podcast, if we could go back maybe 6, 7, 8 years, something like that, before these companies were buying up suites of plugins and what have you, to bulk out their offering. We basically had independent plugin developers. There may have been a team that grew up over time and they were inventing a solution for a particular problem, and they were really invested in that, and that was great. We want to solve the calendar thing or we want to solve the, I don’t know, the menu thing, whatever it may be. I’m just wondering if we’re maybe getting into the territory of designing things to be acquired. We designed something so that this can happen, so that we can become bought up, taken along for the ride by a big hosting company, and just really whether or not there’s any dynamic that changes the way that instead of serving the customer and always trying to offer the best support for the product, really your whole intention for that business isn’t to create the product for the customer, it’s to create the product for the sell in the future.

\n
Robert Jacobi [00:37:01]

I agree. I think there’s a potential for that. On the correlator, are you getting value in what you want out of that product? So if I use, there’s something I’m going to jump into because it’s happened recently, but on the face of it, it’s a product that is so useful to me that I’m not going to have to do custom code. It’s above and beyond every other plugin competitor in that space. Am I going to use it? I’m going to use it, yes. And to some degree it doesn’t really matter what the incentives for the developer are at that point. If it’s doing what I wanted to do, that I’m going to use it because that’s what I needed to do, and it’s going to save me 10 50, 200 hours of development time to use this plugin as opposed to trying to create something on my own. And that’s question one, or the answer one. Answer two is there certainly is an issue with, what’s a nice word for miscreant. I guess it’s gonna be miscreant, where we’ve seen recently some plugin developers literally switch out what that plugin does and what its value proposition is with, quote unquote, upgrades. And they’ve done it behind your back. Oh, well you signed up for this cute little plugin that makes banners, guess what, now it’s going to do all these things and you have to pay for it just to get banners again, and it’s like really, really is that really what you want to do? And I think those developers are getting called out on it.

\n

The agencies and content creators, certainly in the nearby community are aware of that. I think those kinds of, yeah, they’re not necessarily illegal in any way, shape or form because you can do that, but it doesn’t really stick by the unofficial developer third party ecosystem code of conduct. And I think we’re always going to see exceptions to the rule, but as long as those are just exceptions, I think we’re in a good spot.

\n
Nathan Wrigley [00:38:43]

Let’s pivot again. Openverse. I’ve got to say, this is something that kind of passed me by. The radar wasn’t working properly over the last few weeks since Openverse came along. I’m going to ask you to tell us what Openverse is. I have a very vague understanding of what it is, but I’d like you to tell us why you think it’s important.

\n
Robert Jacobi [00:39:03]

This is a new project in the WordPress ecosystem. I should say WordPress dot org ecosystem. It comes from creative commons search project that was languishing at creative commons. They didn’t have community and developers interested in pushing the search component along and, with support from Automattic, it came into the welcoming arms of wordpress dot org. And it has it’s own thing called Openverse. I’m excited by it. One, because it expands the open source vision of WordPress, WordPress becoming even a greater open source proponent. It’s not just the CMS, but now we also have additional things that we’re caring about, which I think is fantastic. It simultaneously is going to be working on technical aspects as well as open libra software model, or content model, I should say, where the tool will be helping WordPress as well as anyone else, obviously on finding creative commons, open licensed media. So in this case, images. I think it’s a great expansion that’s completely in line with what the project is looking to do. And I think it’s going to be surprisingly helpful and people won’t even realize what’s going on, but they’ll all of a sudden be able to access a bunch of new content natively in whatever application, obviously WordPress will be at that top of the list, but, you’ll be able to access it with Drupal or proprietary systems.

\n
Nathan Wrigley [00:40:40]

What was the problem with the old licensing model? What was broken with it?

\n
Robert Jacobi [00:40:43]

What was broken was there was no one who was going to commit to keeping up the code base to make CC search working and functioning, tweaking it, bug fixes, whatnot. So, as part of the WordPress project, there will actually be active development and maintenance of the creative common search.

\n
Nathan Wrigley [00:41:02]

Okay, so was there any concern that things which you may have downloaded from third-party sites, we all know the ones that we customarily go to, that they were often perhaps changing the license after you downloaded things, and then suddenly you didn’t realize that you were in contravention of a license, which you thought you had full access to download, redistribute, do whatever you wanted and suddenly you realize, oh, okay, that’s no longer the case. This image that I’ve got, I need to take down.

\n
Robert Jacobi [00:41:28]

So, licensing is so fun and entertaining. So a lot of these download an image sites, those licenses still stand. So if you have downloaded it and are using an image that was licensed under creative comments, that’s not going away. Will they relicense new images? Possibly. The point is how easy will it be to find more creative commons based media? And I think that is the purpose of Openverse, to make that as easy and intuitive as possible. So again, it’s taking what used to exist as part of creative, common search, almost like a fork, rebranding it under Openverse and, making it part of an ecosystem that’s open source.

\n
Nathan Wrigley [00:42:15]

And this is going to be completely available inside the WP admin. So you’ll have search integrated there, and if you want to search for, I don’t know, a cat on cushions, for example, you’ll be able to do that and everything that’s returned, you’ll be able to use, hopefully because the search will have returned something valuable to you in this case cat’s on cushions.

\n
Robert Jacobi [00:42:35]

So that is my expectation. Obviously it’s not built into any of that yet, but yeah, that is that’s where I see the project going.

\n
Nathan Wrigley [00:42:40]

But it was a nice philanthropic gesture of Automattic to take this on board and just basically put it into WordPress so that the likes of me, and you can find our cats on cushions whenever we please.

\n
Robert Jacobi [00:43:35]

Right.

\n
\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 14 Jul 2021 14:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Nathan Wrigley\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:49;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:58:\"HeroPress: How WordPress Has Changed My Life – Gtarafdar\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://heropress.com/?post_type=heropress-essays&p=3939\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:160:\"https://heropress.com/essays/how-wordpress-has-changed-my-life-gtarafdar/#utm_source=rss&utm_medium=rss&utm_campaign=how-wordpress-has-changed-my-life-gtarafdar\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:19947:\"\"Pull

I’m Gobinda Tarafdar from Dhaka, Bangladesh. In short, Gtarafdar. This short form is available everywhere on social media. Actually, while I was a kid, a medicine specialist suggested this short form of my name. From that time, I had a plan to use it. Moving on, now I have become a WordPress Enthusiast Marketer. In this essay, I will share my journey to WordPress with you.

\n

\n

Early Stage Of My Career:

\n

I started my career as a teacher in an academic coaching center back in 2010. I was then a 1st-year student of my 4-year Graduation Program. But the number of my earnings was not sufficient to cover all my livelihood. My parents were giving me support to continue my study at that time. So I was looking for more ways to earn my living. But in our country, it’s tough to get a job without graduation. I tried to find more tutoring jobs but failed to get one. Then I gave stand-up comedy a try. At that time, it became popular. I participated in a TV reality show based on stand-up comedy. But failed to reach the top five. So, didn’t get much success in the comedy sector as well.

\n

\n

In this way, two years passed. After a while, I got the idea of a call center job in the telco industry of our country. I gave an interview to our number one telco company Grameenphone – a sister concern of Telenor. And luckily got the chance to join there. And it’s a game-changing part of my career. I learned a lot about team play, pressure handling, the ability to put myself in a customer’s shoes, and more. But it was a part-time job, and my graduation was about to end. Immediately after finishing my graduation, I got the opportunity to join Grameenphone’s Finance team. However, I had to pass the challenging interview as many other promising candidates were competing with me. Everything seemed so great at that time. Got the opportunity to work in the country’s best corporate office, but bad luck struck again. Didn’t get the chance to be a full-time employee from contractual employee status.

\n

I took a break to join the country’s public service commission. Unfortunately, I failed to get the desired position again. In the meantime, my father retired from his job. All of a sudden, so many responsibilities came upon me. By the way, I forgot to mention, in this time frame, I had completed my Graduation, Masters, and MBA. The year where I’m now in the beginning of 2018. After my father’s retirement, I had no time for an experiment. But the main challenge came then.

\n

No one wanted to give me a chance as I worked at one of Bangladesh’s most prominent companies; they thought I couldn’t fit into their office culture.

\n

Also, I wanted to start my career as a Digital Marketer, and I had no practical experience at that time. I had some certification of Udemy and Hubspot free courses. But I was confident that I had a degree of MBA in Marketing. But all of my confidence was doomed within three months. I stopped applying everywhere, started to do some research on the job sector. Finally, I decided to join the IT industry, and in our country, WordPress Based companies are in the leading position. So, I had my target fixed towards the WordPress industry.

\n

A Huge Risk-Taking State in My Career:

\n

I took a huge risk to start my career in the WordPress industry. After not seeing much job opportunities in the Digital Marketing area in my country, I was planning to join the telco industry again as I was finding no option to cherish my dream. I badly needed a job at that time. But meanwhile, I found a job circular in weDevs. They were looking for a Digital Marketer Intern. So I made my decision to take part in this program. Surprisingly, I got another job offer from a renowned MNC of our country in the sales team. But I took a huge risk and started trying for the weDevs internship program, and refused the salesperson job. My friends Mayeen & Arif helped me a lot to learn more about WordPress. And they guided me on how I could set up localhost on my computer, and from then, I started to explore themes and plugins from the WordPress repository. I must say I got an interesting tool to play with. After passing three stages, I finally got the chance to join weDevs. weDevs is a popular WordPress Plugin making company. It’s famous for Dokan Multivendor Marketplace Solution for WooCommerce.

\nMy Life at weDevs\n

Ohh, maybe you have a question about how it can be risky to go for the weDevs internship program! Well, the payout of the other company was three times higher than the weDevs internship payout. And I refused to join the other sales team while I still didn’t have any guarantee to join the weDevs team. So now you can judge, isn’t that risky? (Sorry, I can’t share the name of the sales company publicly here due to some policy issue.)

\n

The Journey to WordPress:

\n

From the day when I had installed WordPress in my local host, my journey in this ecosystem started. I found it so easy to use and user-friendly that I felt anyone could create a website. I started to read articles and explore the World of WordPress. Also, weDevs’s internship program helped me a lot to get involved in the WordPress industry. My mentor Afshana Diya and Mainul Kabir Aion guided me a lot to dive deep into the sea of WordPress. Learned the area of content marketing, explored paid mediums, gathered knowledge on social media marketing, and more within three months. The internship program was exact and compact, along with interactive.

\n

Here came another twist. I wanted to be a part of the Digital Marketing Team. But because of my communication skills and interpersonal relationship skills, Mr. Nizam Uddin (Founder & CEO at weDevs) offered me the Business Development executive position. It was an entirely new thing at weDevs. I was the one-man army in the Business Development Team. And it opened up a new world to me. At that time, I got my first chance to attend a WordCamp (WCAhmedabad, India 2018). From that time, I got the motive to be involved in the WordPress Community. I’ll share how WordCamps can help you to join the community closely. Later on, I got the chance to participate in WordCamp Kolkata 2019, WordCamp Nagpur 2019. It was a fantastic journey to join WordCamps in person. In 2019 I took part in WordCamp Dhaka as a volunteer.

\nMy Journey to WordCamps\n

I’d love to share with you; now, I have become part of the Digital Marketing Team of weDevs. After almost two years of my journey as a business development executive, I got this new opportunity to prove myself again. So I took this opportunity and became a Digital Strategist.

\n

Now I’m dedicatedly taking care of a sole product. It’s an Addon of Elementor Page Builder. It’s HappyAddons for Elementor. I’m the product coordinator of this excellent tool. From zero to now, 100k+ users are actively using this tool. It’s an incredible learning period in my career path. I learned how to grow a product from the ground level. It’s a great achievement for me as a Product Marketer.

\n

How WordCamp Helps Me to Become a Member in the WordPress Community:

\n

WordCamps are the place of like-minded people. When you are in touch with the right people under the same roof, you will get that homely feeling. Also, in WordCamps, you get to meet industry experts. Interestingly, you can collect lucrative swag items. To some extent, you will get an opportunity to make partnerships to expand the business. Moreover, some companies share job boxes where anyone can share their resume. So it could be a place of opportunities. Who knows what you will get. But in my case, I made so many friends. We are now close buddies.

\n

The exciting part, some WordCamps run contributors day. On that day, you will get the chance to know closely about how you can take part in the core programs of WordPress. From WordCamp Ahmedabad, I started participating in WordPress programs, also started joining WordPress teams meetings. I’ve become active on social media as well to spread news and updates related to WordPress.

\n

How I’m Enriching My Knowledge of WordPress:

\n

One line changes my way of thinking. Once I was talking with our Founder & CTO, Mr. Tareq Hasan, regarding this topic. He just said, “Gobinda, you don’t have to learn coding to solve the problems of WordPress; you have to gain the ability to solve the problem by anyhow. You can solve any kind of problem by referring to other WordPress Plugins and tools.”

\n

I got a new meaning of using WordPress. From that time, I have started to check WordPress plugins and themes to learn more about their purpose. WordPress repository now becomes a place of amusement for me. Sometimes, my colleagues refer to me as a ‘plugin man’ as I try to give a quick solution to WordPress-related problems with the help of WordPress plugins.

\n

Still, I’m participating in several Facebook Group discussions. Trying to solve several solutions and learning what problems are usually people facing while creating websites with WordPress. And believe me, there is definitely a solution to each particular problem.

\n

You have to keep patience and search for the solution in the right type of keywords.

\n

For example, yesterday on the Facebook group – WordPressian (Dedicated Facebook Group for those who speak Bangali), a person was looking to create a courier service platform where people can track their package. Most people suggested building a custom-made solution. But I know there is a solution; I randomly found it on the WP repository.

\n

So I just googled this term “WordPress plugin: courier service”. Google didn’t disappoint me.

\n

I got my answer, read the description, reviewed, checked screenshots, and shared the solution with that person.

\n

To increase my knowledge of WordPress, I use another method. I use some Google Chrome Extensions for checking the Builtwith Materials of WordPress sites. When I jump on a WordPress site, I just click on the Chrome Ext. and check the plugins they’ve used to create their site. And it helps me a lot to learn the tools and their purposes. You can do that if you want to increase your knowledge of WordPress.

\n

Lastly, you have to create a site by yourself. Otherwise, you would not be able to know the issue on your own. At least create your own portfolio site. I have learned so many things while creating my portfolio site: gtarafdar.com. You will know some untold facts, and finally, you will get a boost. Mr. Asif Rahman, the founder of WP Developers, gave me this idea. He always inspires me to create a personal website. Also, he forced me to write about WordPress daily. Guided me on how I can create a site with Elementor in 2018. I became familiar with a handy tool that helps me create a site without having coding experiences from that time. Later on, it helped me to take over the Happy Elementor Addons Project.

\n

How you can connect with WordPress Socially:

\n

Twitter is the best medium. I opened my Twitter account in 2010. But I had no motivation to use it as I didn’t have people close to me there. My friends were all on Facebook. I was also trying to involve myself on Facebook. But after joining weDevs, I found my Mentor, Afshana Diya, was so active on Twitter, and she has so many like-minded people on Twitter, and most of them belong to the WordPress community. I got new motivation to use Twitter. I started to connect with WordPress Professionals. Also interacted with them regularly. And I must say it feels really amazing.

\n

I’ve prepared a Twitter list of WordPress Influencers. You can easily follow them from here.

\n

How you can start your career at WordPress:

\n

If you have a passion for coding, you could be a WordPress developer. In our region, here is a myth. To become a developer, you have to be a CSE grad. But it’s not true. Let’s check a fact. In our weDevs, most of the Developers are directly not from Computer Science Engineering backgrounds. In the same way, you may have joined the CSE program at an early stage, but now you may not have that much passion for coding. You can be a Product Manager. In the WordPress industry, there is scope for a Product manager as well. Another exciting sector is the Quality Assurance team. So many companies are hiring in this sector. Moreover, if you like to communicate with people, you can join the Support Engineering team. You can’t imagine how many job openings there are in the support engineering field.

\n

Those who don’t have any coding knowledge but are proficient in English and have a passion for writing can join as Content Marketers. There are plenty of job vacancies in the content marketing area.

\n

Another interesting option is joining the Designing team. If you find interest in the designing sector and love to play with the designing tools like Figma, Adobe Tools, Sketch, you can definitely join the design team of a WordPress company.

\n

Later on, other job sectors like HR management, Accounts, Business Development, and other necessary areas are also available on WordPress companies. More interestingly, you can work remotely in so many companies. WordPress founding company Automattic is running its whole operation remotely. You just have to find your perfect niche. Otherwise, you can be frustrated.

\n

I’ve prepared a list of WordPress companies where you can apply for jobs.

\n

Finally, don’t be frustrated, my mate. I often hear from my fellow friends and juniors always blame God, parents, and the government because of their unemployment problem. But when I reach them and personally request to gain some technical skills, they just run away most of the time. Not even reply to my messages anymore. Even some of them block me. Lol. Also, some other groups are available; they knock me for jobs and share their family issues, but when I ask them to learn more about web development, they just fly like a bat. I don’t know what their problem is. If you are in the same category, then my mate, you are in huge trouble. Change your mindset. Gain some skills. It could be anything. Try one by one. Then choose the best one for you. But again, don’t be frustrated. Keep focusing on your goal. And dive into it.

\n

What’s The Challenge on Working in WordPress Industry:

\n

I’ve shared all the positive things about joining the WordPress industry. But there is a significant challenge you have to face while you will join the community. In my region, very few people know WordPress. Only tech-savvy people are familiar with that. Even most of the people don’t have any prior knowledge about remote job life. I have personally experienced so many funny incidents. Last year when my family members found me in front of my Mac and sometimes talking with some people, sometimes in English, they found me as an alien in my house. Even most of the time, I failed to give proof of how the whole work was done. You will face the same situation if you belong to the rural area of Bangladesh. But don’t worry, I prepared a comic book on Describe WordPress To Non-Techies. You can read the conversation with my Grandpa. I have tried to give an idea about WordPress. I hope this will help you to introduce WordPress to the non-tech guys.

\n

How I’m Contributing to the WordPress Community and how you can start:

\n

Usually, I try to attend the weekly meeting of WordPress teams. I have attended several coffee-talk sessions of WordPress Teams. It helps me join with the members. Also, I’m trying to contribute to the Polyglot team. I have started to give suggestions of translating WordPress in Bangla. But mostly, I contribute in different ways. I have conducted local WordPress meet-ups, volunteered on WordCamps. I spread the news and updates through my social media accounts. Help WordPress people to find jobs. Recently, I’ve started my YouTube Channel(Gtarafdarr). I have begun to create how-to tutorials on WordPress.

\n

If you want to join WordPress core teams, you will need a WordPress Slack Account. From here, you can join WordPress Slack.

\n

From here, you will find the meeting schedules of different teams. Don’t get puzzled. You can sort out your desired teams and add the meeting reminders to your calendar.

\n

Everyone in the WordPress community is so helpful. If you find any difficulties, raise your hand and people will guide you in the right way.

\n

Also, there are so many WordPress Facebook communities. Some are locals, and few are international, like WordPress, Advanced WordPress, WordPress For Non-Techies by WPCrafter, The WP Admin Bar, WPLeague, WPBeginner Engage – WordPress Help for Non-Techies, etc. Local Communities are, WordPressians, Kolkata WordPress Community (WPKolkata), etc. You can join these groups to get help from experts. Also, you can help others if you know the answers of the queries.

\n

This How WordPress Changed My Life

\n

Finally, I’m really thankful to WordPress. Because of this community I have overseas friends. We talk and meet virtually. All of them are so helpful. I get new motivations to do something extraordinary in my daily routine. I’m thankful to my parents and my younger sister as they rely upon me. They help me to take the risk to chess my dream. I’m grateful to weDevs and Tareq Hasan, Nizam Uddin, Asif Rahman, Afshana Diya, Mainul Kabir Aion, and my friends Arif, Mayeen, Shahriar, Mazhar, and so on. They all have played a significant role in helping me become Gtarafdar, a WordPress enthusiast. Also, thanks to the HeroPress team for reaching me and encouraging me to share my story here.

\n

I’m still learning about WordPress and have to go further. If you want to connect with me, you can follow me on Twitter: @Gtarafdarr. Let’s contribute to WordPress and hold the glory of the supreme power of an open-source platform.

\n

The post How WordPress Has Changed My Life – Gtarafdar appeared first on HeroPress.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 14 Jul 2021 06:42:10 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"Gobinda Tarafdar\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}}}}}}}}}}}}s:4:\"type\";i:128;s:7:\"headers\";O:42:\"Requests_Utility_CaseInsensitiveDictionary\":1:{s:7:\"\0*\0data\";a:8:{s:6:\"server\";s:5:\"nginx\";s:4:\"date\";s:29:\"Sun, 08 Aug 2021 06:47:24 GMT\";s:12:\"content-type\";s:8:\"text/xml\";s:4:\"vary\";s:15:\"Accept-Encoding\";s:13:\"last-modified\";s:29:\"Sun, 08 Aug 2021 06:30:09 GMT\";s:15:\"x-frame-options\";s:10:\"SAMEORIGIN\";s:4:\"x-nc\";s:9:\"HIT ord 1\";s:16:\"content-encoding\";s:2:\"br\";}}s:5:\"build\";s:14:\"20201016172007\";}','no'),(136,'_transient_timeout_feed_mod_d117b5738fbd35bd8c0391cda1f2b5d9','1628448445','no'),(137,'_transient_feed_mod_d117b5738fbd35bd8c0391cda1f2b5d9','1628405245','no'),(138,'_transient_timeout_dash_v2_88ae138922fe95674369b1cb3d215a2b','1628448445','no'),(139,'_transient_dash_v2_88ae138922fe95674369b1cb3d215a2b','','no'),(140,'theme_mods_twentytwentyone','a:1:{s:18:\"custom_css_post_id\";i:-1;}','yes'),(141,'_site_transient_timeout_wp_remote_block_patterns_77eda09a6b697cf3b9a062612122d2a4','1628409524','no'),(142,'_site_transient_wp_remote_block_patterns_77eda09a6b697cf3b9a062612122d2a4','a:13:{i:0;O:8:\"stdClass\":7:{s:2:\"id\";i:184;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:7:\"Heading\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:290:\"\n

We’re a studio in Berlin with an international practice in architecture, urban planning and interior design. We believe in sharing knowledge and promoting dialogue to increase the creative potential of collaboration.

\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":5:{s:10:\"spay_email\";s:0:\"\";s:16:\"wpop_description\";s:12:\"Heading text\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:1:{i:0;s:12:\"core/heading\";}s:11:\"wpop_locale\";s:5:\"en_US\";}s:14:\"category_slugs\";a:1:{i:0;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:402:\"\n

We\'re a studio in Berlin with an international practice in architecture, urban planning and interior design. We believe in sharing knowledge and promoting dialogue to increase the creative potential of collaboration.

\n\";}i:1;O:8:\"stdClass\":7:{s:2:\"id\";i:185;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:35:\"Large header with left-aligned text\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1019:\"\n
\"\"
\n

Forest.

\n\n\n\n
\n
\n
\n\n\n\n

Even a child knows how valuable the forest is. The fresh, breathtaking smell of trees. Echoing birds flying above that dense magnitude. A stable climate, a sustainable diverse life and a source of culture. Yet, forests and other ecosystems hang in the balance, threatened to become croplands, pasture, and plantations.

\n
\n\n\n\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":5:{s:10:\"spay_email\";s:0:\"\";s:16:\"wpop_description\";s:29:\"Cover image with quote on top\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"header\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:1616:\"\n
\"\"
\n

Forest.

\n\n\n\n
\n
\n
\n\n\n\n

Even a child knows how valuable the forest is. The fresh, breathtaking smell of trees. Echoing birds flying above that dense magnitude. A stable climate, a sustainable diverse life and a source of culture. Yet, forests and other ecosystems hang in the balance, threatened to become croplands, pasture, and plantations.

\n
\n\n\n\n
\n
\n
\n\";}i:2;O:8:\"stdClass\":7:{s:2:\"id\";i:186;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:35:\"Large header with text and a button\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1055:\"\n
\n

Overseas:
1500 — 1960

\n\n\n\n
\n
\n

An exhibition about the different representations of the ocean throughout time, between the sixteenth and the twentieth century. Taking place in our Open Room in Floor 2.

\n\n\n\n
\n\n
\n
\n\n\n\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":5:{s:10:\"spay_email\";s:0:\"\";s:16:\"wpop_description\";s:62:\"Large header with background image and text and button on top.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"header\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:1871:\"\n
\n

Overseas:
1500 — 1960

\n\n\n\n
\n
\n

An exhibition about the different representations of the ocean throughout time, between the sixteenth and the twentieth century. Taking place in our Open Room in Floor 2.

\n\n\n\n
\n\n
\n
\n\n\n\n
\n
\n
\n\";}i:3;O:8:\"stdClass\":7:{s:2:\"id\";i:196;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:41:\"Media and text in a full height container\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1194:\"\n
\n
\"Close-up
\n

What’s the problem?

\n\n\n\n

Trees are more important today than ever before. More than 10,000 products are reportedly made from trees. Through chemistry, the humble woodpile is yielding chemicals, plastics and fabrics that were beyond comprehension when an axe first felled a Texas tree.

\n\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":5:{s:10:\"spay_email\";s:0:\"\";s:16:\"wpop_description\";s:77:\"Media and text block with image to the left and text and button to the right.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"header\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:1864:\"\n
\n
\"Close-up
\n

What\'s the problem?

\n\n\n\n

Trees are more important today than ever before. More than 10,000 products are reportedly made from trees. Through chemistry, the humble woodpile is yielding chemicals, plastics and fabrics that were beyond comprehension when an axe first felled a Texas tree.

\n\n\n\n\n
\n
\n\";}i:4;O:8:\"stdClass\":7:{s:2:\"id\";i:192;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:37:\"Media and text with image on the left\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:520:\"\n
\"Close-up,
\n

Open Spaces

\n\n\n\n

See case study ↗

\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":5:{s:10:\"spay_email\";s:0:\"\";s:16:\"wpop_description\";s:66:\"Media and text block with image to the left and text to the right.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"header\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:827:\"\n
\"Close-up,
\n

Open Spaces

\n\n\n\n

See case study ↗

\n
\n\";}i:5;O:8:\"stdClass\":7:{s:2:\"id\";i:195;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:38:\"Media and text with image on the right\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:685:\"\n
\"A
\n

Shore with Blue Sea

\n\n\n\n

Eleanor Harris (American, 1901-1942)

\n
\n\n\n\n

\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":5:{s:10:\"spay_email\";s:0:\"\";s:16:\"wpop_description\";s:66:\"Media and text block with image to the right and text to the left.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"header\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:1138:\"\n
\"A
\n

Shore with Blue Sea

\n\n\n\n

Eleanor Harris (American, 1901-1942)

\n
\n\n\n\n

\n\";}i:6;O:8:\"stdClass\":7:{s:2:\"id\";i:27;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:5:\"Quote\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:656:\"\n
\n\n\n\n
\"A
\n\n\n\n

“Contributing makes me feel like I’m being useful to the planet.”

— Anna Wong, Volunteer
\n\n\n\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":5:{s:10:\"spay_email\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:10:\"core/quote\";}s:11:\"wpop_locale\";s:5:\"en_US\";}s:14:\"category_slugs\";a:1:{i:0;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:1012:\"\n
\n\n\n\n
\"A
\n\n\n\n

\"Contributing makes me feel like I\'m being useful to the planet.\"

— Anna Wong, Volunteer
\n\n\n\n
\n\";}i:7;O:8:\"stdClass\":7:{s:2:\"id\";i:200;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:21:\"Three columns of text\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:801:\"\n
\n
\n

Virtual Tour ↗

\n\n\n\n

Get a virtual tour of the museum. Ideal for schools and events.

\n
\n\n\n\n
\n

Current Shows ↗

\n\n\n\n

Stay updated and see our current exhibitions here.

\n
\n\n\n\n
\n

Useful Info ↗

\n\n\n\n

Get to know our opening times, ticket prices and discounts.

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":5:{s:10:\"spay_email\";s:0:\"\";s:16:\"wpop_description\";s:22:\"Three columns of text.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";}s:14:\"category_slugs\";a:2:{i:0;s:7:\"columns\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:1496:\"\n
\n
\n

Virtual Tour ↗

\n\n\n\n

Get a virtual tour of the museum. Ideal for schools and events.

\n
\n\n\n\n
\n

Current Shows ↗

\n\n\n\n

Stay updated and see our current exhibitions here.

\n
\n\n\n\n
\n

Useful Info ↗

\n\n\n\n

Get to know our opening times, ticket prices and discounts.

\n
\n
\n\";}i:8;O:8:\"stdClass\":7:{s:2:\"id\";i:199;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:34:\"Three columns with images and text\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2619:\"\n
\n
\n
\n
\n\n\n\n
ECOSYSTEM
\n\n\n\n

Positive growth.

\n\n\n\n
\n
\n
\n\n\n\n
\n
\n

Nature, in the common sense, refers to essences unchanged by man; space, the air, the river, the leaf. Art is applied to the mixture of his will with the same things, as in a house, a canal, a statue, a picture. But his operations taken together are so insignificant, a little chipping, baking, patching, and washing, that in an impression so grand as that of the world on the human mind, they do not vary the result.

\n
\n\n\n\n
\n
\n\n\n\n
\"The
\n
\n\n\n\n
\n
\"Wind
\n
\n
\n\n\n\n
\n
\n
\"The
\n
\n\n\n\n
\n

Undoubtedly we have no questions to ask which are unanswerable. We must trust the perfection of the creation so far, as to believe that whatever curiosity the order of things has awakened in our minds, the order of things can satisfy. Every man’s condition is a solution in hieroglyphic to those inquiries he would put.

\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":5:{s:10:\"spay_email\";s:0:\"\";s:16:\"wpop_description\";s:77:\"Three columns with images and text, with vertical spacing for an offset look.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";}s:14:\"category_slugs\";a:1:{i:0;s:7:\"columns\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3980:\"\n
\n
\n
\n
\n\n\n\n
ECOSYSTEM
\n\n\n\n

Positive growth.

\n\n\n\n
\n
\n
\n\n\n\n
\n
\n

Nature, in the common sense, refers to essences unchanged by man; space, the air, the river, the leaf. Art is applied to the mixture of his will with the same things, as in a house, a canal, a statue, a picture. But his operations taken together are so insignificant, a little chipping, baking, patching, and washing, that in an impression so grand as that of the world on the human mind, they do not vary the result.

\n
\n\n\n\n
\n
\n\n\n\n
\"The
\n
\n\n\n\n
\n
\"Wind
\n
\n
\n\n\n\n
\n
\n
\"The
\n
\n\n\n\n
\n

Undoubtedly we have no questions to ask which are unanswerable. We must trust the perfection of the creation so far, as to believe that whatever curiosity the order of things has awakened in our minds, the order of things can satisfy. Every man\'s condition is a solution in hieroglyphic to those inquiries he would put.

\n
\n
\n
\n\";}i:9;O:8:\"stdClass\":7:{s:2:\"id\";i:201;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:32:\"Three columns with offset images\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1077:\"\n
\n
\n
\"Close-up,
\n
\n\n\n\n
\n
\n\n\n\n
\n\n\n\n
\"Close-up,
\n
\n\n\n\n
\n
\"Close-up
\n\n\n\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":5:{s:10:\"spay_email\";s:0:\"\";s:16:\"wpop_description\";s:33:\"Three columns with offset images.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";}s:14:\"category_slugs\";a:2:{i:0;s:7:\"gallery\";i:1;s:6:\"images\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:1753:\"\n
\n
\n
\"Close-up,
\n
\n\n\n\n
\n
\n\n\n\n
\n\n\n\n
\"Close-up,
\n
\n\n\n\n
\n
\"Close-up
\n\n\n\n
\n
\n
\n\";}i:10;O:8:\"stdClass\":7:{s:2:\"id\";i:29;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:29:\"Two columns of text and title\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1337:\"\n

The voyage had begun, and had begun happily with a soft blue sky, and a calm sea.

\n\n\n\n
\n
\n

They followed her on to the deck. All the smoke and the houses had disappeared, and the ship was out in a wide space of sea very fresh and clear though pale in the early light. They had left London sitting on its mud. A very thin line of shadow tapered on the horizon, scarcely thick enough to stand the burden of Paris, which nevertheless rested upon it. They were free of roads, free of mankind, and the same exhilaration at their freedom ran through them all.

\n
\n\n\n\n
\n

The ship was making her way steadily through small waves which slapped her and then fizzled like effervescing water, leaving a little border of bubbles and foam on either side. The colourless October sky above was thinly clouded as if by the trail of wood-fire smoke, and the air was wonderfully salt and brisk. Indeed it was too cold to stand still. Mrs. Ambrose drew her arm within her husband’s, and as they moved off it could be seen from the way in which her sloping cheek turned up to his that she had something private to communicate.

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":5:{s:10:\"spay_email\";s:0:\"\";s:16:\"wpop_description\";s:47:\"Two columns of text preceded by a long heading.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";}s:14:\"category_slugs\";a:2:{i:0;s:7:\"columns\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:1711:\"\n

The voyage had begun, and had begun happily with a soft blue sky, and a calm sea.

\n\n\n\n
\n
\n

They followed her on to the deck. All the smoke and the houses had disappeared, and the ship was out in a wide space of sea very fresh and clear though pale in the early light. They had left London sitting on its mud. A very thin line of shadow tapered on the horizon, scarcely thick enough to stand the burden of Paris, which nevertheless rested upon it. They were free of roads, free of mankind, and the same exhilaration at their freedom ran through them all.

\n
\n\n\n\n
\n

The ship was making her way steadily through small waves which slapped her and then fizzled like effervescing water, leaving a little border of bubbles and foam on either side. The colourless October sky above was thinly clouded as if by the trail of wood-fire smoke, and the air was wonderfully salt and brisk. Indeed it was too cold to stand still. Mrs. Ambrose drew her arm within her husband\'s, and as they moved off it could be seen from the way in which her sloping cheek turned up to his that she had something private to communicate.

\n
\n
\n\";}i:11;O:8:\"stdClass\":7:{s:2:\"id\";i:197;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:39:\"Two columns of text with offset heading\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1888:\"\n
\n
\n\n\n\n
\n
\n

Oceanic Inspiration

\n
\n\n\n\n
\n
\n
\n
\n\n\n\n
\n
\n\n\n\n
\n

Winding veils round their heads, the women walked on deck. They were now moving steadily down the river, passing the dark shapes of ships at anchor, and London was a swarm of lights with a pale yellow canopy drooping above it. There were the lights of the great theatres, the lights of the long streets, lights that indicated huge squares of domestic comfort, lights that hung high in air.

\n
\n\n\n\n
\n

No darkness would ever settle upon those lamps, as no darkness had settled upon them for hundreds of years. It seemed dreadful that the town should blaze for ever in the same spot; dreadful at least to people going away to adventure upon the sea, and beholding it as a circumscribed mound, eternally burnt, eternally scarred. From the deck of the ship the great city appeared a crouched and cowardly figure, a sedentary miser.

\n
\n
\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":5:{s:10:\"spay_email\";s:0:\"\";s:16:\"wpop_description\";s:43:\"Two columns of text with an offset heading.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";}s:14:\"category_slugs\";a:2:{i:0;s:7:\"columns\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2837:\"\n
\n
\n\n\n\n
\n
\n

Oceanic Inspiration

\n
\n\n\n\n
\n
\n
\n
\n\n\n\n
\n
\n\n\n\n
\n

Winding veils round their heads, the women walked on deck. They were now moving steadily down the river, passing the dark shapes of ships at anchor, and London was a swarm of lights with a pale yellow canopy drooping above it. There were the lights of the great theatres, the lights of the long streets, lights that indicated huge squares of domestic comfort, lights that hung high in air.

\n
\n\n\n\n
\n

No darkness would ever settle upon those lamps, as no darkness had settled upon them for hundreds of years. It seemed dreadful that the town should blaze for ever in the same spot; dreadful at least to people going away to adventure upon the sea, and beholding it as a circumscribed mound, eternally burnt, eternally scarred. From the deck of the ship the great city appeared a crouched and cowardly figure, a sedentary miser.

\n
\n
\n\n\n\n
\n
\n\";}i:12;O:8:\"stdClass\":7:{s:2:\"id\";i:19;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:23:\"Two images side by side\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:647:\"\n\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":5:{s:10:\"spay_email\";s:0:\"\";s:16:\"wpop_description\";s:41:\"An image gallery with two example images.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";}s:14:\"category_slugs\";a:1:{i:0;s:7:\"gallery\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:737:\"\n\n\";}}','no'); -/*!40000 ALTER TABLE `wp_options` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_postmeta` --- - -DROP TABLE IF EXISTS `wp_postmeta`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_postmeta` ( - `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `post_id` bigint(20) unsigned NOT NULL DEFAULT 0, - `meta_key` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `meta_value` longtext COLLATE utf8mb4_unicode_ci DEFAULT NULL, - PRIMARY KEY (`meta_id`), - KEY `post_id` (`post_id`), - KEY `meta_key` (`meta_key`(191)) -) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_postmeta` --- - -LOCK TABLES `wp_postmeta` WRITE; -/*!40000 ALTER TABLE `wp_postmeta` DISABLE KEYS */; -INSERT INTO `wp_postmeta` VALUES (1,2,'_wp_page_template','default'),(2,3,'_wp_page_template','default'),(3,5,'_edit_lock','1628405811:1'),(4,5,'_pingme','1'),(5,5,'_encloseme','1'); -/*!40000 ALTER TABLE `wp_postmeta` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_posts` --- - -DROP TABLE IF EXISTS `wp_posts`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_posts` ( - `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `post_author` bigint(20) unsigned NOT NULL DEFAULT 0, - `post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `post_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `post_content` longtext COLLATE utf8mb4_unicode_ci NOT NULL, - `post_title` text COLLATE utf8mb4_unicode_ci NOT NULL, - `post_excerpt` text COLLATE utf8mb4_unicode_ci NOT NULL, - `post_status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'publish', - `comment_status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'open', - `ping_status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'open', - `post_password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `post_name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `to_ping` text COLLATE utf8mb4_unicode_ci NOT NULL, - `pinged` text COLLATE utf8mb4_unicode_ci NOT NULL, - `post_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `post_modified_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `post_content_filtered` longtext COLLATE utf8mb4_unicode_ci NOT NULL, - `post_parent` bigint(20) unsigned NOT NULL DEFAULT 0, - `guid` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `menu_order` int(11) NOT NULL DEFAULT 0, - `post_type` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'post', - `post_mime_type` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `comment_count` bigint(20) NOT NULL DEFAULT 0, - PRIMARY KEY (`ID`), - KEY `post_name` (`post_name`(191)), - KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`), - KEY `post_parent` (`post_parent`), - KEY `post_author` (`post_author`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_posts` --- - -LOCK TABLES `wp_posts` WRITE; -/*!40000 ALTER TABLE `wp_posts` DISABLE KEYS */; -INSERT INTO `wp_posts` VALUES (1,1,'2021-08-08 06:46:47','2021-08-08 06:46:47','\n

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!

\n','Hello world!','','publish','open','open','','hello-world','','','2021-08-08 06:46:47','2021-08-08 06:46:47','',0,'https://192.168.49.2:5050/?p=1',0,'post','',1),(2,1,'2021-08-08 06:46:47','2021-08-08 06:46:47','\n

This is an example page. It\'s different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this:

\n\n\n\n

Hi there! I\'m a bike messenger by day, aspiring actor by night, and this is my website. I live in Los Angeles, have a great dog named Jack, and I like piña coladas. (And gettin\' caught in the rain.)

\n\n\n\n

...or something like this:

\n\n\n\n

The XYZ Doohickey Company was founded in 1971, and has been providing quality doohickeys to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community.

\n\n\n\n

As a new WordPress user, you should go to your dashboard to delete this page and create new pages for your content. Have fun!

\n','Sample Page','','publish','closed','open','','sample-page','','','2021-08-08 06:46:47','2021-08-08 06:46:47','',0,'https://192.168.49.2:5050/?page_id=2',0,'page','',0),(3,1,'2021-08-08 06:46:47','2021-08-08 06:46:47','

Who we are

Suggested text: Our website address is: https://192.168.49.2:5050.

Comments

Suggested text: When visitors leave comments on the site we collect the data shown in the comments form, and also the visitor’s IP address and browser user agent string to help spam detection.

An anonymized string created from your email address (also called a hash) may be provided to the Gravatar service to see if you are using it. The Gravatar service privacy policy is available here: https://automattic.com/privacy/. After approval of your comment, your profile picture is visible to the public in the context of your comment.

Media

Suggested text: If you upload images to the website, you should avoid uploading images with embedded location data (EXIF GPS) included. Visitors to the website can download and extract any location data from images on the website.

Cookies

Suggested text: If you leave a comment on our site you may opt-in to saving your name, email address and website in cookies. These are for your convenience so that you do not have to fill in your details again when you leave another comment. These cookies will last for one year.

If you visit our login page, we will set a temporary cookie to determine if your browser accepts cookies. This cookie contains no personal data and is discarded when you close your browser.

When you log in, we will also set up several cookies to save your login information and your screen display choices. Login cookies last for two days, and screen options cookies last for a year. If you select "Remember Me", your login will persist for two weeks. If you log out of your account, the login cookies will be removed.

If you edit or publish an article, an additional cookie will be saved in your browser. This cookie includes no personal data and simply indicates the post ID of the article you just edited. It expires after 1 day.

Embedded content from other websites

Suggested text: Articles on this site may include embedded content (e.g. videos, images, articles, etc.). Embedded content from other websites behaves in the exact same way as if the visitor has visited the other website.

These websites may collect data about you, use cookies, embed additional third-party tracking, and monitor your interaction with that embedded content, including tracking your interaction with the embedded content if you have an account and are logged in to that website.

Who we share your data with

Suggested text: If you request a password reset, your IP address will be included in the reset email.

How long we retain your data

Suggested text: If you leave a comment, the comment and its metadata are retained indefinitely. This is so we can recognize and approve any follow-up comments automatically instead of holding them in a moderation queue.

For users that register on our website (if any), we also store the personal information they provide in their user profile. All users can see, edit, or delete their personal information at any time (except they cannot change their username). Website administrators can also see and edit that information.

What rights you have over your data

Suggested text: If you have an account on this site, or have left comments, you can request to receive an exported file of the personal data we hold about you, including any data you have provided to us. You can also request that we erase any personal data we hold about you. This does not include any data we are obliged to keep for administrative, legal, or security purposes.

Where we send your data

Suggested text: Visitor comments may be checked through an automated spam detection service.

','Privacy Policy','','draft','closed','open','','privacy-policy','','','2021-08-08 06:46:47','2021-08-08 06:46:47','',0,'https://192.168.49.2:5050/?page_id=3',0,'page','',0),(4,1,'2021-08-08 06:47:22','0000-00-00 00:00:00','','Auto Draft','','auto-draft','open','open','','','','','2021-08-08 06:47:22','0000-00-00 00:00:00','',0,'https://192.168.49.2:5050/?p=4',0,'post','',0),(5,1,'2021-08-08 06:59:01','2021-08-08 06:59:01','\n

Lorum Ipsum...

\n','Hello 42','','publish','open','open','','hello-42','','','2021-08-08 06:59:01','2021-08-08 06:59:01','',0,'https://192.168.49.2:5050/?p=5',0,'post','',0),(6,1,'2021-08-08 06:59:01','2021-08-08 06:59:01','\n

Lorum Ipsum...

\n','Hello 42','','inherit','closed','closed','','5-revision-v1','','','2021-08-08 06:59:01','2021-08-08 06:59:01','',5,'https://192.168.49.2:5050/?p=6',0,'revision','',0); -/*!40000 ALTER TABLE `wp_posts` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_term_relationships` --- - -DROP TABLE IF EXISTS `wp_term_relationships`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_term_relationships` ( - `object_id` bigint(20) unsigned NOT NULL DEFAULT 0, - `term_taxonomy_id` bigint(20) unsigned NOT NULL DEFAULT 0, - `term_order` int(11) NOT NULL DEFAULT 0, - PRIMARY KEY (`object_id`,`term_taxonomy_id`), - KEY `term_taxonomy_id` (`term_taxonomy_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_term_relationships` --- - -LOCK TABLES `wp_term_relationships` WRITE; -/*!40000 ALTER TABLE `wp_term_relationships` DISABLE KEYS */; -INSERT INTO `wp_term_relationships` VALUES (1,1,0),(5,1,0); -/*!40000 ALTER TABLE `wp_term_relationships` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_term_taxonomy` --- - -DROP TABLE IF EXISTS `wp_term_taxonomy`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_term_taxonomy` ( - `term_taxonomy_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `term_id` bigint(20) unsigned NOT NULL DEFAULT 0, - `taxonomy` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `description` longtext COLLATE utf8mb4_unicode_ci NOT NULL, - `parent` bigint(20) unsigned NOT NULL DEFAULT 0, - `count` bigint(20) NOT NULL DEFAULT 0, - PRIMARY KEY (`term_taxonomy_id`), - UNIQUE KEY `term_id_taxonomy` (`term_id`,`taxonomy`), - KEY `taxonomy` (`taxonomy`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_term_taxonomy` --- - -LOCK TABLES `wp_term_taxonomy` WRITE; -/*!40000 ALTER TABLE `wp_term_taxonomy` DISABLE KEYS */; -INSERT INTO `wp_term_taxonomy` VALUES (1,1,'category','',0,2); -/*!40000 ALTER TABLE `wp_term_taxonomy` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_termmeta` --- - -DROP TABLE IF EXISTS `wp_termmeta`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_termmeta` ( - `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `term_id` bigint(20) unsigned NOT NULL DEFAULT 0, - `meta_key` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `meta_value` longtext COLLATE utf8mb4_unicode_ci DEFAULT NULL, - PRIMARY KEY (`meta_id`), - KEY `term_id` (`term_id`), - KEY `meta_key` (`meta_key`(191)) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_termmeta` --- - -LOCK TABLES `wp_termmeta` WRITE; -/*!40000 ALTER TABLE `wp_termmeta` DISABLE KEYS */; -/*!40000 ALTER TABLE `wp_termmeta` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_terms` --- - -DROP TABLE IF EXISTS `wp_terms`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_terms` ( - `term_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `slug` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `term_group` bigint(10) NOT NULL DEFAULT 0, - PRIMARY KEY (`term_id`), - KEY `slug` (`slug`(191)), - KEY `name` (`name`(191)) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_terms` --- - -LOCK TABLES `wp_terms` WRITE; -/*!40000 ALTER TABLE `wp_terms` DISABLE KEYS */; -INSERT INTO `wp_terms` VALUES (1,'Uncategorized','uncategorized',0); -/*!40000 ALTER TABLE `wp_terms` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_usermeta` --- - -DROP TABLE IF EXISTS `wp_usermeta`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_usermeta` ( - `umeta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `user_id` bigint(20) unsigned NOT NULL DEFAULT 0, - `meta_key` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, - `meta_value` longtext COLLATE utf8mb4_unicode_ci DEFAULT NULL, - PRIMARY KEY (`umeta_id`), - KEY `user_id` (`user_id`), - KEY `meta_key` (`meta_key`(191)) -) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_usermeta` --- - -LOCK TABLES `wp_usermeta` WRITE; -/*!40000 ALTER TABLE `wp_usermeta` DISABLE KEYS */; -INSERT INTO `wp_usermeta` VALUES (1,1,'nickname','admin'),(2,1,'first_name',''),(3,1,'last_name',''),(4,1,'description',''),(5,1,'rich_editing','true'),(6,1,'syntax_highlighting','true'),(7,1,'comment_shortcuts','false'),(8,1,'admin_color','fresh'),(9,1,'use_ssl','0'),(10,1,'show_admin_bar_front','true'),(11,1,'locale',''),(12,1,'wp_capabilities','a:1:{s:13:\"administrator\";b:1;}'),(13,1,'wp_user_level','10'),(14,1,'dismissed_wp_pointers',''),(15,1,'show_welcome_panel','1'),(16,1,'session_tokens','a:1:{s:64:\"6887e49e300968ee9ba0e3b27d62373e7c922f7f707c97066cd1f05707ee9625\";a:4:{s:10:\"expiration\";i:1628578040;s:2:\"ip\";s:10:\"172.17.0.1\";s:2:\"ua\";s:68:\"Mozilla/5.0 (X11; Linux x86_64; rv:90.0) Gecko/20100101 Firefox/90.0\";s:5:\"login\";i:1628405240;}}'),(17,1,'wp_dashboard_quick_press_last_post_id','4'),(18,1,'community-events-location','a:1:{s:2:\"ip\";s:10:\"172.17.0.0\";}'),(19,2,'nickname','editor'),(20,2,'first_name','editor'),(21,2,'last_name','editor'),(22,2,'description',''),(23,2,'rich_editing','true'),(24,2,'syntax_highlighting','true'),(25,2,'comment_shortcuts','false'),(26,2,'admin_color','fresh'),(27,2,'use_ssl','0'),(28,2,'show_admin_bar_front','true'),(29,2,'locale',''),(30,2,'wp_capabilities','a:1:{s:6:\"editor\";b:1;}'),(31,2,'wp_user_level','7'),(32,2,'dismissed_wp_pointers',''),(33,3,'nickname','subscriber'),(34,3,'first_name','subscriber'),(35,3,'last_name','subscriber'),(36,3,'description',''),(37,3,'rich_editing','true'),(38,3,'syntax_highlighting','true'),(39,3,'comment_shortcuts','false'),(40,3,'admin_color','fresh'),(41,3,'use_ssl','0'),(42,3,'show_admin_bar_front','true'),(43,3,'locale',''),(44,3,'wp_capabilities','a:1:{s:10:\"subscriber\";b:1;}'),(45,3,'wp_user_level','0'),(46,3,'dismissed_wp_pointers',''); -/*!40000 ALTER TABLE `wp_usermeta` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_users` --- - -DROP TABLE IF EXISTS `wp_users`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_users` ( - `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `user_login` varchar(60) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `user_pass` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `user_nicename` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `user_email` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `user_url` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `user_registered` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `user_activation_key` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - `user_status` int(11) NOT NULL DEFAULT 0, - `display_name` varchar(250) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', - PRIMARY KEY (`ID`), - KEY `user_login_key` (`user_login`), - KEY `user_nicename` (`user_nicename`), - KEY `user_email` (`user_email`) -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_users` --- - -LOCK TABLES `wp_users` WRITE; -/*!40000 ALTER TABLE `wp_users` DISABLE KEYS */; -INSERT INTO `wp_users` VALUES (1,'admin','$P$B.bR0xchIb6gnbvs/pm53sxDl0Py0A/','admin','sjbfd@idbfbdf.sd','http://192.168.49.2:5050','2021-08-08 06:46:47','',0,'admin'),(2,'editor','$P$BNFzdR1nFPNgzk2n168czbD2hfZ4z20','editor','editor@site.com','','2021-08-08 06:57:41','',0,'editor editor'),(3,'subscriber','$P$Bp3YhqIzUO6rvFrJFGX2yDfXWmJkR90','subscriber','subscriber@site.com','','2021-08-08 06:58:20','1628405900:$P$BhE304I37XJuE62WqPFSbXM17H.xJP.',0,'subscriber subscriber'); -/*!40000 ALTER TABLE `wp_users` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Current Database: `mysql` --- - -USE `mysql`; - --- --- Final view structure for view `user` --- - -/*!50001 DROP TABLE IF EXISTS `user`*/; -/*!50001 DROP VIEW IF EXISTS `user`*/; -/*!50001 SET @saved_cs_client = @@character_set_client */; -/*!50001 SET @saved_cs_results = @@character_set_results */; -/*!50001 SET @saved_col_connection = @@collation_connection */; -/*!50001 SET character_set_client = utf8mb4 */; -/*!50001 SET character_set_results = utf8mb4 */; -/*!50001 SET collation_connection = utf8mb4_general_ci */; -/*!50001 CREATE ALGORITHM=UNDEFINED */ -/*!50013 DEFINER=`mariadb.sys`@`localhost` SQL SECURITY DEFINER */ -/*!50001 VIEW `user` AS select `global_priv`.`Host` AS `Host`,`global_priv`.`User` AS `User`,if(json_value(`global_priv`.`Priv`,'$.plugin') in ('mysql_native_password','mysql_old_password'),ifnull(json_value(`global_priv`.`Priv`,'$.authentication_string'),''),'') AS `Password`,if(json_value(`global_priv`.`Priv`,'$.access') & 1,'Y','N') AS `Select_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 2,'Y','N') AS `Insert_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 4,'Y','N') AS `Update_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 8,'Y','N') AS `Delete_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 16,'Y','N') AS `Create_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 32,'Y','N') AS `Drop_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 64,'Y','N') AS `Reload_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 128,'Y','N') AS `Shutdown_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 256,'Y','N') AS `Process_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 512,'Y','N') AS `File_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 1024,'Y','N') AS `Grant_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 2048,'Y','N') AS `References_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 4096,'Y','N') AS `Index_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 8192,'Y','N') AS `Alter_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 16384,'Y','N') AS `Show_db_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 32768,'Y','N') AS `Super_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 65536,'Y','N') AS `Create_tmp_table_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 131072,'Y','N') AS `Lock_tables_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 262144,'Y','N') AS `Execute_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 524288,'Y','N') AS `Repl_slave_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 1048576,'Y','N') AS `Repl_client_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 2097152,'Y','N') AS `Create_view_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 4194304,'Y','N') AS `Show_view_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 8388608,'Y','N') AS `Create_routine_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 16777216,'Y','N') AS `Alter_routine_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 33554432,'Y','N') AS `Create_user_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 67108864,'Y','N') AS `Event_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 134217728,'Y','N') AS `Trigger_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 268435456,'Y','N') AS `Create_tablespace_priv`,if(json_value(`global_priv`.`Priv`,'$.access') & 536870912,'Y','N') AS `Delete_history_priv`,elt(ifnull(json_value(`global_priv`.`Priv`,'$.ssl_type'),0) + 1,'','ANY','X509','SPECIFIED') AS `ssl_type`,ifnull(json_value(`global_priv`.`Priv`,'$.ssl_cipher'),'') AS `ssl_cipher`,ifnull(json_value(`global_priv`.`Priv`,'$.x509_issuer'),'') AS `x509_issuer`,ifnull(json_value(`global_priv`.`Priv`,'$.x509_subject'),'') AS `x509_subject`,cast(ifnull(json_value(`global_priv`.`Priv`,'$.max_questions'),0) as unsigned) AS `max_questions`,cast(ifnull(json_value(`global_priv`.`Priv`,'$.max_updates'),0) as unsigned) AS `max_updates`,cast(ifnull(json_value(`global_priv`.`Priv`,'$.max_connections'),0) as unsigned) AS `max_connections`,cast(ifnull(json_value(`global_priv`.`Priv`,'$.max_user_connections'),0) as signed) AS `max_user_connections`,ifnull(json_value(`global_priv`.`Priv`,'$.plugin'),'') AS `plugin`,ifnull(json_value(`global_priv`.`Priv`,'$.authentication_string'),'') AS `authentication_string`,if(ifnull(json_value(`global_priv`.`Priv`,'$.password_last_changed'),1) = 0,'Y','N') AS `password_expired`,elt(ifnull(json_value(`global_priv`.`Priv`,'$.is_role'),0) + 1,'N','Y') AS `is_role`,ifnull(json_value(`global_priv`.`Priv`,'$.default_role'),'') AS `default_role`,cast(ifnull(json_value(`global_priv`.`Priv`,'$.max_statement_time'),0.0) as decimal(12,6)) AS `max_statement_time` from `global_priv` */; -/*!50001 SET character_set_client = @saved_cs_client */; -/*!50001 SET character_set_results = @saved_cs_results */; -/*!50001 SET collation_connection = @saved_col_connection */; - --- --- Current Database: `phpmyadmin` --- - -USE `phpmyadmin`; - --- --- Current Database: `test` --- - -USE `test`; - --- --- Current Database: `wordpress` --- - -USE `wordpress`; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2021-08-09 8:59:01 diff --git a/srcs/requirements/mariadb/srcs/wordpress.sql b/srcs/requirements/mariadb/srcs/wordpress.sql deleted file mode 100644 index 33829d0..0000000 --- a/srcs/requirements/mariadb/srcs/wordpress.sql +++ /dev/null @@ -1,610 +0,0 @@ --- MariaDB dump 10.19 Distrib 10.11.4-MariaDB, for Linux (x86_64) --- --- Host: localhost Database: wordpress --- ------------------------------------------------------ --- Server version 10.11.4-MariaDB - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8mb4 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `wp_commentmeta` --- - -DROP TABLE IF EXISTS `wp_commentmeta`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_commentmeta` ( - `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `comment_id` bigint(20) unsigned NOT NULL DEFAULT 0, - `meta_key` varchar(255) DEFAULT NULL, - `meta_value` longtext DEFAULT NULL, - PRIMARY KEY (`meta_id`), - KEY `comment_id` (`comment_id`), - KEY `meta_key` (`meta_key`(191)) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_commentmeta` --- - -LOCK TABLES `wp_commentmeta` WRITE; -/*!40000 ALTER TABLE `wp_commentmeta` DISABLE KEYS */; -/*!40000 ALTER TABLE `wp_commentmeta` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_comments` --- - -DROP TABLE IF EXISTS `wp_comments`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_comments` ( - `comment_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `comment_post_ID` bigint(20) unsigned NOT NULL DEFAULT 0, - `comment_author` tinytext NOT NULL, - `comment_author_email` varchar(100) NOT NULL DEFAULT '', - `comment_author_url` varchar(200) NOT NULL DEFAULT '', - `comment_author_IP` varchar(100) NOT NULL DEFAULT '', - `comment_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `comment_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `comment_content` text NOT NULL, - `comment_karma` int(11) NOT NULL DEFAULT 0, - `comment_approved` varchar(20) NOT NULL DEFAULT '1', - `comment_agent` varchar(255) NOT NULL DEFAULT '', - `comment_type` varchar(20) NOT NULL DEFAULT 'comment', - `comment_parent` bigint(20) unsigned NOT NULL DEFAULT 0, - `user_id` bigint(20) unsigned NOT NULL DEFAULT 0, - PRIMARY KEY (`comment_ID`), - KEY `comment_post_ID` (`comment_post_ID`), - KEY `comment_approved_date_gmt` (`comment_approved`,`comment_date_gmt`), - KEY `comment_date_gmt` (`comment_date_gmt`), - KEY `comment_parent` (`comment_parent`), - KEY `comment_author_email` (`comment_author_email`(10)) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_comments` --- - -LOCK TABLES `wp_comments` WRITE; -/*!40000 ALTER TABLE `wp_comments` DISABLE KEYS */; -INSERT INTO `wp_comments` VALUES -(1,1,'A WordPress Commenter','wapuu@wordpress.example','https://wordpress.org/','','2023-08-10 05:51:52','2023-08-10 05:51:52','Hi, this is a comment.\nTo get started with moderating, editing, and deleting comments, please visit the Comments screen in the dashboard.\nCommenter avatars come from Gravatar.',0,'1','','comment',0,0); -/*!40000 ALTER TABLE `wp_comments` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_links` --- - -DROP TABLE IF EXISTS `wp_links`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_links` ( - `link_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `link_url` varchar(255) NOT NULL DEFAULT '', - `link_name` varchar(255) NOT NULL DEFAULT '', - `link_image` varchar(255) NOT NULL DEFAULT '', - `link_target` varchar(25) NOT NULL DEFAULT '', - `link_description` varchar(255) NOT NULL DEFAULT '', - `link_visible` varchar(20) NOT NULL DEFAULT 'Y', - `link_owner` bigint(20) unsigned NOT NULL DEFAULT 1, - `link_rating` int(11) NOT NULL DEFAULT 0, - `link_updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `link_rel` varchar(255) NOT NULL DEFAULT '', - `link_notes` mediumtext NOT NULL, - `link_rss` varchar(255) NOT NULL DEFAULT '', - PRIMARY KEY (`link_id`), - KEY `link_visible` (`link_visible`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_links` --- - -LOCK TABLES `wp_links` WRITE; -/*!40000 ALTER TABLE `wp_links` DISABLE KEYS */; -/*!40000 ALTER TABLE `wp_links` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_options` --- - -DROP TABLE IF EXISTS `wp_options`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_options` ( - `option_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `option_name` varchar(191) NOT NULL DEFAULT '', - `option_value` longtext NOT NULL, - `autoload` varchar(20) NOT NULL DEFAULT 'yes', - PRIMARY KEY (`option_id`), - UNIQUE KEY `option_name` (`option_name`), - KEY `autoload` (`autoload`) -) ENGINE=InnoDB AUTO_INCREMENT=157 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_options` --- - -LOCK TABLES `wp_options` WRITE; -/*!40000 ALTER TABLE `wp_options` DISABLE KEYS */; -INSERT INTO `wp_options` VALUES -(1,'siteurl','https://djonker.42.fr','yes'), -(2,'home','https://djonker.42.fr','yes'), -(3,'blogname','Wordpress','yes'), -(4,'blogdescription','','yes'), -(5,'users_can_register','0','yes'), -(6,'admin_email','djonker@houtworm.email','yes'), -(7,'start_of_week','1','yes'), -(8,'use_balanceTags','0','yes'), -(9,'use_smilies','1','yes'), -(10,'require_name_email','1','yes'), -(11,'comments_notify','1','yes'), -(12,'posts_per_rss','10','yes'), -(13,'rss_use_excerpt','0','yes'), -(14,'mailserver_url','mail.example.com','yes'), -(15,'mailserver_login','login@example.com','yes'), -(16,'mailserver_pass','password','yes'), -(17,'mailserver_port','110','yes'), -(18,'default_category','1','yes'), -(19,'default_comment_status','open','yes'), -(20,'default_ping_status','open','yes'), -(21,'default_pingback_flag','1','yes'), -(22,'posts_per_page','10','yes'), -(23,'date_format','F j, Y','yes'), -(24,'time_format','g:i a','yes'), -(25,'links_updated_date_format','F j, Y g:i a','yes'), -(26,'comment_moderation','0','yes'), -(27,'moderation_notify','1','yes'), -(28,'permalink_structure','','yes'), -(29,'rewrite_rules','','yes'), -(30,'hack_file','0','yes'), -(31,'blog_charset','UTF-8','yes'), -(32,'moderation_keys','','no'), -(33,'active_plugins','a:0:{}','yes'), -(34,'category_base','','yes'), -(35,'ping_sites','http://rpc.pingomatic.com/','yes'), -(36,'comment_max_links','2','yes'), -(37,'gmt_offset','0','yes'), -(38,'default_email_category','1','yes'), -(39,'recently_edited','','no'), -(40,'template','twentytwentythree','yes'), -(41,'stylesheet','twentytwentythree','yes'), -(42,'comment_registration','0','yes'), -(43,'html_type','text/html','yes'), -(44,'use_trackback','0','yes'), -(45,'default_role','subscriber','yes'), -(46,'db_version','55853','yes'), -(47,'uploads_use_yearmonth_folders','1','yes'), -(48,'upload_path','','yes'), -(49,'blog_public','1','yes'), -(50,'default_link_category','2','yes'), -(51,'show_on_front','posts','yes'), -(52,'tag_base','','yes'), -(53,'show_avatars','1','yes'), -(54,'avatar_rating','G','yes'), -(55,'upload_url_path','','yes'), -(56,'thumbnail_size_w','150','yes'), -(57,'thumbnail_size_h','150','yes'), -(58,'thumbnail_crop','1','yes'), -(59,'medium_size_w','300','yes'), -(60,'medium_size_h','300','yes'), -(61,'avatar_default','mystery','yes'), -(62,'large_size_w','1024','yes'), -(63,'large_size_h','1024','yes'), -(64,'image_default_link_type','none','yes'), -(65,'image_default_size','','yes'), -(66,'image_default_align','','yes'), -(67,'close_comments_for_old_posts','0','yes'), -(68,'close_comments_days_old','14','yes'), -(69,'thread_comments','1','yes'), -(70,'thread_comments_depth','5','yes'), -(71,'page_comments','0','yes'), -(72,'comments_per_page','50','yes'), -(73,'default_comments_page','newest','yes'), -(74,'comment_order','asc','yes'), -(75,'sticky_posts','a:0:{}','yes'), -(76,'widget_categories','a:0:{}','yes'), -(77,'widget_text','a:0:{}','yes'), -(78,'widget_rss','a:0:{}','yes'), -(79,'uninstall_plugins','a:0:{}','no'), -(80,'timezone_string','','yes'), -(81,'page_for_posts','0','yes'), -(82,'page_on_front','0','yes'), -(83,'default_post_format','0','yes'), -(84,'link_manager_enabled','0','yes'), -(85,'finished_splitting_shared_terms','1','yes'), -(86,'site_icon','0','yes'), -(87,'medium_large_size_w','768','yes'), -(88,'medium_large_size_h','0','yes'), -(89,'wp_page_for_privacy_policy','3','yes'), -(90,'show_comments_cookies_opt_in','1','yes'), -(91,'admin_email_lifespan','1707198711','yes'), -(92,'disallowed_keys','','no'), -(93,'comment_previously_approved','1','yes'), -(94,'auto_plugin_theme_update_emails','a:0:{}','no'), -(95,'auto_update_core_dev','enabled','yes'), -(96,'auto_update_core_minor','enabled','yes'), -(97,'auto_update_core_major','enabled','yes'), -(98,'wp_force_deactivated_plugins','a:0:{}','yes'), -(99,'initial_db_version','55853','yes'), -(100,'wp_user_roles','a:5:{s:13:\"administrator\";a:2:{s:4:\"name\";s:13:\"Administrator\";s:12:\"capabilities\";a:61:{s:13:\"switch_themes\";b:1;s:11:\"edit_themes\";b:1;s:16:\"activate_plugins\";b:1;s:12:\"edit_plugins\";b:1;s:10:\"edit_users\";b:1;s:10:\"edit_files\";b:1;s:14:\"manage_options\";b:1;s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:6:\"import\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:8:\"level_10\";b:1;s:7:\"level_9\";b:1;s:7:\"level_8\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;s:12:\"delete_users\";b:1;s:12:\"create_users\";b:1;s:17:\"unfiltered_upload\";b:1;s:14:\"edit_dashboard\";b:1;s:14:\"update_plugins\";b:1;s:14:\"delete_plugins\";b:1;s:15:\"install_plugins\";b:1;s:13:\"update_themes\";b:1;s:14:\"install_themes\";b:1;s:11:\"update_core\";b:1;s:10:\"list_users\";b:1;s:12:\"remove_users\";b:1;s:13:\"promote_users\";b:1;s:18:\"edit_theme_options\";b:1;s:13:\"delete_themes\";b:1;s:6:\"export\";b:1;}}s:6:\"editor\";a:2:{s:4:\"name\";s:6:\"Editor\";s:12:\"capabilities\";a:34:{s:17:\"moderate_comments\";b:1;s:17:\"manage_categories\";b:1;s:12:\"manage_links\";b:1;s:12:\"upload_files\";b:1;s:15:\"unfiltered_html\";b:1;s:10:\"edit_posts\";b:1;s:17:\"edit_others_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:10:\"edit_pages\";b:1;s:4:\"read\";b:1;s:7:\"level_7\";b:1;s:7:\"level_6\";b:1;s:7:\"level_5\";b:1;s:7:\"level_4\";b:1;s:7:\"level_3\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:17:\"edit_others_pages\";b:1;s:20:\"edit_published_pages\";b:1;s:13:\"publish_pages\";b:1;s:12:\"delete_pages\";b:1;s:19:\"delete_others_pages\";b:1;s:22:\"delete_published_pages\";b:1;s:12:\"delete_posts\";b:1;s:19:\"delete_others_posts\";b:1;s:22:\"delete_published_posts\";b:1;s:20:\"delete_private_posts\";b:1;s:18:\"edit_private_posts\";b:1;s:18:\"read_private_posts\";b:1;s:20:\"delete_private_pages\";b:1;s:18:\"edit_private_pages\";b:1;s:18:\"read_private_pages\";b:1;}}s:6:\"author\";a:2:{s:4:\"name\";s:6:\"Author\";s:12:\"capabilities\";a:10:{s:12:\"upload_files\";b:1;s:10:\"edit_posts\";b:1;s:20:\"edit_published_posts\";b:1;s:13:\"publish_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_2\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;s:22:\"delete_published_posts\";b:1;}}s:11:\"contributor\";a:2:{s:4:\"name\";s:11:\"Contributor\";s:12:\"capabilities\";a:5:{s:10:\"edit_posts\";b:1;s:4:\"read\";b:1;s:7:\"level_1\";b:1;s:7:\"level_0\";b:1;s:12:\"delete_posts\";b:1;}}s:10:\"subscriber\";a:2:{s:4:\"name\";s:10:\"Subscriber\";s:12:\"capabilities\";a:2:{s:4:\"read\";b:1;s:7:\"level_0\";b:1;}}}','yes'), -(101,'fresh_site','1','yes'), -(102,'user_count','2','no'), -(103,'widget_block','a:6:{i:2;a:1:{s:7:\"content\";s:19:\"\";}i:3;a:1:{s:7:\"content\";s:154:\"

Recent Posts

\";}i:4;a:1:{s:7:\"content\";s:227:\"

Recent Comments

\";}i:5;a:1:{s:7:\"content\";s:146:\"

Archives

\";}i:6;a:1:{s:7:\"content\";s:150:\"

Categories

\";}s:12:\"_multiwidget\";i:1;}','yes'), -(104,'sidebars_widgets','a:4:{s:19:\"wp_inactive_widgets\";a:0:{}s:9:\"sidebar-1\";a:3:{i:0;s:7:\"block-2\";i:1;s:7:\"block-3\";i:2;s:7:\"block-4\";}s:9:\"sidebar-2\";a:2:{i:0;s:7:\"block-5\";i:1;s:7:\"block-6\";}s:13:\"array_version\";i:3;}','yes'), -(105,'cron','a:7:{i:1691650316;a:1:{s:34:\"wp_privacy_delete_old_export_files\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"hourly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:3600;}}}i:1691689916;a:4:{s:18:\"wp_https_detection\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}s:16:\"wp_version_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}s:17:\"wp_update_plugins\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}s:16:\"wp_update_themes\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1691689979;a:1:{s:21:\"wp_update_user_counts\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:10:\"twicedaily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:43200;}}}i:1691733116;a:2:{s:30:\"wp_site_health_scheduled_check\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:6:\"weekly\";s:4:\"args\";a:0:{}s:8:\"interval\";i:604800;}}s:32:\"recovery_mode_clean_expired_keys\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1691733179;a:2:{s:19:\"wp_scheduled_delete\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}s:25:\"delete_expired_transients\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}i:1691733194;a:1:{s:30:\"wp_scheduled_auto_draft_delete\";a:1:{s:32:\"40cd750bba9870f18aada2478b24840a\";a:3:{s:8:\"schedule\";s:5:\"daily\";s:4:\"args\";a:0:{}s:8:\"interval\";i:86400;}}}s:7:\"version\";i:2;}','yes'), -(106,'widget_pages','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), -(107,'widget_calendar','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), -(108,'widget_archives','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), -(109,'widget_media_audio','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), -(110,'widget_media_image','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), -(111,'widget_media_gallery','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), -(112,'widget_media_video','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), -(113,'widget_meta','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), -(114,'widget_search','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), -(115,'widget_recent-posts','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), -(116,'widget_recent-comments','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), -(117,'widget_tag_cloud','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), -(118,'widget_nav_menu','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), -(119,'widget_custom_html','a:1:{s:12:\"_multiwidget\";i:1;}','yes'), -(120,'_transient_wp_core_block_css_files','a:496:{i:0;s:61:\"/var/www/wordpress/wp-includes/blocks/archives/editor-rtl.css\";i:1;s:65:\"/var/www/wordpress/wp-includes/blocks/archives/editor-rtl.min.css\";i:2;s:57:\"/var/www/wordpress/wp-includes/blocks/archives/editor.css\";i:3;s:61:\"/var/www/wordpress/wp-includes/blocks/archives/editor.min.css\";i:4;s:60:\"/var/www/wordpress/wp-includes/blocks/archives/style-rtl.css\";i:5;s:64:\"/var/www/wordpress/wp-includes/blocks/archives/style-rtl.min.css\";i:6;s:56:\"/var/www/wordpress/wp-includes/blocks/archives/style.css\";i:7;s:60:\"/var/www/wordpress/wp-includes/blocks/archives/style.min.css\";i:8;s:58:\"/var/www/wordpress/wp-includes/blocks/audio/editor-rtl.css\";i:9;s:62:\"/var/www/wordpress/wp-includes/blocks/audio/editor-rtl.min.css\";i:10;s:54:\"/var/www/wordpress/wp-includes/blocks/audio/editor.css\";i:11;s:58:\"/var/www/wordpress/wp-includes/blocks/audio/editor.min.css\";i:12;s:57:\"/var/www/wordpress/wp-includes/blocks/audio/style-rtl.css\";i:13;s:61:\"/var/www/wordpress/wp-includes/blocks/audio/style-rtl.min.css\";i:14;s:53:\"/var/www/wordpress/wp-includes/blocks/audio/style.css\";i:15;s:57:\"/var/www/wordpress/wp-includes/blocks/audio/style.min.css\";i:16;s:57:\"/var/www/wordpress/wp-includes/blocks/audio/theme-rtl.css\";i:17;s:61:\"/var/www/wordpress/wp-includes/blocks/audio/theme-rtl.min.css\";i:18;s:53:\"/var/www/wordpress/wp-includes/blocks/audio/theme.css\";i:19;s:57:\"/var/www/wordpress/wp-includes/blocks/audio/theme.min.css\";i:20;s:59:\"/var/www/wordpress/wp-includes/blocks/avatar/editor-rtl.css\";i:21;s:63:\"/var/www/wordpress/wp-includes/blocks/avatar/editor-rtl.min.css\";i:22;s:55:\"/var/www/wordpress/wp-includes/blocks/avatar/editor.css\";i:23;s:59:\"/var/www/wordpress/wp-includes/blocks/avatar/editor.min.css\";i:24;s:58:\"/var/www/wordpress/wp-includes/blocks/avatar/style-rtl.css\";i:25;s:62:\"/var/www/wordpress/wp-includes/blocks/avatar/style-rtl.min.css\";i:26;s:54:\"/var/www/wordpress/wp-includes/blocks/avatar/style.css\";i:27;s:58:\"/var/www/wordpress/wp-includes/blocks/avatar/style.min.css\";i:28;s:58:\"/var/www/wordpress/wp-includes/blocks/block/editor-rtl.css\";i:29;s:62:\"/var/www/wordpress/wp-includes/blocks/block/editor-rtl.min.css\";i:30;s:54:\"/var/www/wordpress/wp-includes/blocks/block/editor.css\";i:31;s:58:\"/var/www/wordpress/wp-includes/blocks/block/editor.min.css\";i:32;s:59:\"/var/www/wordpress/wp-includes/blocks/button/editor-rtl.css\";i:33;s:63:\"/var/www/wordpress/wp-includes/blocks/button/editor-rtl.min.css\";i:34;s:55:\"/var/www/wordpress/wp-includes/blocks/button/editor.css\";i:35;s:59:\"/var/www/wordpress/wp-includes/blocks/button/editor.min.css\";i:36;s:58:\"/var/www/wordpress/wp-includes/blocks/button/style-rtl.css\";i:37;s:62:\"/var/www/wordpress/wp-includes/blocks/button/style-rtl.min.css\";i:38;s:54:\"/var/www/wordpress/wp-includes/blocks/button/style.css\";i:39;s:58:\"/var/www/wordpress/wp-includes/blocks/button/style.min.css\";i:40;s:60:\"/var/www/wordpress/wp-includes/blocks/buttons/editor-rtl.css\";i:41;s:64:\"/var/www/wordpress/wp-includes/blocks/buttons/editor-rtl.min.css\";i:42;s:56:\"/var/www/wordpress/wp-includes/blocks/buttons/editor.css\";i:43;s:60:\"/var/www/wordpress/wp-includes/blocks/buttons/editor.min.css\";i:44;s:59:\"/var/www/wordpress/wp-includes/blocks/buttons/style-rtl.css\";i:45;s:63:\"/var/www/wordpress/wp-includes/blocks/buttons/style-rtl.min.css\";i:46;s:55:\"/var/www/wordpress/wp-includes/blocks/buttons/style.css\";i:47;s:59:\"/var/www/wordpress/wp-includes/blocks/buttons/style.min.css\";i:48;s:60:\"/var/www/wordpress/wp-includes/blocks/calendar/style-rtl.css\";i:49;s:64:\"/var/www/wordpress/wp-includes/blocks/calendar/style-rtl.min.css\";i:50;s:56:\"/var/www/wordpress/wp-includes/blocks/calendar/style.css\";i:51;s:60:\"/var/www/wordpress/wp-includes/blocks/calendar/style.min.css\";i:52;s:63:\"/var/www/wordpress/wp-includes/blocks/categories/editor-rtl.css\";i:53;s:67:\"/var/www/wordpress/wp-includes/blocks/categories/editor-rtl.min.css\";i:54;s:59:\"/var/www/wordpress/wp-includes/blocks/categories/editor.css\";i:55;s:63:\"/var/www/wordpress/wp-includes/blocks/categories/editor.min.css\";i:56;s:62:\"/var/www/wordpress/wp-includes/blocks/categories/style-rtl.css\";i:57;s:66:\"/var/www/wordpress/wp-includes/blocks/categories/style-rtl.min.css\";i:58;s:58:\"/var/www/wordpress/wp-includes/blocks/categories/style.css\";i:59;s:62:\"/var/www/wordpress/wp-includes/blocks/categories/style.min.css\";i:60;s:57:\"/var/www/wordpress/wp-includes/blocks/code/editor-rtl.css\";i:61;s:61:\"/var/www/wordpress/wp-includes/blocks/code/editor-rtl.min.css\";i:62;s:53:\"/var/www/wordpress/wp-includes/blocks/code/editor.css\";i:63;s:57:\"/var/www/wordpress/wp-includes/blocks/code/editor.min.css\";i:64;s:56:\"/var/www/wordpress/wp-includes/blocks/code/style-rtl.css\";i:65;s:60:\"/var/www/wordpress/wp-includes/blocks/code/style-rtl.min.css\";i:66;s:52:\"/var/www/wordpress/wp-includes/blocks/code/style.css\";i:67;s:56:\"/var/www/wordpress/wp-includes/blocks/code/style.min.css\";i:68;s:56:\"/var/www/wordpress/wp-includes/blocks/code/theme-rtl.css\";i:69;s:60:\"/var/www/wordpress/wp-includes/blocks/code/theme-rtl.min.css\";i:70;s:52:\"/var/www/wordpress/wp-includes/blocks/code/theme.css\";i:71;s:56:\"/var/www/wordpress/wp-includes/blocks/code/theme.min.css\";i:72;s:60:\"/var/www/wordpress/wp-includes/blocks/columns/editor-rtl.css\";i:73;s:64:\"/var/www/wordpress/wp-includes/blocks/columns/editor-rtl.min.css\";i:74;s:56:\"/var/www/wordpress/wp-includes/blocks/columns/editor.css\";i:75;s:60:\"/var/www/wordpress/wp-includes/blocks/columns/editor.min.css\";i:76;s:59:\"/var/www/wordpress/wp-includes/blocks/columns/style-rtl.css\";i:77;s:63:\"/var/www/wordpress/wp-includes/blocks/columns/style-rtl.min.css\";i:78;s:55:\"/var/www/wordpress/wp-includes/blocks/columns/style.css\";i:79;s:59:\"/var/www/wordpress/wp-includes/blocks/columns/style.min.css\";i:80;s:67:\"/var/www/wordpress/wp-includes/blocks/comment-content/style-rtl.css\";i:81;s:71:\"/var/www/wordpress/wp-includes/blocks/comment-content/style-rtl.min.css\";i:82;s:63:\"/var/www/wordpress/wp-includes/blocks/comment-content/style.css\";i:83;s:67:\"/var/www/wordpress/wp-includes/blocks/comment-content/style.min.css\";i:84;s:68:\"/var/www/wordpress/wp-includes/blocks/comment-template/style-rtl.css\";i:85;s:72:\"/var/www/wordpress/wp-includes/blocks/comment-template/style-rtl.min.css\";i:86;s:64:\"/var/www/wordpress/wp-includes/blocks/comment-template/style.css\";i:87;s:68:\"/var/www/wordpress/wp-includes/blocks/comment-template/style.min.css\";i:88;s:80:\"/var/www/wordpress/wp-includes/blocks/comments-pagination-numbers/editor-rtl.css\";i:89;s:84:\"/var/www/wordpress/wp-includes/blocks/comments-pagination-numbers/editor-rtl.min.css\";i:90;s:76:\"/var/www/wordpress/wp-includes/blocks/comments-pagination-numbers/editor.css\";i:91;s:80:\"/var/www/wordpress/wp-includes/blocks/comments-pagination-numbers/editor.min.css\";i:92;s:72:\"/var/www/wordpress/wp-includes/blocks/comments-pagination/editor-rtl.css\";i:93;s:76:\"/var/www/wordpress/wp-includes/blocks/comments-pagination/editor-rtl.min.css\";i:94;s:68:\"/var/www/wordpress/wp-includes/blocks/comments-pagination/editor.css\";i:95;s:72:\"/var/www/wordpress/wp-includes/blocks/comments-pagination/editor.min.css\";i:96;s:71:\"/var/www/wordpress/wp-includes/blocks/comments-pagination/style-rtl.css\";i:97;s:75:\"/var/www/wordpress/wp-includes/blocks/comments-pagination/style-rtl.min.css\";i:98;s:67:\"/var/www/wordpress/wp-includes/blocks/comments-pagination/style.css\";i:99;s:71:\"/var/www/wordpress/wp-includes/blocks/comments-pagination/style.min.css\";i:100;s:67:\"/var/www/wordpress/wp-includes/blocks/comments-title/editor-rtl.css\";i:101;s:71:\"/var/www/wordpress/wp-includes/blocks/comments-title/editor-rtl.min.css\";i:102;s:63:\"/var/www/wordpress/wp-includes/blocks/comments-title/editor.css\";i:103;s:67:\"/var/www/wordpress/wp-includes/blocks/comments-title/editor.min.css\";i:104;s:61:\"/var/www/wordpress/wp-includes/blocks/comments/editor-rtl.css\";i:105;s:65:\"/var/www/wordpress/wp-includes/blocks/comments/editor-rtl.min.css\";i:106;s:57:\"/var/www/wordpress/wp-includes/blocks/comments/editor.css\";i:107;s:61:\"/var/www/wordpress/wp-includes/blocks/comments/editor.min.css\";i:108;s:60:\"/var/www/wordpress/wp-includes/blocks/comments/style-rtl.css\";i:109;s:64:\"/var/www/wordpress/wp-includes/blocks/comments/style-rtl.min.css\";i:110;s:56:\"/var/www/wordpress/wp-includes/blocks/comments/style.css\";i:111;s:60:\"/var/www/wordpress/wp-includes/blocks/comments/style.min.css\";i:112;s:58:\"/var/www/wordpress/wp-includes/blocks/cover/editor-rtl.css\";i:113;s:62:\"/var/www/wordpress/wp-includes/blocks/cover/editor-rtl.min.css\";i:114;s:54:\"/var/www/wordpress/wp-includes/blocks/cover/editor.css\";i:115;s:58:\"/var/www/wordpress/wp-includes/blocks/cover/editor.min.css\";i:116;s:57:\"/var/www/wordpress/wp-includes/blocks/cover/style-rtl.css\";i:117;s:61:\"/var/www/wordpress/wp-includes/blocks/cover/style-rtl.min.css\";i:118;s:53:\"/var/www/wordpress/wp-includes/blocks/cover/style.css\";i:119;s:57:\"/var/www/wordpress/wp-includes/blocks/cover/style.min.css\";i:120;s:60:\"/var/www/wordpress/wp-includes/blocks/details/editor-rtl.css\";i:121;s:64:\"/var/www/wordpress/wp-includes/blocks/details/editor-rtl.min.css\";i:122;s:56:\"/var/www/wordpress/wp-includes/blocks/details/editor.css\";i:123;s:60:\"/var/www/wordpress/wp-includes/blocks/details/editor.min.css\";i:124;s:59:\"/var/www/wordpress/wp-includes/blocks/details/style-rtl.css\";i:125;s:63:\"/var/www/wordpress/wp-includes/blocks/details/style-rtl.min.css\";i:126;s:55:\"/var/www/wordpress/wp-includes/blocks/details/style.css\";i:127;s:59:\"/var/www/wordpress/wp-includes/blocks/details/style.min.css\";i:128;s:58:\"/var/www/wordpress/wp-includes/blocks/embed/editor-rtl.css\";i:129;s:62:\"/var/www/wordpress/wp-includes/blocks/embed/editor-rtl.min.css\";i:130;s:54:\"/var/www/wordpress/wp-includes/blocks/embed/editor.css\";i:131;s:58:\"/var/www/wordpress/wp-includes/blocks/embed/editor.min.css\";i:132;s:57:\"/var/www/wordpress/wp-includes/blocks/embed/style-rtl.css\";i:133;s:61:\"/var/www/wordpress/wp-includes/blocks/embed/style-rtl.min.css\";i:134;s:53:\"/var/www/wordpress/wp-includes/blocks/embed/style.css\";i:135;s:57:\"/var/www/wordpress/wp-includes/blocks/embed/style.min.css\";i:136;s:57:\"/var/www/wordpress/wp-includes/blocks/embed/theme-rtl.css\";i:137;s:61:\"/var/www/wordpress/wp-includes/blocks/embed/theme-rtl.min.css\";i:138;s:53:\"/var/www/wordpress/wp-includes/blocks/embed/theme.css\";i:139;s:57:\"/var/www/wordpress/wp-includes/blocks/embed/theme.min.css\";i:140;s:57:\"/var/www/wordpress/wp-includes/blocks/file/editor-rtl.css\";i:141;s:61:\"/var/www/wordpress/wp-includes/blocks/file/editor-rtl.min.css\";i:142;s:53:\"/var/www/wordpress/wp-includes/blocks/file/editor.css\";i:143;s:57:\"/var/www/wordpress/wp-includes/blocks/file/editor.min.css\";i:144;s:56:\"/var/www/wordpress/wp-includes/blocks/file/style-rtl.css\";i:145;s:60:\"/var/www/wordpress/wp-includes/blocks/file/style-rtl.min.css\";i:146;s:52:\"/var/www/wordpress/wp-includes/blocks/file/style.css\";i:147;s:56:\"/var/www/wordpress/wp-includes/blocks/file/style.min.css\";i:148;s:61:\"/var/www/wordpress/wp-includes/blocks/footnotes/style-rtl.css\";i:149;s:65:\"/var/www/wordpress/wp-includes/blocks/footnotes/style-rtl.min.css\";i:150;s:57:\"/var/www/wordpress/wp-includes/blocks/footnotes/style.css\";i:151;s:61:\"/var/www/wordpress/wp-includes/blocks/footnotes/style.min.css\";i:152;s:61:\"/var/www/wordpress/wp-includes/blocks/freeform/editor-rtl.css\";i:153;s:65:\"/var/www/wordpress/wp-includes/blocks/freeform/editor-rtl.min.css\";i:154;s:57:\"/var/www/wordpress/wp-includes/blocks/freeform/editor.css\";i:155;s:61:\"/var/www/wordpress/wp-includes/blocks/freeform/editor.min.css\";i:156;s:60:\"/var/www/wordpress/wp-includes/blocks/gallery/editor-rtl.css\";i:157;s:64:\"/var/www/wordpress/wp-includes/blocks/gallery/editor-rtl.min.css\";i:158;s:56:\"/var/www/wordpress/wp-includes/blocks/gallery/editor.css\";i:159;s:60:\"/var/www/wordpress/wp-includes/blocks/gallery/editor.min.css\";i:160;s:59:\"/var/www/wordpress/wp-includes/blocks/gallery/style-rtl.css\";i:161;s:63:\"/var/www/wordpress/wp-includes/blocks/gallery/style-rtl.min.css\";i:162;s:55:\"/var/www/wordpress/wp-includes/blocks/gallery/style.css\";i:163;s:59:\"/var/www/wordpress/wp-includes/blocks/gallery/style.min.css\";i:164;s:59:\"/var/www/wordpress/wp-includes/blocks/gallery/theme-rtl.css\";i:165;s:63:\"/var/www/wordpress/wp-includes/blocks/gallery/theme-rtl.min.css\";i:166;s:55:\"/var/www/wordpress/wp-includes/blocks/gallery/theme.css\";i:167;s:59:\"/var/www/wordpress/wp-includes/blocks/gallery/theme.min.css\";i:168;s:58:\"/var/www/wordpress/wp-includes/blocks/group/editor-rtl.css\";i:169;s:62:\"/var/www/wordpress/wp-includes/blocks/group/editor-rtl.min.css\";i:170;s:54:\"/var/www/wordpress/wp-includes/blocks/group/editor.css\";i:171;s:58:\"/var/www/wordpress/wp-includes/blocks/group/editor.min.css\";i:172;s:57:\"/var/www/wordpress/wp-includes/blocks/group/style-rtl.css\";i:173;s:61:\"/var/www/wordpress/wp-includes/blocks/group/style-rtl.min.css\";i:174;s:53:\"/var/www/wordpress/wp-includes/blocks/group/style.css\";i:175;s:57:\"/var/www/wordpress/wp-includes/blocks/group/style.min.css\";i:176;s:57:\"/var/www/wordpress/wp-includes/blocks/group/theme-rtl.css\";i:177;s:61:\"/var/www/wordpress/wp-includes/blocks/group/theme-rtl.min.css\";i:178;s:53:\"/var/www/wordpress/wp-includes/blocks/group/theme.css\";i:179;s:57:\"/var/www/wordpress/wp-includes/blocks/group/theme.min.css\";i:180;s:59:\"/var/www/wordpress/wp-includes/blocks/heading/style-rtl.css\";i:181;s:63:\"/var/www/wordpress/wp-includes/blocks/heading/style-rtl.min.css\";i:182;s:55:\"/var/www/wordpress/wp-includes/blocks/heading/style.css\";i:183;s:59:\"/var/www/wordpress/wp-includes/blocks/heading/style.min.css\";i:184;s:57:\"/var/www/wordpress/wp-includes/blocks/html/editor-rtl.css\";i:185;s:61:\"/var/www/wordpress/wp-includes/blocks/html/editor-rtl.min.css\";i:186;s:53:\"/var/www/wordpress/wp-includes/blocks/html/editor.css\";i:187;s:57:\"/var/www/wordpress/wp-includes/blocks/html/editor.min.css\";i:188;s:58:\"/var/www/wordpress/wp-includes/blocks/image/editor-rtl.css\";i:189;s:62:\"/var/www/wordpress/wp-includes/blocks/image/editor-rtl.min.css\";i:190;s:54:\"/var/www/wordpress/wp-includes/blocks/image/editor.css\";i:191;s:58:\"/var/www/wordpress/wp-includes/blocks/image/editor.min.css\";i:192;s:57:\"/var/www/wordpress/wp-includes/blocks/image/style-rtl.css\";i:193;s:61:\"/var/www/wordpress/wp-includes/blocks/image/style-rtl.min.css\";i:194;s:53:\"/var/www/wordpress/wp-includes/blocks/image/style.css\";i:195;s:57:\"/var/www/wordpress/wp-includes/blocks/image/style.min.css\";i:196;s:57:\"/var/www/wordpress/wp-includes/blocks/image/theme-rtl.css\";i:197;s:61:\"/var/www/wordpress/wp-includes/blocks/image/theme-rtl.min.css\";i:198;s:53:\"/var/www/wordpress/wp-includes/blocks/image/theme.css\";i:199;s:57:\"/var/www/wordpress/wp-includes/blocks/image/theme.min.css\";i:200;s:67:\"/var/www/wordpress/wp-includes/blocks/latest-comments/style-rtl.css\";i:201;s:71:\"/var/www/wordpress/wp-includes/blocks/latest-comments/style-rtl.min.css\";i:202;s:63:\"/var/www/wordpress/wp-includes/blocks/latest-comments/style.css\";i:203;s:67:\"/var/www/wordpress/wp-includes/blocks/latest-comments/style.min.css\";i:204;s:65:\"/var/www/wordpress/wp-includes/blocks/latest-posts/editor-rtl.css\";i:205;s:69:\"/var/www/wordpress/wp-includes/blocks/latest-posts/editor-rtl.min.css\";i:206;s:61:\"/var/www/wordpress/wp-includes/blocks/latest-posts/editor.css\";i:207;s:65:\"/var/www/wordpress/wp-includes/blocks/latest-posts/editor.min.css\";i:208;s:64:\"/var/www/wordpress/wp-includes/blocks/latest-posts/style-rtl.css\";i:209;s:68:\"/var/www/wordpress/wp-includes/blocks/latest-posts/style-rtl.min.css\";i:210;s:60:\"/var/www/wordpress/wp-includes/blocks/latest-posts/style.css\";i:211;s:64:\"/var/www/wordpress/wp-includes/blocks/latest-posts/style.min.css\";i:212;s:56:\"/var/www/wordpress/wp-includes/blocks/list/style-rtl.css\";i:213;s:60:\"/var/www/wordpress/wp-includes/blocks/list/style-rtl.min.css\";i:214;s:52:\"/var/www/wordpress/wp-includes/blocks/list/style.css\";i:215;s:56:\"/var/www/wordpress/wp-includes/blocks/list/style.min.css\";i:216;s:63:\"/var/www/wordpress/wp-includes/blocks/media-text/editor-rtl.css\";i:217;s:67:\"/var/www/wordpress/wp-includes/blocks/media-text/editor-rtl.min.css\";i:218;s:59:\"/var/www/wordpress/wp-includes/blocks/media-text/editor.css\";i:219;s:63:\"/var/www/wordpress/wp-includes/blocks/media-text/editor.min.css\";i:220;s:62:\"/var/www/wordpress/wp-includes/blocks/media-text/style-rtl.css\";i:221;s:66:\"/var/www/wordpress/wp-includes/blocks/media-text/style-rtl.min.css\";i:222;s:58:\"/var/www/wordpress/wp-includes/blocks/media-text/style.css\";i:223;s:62:\"/var/www/wordpress/wp-includes/blocks/media-text/style.min.css\";i:224;s:57:\"/var/www/wordpress/wp-includes/blocks/more/editor-rtl.css\";i:225;s:61:\"/var/www/wordpress/wp-includes/blocks/more/editor-rtl.min.css\";i:226;s:53:\"/var/www/wordpress/wp-includes/blocks/more/editor.css\";i:227;s:57:\"/var/www/wordpress/wp-includes/blocks/more/editor.min.css\";i:228;s:68:\"/var/www/wordpress/wp-includes/blocks/navigation-link/editor-rtl.css\";i:229;s:72:\"/var/www/wordpress/wp-includes/blocks/navigation-link/editor-rtl.min.css\";i:230;s:64:\"/var/www/wordpress/wp-includes/blocks/navigation-link/editor.css\";i:231;s:68:\"/var/www/wordpress/wp-includes/blocks/navigation-link/editor.min.css\";i:232;s:67:\"/var/www/wordpress/wp-includes/blocks/navigation-link/style-rtl.css\";i:233;s:71:\"/var/www/wordpress/wp-includes/blocks/navigation-link/style-rtl.min.css\";i:234;s:63:\"/var/www/wordpress/wp-includes/blocks/navigation-link/style.css\";i:235;s:67:\"/var/www/wordpress/wp-includes/blocks/navigation-link/style.min.css\";i:236;s:71:\"/var/www/wordpress/wp-includes/blocks/navigation-submenu/editor-rtl.css\";i:237;s:75:\"/var/www/wordpress/wp-includes/blocks/navigation-submenu/editor-rtl.min.css\";i:238;s:67:\"/var/www/wordpress/wp-includes/blocks/navigation-submenu/editor.css\";i:239;s:71:\"/var/www/wordpress/wp-includes/blocks/navigation-submenu/editor.min.css\";i:240;s:63:\"/var/www/wordpress/wp-includes/blocks/navigation/editor-rtl.css\";i:241;s:67:\"/var/www/wordpress/wp-includes/blocks/navigation/editor-rtl.min.css\";i:242;s:59:\"/var/www/wordpress/wp-includes/blocks/navigation/editor.css\";i:243;s:63:\"/var/www/wordpress/wp-includes/blocks/navigation/editor.min.css\";i:244;s:62:\"/var/www/wordpress/wp-includes/blocks/navigation/style-rtl.css\";i:245;s:66:\"/var/www/wordpress/wp-includes/blocks/navigation/style-rtl.min.css\";i:246;s:58:\"/var/www/wordpress/wp-includes/blocks/navigation/style.css\";i:247;s:62:\"/var/www/wordpress/wp-includes/blocks/navigation/style.min.css\";i:248;s:61:\"/var/www/wordpress/wp-includes/blocks/nextpage/editor-rtl.css\";i:249;s:65:\"/var/www/wordpress/wp-includes/blocks/nextpage/editor-rtl.min.css\";i:250;s:57:\"/var/www/wordpress/wp-includes/blocks/nextpage/editor.css\";i:251;s:61:\"/var/www/wordpress/wp-includes/blocks/nextpage/editor.min.css\";i:252;s:62:\"/var/www/wordpress/wp-includes/blocks/page-list/editor-rtl.css\";i:253;s:66:\"/var/www/wordpress/wp-includes/blocks/page-list/editor-rtl.min.css\";i:254;s:58:\"/var/www/wordpress/wp-includes/blocks/page-list/editor.css\";i:255;s:62:\"/var/www/wordpress/wp-includes/blocks/page-list/editor.min.css\";i:256;s:61:\"/var/www/wordpress/wp-includes/blocks/page-list/style-rtl.css\";i:257;s:65:\"/var/www/wordpress/wp-includes/blocks/page-list/style-rtl.min.css\";i:258;s:57:\"/var/www/wordpress/wp-includes/blocks/page-list/style.css\";i:259;s:61:\"/var/www/wordpress/wp-includes/blocks/page-list/style.min.css\";i:260;s:62:\"/var/www/wordpress/wp-includes/blocks/paragraph/editor-rtl.css\";i:261;s:66:\"/var/www/wordpress/wp-includes/blocks/paragraph/editor-rtl.min.css\";i:262;s:58:\"/var/www/wordpress/wp-includes/blocks/paragraph/editor.css\";i:263;s:62:\"/var/www/wordpress/wp-includes/blocks/paragraph/editor.min.css\";i:264;s:61:\"/var/www/wordpress/wp-includes/blocks/paragraph/style-rtl.css\";i:265;s:65:\"/var/www/wordpress/wp-includes/blocks/paragraph/style-rtl.min.css\";i:266;s:57:\"/var/www/wordpress/wp-includes/blocks/paragraph/style.css\";i:267;s:61:\"/var/www/wordpress/wp-includes/blocks/paragraph/style.min.css\";i:268;s:63:\"/var/www/wordpress/wp-includes/blocks/post-author/style-rtl.css\";i:269;s:67:\"/var/www/wordpress/wp-includes/blocks/post-author/style-rtl.min.css\";i:270;s:59:\"/var/www/wordpress/wp-includes/blocks/post-author/style.css\";i:271;s:63:\"/var/www/wordpress/wp-includes/blocks/post-author/style.min.css\";i:272;s:71:\"/var/www/wordpress/wp-includes/blocks/post-comments-form/editor-rtl.css\";i:273;s:75:\"/var/www/wordpress/wp-includes/blocks/post-comments-form/editor-rtl.min.css\";i:274;s:67:\"/var/www/wordpress/wp-includes/blocks/post-comments-form/editor.css\";i:275;s:71:\"/var/www/wordpress/wp-includes/blocks/post-comments-form/editor.min.css\";i:276;s:70:\"/var/www/wordpress/wp-includes/blocks/post-comments-form/style-rtl.css\";i:277;s:74:\"/var/www/wordpress/wp-includes/blocks/post-comments-form/style-rtl.min.css\";i:278;s:66:\"/var/www/wordpress/wp-includes/blocks/post-comments-form/style.css\";i:279;s:70:\"/var/www/wordpress/wp-includes/blocks/post-comments-form/style.min.css\";i:280;s:61:\"/var/www/wordpress/wp-includes/blocks/post-date/style-rtl.css\";i:281;s:65:\"/var/www/wordpress/wp-includes/blocks/post-date/style-rtl.min.css\";i:282;s:57:\"/var/www/wordpress/wp-includes/blocks/post-date/style.css\";i:283;s:61:\"/var/www/wordpress/wp-includes/blocks/post-date/style.min.css\";i:284;s:65:\"/var/www/wordpress/wp-includes/blocks/post-excerpt/editor-rtl.css\";i:285;s:69:\"/var/www/wordpress/wp-includes/blocks/post-excerpt/editor-rtl.min.css\";i:286;s:61:\"/var/www/wordpress/wp-includes/blocks/post-excerpt/editor.css\";i:287;s:65:\"/var/www/wordpress/wp-includes/blocks/post-excerpt/editor.min.css\";i:288;s:64:\"/var/www/wordpress/wp-includes/blocks/post-excerpt/style-rtl.css\";i:289;s:68:\"/var/www/wordpress/wp-includes/blocks/post-excerpt/style-rtl.min.css\";i:290;s:60:\"/var/www/wordpress/wp-includes/blocks/post-excerpt/style.css\";i:291;s:64:\"/var/www/wordpress/wp-includes/blocks/post-excerpt/style.min.css\";i:292;s:72:\"/var/www/wordpress/wp-includes/blocks/post-featured-image/editor-rtl.css\";i:293;s:76:\"/var/www/wordpress/wp-includes/blocks/post-featured-image/editor-rtl.min.css\";i:294;s:68:\"/var/www/wordpress/wp-includes/blocks/post-featured-image/editor.css\";i:295;s:72:\"/var/www/wordpress/wp-includes/blocks/post-featured-image/editor.min.css\";i:296;s:71:\"/var/www/wordpress/wp-includes/blocks/post-featured-image/style-rtl.css\";i:297;s:75:\"/var/www/wordpress/wp-includes/blocks/post-featured-image/style-rtl.min.css\";i:298;s:67:\"/var/www/wordpress/wp-includes/blocks/post-featured-image/style.css\";i:299;s:71:\"/var/www/wordpress/wp-includes/blocks/post-featured-image/style.min.css\";i:300;s:72:\"/var/www/wordpress/wp-includes/blocks/post-navigation-link/style-rtl.css\";i:301;s:76:\"/var/www/wordpress/wp-includes/blocks/post-navigation-link/style-rtl.min.css\";i:302;s:68:\"/var/www/wordpress/wp-includes/blocks/post-navigation-link/style.css\";i:303;s:72:\"/var/www/wordpress/wp-includes/blocks/post-navigation-link/style.min.css\";i:304;s:66:\"/var/www/wordpress/wp-includes/blocks/post-template/editor-rtl.css\";i:305;s:70:\"/var/www/wordpress/wp-includes/blocks/post-template/editor-rtl.min.css\";i:306;s:62:\"/var/www/wordpress/wp-includes/blocks/post-template/editor.css\";i:307;s:66:\"/var/www/wordpress/wp-includes/blocks/post-template/editor.min.css\";i:308;s:65:\"/var/www/wordpress/wp-includes/blocks/post-template/style-rtl.css\";i:309;s:69:\"/var/www/wordpress/wp-includes/blocks/post-template/style-rtl.min.css\";i:310;s:61:\"/var/www/wordpress/wp-includes/blocks/post-template/style.css\";i:311;s:65:\"/var/www/wordpress/wp-includes/blocks/post-template/style.min.css\";i:312;s:62:\"/var/www/wordpress/wp-includes/blocks/post-terms/style-rtl.css\";i:313;s:66:\"/var/www/wordpress/wp-includes/blocks/post-terms/style-rtl.min.css\";i:314;s:58:\"/var/www/wordpress/wp-includes/blocks/post-terms/style.css\";i:315;s:62:\"/var/www/wordpress/wp-includes/blocks/post-terms/style.min.css\";i:316;s:62:\"/var/www/wordpress/wp-includes/blocks/post-title/style-rtl.css\";i:317;s:66:\"/var/www/wordpress/wp-includes/blocks/post-title/style-rtl.min.css\";i:318;s:58:\"/var/www/wordpress/wp-includes/blocks/post-title/style.css\";i:319;s:62:\"/var/www/wordpress/wp-includes/blocks/post-title/style.min.css\";i:320;s:64:\"/var/www/wordpress/wp-includes/blocks/preformatted/style-rtl.css\";i:321;s:68:\"/var/www/wordpress/wp-includes/blocks/preformatted/style-rtl.min.css\";i:322;s:60:\"/var/www/wordpress/wp-includes/blocks/preformatted/style.css\";i:323;s:64:\"/var/www/wordpress/wp-includes/blocks/preformatted/style.min.css\";i:324;s:62:\"/var/www/wordpress/wp-includes/blocks/pullquote/editor-rtl.css\";i:325;s:66:\"/var/www/wordpress/wp-includes/blocks/pullquote/editor-rtl.min.css\";i:326;s:58:\"/var/www/wordpress/wp-includes/blocks/pullquote/editor.css\";i:327;s:62:\"/var/www/wordpress/wp-includes/blocks/pullquote/editor.min.css\";i:328;s:61:\"/var/www/wordpress/wp-includes/blocks/pullquote/style-rtl.css\";i:329;s:65:\"/var/www/wordpress/wp-includes/blocks/pullquote/style-rtl.min.css\";i:330;s:57:\"/var/www/wordpress/wp-includes/blocks/pullquote/style.css\";i:331;s:61:\"/var/www/wordpress/wp-includes/blocks/pullquote/style.min.css\";i:332;s:61:\"/var/www/wordpress/wp-includes/blocks/pullquote/theme-rtl.css\";i:333;s:65:\"/var/www/wordpress/wp-includes/blocks/pullquote/theme-rtl.min.css\";i:334;s:57:\"/var/www/wordpress/wp-includes/blocks/pullquote/theme.css\";i:335;s:61:\"/var/www/wordpress/wp-includes/blocks/pullquote/theme.min.css\";i:336;s:77:\"/var/www/wordpress/wp-includes/blocks/query-pagination-numbers/editor-rtl.css\";i:337;s:81:\"/var/www/wordpress/wp-includes/blocks/query-pagination-numbers/editor-rtl.min.css\";i:338;s:73:\"/var/www/wordpress/wp-includes/blocks/query-pagination-numbers/editor.css\";i:339;s:77:\"/var/www/wordpress/wp-includes/blocks/query-pagination-numbers/editor.min.css\";i:340;s:69:\"/var/www/wordpress/wp-includes/blocks/query-pagination/editor-rtl.css\";i:341;s:73:\"/var/www/wordpress/wp-includes/blocks/query-pagination/editor-rtl.min.css\";i:342;s:65:\"/var/www/wordpress/wp-includes/blocks/query-pagination/editor.css\";i:343;s:69:\"/var/www/wordpress/wp-includes/blocks/query-pagination/editor.min.css\";i:344;s:68:\"/var/www/wordpress/wp-includes/blocks/query-pagination/style-rtl.css\";i:345;s:72:\"/var/www/wordpress/wp-includes/blocks/query-pagination/style-rtl.min.css\";i:346;s:64:\"/var/www/wordpress/wp-includes/blocks/query-pagination/style.css\";i:347;s:68:\"/var/www/wordpress/wp-includes/blocks/query-pagination/style.min.css\";i:348;s:63:\"/var/www/wordpress/wp-includes/blocks/query-title/style-rtl.css\";i:349;s:67:\"/var/www/wordpress/wp-includes/blocks/query-title/style-rtl.min.css\";i:350;s:59:\"/var/www/wordpress/wp-includes/blocks/query-title/style.css\";i:351;s:63:\"/var/www/wordpress/wp-includes/blocks/query-title/style.min.css\";i:352;s:58:\"/var/www/wordpress/wp-includes/blocks/query/editor-rtl.css\";i:353;s:62:\"/var/www/wordpress/wp-includes/blocks/query/editor-rtl.min.css\";i:354;s:54:\"/var/www/wordpress/wp-includes/blocks/query/editor.css\";i:355;s:58:\"/var/www/wordpress/wp-includes/blocks/query/editor.min.css\";i:356;s:57:\"/var/www/wordpress/wp-includes/blocks/quote/style-rtl.css\";i:357;s:61:\"/var/www/wordpress/wp-includes/blocks/quote/style-rtl.min.css\";i:358;s:53:\"/var/www/wordpress/wp-includes/blocks/quote/style.css\";i:359;s:57:\"/var/www/wordpress/wp-includes/blocks/quote/style.min.css\";i:360;s:57:\"/var/www/wordpress/wp-includes/blocks/quote/theme-rtl.css\";i:361;s:61:\"/var/www/wordpress/wp-includes/blocks/quote/theme-rtl.min.css\";i:362;s:53:\"/var/www/wordpress/wp-includes/blocks/quote/theme.css\";i:363;s:57:\"/var/www/wordpress/wp-includes/blocks/quote/theme.min.css\";i:364;s:61:\"/var/www/wordpress/wp-includes/blocks/read-more/style-rtl.css\";i:365;s:65:\"/var/www/wordpress/wp-includes/blocks/read-more/style-rtl.min.css\";i:366;s:57:\"/var/www/wordpress/wp-includes/blocks/read-more/style.css\";i:367;s:61:\"/var/www/wordpress/wp-includes/blocks/read-more/style.min.css\";i:368;s:56:\"/var/www/wordpress/wp-includes/blocks/rss/editor-rtl.css\";i:369;s:60:\"/var/www/wordpress/wp-includes/blocks/rss/editor-rtl.min.css\";i:370;s:52:\"/var/www/wordpress/wp-includes/blocks/rss/editor.css\";i:371;s:56:\"/var/www/wordpress/wp-includes/blocks/rss/editor.min.css\";i:372;s:55:\"/var/www/wordpress/wp-includes/blocks/rss/style-rtl.css\";i:373;s:59:\"/var/www/wordpress/wp-includes/blocks/rss/style-rtl.min.css\";i:374;s:51:\"/var/www/wordpress/wp-includes/blocks/rss/style.css\";i:375;s:55:\"/var/www/wordpress/wp-includes/blocks/rss/style.min.css\";i:376;s:59:\"/var/www/wordpress/wp-includes/blocks/search/editor-rtl.css\";i:377;s:63:\"/var/www/wordpress/wp-includes/blocks/search/editor-rtl.min.css\";i:378;s:55:\"/var/www/wordpress/wp-includes/blocks/search/editor.css\";i:379;s:59:\"/var/www/wordpress/wp-includes/blocks/search/editor.min.css\";i:380;s:58:\"/var/www/wordpress/wp-includes/blocks/search/style-rtl.css\";i:381;s:62:\"/var/www/wordpress/wp-includes/blocks/search/style-rtl.min.css\";i:382;s:54:\"/var/www/wordpress/wp-includes/blocks/search/style.css\";i:383;s:58:\"/var/www/wordpress/wp-includes/blocks/search/style.min.css\";i:384;s:58:\"/var/www/wordpress/wp-includes/blocks/search/theme-rtl.css\";i:385;s:62:\"/var/www/wordpress/wp-includes/blocks/search/theme-rtl.min.css\";i:386;s:54:\"/var/www/wordpress/wp-includes/blocks/search/theme.css\";i:387;s:58:\"/var/www/wordpress/wp-includes/blocks/search/theme.min.css\";i:388;s:62:\"/var/www/wordpress/wp-includes/blocks/separator/editor-rtl.css\";i:389;s:66:\"/var/www/wordpress/wp-includes/blocks/separator/editor-rtl.min.css\";i:390;s:58:\"/var/www/wordpress/wp-includes/blocks/separator/editor.css\";i:391;s:62:\"/var/www/wordpress/wp-includes/blocks/separator/editor.min.css\";i:392;s:61:\"/var/www/wordpress/wp-includes/blocks/separator/style-rtl.css\";i:393;s:65:\"/var/www/wordpress/wp-includes/blocks/separator/style-rtl.min.css\";i:394;s:57:\"/var/www/wordpress/wp-includes/blocks/separator/style.css\";i:395;s:61:\"/var/www/wordpress/wp-includes/blocks/separator/style.min.css\";i:396;s:61:\"/var/www/wordpress/wp-includes/blocks/separator/theme-rtl.css\";i:397;s:65:\"/var/www/wordpress/wp-includes/blocks/separator/theme-rtl.min.css\";i:398;s:57:\"/var/www/wordpress/wp-includes/blocks/separator/theme.css\";i:399;s:61:\"/var/www/wordpress/wp-includes/blocks/separator/theme.min.css\";i:400;s:62:\"/var/www/wordpress/wp-includes/blocks/shortcode/editor-rtl.css\";i:401;s:66:\"/var/www/wordpress/wp-includes/blocks/shortcode/editor-rtl.min.css\";i:402;s:58:\"/var/www/wordpress/wp-includes/blocks/shortcode/editor.css\";i:403;s:62:\"/var/www/wordpress/wp-includes/blocks/shortcode/editor.min.css\";i:404;s:62:\"/var/www/wordpress/wp-includes/blocks/site-logo/editor-rtl.css\";i:405;s:66:\"/var/www/wordpress/wp-includes/blocks/site-logo/editor-rtl.min.css\";i:406;s:58:\"/var/www/wordpress/wp-includes/blocks/site-logo/editor.css\";i:407;s:62:\"/var/www/wordpress/wp-includes/blocks/site-logo/editor.min.css\";i:408;s:61:\"/var/www/wordpress/wp-includes/blocks/site-logo/style-rtl.css\";i:409;s:65:\"/var/www/wordpress/wp-includes/blocks/site-logo/style-rtl.min.css\";i:410;s:57:\"/var/www/wordpress/wp-includes/blocks/site-logo/style.css\";i:411;s:61:\"/var/www/wordpress/wp-includes/blocks/site-logo/style.min.css\";i:412;s:65:\"/var/www/wordpress/wp-includes/blocks/site-tagline/editor-rtl.css\";i:413;s:69:\"/var/www/wordpress/wp-includes/blocks/site-tagline/editor-rtl.min.css\";i:414;s:61:\"/var/www/wordpress/wp-includes/blocks/site-tagline/editor.css\";i:415;s:65:\"/var/www/wordpress/wp-includes/blocks/site-tagline/editor.min.css\";i:416;s:63:\"/var/www/wordpress/wp-includes/blocks/site-title/editor-rtl.css\";i:417;s:67:\"/var/www/wordpress/wp-includes/blocks/site-title/editor-rtl.min.css\";i:418;s:59:\"/var/www/wordpress/wp-includes/blocks/site-title/editor.css\";i:419;s:63:\"/var/www/wordpress/wp-includes/blocks/site-title/editor.min.css\";i:420;s:62:\"/var/www/wordpress/wp-includes/blocks/site-title/style-rtl.css\";i:421;s:66:\"/var/www/wordpress/wp-includes/blocks/site-title/style-rtl.min.css\";i:422;s:58:\"/var/www/wordpress/wp-includes/blocks/site-title/style.css\";i:423;s:62:\"/var/www/wordpress/wp-includes/blocks/site-title/style.min.css\";i:424;s:64:\"/var/www/wordpress/wp-includes/blocks/social-link/editor-rtl.css\";i:425;s:68:\"/var/www/wordpress/wp-includes/blocks/social-link/editor-rtl.min.css\";i:426;s:60:\"/var/www/wordpress/wp-includes/blocks/social-link/editor.css\";i:427;s:64:\"/var/www/wordpress/wp-includes/blocks/social-link/editor.min.css\";i:428;s:65:\"/var/www/wordpress/wp-includes/blocks/social-links/editor-rtl.css\";i:429;s:69:\"/var/www/wordpress/wp-includes/blocks/social-links/editor-rtl.min.css\";i:430;s:61:\"/var/www/wordpress/wp-includes/blocks/social-links/editor.css\";i:431;s:65:\"/var/www/wordpress/wp-includes/blocks/social-links/editor.min.css\";i:432;s:64:\"/var/www/wordpress/wp-includes/blocks/social-links/style-rtl.css\";i:433;s:68:\"/var/www/wordpress/wp-includes/blocks/social-links/style-rtl.min.css\";i:434;s:60:\"/var/www/wordpress/wp-includes/blocks/social-links/style.css\";i:435;s:64:\"/var/www/wordpress/wp-includes/blocks/social-links/style.min.css\";i:436;s:59:\"/var/www/wordpress/wp-includes/blocks/spacer/editor-rtl.css\";i:437;s:63:\"/var/www/wordpress/wp-includes/blocks/spacer/editor-rtl.min.css\";i:438;s:55:\"/var/www/wordpress/wp-includes/blocks/spacer/editor.css\";i:439;s:59:\"/var/www/wordpress/wp-includes/blocks/spacer/editor.min.css\";i:440;s:58:\"/var/www/wordpress/wp-includes/blocks/spacer/style-rtl.css\";i:441;s:62:\"/var/www/wordpress/wp-includes/blocks/spacer/style-rtl.min.css\";i:442;s:54:\"/var/www/wordpress/wp-includes/blocks/spacer/style.css\";i:443;s:58:\"/var/www/wordpress/wp-includes/blocks/spacer/style.min.css\";i:444;s:58:\"/var/www/wordpress/wp-includes/blocks/table/editor-rtl.css\";i:445;s:62:\"/var/www/wordpress/wp-includes/blocks/table/editor-rtl.min.css\";i:446;s:54:\"/var/www/wordpress/wp-includes/blocks/table/editor.css\";i:447;s:58:\"/var/www/wordpress/wp-includes/blocks/table/editor.min.css\";i:448;s:57:\"/var/www/wordpress/wp-includes/blocks/table/style-rtl.css\";i:449;s:61:\"/var/www/wordpress/wp-includes/blocks/table/style-rtl.min.css\";i:450;s:53:\"/var/www/wordpress/wp-includes/blocks/table/style.css\";i:451;s:57:\"/var/www/wordpress/wp-includes/blocks/table/style.min.css\";i:452;s:57:\"/var/www/wordpress/wp-includes/blocks/table/theme-rtl.css\";i:453;s:61:\"/var/www/wordpress/wp-includes/blocks/table/theme-rtl.min.css\";i:454;s:53:\"/var/www/wordpress/wp-includes/blocks/table/theme.css\";i:455;s:57:\"/var/www/wordpress/wp-includes/blocks/table/theme.min.css\";i:456;s:61:\"/var/www/wordpress/wp-includes/blocks/tag-cloud/style-rtl.css\";i:457;s:65:\"/var/www/wordpress/wp-includes/blocks/tag-cloud/style-rtl.min.css\";i:458;s:57:\"/var/www/wordpress/wp-includes/blocks/tag-cloud/style.css\";i:459;s:61:\"/var/www/wordpress/wp-includes/blocks/tag-cloud/style.min.css\";i:460;s:66:\"/var/www/wordpress/wp-includes/blocks/template-part/editor-rtl.css\";i:461;s:70:\"/var/www/wordpress/wp-includes/blocks/template-part/editor-rtl.min.css\";i:462;s:62:\"/var/www/wordpress/wp-includes/blocks/template-part/editor.css\";i:463;s:66:\"/var/www/wordpress/wp-includes/blocks/template-part/editor.min.css\";i:464;s:65:\"/var/www/wordpress/wp-includes/blocks/template-part/theme-rtl.css\";i:465;s:69:\"/var/www/wordpress/wp-includes/blocks/template-part/theme-rtl.min.css\";i:466;s:61:\"/var/www/wordpress/wp-includes/blocks/template-part/theme.css\";i:467;s:65:\"/var/www/wordpress/wp-includes/blocks/template-part/theme.min.css\";i:468;s:68:\"/var/www/wordpress/wp-includes/blocks/term-description/style-rtl.css\";i:469;s:72:\"/var/www/wordpress/wp-includes/blocks/term-description/style-rtl.min.css\";i:470;s:64:\"/var/www/wordpress/wp-includes/blocks/term-description/style.css\";i:471;s:68:\"/var/www/wordpress/wp-includes/blocks/term-description/style.min.css\";i:472;s:65:\"/var/www/wordpress/wp-includes/blocks/text-columns/editor-rtl.css\";i:473;s:69:\"/var/www/wordpress/wp-includes/blocks/text-columns/editor-rtl.min.css\";i:474;s:61:\"/var/www/wordpress/wp-includes/blocks/text-columns/editor.css\";i:475;s:65:\"/var/www/wordpress/wp-includes/blocks/text-columns/editor.min.css\";i:476;s:64:\"/var/www/wordpress/wp-includes/blocks/text-columns/style-rtl.css\";i:477;s:68:\"/var/www/wordpress/wp-includes/blocks/text-columns/style-rtl.min.css\";i:478;s:60:\"/var/www/wordpress/wp-includes/blocks/text-columns/style.css\";i:479;s:64:\"/var/www/wordpress/wp-includes/blocks/text-columns/style.min.css\";i:480;s:57:\"/var/www/wordpress/wp-includes/blocks/verse/style-rtl.css\";i:481;s:61:\"/var/www/wordpress/wp-includes/blocks/verse/style-rtl.min.css\";i:482;s:53:\"/var/www/wordpress/wp-includes/blocks/verse/style.css\";i:483;s:57:\"/var/www/wordpress/wp-includes/blocks/verse/style.min.css\";i:484;s:58:\"/var/www/wordpress/wp-includes/blocks/video/editor-rtl.css\";i:485;s:62:\"/var/www/wordpress/wp-includes/blocks/video/editor-rtl.min.css\";i:486;s:54:\"/var/www/wordpress/wp-includes/blocks/video/editor.css\";i:487;s:58:\"/var/www/wordpress/wp-includes/blocks/video/editor.min.css\";i:488;s:57:\"/var/www/wordpress/wp-includes/blocks/video/style-rtl.css\";i:489;s:61:\"/var/www/wordpress/wp-includes/blocks/video/style-rtl.min.css\";i:490;s:53:\"/var/www/wordpress/wp-includes/blocks/video/style.css\";i:491;s:57:\"/var/www/wordpress/wp-includes/blocks/video/style.min.css\";i:492;s:57:\"/var/www/wordpress/wp-includes/blocks/video/theme-rtl.css\";i:493;s:61:\"/var/www/wordpress/wp-includes/blocks/video/theme-rtl.min.css\";i:494;s:53:\"/var/www/wordpress/wp-includes/blocks/video/theme.css\";i:495;s:57:\"/var/www/wordpress/wp-includes/blocks/video/theme.min.css\";}','yes'), -(122,'recovery_keys','a:0:{}','yes'), -(123,'theme_mods_twentytwentythree','a:1:{s:18:\"custom_css_post_id\";i:-1;}','yes'), -(124,'https_detection_errors','a:1:{s:23:\"ssl_verification_failed\";a:1:{i:0;s:24:\"SSL verification failed.\";}}','yes'), -(125,'_site_transient_update_core','O:8:\"stdClass\":4:{s:7:\"updates\";a:1:{i:0;O:8:\"stdClass\":10:{s:8:\"response\";s:6:\"latest\";s:8:\"download\";s:57:\"https://downloads.wordpress.org/release/wordpress-6.3.zip\";s:6:\"locale\";s:5:\"en_US\";s:8:\"packages\";O:8:\"stdClass\":5:{s:4:\"full\";s:57:\"https://downloads.wordpress.org/release/wordpress-6.3.zip\";s:10:\"no_content\";s:68:\"https://downloads.wordpress.org/release/wordpress-6.3-no-content.zip\";s:11:\"new_bundled\";s:69:\"https://downloads.wordpress.org/release/wordpress-6.3-new-bundled.zip\";s:7:\"partial\";s:0:\"\";s:8:\"rollback\";s:0:\"\";}s:7:\"current\";s:3:\"6.3\";s:7:\"version\";s:3:\"6.3\";s:11:\"php_version\";s:5:\"7.0.0\";s:13:\"mysql_version\";s:3:\"5.0\";s:11:\"new_bundled\";s:3:\"6.1\";s:15:\"partial_version\";s:0:\"\";}}s:12:\"last_checked\";i:1691646717;s:15:\"version_checked\";s:3:\"6.3\";s:12:\"translations\";a:0:{}}','no'), -(127,'_site_transient_update_plugins','O:8:\"stdClass\":5:{s:12:\"last_checked\";i:1691646718;s:8:\"response\";a:0:{}s:12:\"translations\";a:0:{}s:9:\"no_update\";a:2:{s:19:\"akismet/akismet.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:21:\"w.org/plugins/akismet\";s:4:\"slug\";s:7:\"akismet\";s:6:\"plugin\";s:19:\"akismet/akismet.php\";s:11:\"new_version\";s:3:\"5.2\";s:3:\"url\";s:38:\"https://wordpress.org/plugins/akismet/\";s:7:\"package\";s:54:\"https://downloads.wordpress.org/plugin/akismet.5.2.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:60:\"https://ps.w.org/akismet/assets/icon-256x256.png?rev=2818463\";s:2:\"1x\";s:60:\"https://ps.w.org/akismet/assets/icon-128x128.png?rev=2818463\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:63:\"https://ps.w.org/akismet/assets/banner-1544x500.png?rev=2900731\";s:2:\"1x\";s:62:\"https://ps.w.org/akismet/assets/banner-772x250.png?rev=2900731\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"5.8\";}s:9:\"hello.php\";O:8:\"stdClass\":10:{s:2:\"id\";s:25:\"w.org/plugins/hello-dolly\";s:4:\"slug\";s:11:\"hello-dolly\";s:6:\"plugin\";s:9:\"hello.php\";s:11:\"new_version\";s:5:\"1.7.2\";s:3:\"url\";s:42:\"https://wordpress.org/plugins/hello-dolly/\";s:7:\"package\";s:60:\"https://downloads.wordpress.org/plugin/hello-dolly.1.7.2.zip\";s:5:\"icons\";a:2:{s:2:\"2x\";s:64:\"https://ps.w.org/hello-dolly/assets/icon-256x256.jpg?rev=2052855\";s:2:\"1x\";s:64:\"https://ps.w.org/hello-dolly/assets/icon-128x128.jpg?rev=2052855\";}s:7:\"banners\";a:2:{s:2:\"2x\";s:67:\"https://ps.w.org/hello-dolly/assets/banner-1544x500.jpg?rev=2645582\";s:2:\"1x\";s:66:\"https://ps.w.org/hello-dolly/assets/banner-772x250.jpg?rev=2052855\";}s:11:\"banners_rtl\";a:0:{}s:8:\"requires\";s:3:\"4.6\";}}s:7:\"checked\";a:2:{s:19:\"akismet/akismet.php\";s:3:\"5.2\";s:9:\"hello.php\";s:5:\"1.7.2\";}}','no'), -(128,'_site_transient_timeout_theme_roots','1691648517','no'), -(129,'_site_transient_theme_roots','a:3:{s:15:\"twentytwentyone\";s:7:\"/themes\";s:17:\"twentytwentythree\";s:7:\"/themes\";s:15:\"twentytwentytwo\";s:7:\"/themes\";}','no'), -(130,'_site_transient_update_themes','O:8:\"stdClass\":5:{s:12:\"last_checked\";i:1691646718;s:7:\"checked\";a:3:{s:15:\"twentytwentyone\";s:3:\"1.9\";s:17:\"twentytwentythree\";s:3:\"1.2\";s:15:\"twentytwentytwo\";s:3:\"1.5\";}s:8:\"response\";a:0:{}s:9:\"no_update\";a:3:{s:15:\"twentytwentyone\";a:6:{s:5:\"theme\";s:15:\"twentytwentyone\";s:11:\"new_version\";s:3:\"1.8\";s:3:\"url\";s:45:\"https://wordpress.org/themes/twentytwentyone/\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/theme/twentytwentyone.1.8.zip\";s:8:\"requires\";s:3:\"5.3\";s:12:\"requires_php\";s:3:\"5.6\";}s:17:\"twentytwentythree\";a:6:{s:5:\"theme\";s:17:\"twentytwentythree\";s:11:\"new_version\";s:3:\"1.2\";s:3:\"url\";s:47:\"https://wordpress.org/themes/twentytwentythree/\";s:7:\"package\";s:63:\"https://downloads.wordpress.org/theme/twentytwentythree.1.2.zip\";s:8:\"requires\";s:3:\"6.1\";s:12:\"requires_php\";s:3:\"5.6\";}s:15:\"twentytwentytwo\";a:6:{s:5:\"theme\";s:15:\"twentytwentytwo\";s:11:\"new_version\";s:3:\"1.4\";s:3:\"url\";s:45:\"https://wordpress.org/themes/twentytwentytwo/\";s:7:\"package\";s:61:\"https://downloads.wordpress.org/theme/twentytwentytwo.1.4.zip\";s:8:\"requires\";s:3:\"5.9\";s:12:\"requires_php\";s:3:\"5.6\";}}s:12:\"translations\";a:0:{}}','no'), -(132,'can_compress_scripts','0','yes'), -(133,'_site_transient_timeout_wp_remote_block_patterns_63ba30730e414de2219f2d1f17ebfde9','1691650383','no'), -(134,'_site_transient_wp_remote_block_patterns_63ba30730e414de2219f2d1f17ebfde9','a:46:{i:0;O:8:\"stdClass\":7:{s:2:\"id\";i:310547;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:40:\"Cover Poster on Left, Paragraph on Right\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3610:\"\n
\n
\n
\"\"
\n
\n

Wardell

\n\n\n\n

gray

\n\n\n\n

Plays

\n\n\n\n

Bebop &

\n\n\n\n

SWING

\n
\n
\n\n\n\n
\n

Wardell Gray was born in Oklahoma City, the youngest of four children. His early childhood years were spent in Oklahoma, before moving with his family to Detroit in 1929.

\n\n\n\n

In early 1935, Gray began attending Northeastern High School, and then transferred to Cass Technical High School, which is noted for having Donald Byrd, Lucky Thompson and Al McKibbon as alumni.

\n\n\n\n\n\n\n\n
\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:73:\"core/button,core/buttons,core/cover,core/group,core/paragraph,core/spacer\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:6343:\"\n
\n
\n
\"\"
\n
\n

Wardell

\n\n\n\n

gray

\n\n\n\n

Plays

\n\n\n\n

Bebop &

\n\n\n\n

SWING

\n
\n
\n\n\n\n
\n

Wardell Gray was born in Oklahoma City, the youngest of four children. His early childhood years were spent in Oklahoma, before moving with his family to Detroit in 1929.

\n\n\n\n

In early 1935, Gray began attending Northeastern High School, and then transferred to Cass Technical High School, which is noted for having Donald Byrd, Lucky Thompson and Al McKibbon as alumni.

\n\n\n\n\n\n\n\n
\n
\n
\n
\n\";}i:1;O:8:\"stdClass\":7:{s:2:\"id\";i:309935;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:45:\"Centered image with two-tone background color\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1278:\"\n
\n
\n
\n\n\n\n
\"\"
\n\n\n\n
\n\n\n\n

Etcetera

\n\n\n\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:18:\"Gradient, Two-Tone\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:57:\"core/cover,core/group,core/heading,core/image,core/spacer\";}s:14:\"category_slugs\";a:3:{i:0;s:6:\"banner\";i:1;s:6:\"images\";i:2;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2134:\"\n
\n
\n
\n\n\n\n
\"\"
\n\n\n\n
\n\n\n\n

Etcetera

\n\n\n\n
\n
\n
\n\";}i:2;O:8:\"stdClass\":7:{s:2:\"id\";i:309925;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:43:\"Fullwidth Dark Banner with Heading Top Left\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1031:\"\n
\"\"
\n
\n

bud!

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:16:\"Jazz, Fulllwidth\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:36:\"core/cover,core/group,core/paragraph\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:1697:\"\n
\"\"
\n
\n

bud!

\n
\n
\n\";}i:3;O:8:\"stdClass\":7:{s:2:\"id\";i:309230;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:44:\"Fullwidth cover with repeating gradient text\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1724:\"\n
\"\"
\n
\n\n\n\n
\n

DJANGO

\n\n\n\n

DJANGO

\n\n\n\n

DJANGO

\n\n\n\n

DJANGO

\n
\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:48:\"Fullwidth, Background Image, Gradient, Uppercase\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:48:\"core/cover,core/group,core/paragraph,core/spacer\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"banner\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3135:\"\n
\"\"
\n
\n\n\n\n
\n

DJANGO

\n\n\n\n

DJANGO

\n\n\n\n

DJANGO

\n\n\n\n

DJANGO

\n
\n\n\n\n
\n
\n\";}i:4;O:8:\"stdClass\":7:{s:2:\"id\";i:309224;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:72:\"Fullwidth, vertically aligned headline on right with description on left\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2130:\"\n
\n
\n
\n

Let ’em Roll is an album by American organist Big John Patton recorded in 1965 and released on the Blue Note label.

\n\n\n\n\n
\n\n\n\n
\n

Let
‘EM
Roll

\n\n\n\n

Big
John
Patton

\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:60:\"vertically, bold, jazz, shop, store, headline, hero, product\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:61:\"core/button,core/buttons,core/cover,core/group,core/paragraph\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3726:\"\n
\n
\n
\n

Let \'em Roll is an album by American organist Big John Patton recorded in 1965 and released on the Blue Note label.

\n\n\n\n\n
\n\n\n\n
\n

Let
\'EM
Roll

\n\n\n\n

Big
John
Patton

\n
\n
\n
\n\";}i:5;O:8:\"stdClass\":7:{s:2:\"id\";i:309236;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:60:\"Fullwidth headline with links and gradient offset background\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1893:\"\n
\n
\n\n\n\n
\n
\n

MONK.

\n
\n\n\n\n
\n
\n

A new collection

\n\n\n\n

Learn More →

\n
\n
\n
\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:41:\"Offset, Gradient, Jazz, Headline, Feature\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:48:\"core/cover,core/group,core/paragraph,core/spacer\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3195:\"\n
\n
\n\n\n\n
\n
\n

MONK.

\n
\n\n\n\n
\n
\n

A new collection

\n\n\n\n

Learn More →

\n
\n
\n
\n\n\n\n
\n
\n\";}i:6;O:8:\"stdClass\":7:{s:2:\"id\";i:308937;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:42:\"Heading, Paragraph, Button with Two Images\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2550:\"\n
\n
\n
\n

Time for an adventure

\n\n\n\n
\n\n\n\n

Explore our network of trails that lead through a variety of woodland habitats and observe the diverse flora that call this area home.

\n\n\n\n
\n\n\n\n\n
\n\n\n\n
\n
\n
\n\n\n\n
\"\"
\n
\n\n\n\n
\"\"
\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:97:\"core/button,core/buttons,core/cover,core/group,core/heading,core/image,core/paragraph,core/spacer\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:4102:\"\n
\n
\n
\n

Time for an adventure

\n\n\n\n
\n\n\n\n

Explore our network of trails that lead through a variety of woodland habitats and observe the diverse flora that call this area home.

\n\n\n\n
\n\n\n\n\n
\n\n\n\n
\n
\n
\n\n\n\n
\"\"
\n
\n\n\n\n
\"\"
\n
\n
\n
\n\";}i:7;O:8:\"stdClass\":7:{s:2:\"id\";i:308949;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:42:\"Bold sale banner with geometric background\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1663:\"\n
\"\"
\n
\n

Enjoy

\n\n\n\n

20% Off

\n\n\n\n
\n\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:43:\"store, shop, coupon, jazz, background image\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:73:\"core/button,core/buttons,core/cover,core/group,core/paragraph,core/spacer\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2819:\"\n
\"\"
\n
\n

Enjoy

\n\n\n\n

20% Off

\n\n\n\n
\n\n\n\n\n
\n
\n\";}i:8;O:8:\"stdClass\":7:{s:2:\"id\";i:308924;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:47:\"Offset bold paragraph text with varying opacity\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1592:\"\n
\n
\n

Embark

\n\n\n\n

ON A HIKING

\n\n\n\n

adventure and explore the beauty of nature’s best…

\n\n\n\n

In the

\n\n\n\n

WOODS.

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:36:\"core/cover,core/group,core/paragraph\";}s:14:\"category_slugs\";a:1:{i:0;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3052:\"\n
\n
\n

Embark

\n\n\n\n

ON A HIKING

\n\n\n\n

adventure and explore the beauty of nature\'s best…

\n\n\n\n

In the

\n\n\n\n

WOODS.

\n
\n
\n\";}i:9;O:8:\"stdClass\":7:{s:2:\"id\";i:308916;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:40:\"Offset text with a brutalist design vibe\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1389:\"\n
\n
\n

✴︎ Walk

\n\n\n\n

In the

\n\n\n\n

Park

\n\n\n\n

—01.03

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:36:\"core/cover,core/group,core/paragraph\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"banner\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2631:\"\n
\n
\n

✴︎ Walk

\n\n\n\n

In the

\n\n\n\n

Park

\n\n\n\n

—01.03

\n
\n
\n\";}i:10;O:8:\"stdClass\":7:{s:2:\"id\";i:308901;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:40:\"Fullscreen image with right content area\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2040:\"\n
\n
\n
\"\"
\n\n\n\n
\n

wAndering through the woods

\n\n\n\n
\n\n\n\n

Explore our network of trails that lead through a variety of woodland habitats and observe the diverse flora that call this area home.

\n\n\n\n
\n\n\n\n\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:97:\"core/button,core/buttons,core/cover,core/group,core/heading,core/image,core/paragraph,core/spacer\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3261:\"\n
\n
\n
\"\"
\n\n\n\n
\n

wAndering through the woods

\n\n\n\n
\n\n\n\n

Explore our network of trails that lead through a variety of woodland habitats and observe the diverse flora that call this area home.

\n\n\n\n
\n\n\n\n\n
\n
\n
\n\";}i:11;O:8:\"stdClass\":7:{s:2:\"id\";i:308871;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:46:\"Cover Image with Bold Heading and Button, Left\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1525:\"\n
\"\"
\n
\n

Take a hike and wAnder through the woods

\n
\n\n\n\n
\n\n\n\n\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:71:\"core/button,core/buttons,core/cover,core/group,core/heading,core/spacer\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2443:\"\n
\"\"
\n
\n

Take a hike and wAnder through the woods

\n
\n\n\n\n
\n\n\n\n\n
\n\";}i:12;O:8:\"stdClass\":7:{s:2:\"id\";i:308868;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:40:\"Cover Image with Bold Heading and Button\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1533:\"\n
\"\"
\n
\n

Embark on a hiking adventure and explore the beauty of the woods.

\n
\n\n\n\n
\n\n\n\n\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:71:\"core/button,core/buttons,core/cover,core/group,core/heading,core/spacer\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2449:\"\n
\"\"
\n
\n

Embark on a hiking adventure and explore the beauty of the woods.

\n
\n\n\n\n
\n\n\n\n\n
\n\";}i:13;O:8:\"stdClass\":7:{s:2:\"id\";i:303828;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:30:\"Fullscreen cover image gallery\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:895:\"\n
\n
\n
\"\"
\n\n\n\n
\"\"
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:43:\"gallery, images, columns, background, cover\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:32:\"core/cover,core/group,core/image\";}s:14:\"category_slugs\";a:1:{i:0;s:7:\"gallery\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:1259:\"\n
\n
\n
\"\"
\n\n\n\n
\"\"
\n
\n
\n\";}i:14;O:8:\"stdClass\":7:{s:2:\"id\";i:277265;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:37:\"Fullwidth posts with uppercase titles\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:6991:\"\n
\n
\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:30:\"star, posts, loop, blog, index\";s:16:\"wpop_description\";s:62:\"A fullwidth posts pattern with large titles and start accents.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:10:\"core/query\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:182:\"core/group,core/paragraph,core/post-date,core/post-template,core/post-terms,core/post-title,core/query,core/query-pagination,core/query-pagination-next,core/query-pagination-previous\";}s:14:\"category_slugs\";a:1:{i:0;s:5:\"query\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3502:\"\n
\n
\n\n
\n
\n
\n

✴︎

\n\n\n
\n\n\n
\n
\n\n\n\n
\n\n
\n\n\n\n
\n\n\n\n
\n
\n\";}i:15;O:8:\"stdClass\":7:{s:2:\"id\";i:277127;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:33:\"Fullwidth posts titles with dates\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:6509:\"\n
\n
\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:31:\"Posts, Query, Loop, Blog, Index\";s:16:\"wpop_description\";s:62:\"A fullwidth posts pattern with large titles and numeral dates.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:10:\"core/query\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:151:\"core/group,core/post-date,core/post-template,core/post-title,core/query,core/query-pagination,core/query-pagination-next,core/query-pagination-previous\";}s:14:\"category_slugs\";a:1:{i:0;s:5:\"query\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:3583:\"\n
\n
\n\n
\n
\n\n
\n\n\n
\n\n
\n\n\n\n
\n\n\n\n
\n
\n\";}i:16;O:8:\"stdClass\":7:{s:2:\"id\";i:229101;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:29:\"Text-only header with tagline\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3727:\"\n
\n
\n

Block Pattern Directory

\n\n

Beautifully designed patterns ready to go with a simple copy/paste

\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:53:\"Header with site title, tagline and navigation links.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:60:\"core/group,core/navigation,core/site-tagline,core/site-title\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"header\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:966:\"\n
\n
\n
\n\n
\n\n\n
\n
\n\";}i:17;O:8:\"stdClass\":7:{s:2:\"id\";i:229105;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:26:\"Simple header with tagline\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:4296:\"\n
\n
\n
\"Site
\n\n\n

Block Pattern Directory

\n\n

Beautifully designed patterns ready to go with a simple copy/paste

\n
\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:92:\"Header with site logo, title and tagline on the left and with navigation links on the right.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:75:\"core/group,core/navigation,core/site-logo,core/site-tagline,core/site-title\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"header\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1389:\"\n
\n
\n
\n\n\n
\n\n
\n
\n\n\n
\n
\n\";}i:18;O:8:\"stdClass\":7:{s:2:\"id\";i:229111;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:36:\"Fullwidth site title and menu button\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3499:\"\n

Block Pattern Directory

\n\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:51:\"Header with site title and a hamburger menu button.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:42:\"core/group,core/navigation,core/site-title\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"header\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:794:\"\n
\n\n
\n\";}i:19;O:8:\"stdClass\":7:{s:2:\"id\";i:229116;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:32:\"Fullwidth header with hero image\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:4827:\"\n
\n
\n\n\n\n
\n\n\n\n
\"\"
\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:65:\"Header on a white background followed by a full-width hero image.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:80:\"core/cover,core/group,core/navigation,core/site-logo,core/site-title,core/spacer\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"header\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:2566:\"\n
\n
\n
\n\n\n
\n
\n\n\n
\n\n\n\n
\"\"
\n
\n
\n
\n\";}i:20;O:8:\"stdClass\":7:{s:2:\"id\";i:229092;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:41:\"Header inside full-width background image\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:4895:\"\n
\n
\"\"
\n
\n\n\n\n
\n\n\n\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:100:\"Simple header with logo, site title, navigation and a full-width background image with dark overlay.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:80:\"core/cover,core/group,core/navigation,core/site-logo,core/site-title,core/spacer\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"header\";}s:13:\"keyword_slugs\";a:1:{i:0;s:4:\"core\";}s:15:\"pattern_content\";s:2554:\"\n
\n
\"\"
\n
\n
\n\n
\n\n\n
\n\n\n\n
\n
\n
\n\";}i:21;O:8:\"stdClass\":7:{s:2:\"id\";i:229097;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:34:\"Simple header with dark background\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3967:\"\n
\n
\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:76:\"Simple header with logo, site title, navigation links and a dark background.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:57:\"core/group,core/navigation,core/site-logo,core/site-title\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"header\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1232:\"\n
\n
\n
\n\n
\n\n\n
\n
\n\";}i:22;O:8:\"stdClass\":7:{s:2:\"id\";i:229080;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:25:\"Centered header with logo\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3794:\"\n
\n
\"Site
\n\n

Block Pattern Directory

\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:65:\"Center aligned header with logo, site title and navigation links.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:57:\"core/group,core/navigation,core/site-logo,core/site-title\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"header\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:926:\"\n
\n
\n\n\n\n
\n
\n\";}i:23;O:8:\"stdClass\":7:{s:2:\"id\";i:229084;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:37:\"Fullwidth header with large font size\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3627:\"\n

Block Pattern Directory

\n\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:80:\"Header with a large site title and navigation links in the same large font size.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:42:\"core/group,core/navigation,core/site-title\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"header\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:811:\"\n
\n\n
\n\";}i:24;O:8:\"stdClass\":7:{s:2:\"id\";i:229088;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:13:\"Simple header\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3830:\"\n
\n
\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:51:\"Simple header with logo, site title and navigation.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/header\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:57:\"core/group,core/navigation,core/site-logo,core/site-title\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"header\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1021:\"\n
\n
\n
\n\n
\n\n\n
\n
\n\";}i:25;O:8:\"stdClass\":7:{s:2:\"id\";i:229123;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:33:\"Centered footer with social links\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:4180:\"\n
\n
\n

Proudly powered by WordPress

\n\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:82:\"Centered footer with the sentence \"Proudly powered by WordPress\" and social links.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:25:\"core/group,core/paragraph\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1495:\"\n
\n
\n

Proudly powered by WordPress

\n\n\n\n\n
\n
\n\";}i:26;O:8:\"stdClass\":7:{s:2:\"id\";i:229127;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:47:\"Footer with search, site title, and credit line\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2962:\"\n
\n
\n
\n

Search

\n\n\n
\n\n\n\n
\n
\n

Social

\n\n\n\n
\n

Facebook

\n\n\n\n

Instagram

\n\n\n\n

Twitter

\n
\n
\n
\n
\n\n\n\n
\n\n\n\n
\n\n\n\n\n

Proudly powered by WordPress

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:88:\"Footer with search field and site title on the left, and small credit line on the right.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:65:\"core/group,core/paragraph,core/search,core/site-title,core/spacer\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:3254:\"\n
\n
\n
\n

Search

\n\n\n
\n\n\n\n
\n
\n

Social

\n\n\n\n
\n

Facebook

\n\n\n\n

Instagram

\n\n\n\n

Twitter

\n
\n
\n
\n
\n\n\n\n
\n\n\n\n
\n
\n\n\n\n

Proudly powered by WordPress

\n
\n
\n\";}i:27;O:8:\"stdClass\":7:{s:2:\"id\";i:229131;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:38:\"Footer with site title and credit line\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:840:\"\n
\n
\n\n\n\n\n

Proudly powered by WordPress

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:64:\"Footer with site title on the left and credit line on the right.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:41:\"core/group,core/paragraph,core/site-title\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1095:\"\n
\n
\n
\n\n\n\n

Proudly powered by WordPress

\n
\n
\n\";}i:28;O:8:\"stdClass\":7:{s:2:\"id\";i:229135;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:38:\"Footer with navigation and credit line\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3733:\"\n
\n
\n
\n\n\n\n

Proudly powered by WordPress

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:64:\"Footer with navigation on the left and credit line on the right.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:41:\"core/group,core/navigation,core/paragraph\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1174:\"\n
\n
\n
\n\n\n\n

Proudly powered by WordPress

\n
\n
\n\";}i:29;O:8:\"stdClass\":7:{s:2:\"id\";i:229139;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:56:\"Fullwidth footer with background color and three columns\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2963:\"\n
\n
\n
\n

Location

\n\n\n\n

2020 Lomita Blvd, 
Torrance, CA 90101
United States

\n\n\n\n
\n
\n\n\n\n
\n

Pages

\n\n\n\n\n\n
\n
\n\n\n\n
\n

Follow us

\n\n\n\n
\n

Facebook

\n\n\n\n

Instagram

\n\n\n\n

Twitter

\n
\n\n\n\n
\n
\n
\n\n\n\n
\n

Proudly powered by WordPress

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:57:\"Text-only footer with background color and three columns.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:78:\"core/column,core/columns,core/group,core/navigation,core/paragraph,core/spacer\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:3225:\"\n
\n
\n
\n

Location

\n\n\n\n

2020 Lomita Blvd, 
Torrance, CA 90101
United States

\n\n\n\n
\n
\n\n\n\n
\n

Pages

\n\n\n\n\n\n
\n
\n\n\n\n
\n

Follow us

\n\n\n\n
\n

Facebook

\n\n\n\n

Instagram

\n\n\n\n

Twitter

\n
\n\n\n\n
\n
\n
\n\n\n\n
\n

Proudly powered by WordPress

\n
\n
\n\";}i:30;O:8:\"stdClass\":7:{s:2:\"id\";i:229143;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:33:\"Centered footer with social links\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:4120:\"\n
\"Site
\n\n\n

Proudly powered by WordPress

\n\n\n\n\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:71:\"Footer with centered site title, tagline, social links and credit line.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.2\";s:25:\"wpop_contains_block_types\";s:75:\"core/group,core/paragraph,core/site-logo,core/social-link,core/social-links\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1532:\"\n
\n\n\n

Proudly powered by WordPress

\n\n\n\n\n
\n\";}i:31;O:8:\"stdClass\":7:{s:2:\"id\";i:229147;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:52:\"Fullwidth footer with navigation, credit, and social\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:4597:\"\n
\n

Block Pattern Directory

\n\n\n
\n

Proudly powered by WordPress

\n
\n\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:87:\"Footer with site title on the left, credit in the middle and social links on the right.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:76:\"core/group,core/paragraph,core/site-title,core/social-link,core/social-links\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1869:\"\n
\n
\n\n\n
\n

Proudly powered by WordPress

\n
\n\n\n\n\n
\n
\n\";}i:32;O:8:\"stdClass\":7:{s:2:\"id\";i:229151;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:19:\"Left-aligned footer\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2835:\"\n
\n

Block Pattern Directory

\n\n\n

2020 Lomita Blvd, 
Torrance, CA 90101
United States

\n\n\n\n

Proudly powered by WordPress

\n\n\n\n
\n
\n\n\n\n
\n
\n

Pages

\n\n\n\n\n\n
\n
\n\n\n\n
\n

Social

\n\n\n\n
\n

Facebook

\n\n\n\n

Instagram

\n\n\n\n

Twitter

\n
\n\n\n\n
\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:44:\"Left-aligned footer with just a credit line.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:25:\"core/template-part/footer\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:69:\"core/group,core/navigation,core/paragraph,core/site-title,core/spacer\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"footer\";i:1;s:9:\"wireframe\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:2939:\"\n
\n
\n\n\n

2020 Lomita Blvd, 
Torrance, CA 90101
United States

\n\n\n\n

Proudly powered by WordPress

\n\n\n\n
\n
\n\n\n\n
\n
\n

Pages

\n\n\n\n\n\n
\n
\n\n\n\n
\n

Social

\n\n\n\n
\n

Facebook

\n\n\n\n

Instagram

\n\n\n\n

Twitter

\n
\n\n\n\n
\n
\n
\n
\n\";}i:33;O:8:\"stdClass\":7:{s:2:\"id\";i:201;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:32:\"Three columns with offset images\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1330:\"\n
\n
\n
\"Close-up,
\n
\n\n\n\n
\n
\n\n\n\n
\n\n\n\n
\"Close-up,
\n
\n\n\n\n
\n
\"Close-up
\n\n\n\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:33:\"Three columns with offset images.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:47:\"core/column,core/columns,core/image,core/spacer\";}s:14:\"category_slugs\";a:2:{i:0;s:7:\"gallery\";i:1;s:6:\"images\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1753:\"\n
\n
\n
\"Close-up,
\n
\n\n\n\n
\n
\n\n\n\n
\n\n\n\n
\"Close-up,
\n
\n\n\n\n
\n
\"Close-up
\n\n\n\n
\n
\n
\n\";}i:34;O:8:\"stdClass\":7:{s:2:\"id\";i:200;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:21:\"Three columns of text\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1078:\"\n
\n
\n

Virtual Tour ↗

\n\n\n\n

Get a virtual tour of the museum. Ideal for schools and events.

\n
\n\n\n\n
\n

Current Shows ↗

\n\n\n\n

Stay updated and see our current exhibitions here.

\n
\n\n\n\n
\n

Useful Info ↗

\n\n\n\n

Get to know our opening times, ticket prices and discounts.

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:22:\"Three columns of text.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:52:\"core/column,core/columns,core/heading,core/paragraph\";}s:14:\"category_slugs\";a:3:{i:0;s:7:\"columns\";i:1;s:8:\"featured\";i:2;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1496:\"\n
\n
\n

Virtual Tour ↗

\n\n\n\n

Get a virtual tour of the museum. Ideal for schools and events.

\n
\n\n\n\n
\n

Current Shows ↗

\n\n\n\n

Stay updated and see our current exhibitions here.

\n
\n\n\n\n
\n

Useful Info ↗

\n\n\n\n

Get to know our opening times, ticket prices and discounts.

\n
\n
\n\";}i:35;O:8:\"stdClass\":7:{s:2:\"id\";i:199;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:34:\"Three columns with images and text\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3496:\"\n
\n
\n
ECOSYSTEM
\n\n\n\n

Positive growth.

\n
\n\n\n\n
\n\n\n\n
\n
\n
\n

Nature, in the common sense, refers to essences unchanged by man; space, the air, the river, the leaf. Art is applied to the mixture of his will with the same things, as in a house, a canal, a statue, a picture.

\n\n\n\n

But his operations taken together are so insignificant, a little chipping, baking, patching, and washing, that in an impression so grand as that of the world on the human mind, they do not vary the result.

\n
\n\n\n\n
\n
\n\n\n\n
\"The
\n
\n\n\n\n
\n
\"Wind
\n
\n
\n\n\n\n
\n
\n
\"The
\n
\n\n\n\n
\n
\n\n\n\n

Undoubtedly we have no questions to ask which are unanswerable. We must trust the perfection of the creation so far, as to believe that whatever curiosity the order of things has awakened in our minds, the order of things can satisfy. Every man’s condition is a solution in hieroglyphic to those inquiries he would put.

\n
\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:77:\"Three columns with images and text, with vertical spacing for an offset look.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:86:\"core/column,core/columns,core/group,core/heading,core/image,core/paragraph,core/spacer\";}s:14:\"category_slugs\";a:5:{i:0;s:7:\"columns\";i:1;s:8:\"featured\";i:2;s:7:\"gallery\";i:3;s:6:\"images\";i:4;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:5124:\"\n
\n
\n
ECOSYSTEM
\n\n\n\n

Positive growth.

\n
\n\n\n\n
\n\n\n\n
\n
\n
\n

Nature, in the common sense, refers to essences unchanged by man; space, the air, the river, the leaf. Art is applied to the mixture of his will with the same things, as in a house, a canal, a statue, a picture.

\n\n\n\n

But his operations taken together are so insignificant, a little chipping, baking, patching, and washing, that in an impression so grand as that of the world on the human mind, they do not vary the result.

\n
\n\n\n\n
\n
\n\n\n\n
\"The
\n
\n\n\n\n
\n
\"Wind
\n
\n
\n\n\n\n
\n
\n
\"The
\n
\n\n\n\n
\n
\n\n\n\n

Undoubtedly we have no questions to ask which are unanswerable. We must trust the perfection of the creation so far, as to believe that whatever curiosity the order of things has awakened in our minds, the order of things can satisfy. Every man\'s condition is a solution in hieroglyphic to those inquiries he would put.

\n
\n
\n
\n
\n\";}i:36;O:8:\"stdClass\":7:{s:2:\"id\";i:197;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:39:\"Two columns of text with offset heading\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2240:\"\n
\n
\n\n\n\n
\n
\n

Oceanic Inspiration

\n
\n\n\n\n
\n
\n
\n
\n\n\n\n
\n
\n\n\n\n
\n

Winding veils round their heads, the women walked on deck. They were now moving steadily down the river, passing the dark shapes of ships at anchor, and London was a swarm of lights with a pale yellow canopy drooping above it. There were the lights of the great theatres, the lights of the long streets, lights that indicated huge squares of domestic comfort, lights that hung high in air.

\n
\n\n\n\n
\n

No darkness would ever settle upon those lamps, as no darkness had settled upon them for hundreds of years. It seemed dreadful that the town should blaze for ever in the same spot; dreadful at least to people going away to adventure upon the sea, and beholding it as a circumscribed mound, eternally burnt, eternally scarred. From the deck of the ship the great city appeared a crouched and cowardly figure, a sedentary miser.

\n
\n
\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:43:\"Two columns of text with an offset heading.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:77:\"core/column,core/columns,core/group,core/paragraph,core/separator,core/spacer\";}s:14:\"category_slugs\";a:2:{i:0;s:7:\"columns\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:2837:\"\n
\n
\n\n\n\n
\n
\n

Oceanic Inspiration

\n
\n\n\n\n
\n
\n
\n
\n\n\n\n
\n
\n\n\n\n
\n

Winding veils round their heads, the women walked on deck. They were now moving steadily down the river, passing the dark shapes of ships at anchor, and London was a swarm of lights with a pale yellow canopy drooping above it. There were the lights of the great theatres, the lights of the long streets, lights that indicated huge squares of domestic comfort, lights that hung high in air.

\n
\n\n\n\n
\n

No darkness would ever settle upon those lamps, as no darkness had settled upon them for hundreds of years. It seemed dreadful that the town should blaze for ever in the same spot; dreadful at least to people going away to adventure upon the sea, and beholding it as a circumscribed mound, eternally burnt, eternally scarred. From the deck of the ship the great city appeared a crouched and cowardly figure, a sedentary miser.

\n
\n
\n\n\n\n
\n
\n\";}i:37;O:8:\"stdClass\":7:{s:2:\"id\";i:196;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:41:\"Media and text in a full height container\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1445:\"\n
\n
\"Close-up
\n

What’s the problem?

\n\n\n\n

Trees are more important today than ever before. More than 10,000 products are reportedly made from trees. Through chemistry, the humble woodpile is yielding chemicals, plastics and fabrics that were beyond comprehension when an axe first felled a Texas tree.

\n\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:77:\"Media and text block with image to the left and text and button to the right.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:79:\"core/button,core/buttons,core/cover,core/heading,core/media-text,core/paragraph\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:2015:\"\n
\n
\"Close-up
\n

What\'s the problem?

\n\n\n\n

Trees are more important today than ever before. More than 10,000 products are reportedly made from trees. Through chemistry, the humble woodpile is yielding chemicals, plastics and fabrics that were beyond comprehension when an axe first felled a Texas tree.

\n\n\n\n\n
\n
\n\";}i:38;O:8:\"stdClass\":7:{s:2:\"id\";i:195;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:38:\"Media and text with image on the right\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:719:\"\n
\n

Shore with Blue Sea

\n\n\n\n

Eleanor Harris (American, 1901-1942)

\n
\"A
\n\n\n\n

\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:66:\"Media and text block with image to the right and text to the left.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:43:\"core/heading,core/media-text,core/paragraph\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1155:\"\n
\n

Shore with Blue Sea

\n\n\n\n

Eleanor Harris (American, 1901-1942)

\n
\"A
\n\n\n\n

\n\";}i:39;O:8:\"stdClass\":7:{s:2:\"id\";i:192;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:37:\"Media and text with image on the left\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:554:\"\n
\"Close-up,
\n

Open Spaces

\n\n\n\n

See case study ↗

\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:66:\"Media and text block with image to the left and text to the right.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:43:\"core/heading,core/media-text,core/paragraph\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"banner\";i:1;s:8:\"featured\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:844:\"\n
\"Close-up,
\n

Open Spaces

\n\n\n\n

See case study ↗

\n
\n\";}i:40;O:8:\"stdClass\":7:{s:2:\"id\";i:186;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:35:\"Large header with text and a button\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1508:\"\n
\n

Overseas:
1500 — 1960

\n\n\n\n
\n
\n

An exhibition about the different representations of the ocean throughout time, between the sixteenth and the twentieth century. Taking place in our Open Room in Floor 2.

\n\n\n\n
\n\n
\n
\n\n\n\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:62:\"Large header with background image and text and button on top.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:88:\"core/button,core/buttons,core/column,core/columns,core/cover,core/heading,core/paragraph\";}s:14:\"category_slugs\";a:1:{i:0;s:6:\"banner\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:2053:\"\n
\n

Overseas:
1500 — 1960

\n\n\n\n
\n
\n

An exhibition about the different representations of the ocean throughout time, between the sixteenth and the twentieth century. Taking place in our Open Room in Floor 2.

\n\n\n\n
\n\n
\n
\n\n\n\n
\n
\n
\n\";}i:41;O:8:\"stdClass\":7:{s:2:\"id\";i:185;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:35:\"Large header with left-aligned text\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1321:\"\n
\"\"
\n

Forest.

\n\n\n\n
\n
\n
\n\n\n\n

Even a child knows how valuable the forest is. The fresh, breathtaking smell of trees. Echoing birds flying above that dense magnitude. A stable climate, a sustainable diverse life and a source of culture. Yet, forests and other ecosystems hang in the balance, threatened to become croplands, pasture, and plantations.

\n
\n\n\n\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:29:\"Cover image with quote on top\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:75:\"core/column,core/columns,core/cover,core/heading,core/paragraph,core/spacer\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"banner\";i:1;s:8:\"featured\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1698:\"\n
\"\"
\n

Forest.

\n\n\n\n
\n
\n
\n\n\n\n

Even a child knows how valuable the forest is. The fresh, breathtaking smell of trees. Echoing birds flying above that dense magnitude. A stable climate, a sustainable diverse life and a source of culture. Yet, forests and other ecosystems hang in the balance, threatened to become croplands, pasture, and plantations.

\n
\n\n\n\n
\n
\n
\n\";}i:42;O:8:\"stdClass\":7:{s:2:\"id\";i:184;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:7:\"Heading\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:526:\"\n

We’re a studio in Berlin with an international practice in architecture, urban planning and interior design. We believe in sharing knowledge and promoting dialogue to increase the creative potential of collaboration.

\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:17:\"large text, title\";s:16:\"wpop_description\";s:12:\"Heading text\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:1:{i:0;s:12:\"core/heading\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:12:\"core/heading\";}s:14:\"category_slugs\";a:2:{i:0;s:8:\"featured\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:621:\"\n

We\'re a studio in Berlin with an international practice in architecture, urban planning and interior design. We believe in sharing knowledge and promoting dialogue to increase the creative potential of collaboration.

\n\";}i:43;O:8:\"stdClass\":7:{s:2:\"id\";i:27;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:5:\"Quote\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:688:\"\n
\n\n\n\n
\"A
\n\n\n\n
\n

“Contributing makes me feel like I’m being useful to the planet.”

\n— Anna Wong, Volunteer
\n\n\n\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:1:{i:0;s:10:\"core/quote\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:51:\"core/image,core/paragraph,core/quote,core/separator\";}s:14:\"category_slugs\";a:2:{i:0;s:12:\"testimonials\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1102:\"\n
\n\n\n\n
\"A
\n\n\n\n
\n

\"Contributing makes me feel like I\'m being useful to the planet.\"

\n— Anna Wong, Volunteer
\n\n\n\n
\n\";}i:44;O:8:\"stdClass\":7:{s:2:\"id\";i:29;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:29:\"Two columns of text and title\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1518:\"\n

The voyage had begun, and had begun happily with a soft blue sky, and a calm sea.

\n\n\n\n
\n
\n

They followed her on to the deck. All the smoke and the houses had disappeared, and the ship was out in a wide space of sea very fresh and clear though pale in the early light. They had left London sitting on its mud. A very thin line of shadow tapered on the horizon, scarcely thick enough to stand the burden of Paris, which nevertheless rested upon it. They were free of roads, free of mankind, and the same exhilaration at their freedom ran through them all.

\n
\n\n\n\n
\n

The ship was making her way steadily through small waves which slapped her and then fizzled like effervescing water, leaving a little border of bubbles and foam on either side. The colourless October sky above was thinly clouded as if by the trail of wood-fire smoke, and the air was wonderfully salt and brisk. Indeed it was too cold to stand still. Mrs. Ambrose drew her arm within her husband’s, and as they moved off it could be seen from the way in which her sloping cheek turned up to his that she had something private to communicate.

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:47:\"Two columns of text preceded by a long heading.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:52:\"core/column,core/columns,core/heading,core/paragraph\";}s:14:\"category_slugs\";a:2:{i:0;s:7:\"columns\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1711:\"\n

The voyage had begun, and had begun happily with a soft blue sky, and a calm sea.

\n\n\n\n
\n
\n

They followed her on to the deck. All the smoke and the houses had disappeared, and the ship was out in a wide space of sea very fresh and clear though pale in the early light. They had left London sitting on its mud. A very thin line of shadow tapered on the horizon, scarcely thick enough to stand the burden of Paris, which nevertheless rested upon it. They were free of roads, free of mankind, and the same exhilaration at their freedom ran through them all.

\n
\n\n\n\n
\n

The ship was making her way steadily through small waves which slapped her and then fizzled like effervescing water, leaving a little border of bubbles and foam on either side. The colourless October sky above was thinly clouded as if by the trail of wood-fire smoke, and the air was wonderfully salt and brisk. Indeed it was too cold to stand still. Mrs. Ambrose drew her arm within her husband\'s, and as they moved off it could be seen from the way in which her sloping cheek turned up to his that she had something private to communicate.

\n
\n
\n\";}i:45;O:8:\"stdClass\":7:{s:2:\"id\";i:19;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:23:\"Two images side by side\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:572:\"\n\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:41:\"An image gallery with two example images.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:23:\"core/gallery,core/image\";}s:14:\"category_slugs\";a:1:{i:0;s:7:\"gallery\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:704:\"\n\n\";}}','no'), -(135,'_site_transient_timeout_wp_remote_block_patterns_9878e052535700697ff756158aa990b2','1691650384','no'), -(136,'_site_transient_wp_remote_block_patterns_9878e052535700697ff756158aa990b2','a:14:{i:0;O:8:\"stdClass\":7:{s:2:\"id\";i:207567;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:11:\"Link in Bio\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:6630:\"\n

Block Pattern Directory

\n\n

Beautifully designed patterns ready to go with a simple copy/paste

\n\n\n
\n\n\n\n\n\n\n\n\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:3:\"6.1\";s:25:\"wpop_contains_block_types\";s:116:\"core/button,core/buttons,core/group,core/site-tagline,core/site-title,core/social-link,core/social-links,core/spacer\";}s:14:\"category_slugs\";a:2:{i:0;s:14:\"call-to-action\";i:1;s:8:\"featured\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:2665:\"\n
\n\n\n\n\n
\n\n\n\n\n\n\n\n\n
\n\";}i:1;O:8:\"stdClass\":7:{s:2:\"id\";i:732;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:21:\"Simple call to action\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:961:\"\n
\n
\n\n\n\n

GET IN TOUCH

\n\n\n\n

Schedule a Visit

\n\n\n\n\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:89:\"A container with a white background. Inside is a centered paragraph, heading, and button.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:75:\"core/button,core/buttons,core/group,core/heading,core/paragraph,core/spacer\";}s:14:\"category_slugs\";a:2:{i:0;s:7:\"buttons\";i:1;s:8:\"featured\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:1506:\"\n
\n
\n\n\n\n

GET IN TOUCH

\n\n\n\n

Schedule a Visit

\n\n\n\n\n\n\n\n
\n
\n\";}i:2;O:8:\"stdClass\":7:{s:2:\"id\";i:678;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:26:\"Three column pricing table\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3717:\"\n
\n
\n

Single

\n\n\n\n

Enrich our growing community.

\n\n\n\n
\n\n\n\n
    \n
  • General admission and member discounts for one adult
  • \n\n\n\n
  • One free ticket per special exhibition
  • \n\n\n\n
  • Two single-use guest passes per year
  • \n
\n\n\n\n\n
\n\n\n\n
\n

Family

\n\n\n\n

Support special exhibitions.

\n\n\n\n
\n\n\n\n
    \n
  • General admission and member discounts for two adults
  • \n\n\n\n
  • Four free tickets per special exhibition
  • \n\n\n\n
  • Four single-use guest passes per year
  • \n
\n\n\n\n\n
\n\n\n\n
\n

Patron

\n\n\n\n

Take support to the next level.

\n\n\n\n
\n\n\n\n
    \n
  • General admission and member discounts for two adults
  • \n\n\n\n
  • Five free tickets per special exhibition
  • \n\n\n\n
  • Six single-use guest passes per year
  • \n
\n\n\n\n\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:272:\"Three equal-width columns set up as a pricing table. The left column has a yellow background, the middle column has a light purple background, and the right column has a light blue background. Each column contains a heading, subheading, separator, list, and then a button.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:117:\"core/button,core/buttons,core/column,core/columns,core/heading,core/list,core/list-item,core/paragraph,core/separator\";}s:14:\"category_slugs\";a:2:{i:0;s:14:\"call-to-action\";i:1;s:8:\"featured\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:6125:\"\n
\n
\n

Single

\n\n\n\n

Enrich our growing community.

\n\n\n\n
\n\n\n\n
    \n
  • General admission and member discounts for one adult
  • \n\n\n\n
  • One free ticket per special exhibition
  • \n\n\n\n
  • Two single-use guest passes per year
  • \n
\n\n\n\n\n
\n\n\n\n
\n

Family

\n\n\n\n

Support special exhibitions.

\n\n\n\n
\n\n\n\n
    \n
  • General admission and member discounts for two adults
  • \n\n\n\n
  • Four free tickets per special exhibition
  • \n\n\n\n
  • Four single-use guest passes per year
  • \n
\n\n\n\n\n
\n\n\n\n
\n

Patron

\n\n\n\n

Take support to the next level.

\n\n\n\n
\n\n\n\n
    \n
  • General admission and member discounts for two adults
  • \n\n\n\n
  • Five free tickets per special exhibition
  • \n\n\n\n
  • Six single-use guest passes per year
  • \n
\n\n\n\n\n
\n
\n\";}i:3;O:8:\"stdClass\":7:{s:2:\"id\";i:669;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:31:\"Image and quote on a background\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2281:\"\n
\"\"
\n
\n

Even the bitterest fruit has sugar in it.

\n\n\n\n

– Terry a O’Neal

\n
\n
\n\n\n\n
\"\"
\n
\n

The trees that are slow to grow bear the best fruit.

\n\n\n\n

– Molière

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:221:\"Two media and text blocks. The top one has a pale green background. The text is on the left and contains a quote, and the image is on the right. The next block underneath has the image on the left, and quote on the right.\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:41:\"core/group,core/media-text,core/paragraph\";}s:14:\"category_slugs\";a:3:{i:0;s:8:\"featured\";i:1;s:6:\"images\";i:2;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:2404:\"\n
\"\"
\n
\n

Even the bitterest fruit has sugar in it.

\n\n\n\n

– Terry a O\'Neal

\n
\n
\n\n\n\n
\"\"
\n
\n

The trees that are slow to grow bear the best fruit.

\n\n\n\n

– Molière

\n
\n
\n\";}i:4;O:8:\"stdClass\":7:{s:2:\"id\";i:591;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:5:\"Event\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1687:\"\n
\n
\n

Opening
Party

\n\n\n\n

RSVP →

\n
\n
\"\"
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:0:\"\";s:19:\"wpop_viewport_width\";i:800;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:54:\"core/group,core/heading,core/media-text,core/paragraph\";}s:14:\"category_slugs\";a:3:{i:0;s:6:\"banner\";i:1;s:8:\"featured\";i:2;s:6:\"images\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:1617:\"\n
\n
\n

Opening
Party

\n\n\n\n

RSVP →

\n
\n
\"\"
\n\";}i:5;O:8:\"stdClass\":7:{s:2:\"id\";i:573;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:37:\"Image on solid color with description\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1830:\"\n
\n
\n
\n
\"\"
\n
\n
\n\n\n\n
\n
\n
\n

Airplane

\n\n\n\n

Copper wire, wood base. I created this piece in late 2008. For this work, I aimed to convey both the industrial heaviness of an airplane, but also the cloudlike floating quality you feel when you’re in one.

\n
\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:38:\"Image on solid color with description.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:61:\"core/column,core/columns,core/cover,core/image,core/paragraph\";}s:14:\"category_slugs\";a:3:{i:0;s:8:\"featured\";i:1;s:6:\"images\";i:2;s:4:\"text\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:1826:\"\n
\n
\n
\n
\"\"
\n
\n
\n\n\n\n
\n
\n
\n

Airplane

\n\n\n\n

Copper wire, wood base. I created this piece in late 2008. For this work, I aimed to convey both the industrial heaviness of an airplane, but also the cloudlike floating quality you feel when you’re in one.

\n
\n
\n
\n
\n\";}i:6;O:8:\"stdClass\":7:{s:2:\"id\";i:526;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:31:\"Offset images with descriptions\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:2907:\"\n
\n
\n
\n
\"Beautiful
\n\n\n\n
\n

White Irises

\n\n\n\n

Ogawa Kazumasa

\n
\n
\n
\n\n\n\n
\n
\n
\n
\n\n\n\n

Cherry Blossom

\n\n\n\n

Ogawa Kazumasa

\n
\n\n\n\n
\"Beautiful
\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:58:\"Two offset columns with images and titles within each one.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:73:\"core/column,core/columns,core/group,core/image,core/paragraph,core/spacer\";}s:14:\"category_slugs\";a:3:{i:0;s:8:\"featured\";i:1;s:7:\"gallery\";i:2;s:6:\"images\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:2930:\"\n
\n
\n
\n
\"Beautiful
\n\n\n\n
\n

White Irises

\n\n\n\n

Ogawa Kazumasa

\n
\n
\n
\n\n\n\n
\n
\n
\n
\n\n\n\n

Cherry Blossom

\n\n\n\n

Ogawa Kazumasa

\n
\n\n\n\n
\"Beautiful
\n
\n
\n
\n\";}i:7;O:8:\"stdClass\":7:{s:2:\"id\";i:521;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:45:\"Image with description below and to the right\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1665:\"\n
\n
\n\n\n\n
\n
\"Vintage
\n
\n\n\n\n
\n\n\n\n
\n
\n\n\n\n
\n
\n\n\n\n
\n

Cupid in Flight
48” x 48” Giclee print on archival paper.

\n
\n
\n\n\n\n

\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:46:\"Image with description below and to the right.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:50:\"core/column,core/columns,core/image,core/paragraph\";}s:14:\"category_slugs\";a:2:{i:0;s:8:\"featured\";i:1;s:6:\"images\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:1241:\"\n
\n
\n\n\n\n
\n
\"Vintage
\n
\n\n\n\n
\n\n\n\n
\n
\n\n\n\n
\n
\n\n\n\n
\n

Cupid in Flight
48” x 48” Giclee print on archival paper.

\n
\n
\n\n\n\n

\n\";}i:8;O:8:\"stdClass\":7:{s:2:\"id\";i:502;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:13:\"Event details\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1684:\"\n
\"Image
\n\n\n\n
\n
\n

Location:
82 Main St. Brooklyn, NY

\n
\n\n\n\n
\n

Date:
October 24, 2021

\n
\n\n\n\n\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:14:\"Event details.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:75:\"core/button,core/buttons,core/column,core/columns,core/image,core/paragraph\";}s:14:\"category_slugs\";a:2:{i:0;s:14:\"call-to-action\";i:1;s:8:\"featured\";}s:13:\"keyword_slugs\";a:1:{i:0;s:8:\"featured\";}s:15:\"pattern_content\";s:1642:\"\n
\"Image
\n\n\n\n
\n
\n

Location:
82 Main St. Brooklyn, NY

\n
\n\n\n\n
\n

Date:
October 24, 2021

\n
\n\n\n\n\n
\n\";}i:9;O:8:\"stdClass\":7:{s:2:\"id\";i:200;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:21:\"Three columns of text\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1077:\"\n
\n
\n

Virtual Tour ↗

\n\n\n\n

Get a virtual tour of the museum. Ideal for schools and events.

\n
\n\n\n\n
\n

Current Shows ↗

\n\n\n\n

Stay updated and see our current exhibitions here.

\n
\n\n\n\n
\n

Useful Info ↗

\n\n\n\n

Get to know our opening times, ticket prices and discounts.

\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:22:\"Three columns of text.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:52:\"core/column,core/columns,core/heading,core/paragraph\";}s:14:\"category_slugs\";a:3:{i:0;s:7:\"columns\";i:1;s:8:\"featured\";i:2;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1496:\"\n
\n
\n

Virtual Tour ↗

\n\n\n\n

Get a virtual tour of the museum. Ideal for schools and events.

\n
\n\n\n\n
\n

Current Shows ↗

\n\n\n\n

Stay updated and see our current exhibitions here.

\n
\n\n\n\n
\n

Useful Info ↗

\n\n\n\n

Get to know our opening times, ticket prices and discounts.

\n
\n
\n\";}i:10;O:8:\"stdClass\":7:{s:2:\"id\";i:199;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:34:\"Three columns with images and text\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:3492:\"\n
\n
\n
ECOSYSTEM
\n\n\n\n

Positive growth.

\n
\n\n\n\n
\n\n\n\n
\n
\n
\n

Nature, in the common sense, refers to essences unchanged by man; space, the air, the river, the leaf. Art is applied to the mixture of his will with the same things, as in a house, a canal, a statue, a picture.

\n\n\n\n

But his operations taken together are so insignificant, a little chipping, baking, patching, and washing, that in an impression so grand as that of the world on the human mind, they do not vary the result.

\n
\n\n\n\n
\n
\n\n\n\n
\"The
\n
\n\n\n\n
\n
\"Wind
\n
\n
\n\n\n\n
\n
\n
\"The
\n
\n\n\n\n
\n
\n\n\n\n

Undoubtedly we have no questions to ask which are unanswerable. We must trust the perfection of the creation so far, as to believe that whatever curiosity the order of things has awakened in our minds, the order of things can satisfy. Every man’s condition is a solution in hieroglyphic to those inquiries he would put.

\n
\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:77:\"Three columns with images and text, with vertical spacing for an offset look.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:86:\"core/column,core/columns,core/group,core/heading,core/image,core/paragraph,core/spacer\";}s:14:\"category_slugs\";a:5:{i:0;s:7:\"columns\";i:1;s:8:\"featured\";i:2;s:7:\"gallery\";i:3;s:6:\"images\";i:4;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:5124:\"\n
\n
\n
ECOSYSTEM
\n\n\n\n

Positive growth.

\n
\n\n\n\n
\n\n\n\n
\n
\n
\n

Nature, in the common sense, refers to essences unchanged by man; space, the air, the river, the leaf. Art is applied to the mixture of his will with the same things, as in a house, a canal, a statue, a picture.

\n\n\n\n

But his operations taken together are so insignificant, a little chipping, baking, patching, and washing, that in an impression so grand as that of the world on the human mind, they do not vary the result.

\n
\n\n\n\n
\n
\n\n\n\n
\"The
\n
\n\n\n\n
\n
\"Wind
\n
\n
\n\n\n\n
\n
\n
\"The
\n
\n\n\n\n
\n
\n\n\n\n

Undoubtedly we have no questions to ask which are unanswerable. We must trust the perfection of the creation so far, as to believe that whatever curiosity the order of things has awakened in our minds, the order of things can satisfy. Every man\'s condition is a solution in hieroglyphic to those inquiries he would put.

\n
\n
\n
\n
\n\";}i:11;O:8:\"stdClass\":7:{s:2:\"id\";i:192;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:37:\"Media and text with image on the left\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:554:\"\n
\"Close-up,
\n

Open Spaces

\n\n\n\n

See case study ↗

\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:66:\"Media and text block with image to the left and text to the right.\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:43:\"core/heading,core/media-text,core/paragraph\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"banner\";i:1;s:8:\"featured\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:844:\"\n
\"Close-up,
\n

Open Spaces

\n\n\n\n

See case study ↗

\n
\n\";}i:12;O:8:\"stdClass\":7:{s:2:\"id\";i:185;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:35:\"Large header with left-aligned text\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:1320:\"\n
\"\"
\n

Forest.

\n\n\n\n
\n
\n
\n\n\n\n

Even a child knows how valuable the forest is. The fresh, breathtaking smell of trees. Echoing birds flying above that dense magnitude. A stable climate, a sustainable diverse life and a source of culture. Yet, forests and other ecosystems hang in the balance, threatened to become croplands, pasture, and plantations.

\n
\n\n\n\n
\n
\n
\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:0:\"\";s:16:\"wpop_description\";s:29:\"Cover image with quote on top\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:0:{}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:75:\"core/column,core/columns,core/cover,core/heading,core/paragraph,core/spacer\";}s:14:\"category_slugs\";a:2:{i:0;s:6:\"banner\";i:1;s:8:\"featured\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:1698:\"\n
\"\"
\n

Forest.

\n\n\n\n
\n
\n
\n\n\n\n

Even a child knows how valuable the forest is. The fresh, breathtaking smell of trees. Echoing birds flying above that dense magnitude. A stable climate, a sustainable diverse life and a source of culture. Yet, forests and other ecosystems hang in the balance, threatened to become croplands, pasture, and plantations.

\n
\n\n\n\n
\n
\n
\n\";}i:13;O:8:\"stdClass\":7:{s:2:\"id\";i:184;s:5:\"title\";O:8:\"stdClass\":1:{s:8:\"rendered\";s:7:\"Heading\";}s:7:\"content\";O:8:\"stdClass\":2:{s:8:\"rendered\";s:526:\"\n

We’re a studio in Berlin with an international practice in architecture, urban planning and interior design. We believe in sharing knowledge and promoting dialogue to increase the creative potential of collaboration.

\n\";s:9:\"protected\";b:0;}s:4:\"meta\";O:8:\"stdClass\":7:{s:13:\"wpop_keywords\";s:17:\"large text, title\";s:16:\"wpop_description\";s:12:\"Heading text\";s:19:\"wpop_viewport_width\";i:1200;s:16:\"wpop_block_types\";a:1:{i:0;s:12:\"core/heading\";}s:11:\"wpop_locale\";s:5:\"en_US\";s:15:\"wpop_wp_version\";s:0:\"\";s:25:\"wpop_contains_block_types\";s:12:\"core/heading\";}s:14:\"category_slugs\";a:2:{i:0;s:8:\"featured\";i:1;s:4:\"text\";}s:13:\"keyword_slugs\";a:2:{i:0;s:4:\"core\";i:1;s:8:\"featured\";}s:15:\"pattern_content\";s:621:\"\n

We\'re a studio in Berlin with an international practice in architecture, urban planning and interior design. We believe in sharing knowledge and promoting dialogue to increase the creative potential of collaboration.

\n\";}}','no'), -(137,'_site_transient_timeout_browser_a86e428bd3bf389017382160c9a84756','1692251594','no'), -(138,'_site_transient_browser_a86e428bd3bf389017382160c9a84756','a:10:{s:4:\"name\";s:6:\"Safari\";s:7:\"version\";s:4:\"16.4\";s:8:\"platform\";s:5:\"Linux\";s:10:\"update_url\";s:29:\"https://www.apple.com/safari/\";s:7:\"img_src\";s:43:\"http://s.w.org/images/browsers/safari.png?1\";s:11:\"img_src_ssl\";s:44:\"https://s.w.org/images/browsers/safari.png?1\";s:15:\"current_version\";s:2:\"11\";s:7:\"upgrade\";b:0;s:8:\"insecure\";b:0;s:6:\"mobile\";b:0;}','no'), -(139,'_site_transient_timeout_php_check_8e5f884b2350dc5500d715889ec932a0','1692251594','no'), -(140,'_site_transient_php_check_8e5f884b2350dc5500d715889ec932a0','a:5:{s:19:\"recommended_version\";s:3:\"7.4\";s:15:\"minimum_version\";s:3:\"7.0\";s:12:\"is_supported\";b:1;s:9:\"is_secure\";b:1;s:13:\"is_acceptable\";b:1;}','no'), -(142,'_site_transient_timeout_community-events-09230dde513ccf63912b10d9c35187d5','1691689996','no'), -(143,'_site_transient_community-events-09230dde513ccf63912b10d9c35187d5','a:4:{s:9:\"sandboxed\";b:0;s:5:\"error\";N;s:8:\"location\";a:1:{s:2:\"ip\";s:11:\"172.20.30.0\";}s:6:\"events\";a:5:{i:0;a:10:{s:4:\"type\";s:6:\"meetup\";s:5:\"title\";s:41:\"WordPress Meetup 010 Pre WordCamp editie\n\";s:3:\"url\";s:66:\"https://www.meetup.com/rotterdam-wordpress-meetup/events/292890950\";s:6:\"meetup\";s:20:\"WordPress Meetup 010\";s:10:\"meetup_url\";s:50:\"https://www.meetup.com/Rotterdam-WordPress-Meetup/\";s:4:\"date\";s:19:\"2023-08-21 19:00:00\";s:8:\"end_date\";s:19:\"2023-08-21 22:00:00\";s:20:\"start_unix_timestamp\";i:1692637200;s:18:\"end_unix_timestamp\";i:1692648000;s:8:\"location\";a:4:{s:8:\"location\";s:22:\"Rotterdam, Netherlands\";s:7:\"country\";s:2:\"nl\";s:8:\"latitude\";d:51.90691;s:9:\"longitude\";d:4.460783;}}i:1;a:10:{s:4:\"type\";s:6:\"meetup\";s:5:\"title\";s:25:\"WP Meetup Amsterdam talks\";s:3:\"url\";s:59:\"https://www.meetup.com/wordpress-amsterdam/events/291726641\";s:6:\"meetup\";s:26:\"WordPress Meetup Amsterdam\";s:10:\"meetup_url\";s:43:\"https://www.meetup.com/wordpress-amsterdam/\";s:4:\"date\";s:19:\"2023-09-04 19:00:00\";s:8:\"end_date\";s:19:\"2023-09-04 21:00:00\";s:20:\"start_unix_timestamp\";i:1693846800;s:18:\"end_unix_timestamp\";i:1693854000;s:8:\"location\";a:4:{s:8:\"location\";s:26:\"Amsterdam, NH, Netherlands\";s:7:\"country\";s:2:\"NL\";s:8:\"latitude\";d:52.37;s:9:\"longitude\";d:4.89;}}i:2;a:10:{s:4:\"type\";s:8:\"wordcamp\";s:5:\"title\";s:20:\"WordCamp Netherlands\";s:3:\"url\";s:38:\"https://netherlands.wordcamp.org/2023/\";s:6:\"meetup\";N;s:10:\"meetup_url\";N;s:4:\"date\";s:19:\"2023-09-07 09:00:00\";s:8:\"end_date\";s:19:\"2023-09-08 00:00:00\";s:20:\"start_unix_timestamp\";i:1694070000;s:18:\"end_unix_timestamp\";i:1694124000;s:8:\"location\";a:4:{s:8:\"location\";s:23:\"Arnhem, The Netherlands\";s:7:\"country\";s:2:\"NL\";s:8:\"latitude\";d:52.0094123;s:9:\"longitude\";d:5.9008147;}}i:3;a:10:{s:4:\"type\";s:6:\"meetup\";s:5:\"title\";s:23:\"WordPress Meetup Zwolle\";s:3:\"url\";s:63:\"https://www.meetup.com/zwolle-wordpress-meetup/events/294792308\";s:6:\"meetup\";s:23:\"WordPress Meetup Zwolle\";s:10:\"meetup_url\";s:47:\"https://www.meetup.com/Zwolle-WordPress-Meetup/\";s:4:\"date\";s:19:\"2023-09-14 18:45:00\";s:8:\"end_date\";s:19:\"2023-09-14 20:45:00\";s:20:\"start_unix_timestamp\";i:1694709900;s:18:\"end_unix_timestamp\";i:1694717100;s:8:\"location\";a:4:{s:8:\"location\";s:19:\"Zwolle, Netherlands\";s:7:\"country\";s:2:\"nl\";s:8:\"latitude\";d:52.508583;s:9:\"longitude\";d:6.093302;}}i:4;a:10:{s:4:\"type\";s:6:\"meetup\";s:5:\"title\";s:25:\"WP Meetup Amsterdam talks\";s:3:\"url\";s:59:\"https://www.meetup.com/wordpress-amsterdam/events/291726686\";s:6:\"meetup\";s:26:\"WordPress Meetup Amsterdam\";s:10:\"meetup_url\";s:43:\"https://www.meetup.com/wordpress-amsterdam/\";s:4:\"date\";s:19:\"2023-10-17 19:00:00\";s:8:\"end_date\";s:19:\"2023-10-17 21:00:00\";s:20:\"start_unix_timestamp\";i:1697562000;s:18:\"end_unix_timestamp\";i:1697569200;s:8:\"location\";a:4:{s:8:\"location\";s:26:\"Amsterdam, NH, Netherlands\";s:7:\"country\";s:2:\"NL\";s:8:\"latitude\";d:52.37;s:9:\"longitude\";d:4.89;}}}}','no'), -(144,'_transient_timeout_feed_9bbd59226dc36b9b26cd43f15694c5c3','1691689996','no'), -(145,'_transient_feed_9bbd59226dc36b9b26cd43f15694c5c3','a:4:{s:5:\"child\";a:1:{s:0:\"\";a:1:{s:3:\"rss\";a:1:{i:0;a:6:{s:4:\"data\";s:3:\"\n\n\n\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:7:\"version\";s:3:\"2.0\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:1:{s:0:\"\";a:1:{s:7:\"channel\";a:1:{i:0;a:6:{s:4:\"data\";s:52:\"\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:8:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"WordPress News\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:26:\"https://wordpress.org/news\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:59:\"The latest news about WordPress and the WordPress community\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:13:\"lastBuildDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 08 Aug 2023 23:38:54 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"language\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"en-US\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:9:\"generator\";a:1:{i:0;a:5:{s:4:\"data\";s:40:\"https://wordpress.org/?v=6.4-alpha-56379\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:5:\"image\";a:1:{i:0;a:6:{s:4:\"data\";s:11:\"\n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:1:{s:0:\"\";a:5:{s:3:\"url\";a:1:{i:0;a:5:{s:4:\"data\";s:29:\"https://s.w.org/favicon.ico?2\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"WordPress News\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:26:\"https://wordpress.org/news\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:5:\"width\";a:1:{i:0;a:5:{s:4:\"data\";s:2:\"32\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:6:\"height\";a:1:{i:0;a:5:{s:4:\"data\";s:2:\"32\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}}s:4:\"item\";a:10:{i:0;a:6:{s:4:\"data\";s:66:\"\n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:26:\"WordPress 6.3 “Lionel”\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:42:\"https://wordpress.org/news/2023/08/lionel/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 08 Aug 2023 20:03:16 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:4:{i:0;a:5:{s:4:\"data\";s:7:\"General\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:3:\"6.3\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:3;a:5:{s:4:\"data\";s:8:\"releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=15718\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:196:\"WordPress 6.3 \"Lionel\" is here! Named after Lionel Hampton, the prolific jazz musician and bandleader, this release was made possible by over 650 contributors. Download WordPress 6.3 Lionel today.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Matias Ventura\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:70083:\"\n
\"\"
\n\n\n\n

Say hello to WordPress 6.3 “Lionel,” named after Lionel Hampton, the celebrated American jazz artist. A prolific jazz vibraphonist, pianist, and percussionist, Hampton gained notoriety working in harmony with greats from Charles Mingus to Quincy Jones and as bandleader of the eponymous Lionel Hampton Orchestra. His artistry and charitable work have been recognized with a Grammy, a star on the Hollywood Walk of Fame, and the National Medal of Arts.

\n\n\n\n

Be sure to turn up the volume of the musical stylings of Lionel Hampton as you discover all “Lionel” has to offer.

\n\n\n\n

With “Lionel” you can create beautiful and compelling websites more efficiently than ever. Whether you want to build an entire site without coding or are a developer looking to customize every detail, WordPress 6.3 has something to pique your interest. As you unpack and explore this latest release, you will discover updated functions and navigation designed to help you work and create with less effort, design tools that give you more control over layout, and added functionality enriching the site-building experience.

\n\n\n\n
\n

“Lionel” marks a major chapter in the evolution of WordPress as a tool for expression. It’s the culmination of years of work from hundreds of contributors, bringing a more powerful and cohesive editing experience for crafting websites with blocks. It continues the quest of making web publishing approachable for everyone—so it’s also just a new beginning!

\nMatías Ventura, WordPress 6.3 Release Lead
\n\n\n\n\n\n\n\n

What’s inside

\n\n\n\n

This momentous release opens new possibilities for the creative expression of designers, creators, and builders. Powerful tools and refined controls give users confidence and allow them to easily manage their sites.

\n\n\n\n

Do everything in the Site Editor

\n\n\n\n

WordPress 6.3 brings your content, templates, and patterns together in the Site Editor for the first time. Add pages, browse style variations, create synced patterns, and enjoy fine-tuned control over navigation menus. Spend less time switching across different site areas—so you can focus on what matters most. Creation to completion, all in one place.

\n\n\n\n
\"Image
Do everything in the Site Editor
\n\n\n\n

Preview Block themes

\n\n\n\n

Experience block themes before you switch and preview the Site Editor, with options to customize directly before committing to a new theme. 

\n\n\n\n
\"Image
Preview a new block theme before you switch and commit
\n\n\n\n

Create and sync patterns

\n\n\n\n

Arrange blocks and save them to the ‘My Patterns’ section for use throughout your site. You can even specify whether to sync your patterns (previously referred to as “Reusable blocks”) so that one change applies to all parts of your site. Or, utilize patterns as a starting point with the ability to customize each instance.

\n\n\n\n
\"Image
My patterns: All your patterns in one place
\n\n\n\n

Work faster with the Command Palette

\n\n\n\n

Switch to a specific template or open your editor preferences with a new tool that helps you quickly access expanded functionality. With simple keyboard shortcuts (⌘+k on Mac or Ctrl+k on Windows), clicking the sidebar search icon in Site View, or clicking the Title Bar, get where you need to go and do what you need to do in seconds.

\n\n\n\n
\"Image
Get to know the new Command Palette
\n\n\n\n

Sharpen your designs with new tools

\n\n\n\n

New design controls bring more versatility for fine-tuning, starting with the ability to customize your captions from the Styles interface without coding. You can manage your duotone filters in Styles for supported blocks and pick from the options provided by your theme or disable them entirely. The Cover block gets added settings for text color, layout controls, and border options, making this powerful block even more handy.

\n\n\n\n
\"Image
New design tools
\n\n\n\n

Track design changes with Style revisions

\n\n\n\n

With a new audit trail, you can now see how your site looked at a specific time. Visualize these revisions in a timeline and access a one-click option to restore prior styles.

\n\n\n\n
\"Image
Style revisions: See your style revision history
\n\n\n\n

Annotate with the Footnotes block

\n\n\n\n

Footnotes add convenient annotations throughout your content. Now you can add and link footnotes for any paragraph.

\n\n\n\n
\"Image
Add footnotes effortlessly with the new Footnotes Block
\n\n\n\n

Show or hide content with the Details block

\n\n\n\n

Use the Details block to avoid spoiling a surprise, create an interactive Q&A section, or hide a long paragraph under a heading.

\n\n\n\n
\"Image
Display or hide content with the new Details Block
\n\n\n\n

Performance gets a boost

\n\n\n\n

WordPress 6.3 has 170+ performance updates, including defer and async support for the Scripts API and fetchpriority support for images. These improvements, along with block template resolution, image lazy-loading, and the emoji loader, can dramatically improve your website’s perceived load time.

\n\n\n\n

Accessibility remains a core focus

\n\n\n\n

Incorporating more than 50 accessibility improvements across the platform, WordPress 6.3 is more accessible than ever. Improved labeling, optimized tab and arrow-key navigation, revised heading hierarchy, and new controls in the admin image editor allow those using assistive technologies to navigate more easily.

\n\n\n\n

Other highlights

\n\n\n\n

Set aspect ratio on images

\n\n\n\n

Specify your aspect ratios and ensure design integrity, especially when using images in patterns.

\n\n\n\n

Build your site distraction-free

\n\n\n\n

Distraction-free designing is now available in the Site Editor.

\n\n\n\n

Rediscover the Top Toolbar

\n\n\n\n

A revamped Top Toolbar offers parent selectors for nested blocks, options when selecting multiple blocks, and an interface embedded into the title bar with new functionality in mind.

\n\n\n\n

List View improvements

\n\n\n\n

Drag and drop to every content layer and delete any block you would like in the updated List View.

\n\n\n\n

Build templates with Patterns

\n\n\n\n

Create unique patterns to jumpstart template creation with a new modal enabling access to pattern selection.

\n\n\n\n

Changes in PHP support

\n\n\n\n

Support for PHP 5 is discontinued. The new minimum supported version of PHP is 7.0.0.

\n\n\n\n

Failed update safeguards

\n\n\n\n

WordPress will now auto-restore the previously installed version of plugins or themes if something goes wrong during a failed manual update.

\n\n\n\n
\n\n\n\n

Learn more about WordPress and 6.3

\n\n\n\n

Explore Learn WordPress for quick how-to videos, online workshops, and other resources to level up your knowledge of the latest features in WordPress. 

\n\n\n\n

Check out the WordPress 6.3 Field Guide for detailed developer notes to help you build with WordPress and get the most out of the latest release. Read the 6.3 release notes for additional technical details about this release, including feature recaps, installation information, file changes, fixes, and updates.

\n\n\n\n

Read and subscribe to the Developer Blog for even more helpful WordPress content. 

\n\n\n\n

WordPress is a global software platform

\n\n\n\n

61 locales have translated 90 percent or more of WordPress 6.3 into their language. Community translators are working hard to ensure more translations are on their way. Thank you, gracias, ありがとう, धन्यवाद, and ευχαριστώ to everyone who helps to make WordPress available in 200 languages.

\n\n\n\n

Contributing to WordPress

\n\n\n\n

WordPress believes in democratizing publishing and the freedoms that come with open source. Supporting this idea is a large community of people collaborating to strengthen the software. A big thank you to everyone who makes WordPress.

\n\n\n\n
\n

Our community of contributors has always been what makes WordPress wonderful. You are what makes sure our project continues to thrive, and our software remains secure, usable, and impactful. Thank you so much for joining together to make the web (and the world) a better place!

\nJosepha Haden Chomphosy, Executive Director, WordPress.org
\n\n\n\n

WordPress 6.3 arrives thanks to more than 650 contributors’ collective passion and effort in at least 52 countries. This release also includes over 205 first-time contributors! 

\n\n\n\n

The 6.3 release squad

\n\n\n\n

The 6.3 release was led from start to launch by an active set of contributors from across many disciplines. Over several weeks, they kept the release on track and moving forward by connecting ideas, resolving issues, and removing roadblocks.

\n\n\n\n\n\n\n\n

6.3 contributors

\n\n\n\n

Complimenting the release squad is a diverse group of contributors whose global collaboration delivered hundreds of enhancements and fixes, ensuring a stable release for all—a testament to the power and capability of the WordPress community. 

\n\n\n\n

Özgür KARALAR · 6adminit · Aaron Jorbin · Aaron Robertshaw · Abha Thakor · abhi3315 · Abhishek Sharma · Abir · abitofmind · Adam Silverstein · Adam W. Warner · Adarsh Akshat · Adel Tahri · Aditya Jain · Ahmed Chaion · Ahsan Chowdhury · Aki Hamano · akmelias · Akramul Hasan · Alex Concha · Alex Dimitrov · Alex Kozack · Alex Lende · Alex Stine · Alexandre Lara · allancole · Alvaro Gómez · Alvi Tazwar · Amaan Khan · amansurov · amin · Amy Hendrix (sabreuse) · Anatoliy · Anatoliy Dovgun · Andrea Fercia · Andrei Draganescu · Andrew Nacin · Andrew Ozz · Andrew Serong · Andrey \"Rarst\" Savchenko · André Maneiro · Andy Fragen · Andy Meerwaldt · Andy Peatling · Anil Vaza · Ankit K Gupta · Ankit Panchal · Ankur Chotai · Anna · Anne McCarthy · Anne-Mieke Bovelett · annziel · Anthony Burchell · Anton Timmermans · Anton Vlasenko · Antony Agrios · anver · Anveshika Srivastava · Arafat Jamil · Ari Stathopoulos · Artemio Morales · Arthur Chu · Arunas Liuiza · Asad Polash · Ashar Irfan · Ashikur Rahman · Atanas Antonov · Aurooba Ahmed · Austin Matzko · Ayesh Karunaratne · azizantoun · Aznadesign · bangank36 · bartkalisz · Ben Dunkle · Ben Dwyer · Ben Keith · Benjamin Grolleau · benjibee · Bernie Reiter · Bhavik Kalpesh · Bhrugesh Bavishi · Bijay Yadav · Birgit Pauli-Haack · bitnissen · bonger · Boone Gorges · Boro Sitnikovski · Brandon DuRette · Brandon Kraft · Brandon Payton · brasofilo · Brennan Goewert · Brian Alexander · Brian Coords · Brian Fischer · Brian Gardner · Bridget Willard · Bronson Quick · Brooke · Brooke. · caraffande · Carlos Bravo · Carlos Garcia · Carolina Nymark · Cathi Bosco · ceer · Chad Chadbourne · Chintan hingrajiya · Chirag Rathod · Chloe Bringmann · Chouby · Chris Flannagan · Chris Lubkert · Chris Malone · chriscct7 · Christoph Daum · ckoerner · Code Amp · Colin Stewart · corentingautier · Courtney Robertson · Crixu · crs1138 · crstauf · cshark · Daisy Olsen · Dan Bernardic · Dan Soschin · Daniel Bachhuber · Daniel Richards · Daniele Scasciafratte · danyk4 · darerodz · Darshit Rajyaguru · Dave Whitley · David Baumwald · David Biňovec · David Calhoun · David Herrera · David Smith · davidmusnik · davidwebca · Dean Sas · Deepak Vijayan · Denis de Bernardy · Denis Žoljom · Dennis Snell · Dennys Dionigi · densityapps · Derek Ashauer · Derek Blank · devshagor · Dharmesh Patel · Dhrumil Kumbhani · Dhruvi Shah · DigTek · Dilip Bheda · dimijazz · Dion Hulse · doems · Dominik Schilling · Drew Jaynes · dsar · dustyreagan · ebai4 · ecorica · Ed Beck · eduwass · Edward · Edwin Takahashi · ehsanakhgari · Ehtisham S. · Ella van Durpe · Emily Clarke · emirpprime · Enrique Sánchez · eric.7186 · Erik Betshammar · Ernest Behinov · Estela Rueda · Fabian Kägy · Fabian Todt · Faisal Ahammad · Falguni Desai · Farhan Ahmed · Felipe Elia · Felix Arntz · Femy Praseeth · Firoz Sabaliya · Florian TIAR · Francesca Marano · Frank Klein · franrosa · gaeldenysiak · Gal Baras · Gan (a11n) · Garth Mortensen · Gary Cao · Gary Jones · Gary Pendergast · Gennady Kovshenin · George · George Mamadashvili · Gerardo Pacheco · gilles66 · Gio Lodi · Glen Davies · GrandSlambert · Grant M. Kinney · Greg Ziółkowski · Gudmundur Haraldsson · Guillaume TURPIN · gvgvgvijayan · Habibur Rahman Delwar · Hanzala Taifun · Hardik Thakkar · Hareesh S · Harit Panchal · Harsh Gajipara · Hasan Misbah · Hasanuzzaman · Haz · Heiko Mamerow · Helen Hou-Sandi · HelgaTheViking · Hendrik Luehrsen · Hilay Trivedi · Himani Panchal · Hit Bhalodia · Hridoy Mozumder · Hugo Baeta · hugod · Huseyin Berberoglu · Huzaifa Al Mesbah · Héctor Prieto · Iain Poulson · Ian Belanger · Ian Dunn · Ibrahim Khalil · Ibrahim Sharif · Ignat Georgiev · imanish003 · intoxination · Ipstenu (Mika Epstein) · Isabel Brison · jacknotman · Jahid Hasan · Jakaria Istauk · James Koster · James Roberts · james0r · Jan Boddez · jane · jankyz · janpaulkleijn · Jarda Snajdr · Jason Crist · Jason Johnston · Jason LeMahieu (MadtownLems) · Javier Casares · jbcouton · Jean-Baptiste Audras · Jeff Ong · jeffmora · Jeffrey Paul · Jen · Jenil Kanani · Jeremy Felt · Jeroen Rotty · Jerry Jones · jhnstn · jigar bhanushali · Joe Dolson · Joe McGill · Joen Asmussen · John Blackbourn · John Hooks · John James Jacoby · Jomon Thomas Lobo · Jon Bourne · Jonathan Desrosiers · Jonathan Pantani · Joni Erkkilä · Jonny Harris · Joost de Valk · jordesign · Jorge Costa · Jos Klever · Josep Morán · Joseph G. · Josepha · Josh Habdas · Josh Pollock · Joy · jqz · Juan Aldasoro · JuanMa Garrido · Juliette Reinders Folmer · Juzar · K. Adam White · KafleG · Kai Hao · Kailey (trepmal) · Kajal Gohel · Kantari Samy · Kapil Paul · Karol Manijak · Karthik Thayyil · Kathryn P. · Kausar Al Mamun · Kausar Alam · Kelly Choyce-Dwan · kenwins · Kevin Behrens · Khoi Pro · Kjell Reigstad · Knut Sparhell · koenschipper · Konstantinos Xenos · Krishna Neupane · Krunal Bhimajiyani · Krupa Nanda · Krupal Panchal · kutsu · KZeni · Léa McAleese · Lachezar Gadzhev · Lana Codes · laurelfulford · Lauren Stein · laurentmagnin · Lena Morita · Leonardus Nugraha · lessbloat · Levdbas · Linda van Tol · Linkon Miyan · lowlydev · lphk · Luigi · luisherranz · Luke Cavanagh · madejackson · Madhu Dollu · Madhu Dollu · Maggie Cabrera · Mahdi Hasan · Mahmudul Haque Nadim · Mai · Maja Loncar · Malae · Malav Vasita · manfcarlo · maniu · Marc · Marcelo de Moraes Serpa · MarcGuay · Marco Ciampini · Marek Dědič · margolisj · marianne38 · Marin Atanasov · Marine EVAIN · Mario Santos · Marius L. J. · Mark Jaquith · Mark Parnell · markdoliner · Marko Heijnen · Marko Ivanovic · Markus · Markus Kosmal · martin.krcho · marybaum · masteradhoc · mastrup · Mat Lipe · Matias Benedetto · Matias Ventura · matmoe · Matt Mullenweg · Matt Watson · Matt Wiebe · matt_fw · Matteo Enna · Matthew Boynes · Mauriac AZOUA · maurodf · Max Lyuchin · maxcgparis · maysi · Mayur Prajapati · McAlyster · mcliwanow · Md Mahamudur Rahaman · Md Monir Hossain · MD Shakibul Islam · megane9988 · Meher Bala · Mel Choyce-Dwan · Menaka S. · mensmaximus · mgol · Michael Adams (mdawaffe) · Michael Burridge · Michael Day · MichaelH · Michal Czaplinski · Miguel Fonseca · Mike Schinkel · Mike Schroder · mikecho · mikeyzm · Mikin Chauhan · Milana Cap · Milen Petrinski - Gonzo · Mitch Canter · mitchellaustin · mitcho (Michael Yoshitaka Erlewine) · Moe · Mohammad Jangda · Mohan Raj · Mohip Patel · Mohiuddin Omran · Monique Dubbelman · Monzur Alam · Morten Rand-Hendriksen · Mrinal Haque · mtxz · Muhammad Yeasin · mujuonly · Mukesh Panchal · Mushrit Shabnam · Naeem Haque · Nahid Hasan · Narthur · nataliat2004 · Nate Allen · Nazgul · Nazmul Hosen · Nazmul Huda · nendeb · Neycho Kalaydzhiev · Nicholas Garofalo · Nick Diego · nickpap · nidhidhandhukiya · Nihar Ranjan Das · Nik Tsekouras · Nilo Velez · Niluthpal Purkayastha · Nithin John · Nithin SreeRaj · njsamsatli · nkeller15 · Noah Allen · obliviousharmony · Okamoto Hidetaka · Olga Gleckler · OllieJones · opr18 · Orestis Samaras · Ov3rfly · owi · Paal Joachim Romdahl · Pamela Ribeiro · Paragon Initiative Enterprises · Pascal Birchler · Patel Jaymin · patriciahillebrandt · Paul Biron · Paul Kevan · Paul Von Schrottky · Paulo Trentin · Pavan Patil · Pedro Mendonça · Peter Westwood · Peter Wilson · Petter Walbø Johnsgård · Philipp Bammes · Phill · Pierre Sylvestre · Pieterjan Deneys · Piotrek Boniu · Pitam Dey · Piyush Tekwani · pkbhatt · Platon Kristinin · Pooja Derashri · Pooja N Muchandikar · pouicpouic · Prashant · Prashant Singh · Pravin Parmar · Presskopp · Priyanka Adhikari · Przemek Hernik · Rachel Baker · Rafa Poveda · Rafael Fischmann · Rajan Panchal · Rajin Sharwar · Ramon Ahnert · Ramon James · Ratnesh Sonar · Rehan Ali · rembem · ren · Riad Benguella · Rian Rietveld · Rich Tabor · richards1052 · Richie Carey · rjasdfiii · rob1n · Robert Anderson · Robert O\'Rourke · Robin · Rolf Allard van Hagen · Ronak Ganatra · Ruman Ahmed · Rutvik Savsani · Ryan Boren · Ryan Fredlund · Ryan Kienstra · Ryan McCue · Ryan Welcher · Sé Reed · Sébastien SERRE · Sérgio Gomes · Süleyman Kenar · Sahil B. · Sajjad Hossain Sagor · Sakib Mohammed · salvoaranzulla · Sam Fullalove · samiamnot · SamNajian · Samuel Wood (Otto) · Sarah Norris · Sarequl Basar · Saxon Fletcher · Scott Reilly · Scott Taylor · scribu · Sean Davis · Sergey Biryukov · Shail Mehta · Shalin Shah · Shannon Little · Shipon Karmakar · Shreyas Ikhar · shubhamsedani · shuvo586 · shvv · Shweta Bathani · Siddhant Wadhwani · siddharth ravikumar · Siddharth Thevaril · Simon Dowdles · Simone · Siobhan · Sirajum Mahdi · Sjoerd Boerrigter · Sjoerd Linders · Smit Rathod · Soren Wrede · Spencer · sque · srikanthmeenakshi · Stanimir Stoyanov · Stefano Minoia · Stephan Nijman · Stephen Bernhardt · Steven Lin · Subrata Sarkar · Sudip Dadhaniya · Sumit Bagthariya · Sumit Singh · sunyatasattva (a11n) · Suvro · Suzette Franck · Suzette Franck · syamraj24 · Sybre Waaijer · Syed Nuhel · Synchro · Taco Verdonschot · Tahmina Jahan · Takashi Kitajima · Tammie Lister · Tanner Moushey · Thakor Darshil · thomask · thunder rumbles · Tijmen Smit · Till Krüss · Tim Brathärig · Timothy Jacobs · tmatsuur · TobiasBg · tobifjellner (Tor-Bjorn Fjellner) · Tom de Visser · Tom J Nowell · Tomoki Shimomura · Toni Viemerö · Tonya Mork · tonythomas01 · Toro_Unit (Hiroshi Urabe) · Torsten Landsiedel · Towhidul I Chowdhury · Tryon · twstokes · TyB · Ugyen Dorji · Umesh Gupta · Umesh Patel · Upadala Vipul · Utsav tilava · uxtremist · Vagelis · valterlorran · Vasilis Manthos · victoranto · Viktor Szépe · vivekawsm · Vlad T · Weston Ruter · whaze · Will Skora · williampatton · wlindley · Wojtek Szkutnik · wplmillet · xerpa43 · xmarcos · Yani Iliev · Yui · Zdrobau · Zeba Afia Shama · Zebulan Stanphill · Zenaul Islam · zieladam · Zunaid Amin

\n\n\n\n

WordPress support forums

\n\n\n\n

Many thanks to the community volunteers who contribute to the support forums by answering questions from WordPress users worldwide.

\n\n\n\n

Get involved today

\n\n\n\n

If contributing to WordPress appeals to you, learning more and getting involved is easy. Discover the teams that come together to Make WordPress and explore the product roadmap on the core development blog. You can also use this interactive tool to help you decide which team is right for you.

\n\n\n\n

Looking toward the future

\n\n\n\n

20 years ago this past May, WordPress shipped the very first version, 0.7. What started with a blog post from co-founder Matt Mullenweg and a subsequent comment by co-founder Mike Little eventually evolved into the world’s most popular web publishing platform.

\n\n\n\n

WordPress software continues to evolve and iterate based on the needs and desires of its robust and diverse user community. This release is the capstone of Phase 2 along the WordPress development roadmap. As the community looks to the future, all efforts turn to 6.4 and, subsequently, the transition into Phase 3, which is expected to introduce powerful collaboration tools to the website creation and management experience.

\n\n\n\n
\n\n\n\n

6.3 Haiku

\n\n\n\n

A capstone release
Ships tools for building great sites
Collaboration

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"15718\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:1;a:6:{s:4:\"data\";s:60:\"\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:63:\"Concerns over the European Union’s Cyber Resilience Act (CRA)\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:94:\"https://wordpress.org/news/2023/08/concerns-over-the-european-unions-cyber-resilience-act-cra/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 02 Aug 2023 14:25:55 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:2:{i:0;a:5:{s:4:\"data\";s:7:\"General\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:3:\"cra\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=15686\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:216:\"\"Our shared goal is to further bolster the security of digital products without compromising the values of freedom, democracy, and innovation.\" Learn more about the Cyber Resilience Act and its impact on open source.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:7:\"Josepha\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:4334:\"\n

As the world’s most popular open source content management system, WordPress acknowledges the European Union’s initiative to bolster the cybersecurity of digital hardware and software products with the Cyber Resilience Act (CRA). The Act’s effort to counter the increasing threat of cyberattacks and promote informed usage of digital products with increased security updates and transparency is commendable. 

\n\n\n\n
\n

While we wholly endorse the objectives of the CRA, we are apprehensive about the Act’s implications on open source software due to unclear terms and definitions.

\n
\n\n\n\n

Specifically, the Act’s prohibition on “unfinished software” and ambiguous definition of “commercial activity” could inadvertently inhibit innovation and economic participation in the European digital landscape.

\n\n\n\n

Open source projects, like WordPress, often rely on continual updates and improvements—a process that may technically fall under the label of “unfinished.” Furthermore, the ambiguous definition of “commercial activity” could unintentionally encompass open source projects that are largely driven by communities and operate on a not-for-profit basis.

\n\n\n\n

Our letter to the EU Commission

\n\n\n\n

We have jointly authored an open letter addressing these concerns alongside fellow open source projects Drupal, Joomla!, and TYPO31. The letter emphasizes the significant contribution of Free and Open Source Software (FOSS) to the EU’s economy and how the proposed regulations might undermine these efforts. Our shared goal is to further bolster the security of digital products without compromising the values of freedom, democracy, and innovation inherent to both the open source community and the EU’s Aims and Values.

\n\n\n\n

The letter invites the EU Commission and interested parties to participate in a seminar in Brussels to discuss how we can align the objectives of the CRA with the realities and needs of the FOSS community. We are optimistic that, with mutual understanding and cooperation, we can achieve secure digital products without limiting the vital contributions of open source projects.

\n\n\n\n\n\n\n\n
\n\n\n\n
  1. Drupal, Joomla!, TYPO3, and WordPress are the most popular FOSS content management systems on the web today. While all are based on the PHP programming language and distributed under the GPL open source license, each platform takes a different approach to website publishing. With strength in diversity, they form the Inter-CMS Working Group, promoting the values and benefits of free and open source software. \"↩\"
\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"15686\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:2;a:6:{s:4:\"data\";s:69:\"\n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:33:\"WordPress 6.3 Release Candidate 3\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"https://wordpress.org/news/2023/08/wordpress-6-3-rc3/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 01 Aug 2023 16:55:21 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:5:{i:0;a:5:{s:4:\"data\";s:11:\"Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:3:\"6.3\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:3;a:5:{s:4:\"data\";s:11:\"development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:4;a:5:{s:4:\"data\";s:8:\"releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=15615\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:226:\"WordPress 6.3 Release Candidate 3 is now available for download and testing.\n\nThe WordPress 6.3 release is scheduled for August 8, 2023—just one week away. Now is your last opportunity to test it before the general release. \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"Jonathan Pantani\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:6221:\"\n

WordPress 6.3 RC3 is ready for download and testing.

\n\n\n\n

This version of the WordPress software is under development. Please do not install, run, or test this version on production or mission-critical websites. Instead, you should evaluate RC3 on a test server and site. 

\n\n\n\n

The WordPress 6.3 release is scheduled for August 8, 2023—just one week away. Now is your last opportunity to test it before the general release. 

\n\n\n\n

For a deeper look into this release, read this overview of the 6.3 release cycle, check the Make WordPress Core blog for 6.3-related posts, review new features in WordPress 6.3, or watch a recorded demo

\n\n\n\n

What’s new since RC2

\n\n\n\n

Since the RC2 release on July 25, 2023, there have been approximately 14 issues resolved in Github and Trac. To prepare for 6.3 general availability, RC3 also addresses several bugs and adds fixes for retrieving templates (#4940) and resolving child theme issues (#53138). Thank you for testing, WordPressers!

\n\n\n\n

Developers and extenders should review the comprehensive WordPress 6.3 Field Guide for detailed technical notes regarding new features and improvements.

\n\n\n\n

Ways to contribute

\n\n\n\n

WordPress is open source software made possible by the community of people collaborating on and contributing to its development. The resources below outline a variety of ways you can help, regardless of your technical expertise.

\n\n\n\n

Download RC3 for testing

\n\n\n\n

You can test WordPress 6.3 RC3 in three ways:

\n\n\n\n
    \n
  • Option 1: Install and activate the WordPress Beta Tester plugin (select the “Bleeding edge” channel and “Beta/RC Only” stream).
  • \n\n\n\n
  • Option 2: Direct download the RC3 version (zip).
  • \n\n\n\n
  • Option 3: Use the following WP-CLI command:
    wp core update --version=6.3-RC3
  • \n
\n\n\n\n

Keep WordPress bug-free—help with testing

\n\n\n\n

Testing for issues is a critical part of developing any software, and it’s a meaningful way for anyone to contribute—whether you have experience or not. While testing the upgrade process is essential, trying out new features is too.  

\n\n\n\n\n\n\n\n

Search for vulnerabilities

\n\n\n\n

The monetary reward for reporting new, unreleased security vulnerabilities is doubled between the Beta 1 release and the final release candidate (RC). Please follow responsible disclosure practices as detailed in the project’s security practices and policies outlined on the HackerOne page and in the security white paper.

\n\n\n\n

Update your theme or plugin

\n\n\n\n

Do you build themes or plugins? Your products play an integral role in extending the functionality and value of WordPress for users of all types worldwide. 

\n\n\n\n

This is your final opportunity to test your latest versions against RC3. You will want to continue your testing and update the “Tested up to” version in your plugin’s readme file to 6.3. 

\n\n\n\n

If you find compatibility problems, please post detailed information to the support forums.

\n\n\n\n

Help translate WordPress

\n\n\n\n

Do you speak a language other than English? ¿Español? Français? Português? Русский? 日本? Help translate WordPress into more than 100 languages. 

\n\n\n\n

Release the haiku

\n\n\n\n

Phase two, soon complete
A monumental release
Then onto six-four.

\n\n\n\n

Thank you to the contributors who collaborated on this post: @Meher, @DanSoschin, and @jpantani

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"15615\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:3;a:6:{s:4:\"data\";s:72:\"\n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:36:\"People of WordPress: Ihtisham Zahoor\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:71:\"https://wordpress.org/news/2023/07/people-of-wordpress-ihtisham-zahoor/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 31 Jul 2023 20:22:31 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:6:{i:0;a:5:{s:4:\"data\";s:9:\"Community\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"Features\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:7:\"General\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:3;a:5:{s:4:\"data\";s:10:\"Interviews\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:4;a:5:{s:4:\"data\";s:9:\"HeroPress\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:5;a:5:{s:4:\"data\";s:19:\"People of WordPress\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=15589\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:98:\"People of WordPress features Ihtisham Zahoor, an administrator turned web developer from Pakistan.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:11:\"Abha Thakor\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:12334:\"\n

From administrator to web developer thanks to the supportive WordPress community. Through learning from other software users in Pakistan, Ihtisham Zahoor knew that his life would change. He moved cities and careers to make his life through open source.

\n\n\n\n

The People of WordPress series shares inspiring stories of how people’s lives can change for the better through WordPress and its global community of contributors.

\n\n\n\n
\"Ihtisham
\n\n\n\n

Ihtisham, from Haripur, a city in northern Pakistan, said: “The WordPress community made me a firm believer in the power of open source software. This is why I am an enthusiast and one who enjoys contributing back to the community via writing, speaking, and helping organize meetups.”

\n\n\n\n

When Ihtisham discovered WordPress, his fascination for working with computing grew. He knew he did not want to just work in administration his entire career.

\n\n\n\n

Ihitsham describes himself as an ‘introvert’ and therefore the idea of remote work appealed as he could still add value to others through technology. He was intrigued by the thought of the freedom to choose his work hours. However, without access to others who had already transformed their careers and lives through web development, he felt he ‘had no path to follow to turn my dream into a reality.’

\n\n\n\n

Challenges become opportunities to learn when there is an active community  

\n\n\n\n
\"Ihtisham
\n\n\n\n

Lacking any kind of informed support network to advise or guide him, Ihtisham devoted time to online research to find the next steps he could take. Looking back, he believes that for those who are not in a network with others with similar interests, it can be hard to keep learning and experimenting with new things. Isolation can be a barrier to working in web development.  

\n\n\n\n

He said: “I think it is not easy to stay motivated when there aren’t immediate rewards for the hard work we do. Sometimes, weeks would go by when my only focus would be to stay motivated rather than give up.”

\n\n\n\n

After another two years of combining learning and work, Ihtisham took up using WordPress as a full-time career. He moved to the capital of Pakistan, Islamabad. It was not easy at first. He recalls: “After many failed attempts at getting hired and desperate moments, I finally received an offer from a digital agency as a web developer focused on the WordPress platform.”

\n\n\n\n

He added: “Moving to work with a bigger agency was one of the best decisions of my life as it helped me with my professional growth by becoming familiar with the whole WordPress ecosystem in a supportive environment. I was valued for my opinions in the web projects in which I was involved. I was also appreciated and encouraged for the open source work I did for the company.” He summarized his enthusiasm for WordPress like this: “It is really interesting figuring out what is happening in the backends. I like problem-solving and finding solutions which you can do with WordPress.”

\n\n\n\n

During the Covid-19 pandemic, Ihtisham moved to join a start-up based in his hometown which provides web development services to international clients. He works as a developer and has the opportunity to learn more about client communication and project management. “WordPress has opened up so many opportunities for me. It has been an exciting journey for me with lots of learning every day,” he said. In particular, he has discovered an interest in APIs and regularly uses his spare time to follow tickets in the hope of one day contributing even more to topics, such as, third-party app integration through APIs on WordPress sites.

\n\n\n\n

Give back through WordPress community

\n\n\n\n
\"Ihtisham
\n\n\n\n

It was not just software that made a difference in Ihtisham’s life. Joining a welcoming and sharing community was transforming for him. Recalling those early days of isolation, he values the WordPress community and is wholly committed to the power of open-source software. He now enjoys writing, speaking, and organizing meetups to give back to both to the community. He has written software for the platform and contributes to the Core work, which he describes as a ‘humbling’ experience. He is fond of WordCamp Islamabad and in 2023 is on the organizing team to help bring both WordPress and its community to others in Pakistan.

\n\n\n\n

“My first experience,” he said, “was that everyone was so friendly and open to sharing what they have learned, even though they were all busy working. This really had an impact on me. It really helped me and gave me the confidence that I could work with WordPress…. It was a real step forward for me joining this community.”

\n\n\n\n
\"Ihtisham
\n\n\n\n

A particular meeting in 2018 led to new friendships through the WordPress community. Ihtisham was on a train to Karachi for the first ever Pakistani WordCamp in 2018 and met a group of fellow attendees he now regards as close friends. What impressed him most about the camp was that although he met many people with considerable expertise, they also had a generosity of spirit and humbleness in their willingness to share this knowledge. in sharing it. Now, he and this group of friends make a point to taking trains across the country, which allows him to fulfil another dream of traveling widely. He says these things and other ‘side benefits’ have been made possible by the WordPress community, and for that, he is ‘forever grateful’.

Ihtisham particularly wanted to share his story through this People of WordPress article to encourage those starting with little or no support to remain persistent. He knows from experience breaking into the tech world can be hard, especially when you may be switching from doing something else and have no ‘track record’ to offer.

\n\n\n\n

He feels he is a living example of how perseverance can lead to success. He offers these words to anyone thinking of making a move into development using the WordPress platform: “I attribute my success (financial and mental well-being) to the open-source nature of WordPress and its amazing community. It would not be possible to learn and use the plethora of free tools WordPress provides if it weren’t an open-source platform. It is for that reason I feel obligated to contribute back to this platform to the best of my abilities.” To those who are finding getting going difficult, as he did, he adds: “Get yourself a clear learning path and just dive in doing WordPress, and things will get better for you over time as they were for me, I promise. Good Luck!”

\n\n\n\n

Share the stories

\n\n\n\n

Help share these stories of open source contributors and continue to grow the community. Meet more WordPressers in the People of WordPress series.

\n\n\n\n

To help you discover more about how to use the WordPress software, there is a free resource from the community, Learn.WordPress.org

\n\n\n\n

Contributors

\n\n\n\n

Thanks to Ihtisham Zahoor (@shaampk1) for sharing about his adventures in WordPress.

\n\n\n\n

Thank you to Abha Thakor (@webcommsat), Nalini Thakor (@nalininonstopnewsuk), and Meher Bala (@meher) for interviews, the feature and collaborating on images. To Chloe Bringmann (@cbringmann), Mark Smallman (@marks99), and Mary Baum (@marybaum) for reviews. Thanks to the late Surendra Thakor (@sthakor), Maja Loncar (@majaloncar), Maedah Bahtool (@maedahbatool) and other members of the Marketing and Polyglots Team for their contributions.

\n\n\n

The People of WordPress series thanks Josepha Haden (@chanthaboune) and Topher DeRosia (@topher1kenobe) for their support.

\n\n\n
\"HeroPress
\n

This People of WordPress feature is inspired by an essay originally published on HeroPress.com, a community initiative created by Topher DeRosia. It highlights people in the WordPress community who have overcome barriers and whose stories might otherwise go unheard. #HeroPress

\n
\n\n\n

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"15589\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:4;a:6:{s:4:\"data\";s:63:\"\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:49:\"Synced Patterns: The Evolution of Reusable Blocks\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:84:\"https://wordpress.org/news/2023/07/synced-patterns-the-evolution-of-reusable-blocks/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 27 Jul 2023 14:45:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:3:{i:0;a:5:{s:4:\"data\";s:6:\"Design\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:11:\"Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:8:\"Features\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=15541\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:369:\"Synced patterns are replacing Reusable blocks, offering a unified creation experience for new pattern functionality coming to WordPress 6.3. Patterns, first introduced in WordPress 5.5, are a collection of blocks that make it simple to add complex layouts and designs to any WordPress site without starting from scratch. With WordPress 6.3, set to be released […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"annezazu\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:6153:\"\n

Synced patterns are replacing Reusable blocks, offering a unified creation experience for new pattern functionality coming to WordPress 6.3. Patterns, first introduced in WordPress 5.5, are a collection of blocks that make it simple to add complex layouts and designs to any WordPress site without starting from scratch. With WordPress 6.3, set to be released on August 8th, you will be able to arrange blocks in unlimited ways and save them as patterns for use throughout your site, directly within the editing experience. You can also specify whether to sync your patterns, so that one change applies to all parts of your site, or to keep them unsynced, so you can customize each instance.

\n\n\n\n
\n\n
\n\n\n\n

Create your own patterns

\n\n\n\n

The ability to create your own patterns, on top of using the ones bundled into each WordPress release, opens up a world of possibilities. Need to repeat the same contact information across your site and keep it up to date? Create a synced pattern with all the details, and say goodbye to repeating yourself, with the ability to quickly insert the synced pattern wherever you need it. If you find yourself creating various banners for your site and want them to have the same layout with unique content, creating an unsynced pattern speeds up your workflow and ensures a level of consistency in approach. While themes and plugins have been able to offer patterns to users and curate the experience, this update allows agencies and site builders to do the same for their clients, directly in the site building process.

\n\n\n\n

Dig into the details

\n\n\n\n

Any previously made Reusable blocks will continue to function as they do now, just under the new Synced pattern name. To help adjust to these changes, a few contextual notices will be placed throughout the interface. Specifically, the menu item in the creation flow will show as “Create pattern/reusable block” until the prompt describing the switch is dismissed in one of the various locations, including the naming and syncing modal: 

\n\n\n\n
\n\n
\n\n\n\n

For folks using block themes, all patterns will be listed alongside template parts in the Site Editor > Patterns section, where you can enter a focused editing mode to make changes. For Classic themes, the prior reusable block management page will now house patterns in a list, similar to the Posts > All Posts view.

\n\n\n\n
\"Patterns
\n\n\n\n

For a complete overview of patterns on your site, all patterns provided by themes and plugins will be shown in this section but without the option to edit directly.

\n\n\n\n

Go further

\n\n\n\n

With the ability to create your own patterns baked into the creation experience, remember that you can copy the patterns available in the Pattern Directory and contribute back, an excellent way to democratize design for every WordPress user and the web.

\n\n\n\n

For more exciting features coming to patterns in WordPress 6.3, read on in the Advancing the Power of Patterns post. Thank you to the contributors who collaborated on this post: Chloé Bringmann, Jonathan Pantani, Josepha, Krista Stevens, Nicholas Garofalo, Peter Rubin.

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"15541\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:5;a:6:{s:4:\"data\";s:69:\"\n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:33:\"WordPress 6.3 Release Candidate 2\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:69:\"https://wordpress.org/news/2023/07/wordpress-6-3-release-candidate-2/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 25 Jul 2023 16:43:13 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:5:{i:0;a:5:{s:4:\"data\";s:11:\"Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:3:\"6.3\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:3;a:5:{s:4:\"data\";s:11:\"development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:4;a:5:{s:4:\"data\";s:8:\"releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=15460\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:246:\"WordPress 6.3 RC2 is ready for download and testing. Reaching this part of the release cycle is a key milestone. While release candidates are considered ready for final release, additional testing and use by the community can only make it better.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:10:\"Meher Bala\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:7642:\"\n

WordPress 6.3 RC2 is ready for download and testing.

\n\n\n\n

This version of the WordPress software is under development. Please do not install, or run, or test this version on production or mission-critical websites. Instead, you should evaluate RC2 on a test server and site. 

\n\n\n\n

While release candidates are considered ready for final release, additional testing and use by the community can only make it better.

\n\n\n\n

WordPress 6.3 is scheduled for release on August 8, 2023 – just two weeks from today.

\n\n\n\n

Get an overview of the 6.3 release cycle, check the Make WordPress Core blog for 6.3-related posts, review new features in WordPress 6.3, or watch a recorded demo.

\n\n\n\n

Developers and extenders should review the comprehensive WordPress 6.3 Field Guide for detailed technical notes regarding new features and improvements.  

\n\n\n\n

RC2 Highlights

\n\n\n\n

Since the RC1 release on July 18, 2023, there have been approximately 15 issues resolved in Editor and Trac.

\n\n\n\n

Notable updates for this release include:

\n\n\n\n
    \n
  • Footnotes will be reverted or restored with post revisions (#52686).
  • \n\n\n\n
  • Distraction free adds a missing command in the site editor (#52868).
  • \n\n\n\n
  • Global styles revisions will display text if no revisions are found (#52865).
  • \n\n\n\n
  • The About Page has been completed (#58067).
  • \n\n\n\n
  • The About Page now includes a “Get Involved” section (#23348).
  • \n\n\n\n
  • The dark mode option has been restored in the block editor iframe for Twenty Twenty-One (#58835).
  • \n\n\n\n
  • Max height value was fixed in the image scaling in the Edit Media screen (#50523).
  • \n\n\n\n
  • Additionally, some issues regarding internationalization were addressed (#58879#58067 and #58864).
  • \n
\n\n\n\n

Test features in WordPress 6.3

\n\n\n\n

Testing for issues is a critical part of developing any software, and it’s a meaningful way for anyone to contribute—whether you have experience or not. While testing the upgrade process is essential, trying out new features is too. 

\n\n\n\n\n\n\n\n

Vulnerability bounty doubles during the Beta/RC phases

\n\n\n\n

The monetary reward for reporting new, unreleased security vulnerabilities is doubled between the Beta 1 release and the final release candidate (RC). Please follow responsible disclosure practices as detailed in the project’s security practices and policies outlined on the HackerOne page and in the security white paper.

\n\n\n\n

Get WordPress 6.3 RC2

\n\n\n\n

You can test WordPress 6.3 RC2 in three ways:

\n\n\n\n
    \n
  • Option 1: Install and activate the WordPress Beta Tester plugin (select the “Bleeding edge” channel and “Beta/RC Only” stream).
  • \n\n\n\n
  • Option 2: Direct download the RC2 version (zip).
  • \n\n\n\n
  • Option 3: Use the following WP-CLI command:
    wp core update --version=6.3-RC2
  • \n
\n\n\n\n

Thanks to WordPress plugin and theme developers

\n\n\n\n

Do you build plugins and themes? Your products play an integral role in extending the functionality and value of WordPress for users of all types worldwide. 

\n\n\n\n

Hopefully, you have already tested your themes and plugins with WordPress 6.3 betas by now. With RC2, you will want to continue your testing and update the “Tested up to” version in your plugin’s readme file to 6.3. 

\n\n\n\n

If you find compatibility problems, please post detailed information to the support forums.

\n\n\n\n

Help translate WordPress

\n\n\n\n

Do you speak a language other than English? ¿Español? Français? Português? Русский? 日本? Help translate WordPress into more than 100 languages.

\n\n\n\n

Haiku for RC2

\n\n\n\n

Time is nearly here
WordPress shines thanks to you all
Let’s get testing, dear

\n\n\n\n

Thank you to the contributors who collaborated on this post: @Priethor, @AudrasJb, @DavidBaumwald, @DanSoschin, @JPantani and @Meher.

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"15460\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:6;a:6:{s:4:\"data\";s:63:\"\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:62:\"WordPress 6.3 Live Product Demo – Highlights & Recording\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:88:\"https://wordpress.org/news/2023/07/wordpress-6-3-live-product-demo-highlights-recording/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 21 Jul 2023 19:26:26 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:3:{i:0;a:5:{s:4:\"data\";s:7:\"General\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:3:\"6.3\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:9:\"live demo\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=15445\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:102:\"Watch a demonstration of some of the newest features of WordPress 6.3, recorded live on July 20, 2023.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"Jonathan Pantani\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:8111:\"\n

WordPress 6.3 ships on August 8th! For a sneak peek of what’s to come, members of the 6.3 release squad, Anne McCarthy and Rich Tabor, held a live demo moderated by Nathan Wrigley

\n\n\n\n

More than 100 attendees watched as some of the most anticipated product features were demonstrated, from the brand-new Command Palette to new design tools and more.

\n\n\n\n
\n\n
6.3 Live Product Demo
\n\n\n\n

Here are some of the key takeaways from the 6.3 live product demonstration.

\n\n\n\n

Command Palette’s big debut

\n\n\n\n

One of the most anticipated features of 6.3 is the Command Palette. It lets you quickly navigate and open different WordPress functions within the post and Site Editor. Access it using a shortcut command (Command + K or Control + K).

\n\n\n\n

Page creation gets easier in the Site Editor

\n\n\n\n

Now you can browse and edit pages within the Site Editor, providing a more cohesive WordPress experience. A new drafting flow debuts, allowing you to create and publish pages directly within the editor. 

\n\n\n\n

Synced Patterns set to replace Reusable Blocks

\n\n\n\n

You can create and manage all your patterns directly in the Site Editor. Once edited, all synced patterns (previously called Reusable Blocks) will change across a site—a huge time saver when making changes. 

\n\n\n\n

Stay on top of design changes with Style Revisions

\n\n\n\n

This enhancement offers a visual timeline of your site so you can see all the revisions in your site’s history and restore a previous style with just a click. 

\n\n\n\n

New design tools and blocks

\n\n\n\n

Controls for specifying aspect ratios to ensure design integrity, especially when using images in Patterns debut in 6.3, along with new blocks for Footnotes and Details. Easily add footnotes to your content and have them automatically linked to the corresponding text. With the Details block, hide or display content to create spoilers or accordions. 

\n\n\n\n

Performance

\n\n\n\n

WordPress is getting faster with 6.3 as content with images will see speedier load times. Both theme types (Classic and Block) will also benefit from performance improvements. The upcoming hallway hangout is an excellent opportunity to learn more about performance enhancements directly from the WordPress Performance team.

\n\n\n\n

More from Core

\n\n\n\n\n\n\n\n

These new features and more await you as Phase 2 of the WordPress Roadmap comes to a close with the 6.3 release.

\n\n\n\n

A question and answer session followed the demo, with attendees asking plenty of great questions. The panelists shared links for additional reading regarding many new features—all conveniently added to the end of this post. 

\n\n\n\n

A big thank you to everyone who helps make WordPress. Contributors power every WordPress release. Without the hundreds of contributors worldwide who help build WordPress, this live product demo wouldn’t have been possible. Thank you for all of your hard work.

\n\n\n\n

References from the Live Demo

\n\n\n\n\n\n\n\n

Props to @richtabor and @annezazu for reviewing this post and to @cbringmann, @meher, and @dansoschin for their logistics support to run the event.

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"15445\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:7;a:6:{s:4:\"data\";s:69:\"\n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:33:\"WordPress 6.3 Release Candidate 1\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:69:\"https://wordpress.org/news/2023/07/wordpress-6-3-release-candidate-1/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 18 Jul 2023 17:08:04 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:5:{i:0;a:5:{s:4:\"data\";s:11:\"Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:8:\"Releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:3:\"6.3\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:3;a:5:{s:4:\"data\";s:11:\"development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:4;a:5:{s:4:\"data\";s:8:\"releases\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=15431\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:246:\"WordPress 6.3 RC1 is ready for download and testing. Reaching this part of the release cycle is a key milestone. While release candidates are considered ready for final release, additional testing and use by the community can only make it better.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:11:\"Dan Soschin\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:11307:\"\n

WordPress 6.3 RC1 is ready for download and testing.

\n\n\n\n

This version of the WordPress software is under development. Please do not install, run, or test this version on production or mission-critical websites. Instead, you should evaluate RC1 on a test server and site. 

\n\n\n\n

Reaching this part of the release cycle is a key milestone. While release candidates are considered ready for final release, additional testing and use by the community can only make it better.

\n\n\n\n

Get an overview of the 6.3 release cycle, check the Make WordPress Core blog for 6.3-related posts, and review the new features in WordPress 6.3. Save the date for a live product demo scheduled for Thursday, July 20, 2023, at 16:00 UTC (Zoom link). This live demo will be a great opportunity to join the WordPress community to celebrate the accomplishments of 6.3 and this final chapter of Phase 2.

\n\n\n\n

RC1 highlights

\n\n\n\n

Thanks to the many WordPress beta testers, this release contains 40+ (Editor) and 80+ (Trac) updates since the Beta 4 release. Keep it up WordPressers!

\n\n\n\n

Notable updates for this release include:

\n\n\n\n
    \n
  • WordPress database error when installing PHPUnit tests (#58673)
  • \n\n\n\n
  • Use _get_block_template_file function and set $area variable (#52708)
  • \n\n\n\n
  • Indicate when a theme supports the Site editor in the Themes REST API response (#58123)
  • \n\n\n\n
  • bulk_edit_posts() function needs an action hook (#28112)
  • \n\n\n\n
  • Allow editing existing footnote from formats toolbar (#52506)
  • \n\n\n\n
  • Patterns: Add client side pagination to patterns list (#52538)
  • \n\n\n\n
  • Trim footnote anchors from excerpts (#52518)
  • \n
\n\n\n\n

Browse the technical details for issues addressed since Beta 4 using these queries:

\n\n\n\n\n\n\n\n

For a recap of what’s coming in 6.3, please refer to the Beta 2 post, which summarizes key features.

\n\n\n\n

You can also dig into technical information about various components in 6.3:

\n\n\n\n\n\n\n\n

For a compilation of the dev notes above and more, read the comprehensive WordPress 6.3 Field Guide.  

\n\n\n\n

Test the new features in WordPress 6.3

\n\n\n\n

Testing for issues is a critical part of developing any software, and it’s a meaningful way for anyone to contribute—whether you have experience or not. While testing the upgrade process is essential, trying out new features is too. 

\n\n\n\n\n\n\n\n

Vulnerability bounty doubles during the Beta/RC phases

\n\n\n\n

The monetary reward for reporting new, unreleased security vulnerabilities is doubled between the Beta 1 release and the final release candidate (RC). Please follow responsible disclosure practices as detailed in the project’s security practices and policies outlined on the HackerOne page and in the security white paper.

\n\n\n\n

Get WordPress 6.3 RC1

\n\n\n\n

You can test WordPress 6.3 RC1 in three ways:

\n\n\n\n
    \n
  • Option 1: Install and activate the WordPress Beta Tester plugin (select the “Bleeding edge” channel and “Beta/RC Only” stream).
  • \n\n\n\n
  • Option 2: Direct download the RC1 version (zip).
  • \n\n\n\n
  • Option 3: Use the following WP-CLI command:
    wp core update --version=6.3-RC1
  • \n
\n\n\n\n

The current target for the final release is August 8, 2023, about three weeks away. Your help testing this version ensures everything in this release is the best.

\n\n\n\n

Thanks to WordPress plugin and theme developers

\n\n\n\n

Do you build plugins and themes? Your products play an integral role in extending the functionality and value of WordPress for users of all types worldwide. 

\n\n\n\n

Chances are, you have already been testing your latest themes and plugins with WordPress 6.3 betas. With RC1, you will want to complete your testing and update the “Tested up to” version in your plugin’s readme file to 6.3. 

\n\n\n\n

If you find compatibility problems, please post detailed information to the support forums.

\n\n\n\n

Help translate WordPress

\n\n\n\n

Do you speak a language other than English? ¿Español? Français? Português? Русский? 日本? Help translate WordPress into more than 100 languages. This release also marks the hard string freeze point of the 6.3 release cycle.

\n\n\n\n

Haiku for RC1

\n\n\n\n

RC1 is here
Hold your applause ‘til the end
Download, test, repeat

\n\n\n\n

Thank you to the contributors who collaborated on this post: @DanSoschin, @Meher, and @JPantani.

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"15431\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:8;a:6:{s:4:\"data\";s:61:\"\n \n \n \n \n \n \n \n \n\n \n \n \n \n \n\n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:7:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:87:\"WP Briefing: Episode 60: Sneak a Peek at WordPress 6.3 with Special Guest Mike Schroder\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:109:\"https://wordpress.org/news/2023/07/episode-60-sneak-a-peek-at-wordpress-6-3-with-special-guest-mike-schroder/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 17 Jul 2023 13:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:2:{i:0;a:5:{s:4:\"data\";s:7:\"Podcast\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:11:\"wp-briefing\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"https://wordpress.org/news/?post_type=podcast&p=15398\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:176:\"Join WordPress Executive Director Josepha Haden Chomphosy and Core Tech Lead Mike Schroder as they discuss their favorite new features and enhancements coming in WordPress 6.3.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:9:\"enclosure\";a:1:{i:0;a:5:{s:4:\"data\";s:0:\"\";s:7:\"attribs\";a:1:{s:0:\"\";a:3:{s:3:\"url\";s:60:\"https://wordpress.org/news/files/2023/07/WP-Briefing-060.mp3\";s:6:\"length\";s:1:\"0\";s:4:\"type\";s:0:\"\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:17:\"Nicholas Garofalo\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:31362:\"\n

Join WordPress Executive Director Josepha Haden Chomphosy and Core Tech Lead Mike Schroder as they discuss their favorite new features and enhancements coming in WordPress 6.3.

\n\n\n\n

Have a question you’d like answered? You can submit them to wpbriefing@wordpress.org, either written or as a voice recording.

\n\n\n\n

Credits

\n\n\n\n

Host: Josepha Haden Chomphosy
Guests: Mike Schroder
Editor: Dustin Hartzler
Logo: Javier Arce
Production: Nicholas Garofalo
Song: Fearless First by Kevin MacLeod

\n\n\n\n

Show Notes

\n\n\n\n\n\n\n\n\n\n\n\n

Transcript

\n\n\n\n

( Intro music )

\n\n\n\n

[00:00:00] Josepha: Hello, everyone, and welcome to the WordPress Briefing, the podcast where you can catch quick explanations of the ideas behind the WordPress open source project, some insight into the community that supports it, and get a small list of big things coming up in the next two weeks.

\n\n\n\n

I’m your host, Josepha Haden Chomphosy. Here we go.

\n\n\n\n

( Intro music continues )

\n\n\n\n

[00:00:39] Josepha: We have with us Mike Schroder. They are on the WordPress 6.3 release squad, and I believe, Mike, that your role there is the Core Tech Lead.

\n\n\n\n

Is that right?

\n\n\n\n

[00:00:50] Mike: Yeah, that’s correct. I’m one of the tech leads along with Andrew Ozz and David Baumwald.

\n\n\n\n

[00:00:56] Josepha: Thank you so much for being able to join me today.

\n\n\n\n

[00:00:58] Mike: Thanks for inviting me.

\n\n\n\n

[00:01:00] Josepha: This is our 6.3 sneak peek, and so it has a little bit of a “What do you wish people knew about the upcoming release?” aspect to it, but it also has like a “What do we find most interesting about the work that we’ve been doing in this release so far?”

\n\n\n\n

As the Core Tech Lead, what currently is like your favorite thing that y’all are getting into the release or the thing that’s the most interesting or happiest to finally be done with it?

\n\n\n\n

[00:01:27] Mike: Yeah, I think there are a couple of things. So I was playing around with the release in anticipation for this, and one of the favorite sort of user-facing features that I played with was the live preview for Block themes. And it just makes it feel so intuitive to open up a new Block theme and play around with Styles and different designs and see how it looks.

\n\n\n\n

I really enjoyed it, opened it up on my personal site and started messing around with different color palettes and things like that, and it was a lot of fun.

\n\n\n\n

[00:01:55] Josepha: Like it’s a live preview, but also with all of the content they already have on your site.

\n\n\n\n

[00:01:59] Mike: It does use the templates and so it, it shows some of the live content from the from the homepage, for instance, and some of those blocks, and some of the other areas are editing the templates rather than the live content. But yes, it was neat to play around with it and see my blog content in the background and yeah, some real-time design. That was really fun.

\n\n\n\n

[00:02:20] Josepha: And has that been a big focus of the release? Was it something that you and the other Tech Leads both for the Core side and the Editor side just had to focus a lot on in this round of the release?

\n\n\n\n

[00:02:33] Mike: So I was not a part of a lot of that work. So I’m not gonna take credit for it. I think that is the culmination, all of those different things together of a lot of the things that the Editor team has been working on for some time. And it was just, it was really refreshing to see it.

\n\n\n\n

The other feature that I had in my head, if it’s okay for me to talk about a second one, is something that has been trying to get landed in Core for quite some time, and that has to do with automatic rollbacks. If plugin updates or theme updates start to happen and then they fail in the middle of that update, then it will automatically restore the previous version of the plugin or theme. And that’s a pretty big improvement over the previous behavior, which could result not as well.

\n\n\n\n

[00:03:16] Josepha: Right. Where you would just have a site that was like, “Best of luck to you,” and emails that told you what kind of probably was broken. I shouldn’t be sassy about that. The WSOD protection that we put in really was a huge leap forward for the way that we handled that in the past, but this is great news.

\n\n\n\n

[00:03:34] Mike: Yes, I was so excited when that landed, and this is I guess the next part of that. And it’s been, yeah, it’s been in the works for a long time, through testing and there was an entire team that did a lot of work on it in a future plugin. And I’m very excited to see it land.

\n\n\n\n

[00:03:49] Josepha: That’s great. That’s one of those things that we hope a WordPress user never has to know exists. Like it’s always our hope that the plugins work perfectly and the themes work perfectly. And so unless something is going really wrong you won’t know that’s a feature. Surely it tells you like, “This didn’t update by the way. Go figure that out.”

\n\n\n\n

[00:04:08] Mike: Yeah, the whole idea of this particular feature is to make it feel more like everything is smooth and one site continues to work, and the underpinning of it has been going in for a couple of releases. The whole idea is to make the experience more smooth for users.

\n\n\n\n

[00:04:21] Josepha: Cool. That auto rollback actually was not on my radar as a thing to keep an eye out for in this release, so that’s really neat. One of the things that I saw as I was doing, I don’t do any complicated testing. I mostly do like testing of what users would expect with the workflow with my eyeballs and a mouse.

\n\n\n\n

[00:04:40] Mike: Well, that’s, that’s wonderful.

\n\n\n\n

[00:04:42] Josepha: I’m not doing any of the fancy testing with like code, but one of the things that I saw as I was working through my general, just regular test, my spot check click around test was that it looks like there’s some consolidation, some consolidation of the navigation in the Editor.

\n\n\n\n

So, it had I think maybe Pages and Templates in there before, and now there are five things in there. Do you have a bit of a concept of what went into that, what we’re hoping everybody’s gonna be able to accomplish there now?

\n\n\n\n

[00:05:13] Mike: So I, I was not involved as much in the later stages of this, but I was in a couple of the first couple iterations of this particular feature, and I think this is, I don’t want to guess the exact amount of times that this has been sort of reworked so the experience is good for users, there been so much effort that’s gone into helping navigation be a comfortable experience for people to work with within the site editor.

\n\n\n\n

And what I have heard is that everyone that’s worked on it is very excited that it’s landing and that users will be able to experience it and more easily work with navigation.

\n\n\n\n

[00:05:46] Josepha: Yeah, I think that navigation is one of those things, both like creating good navigation as a software designer, but then also as somebody who’s like putting together a website. Good navigation is hard to do. And it’s design where everyone’s, “Good design is invisible,” and we don’t actually mean that.

\n\n\n\n

We don’t mean it’s invisible. We mean it’s not intrusive, it doesn’t get in your way, it acts in the way you think it’s going to act, and it knows or has a good guess about where you’re trying to be, what you’re trying to do in that particular moment on a site. And so like the fact that we’ve had probably hundreds of people working on navigation inside the software is no surprise to me, but I bet it’s gonna be a surprise to a lot of people.

\n\n\n\n

They’ll be like, “It’s like folders, right?” Turns out it’s not.

\n\n\n\n

[00:06:33] Mike: Yes, it was, incredibly, incredibly difficult to design. I know there was, the couple instances that I was most involved with, I know there was so much discussion about how folks are used to working with navigation within WordPress and sort of what expectations are for menus and what expectations are for, you know, users both that have been using WordPress for a long time and users who, who are new to WordPress, and the Site Editor. And having all of those considerations from the various stakeholders just makes it a really difficult design problem.

\n\n\n\n

[00:07:03] Josepha: Yeah, absolutely. And I mean, not for nothing like the WP Admin itself, that dashboard inside the WordPress software, like that’s been due for an update for quite some time. This is the same one that I think we’ve had since 2008, which was also very disruptive in its way. And so like it was a good disruption, but we really haven’t made any substantial changes to it since then. And part of it is because there are so many use cases for WordPress, and we don’t have a good concept of that because we don’t have a lot of tracking in the software. We don’t take anyone’s like data about what field they work in. We don’t do any of that.

\n\n\n\n

And so it’s hard for us to account for all of the use cases and get a really excellent design for a majority of the people that are gonna be using it. Because like we don’t actually build software for robots around here. Not yet.

\n\n\n\n

[00:07:54] Mike: ( laughs ) Yeah.

\n\n\n\n

[00:07:55] Josepha: No, I don’t think we’ll ever be robot-building software.

\n\n\n\n

[00:07:57] Mike: I doubt it, but I also don’t wanna predict the future. No, I agree. And I think that is absolutely one of the super tricky things about building WordPress. I’m really glad that WordPress doesn’t collect any of that data. And it makes it so that the sort of testing that, that you were talking about, in user studies and things like that, are incredibly helpful for figuring out what the best approaches are.

\n\n\n\n

[00:08:21] Josepha: Yeah, absolutely. Since we’re just in the zone of like things that Josepha likes and that she saw, I’m gonna also do this other thing. In one of the last couple of releases, the Style Book came out, which was such an exciting thing for me. It’s great to be able to see whether or not all of the style choices you’ve made in various parts of the admin or in the code, depending on how you’re doing things.

\n\n\n\n

It’s nice to make sure, in one big set, that like everything is coherent. Everything that you thought you changed did get changed and it looks the way that you wanted it to look in concert with everything else in there. And it looked like we now have revisions specific to styles, like styling things across the site, have revisions.

\n\n\n\n

Is that right?

\n\n\n\n

[00:09:06] Mike: That’s correct.

\n\n\n\n

[00:09:07] Josepha: I think that’s a super big deal because as somebody who is just, I’m filled with techno joy. I don’t always want to look at a manual. I just want to do stuff until it breaks and then hope I can fix it. The hoping you can fix it part ( laughs ) can sometimes be really nerve-wracking if what you’re doing is creating a site for a client or you are working on your first big theme and you wanna make sure that’s all together.

\n\n\n\n

And so style revisions to go along with some of the Editor revisions I think is a great change.

\n\n\n\n

[00:09:39] Mike: Same. Absolutely. This is not a feature I have, done too much particular playing with, at this point.

\n\n\n\n

[00:09:44] Josepha: You’re a very skilled developer.

\n\n\n\n

[00:09:46] Mike: I appreciate that. That’s very kind. I think that adding revisions to anything that folks regularly change in posts or pages is, really important. And making it very easy to get to both make forward changes and also to realize, “Oh, there was this other change that was, you know, there was three clicks ago that I really loved. How do I get back to that? How do I see the history?” And that’s what I love about that sort of feature. Being able to really easily see, “Okay, when did this happen? In what series? How can I jump back and get to that spot that felt right.”

\n\n\n\n

[00:10:19] Josepha: Yes. Anytime that we can have that kind of historical layering of things, I think is good. I went to a meetup. I like to go to meetups that are 101 content, because that’s like the folks that really need new refined processes the most. But I went to a 101 meetup a couple years back, and I remember that the presenter was saying like, take a theme that you pretty much like and make some changes until you have a theme that you love.

\n\n\n\n

And people kept saying like, “Yeah, but what if I break everything?” And he said in the middle of that to everyone, not knowing who I was because who cares? He was like, “Yeah, WordPress is not gonna let you do anything that will completely destroy a theme or completely destroy your site. There’s an undo button and you can just undo it. It’ll be fine.” And I was like, “Yeah, that is true now.”

\n\n\n\n

[00:11:15] Mike: I love that.

\n\n\n\n

Gosh. I mean, I remember when I was playing with my first WordPress site, and even to make really small changes with navigation or with menus, I had to go in and make changes to the PHP code, and none of that was protected.

\n\n\n\n

[00:11:31] Josepha: You’re like, “This is free-range me out here.”

\n\n\n\n

[00:11:34] Mike: I love, absolutely. I love that is just no longer the case anymore and it’s super easy to go in and play with a theme and make changes without worrying about any of that. And, I mean, I may be a developer, but that’s the way I would prefer. That’s the way I go in and edit my sites now too.

\n\n\n\n

If I wanna mess with a theme, go in, and it was the Customizer and now it’s the Site Editor, and it’s great.

\n\n\n\n

[00:11:58] Josepha: Yeah, it’s a leap forward, I think, leap forward.

\n\n\n\n

So another thing that I ran into, I guess it’s two things that I ran into while I was wandering around in there recently, and it’s possible that I ran into these two things because I just personally love them the most, but the Footnotes block looks like it is potentially going to land.

\n\n\n\n

I have been so excited about this block for no reason. I have dreams about it. I wish that were not a true statement. I did recently have a dream about it. I dreamt that it didn’t land in the release, and that I went to talk to Ella about it and she was like, “Oh, yeah, publishers have given up on footnotes and they’re just doing end notes now, and so I decided not to ship it.” Like this is a dream I had.

\n\n\n\n

And so I’m a little worried, but tomorrow I’m gonna be like, “Hey, Ella, friend, what’s happening?” And she’s gonna be like, “Yeah, end notes are where it’s at.”

\n\n\n\n

And then the other block that I’m personally very excited about is what I like to call the “Spoilers block.” I know it is not “Spoilers”, it’s the called “Details,” but anytime I’ve ever used that after like early, early times in my career, early in my career, I used to call them accordions and I don’t know why, but now I call them “Spoiler blocks.” But I know it’s actually called the “Details block,” where you can put in a piece of information at the top, essentially a title, and then expand it to get more information in there.

\n\n\n\n

So are both of those actually gonna land or am I gonna be heartbroken?

\n\n\n\n

[00:13:24] Mike: As far as I’m aware, yes. I know that I haven’t checked recently on the latter, but I was just playing with the Footnotes block, and it’s really cool. I really like the interface. I think that it makes it really simple to add quick footnotes to, anywhere in the site, and everything feels very automated and simple.

\n\n\n\n

[00:13:46] Josepha: As someone who every, almost everything that I’ve ever written, I want to have an aside in it, which essentially just becomes a footnote. One of the weirdest parts about Gutenberg at first is that like, the asterisk way of doing it, where you just put one after the word and then put one at the start. The asterisk makes it into a list block, and for a long time you also couldn’t escape it, and so I had to do a lot of fancy footwork to get my footnotes to work for a while, and so I’m excited for that.

\n\n\n\n

[00:14:15] Mike: I think I had similar discouraging moments with lists and I was really encouraged by the way the footnotes select, and I’m sure there are other ways to do it too, but select, right-click, footnote, and they all automatically go to the bottom order, all of it. It’s a really smooth process.

\n\n\n\n

[00:14:31] Josepha: Yeah. I’m really excited about it. I know that like for the last two or three major releases, a bulk of what we’ve been offering to folks is like, design stuff, and we’re just like, “It’s a bunch of design things,” but this release actually has over 500 different tickets that were marked as features or enhancements that are going into it.

\n\n\n\n

And so, you and I have talked about seven things so far, but I also understand that there are literally 500 tickets or so that were marked as “feature” or “enhancement.” And so we are definitely not gonna catch everything that goes in there, but there is kind of a group of another group of enhancements to the design tools because of course this wraps up the bulk of phase two so that we can all move into the collaborative editing phase.

\n\n\n\n

And so like, do you have a sense for, like is this just mostly polish for those design and like image media management kinds of things? Or are there big features that are coming in those also?

\n\n\n\n

[00:15:29] Mike: My understanding is that it’s all of the above. I think that there are a lot of new features being added along with polish to those features. And I think the neatest thing is that there are also a lot of enhancements that are focused on bringing all of those things together and making it feel like more of a connected experience. And so I think that’s my favorite part so far in testing that I’ve been doing of, the many, as you mentioned, so many additional new features that, that we’re added this time. And, I have a huge amount of respect for, you know, everyone that works, for the huge amount of folks that work on it across the project.

\n\n\n\n

[00:16:07] Josepha: Yeah. Yeah, you’ve given a couple of answers where you were like, “I wasn’t personally involved in that,” but on the one hand, I was like, “Everyone knows that we’re not all personally involved in it,” but on the other hand, not everybody knows how many people touch all of these tickets and features and bugs and tests as we get them ready to be put into the release.

\n\n\n\n

Last year, I was super worried that like, post active fear of Covid, and now everyone just like deciding that they’ve done their best and they’re going back out there. Like I was really worried that everyone was gonna be having so much fun out of the house, that they would stop contributing.

\n\n\n\n

[00:16:43] Mike: ( laughs )

\n\n\n\n

[00:16:44] Josepha: I know, but we actually had one of our most active years for contributors last year, which means that especially for the releases that are coming this year, the people who worked all the way through last year, like almost 2000, I think, contributors, just to code, that’s not even like the contributors who worked on reigniting the community and putting together events, all of those things like all of the other things that we do.

\n\n\n\n

It’s, it is remarkable to me that when we look at any feature it is definitely been looked at or worked on, or at least passed through desks of easily a hundred people, even for small little things. And I just love that, the depth of the work we do.

\n\n\n\n

[00:17:29] Mike: Absolutely. Same. I remember wondering about that too, about your same sort of concerns. And it’s been really great to be a part of the community as it’s essentially, as it’s grown together again, I think is maybe the best way I can think of to say it. That’s been quite wonderful.

\n\n\n\n

[00:17:46] Josepha: Yeah, absolutely. Mike, this has been an absolutely delightful conversation. Is there anything you would like to leave us with before we move on to our small list of big things today?

\n\n\n\n

[00:17:58] Mike: The release candidate for 6.3 comes out tomorrow, and what I would love the most is if anyone in interested in testing, anyone, whether it’s testing exactly like this sort of testing that you were just talking about, with loading the RC and clicking around and seeing what works the best and what doesn’t work and what feels good and what doesn’t, or if it’s testing, if you’re like a plugin or a theme developer, testing with those things to see how things work and looking for backwards compatibility breaks that are unexpected so we can fix them before release.

\n\n\n\n

If you work at a hosting company or you make sites for folks, helping test that to see that it works really well on your platforms for folks that you work with. I think all of those would be super helpful, and there are testing instructions that can be found on the release candidate announcement page.

\n\n\n\n

[00:18:43] Josepha: Perfect. Wonderful. Mike, thank you so much for joining me today.

\n\n\n\n

[00:18:47] Mike: Thank you so much. I’ve really appreciated the time.

\n\n\n\n

( Musical interlude )

\n\n\n\n

[00:18:49] Josepha: That brings us now to our small list of big things. It’s actually kind of a big list of big things today. So first on the list is that WordCamp US has a Contributor Day and we need your help. So the WordCamp US Contributor Team has contacted all of the team reps asking for help with a new approach to organizing this year’s Contributor Day.

\n\n\n\n

The hope is to make the initial steps to contribution easier. And so they’re asking teams who will be present to help participate with that process. I will have a link in the show notes to the post that has more information.

\n\n\n\n

Also second thing related also to WordCamp US is that I would like to put out a call for art and music, especially that is related to open source and the freedoms that it brings. So one of the things that makes WordPress so fantastic in the world is not only that like we’re creating opportunities for folks, we’re offering economic, and I don’t know, philosophical freedoms to people, but we frequently do think about that in the vein of, you know, commerce and work and the economy, and we rarely think about it in the obviously related subset of arts and music. And so I also would like to put out a call for any open source related arts or poetry or music that you all have created.

\n\n\n\n

I would love to be able to display some of that at WordCamp US this year. I don’t think I have a link quite yet for a call for that, but as soon as I do, I’ll send it out on social media and other places.

\n\n\n\n

The third thing on our small list of big things is that, as Mike mentioned, tomorrow is the RC1 release date for WordPress 6. 3, and you can help us to test that.

\n\n\n\n

It’s always good for us to test any release as it’s working its way through the process, but certainly by the time it gets to RC, that’s when we are pretty sure it’s going to be as stable as possible. We’ve done some soft string freezes and feature freezes-ish. And so that’s about as stable as it’s going to get. And so I encourage everyone to get out and test that as much as possible. And in all the ways that Mike shared.

\n\n\n\n

Item number four, we are also reaching a milestone. So, a couple weeks ago, we reached the one year milestone for the start of the Meetup Reactivation Project.

\n\n\n\n

We have about 50% of our Meetup groups reactivated. If you are listening to this and you are a Meetup organizer and you haven’t heard from anyone from WordCamp Central or the community team, I’m going to put a link to the notes, or rather, a link to the post in the notes so that you can also learn more about that.

\n\n\n\n

You don’t have to hear from us in order to get your meetup group going again. But, if you are interested to know what has gone into that process, or always just want to know what’s going on in the community side of things, that’s a good place to start. So there will be a link to that in the show notes as well.

\n\n\n\n

Number five, WordPress event organizers in general, but also anyone. So there are two different events coming up on Thursday, on July 20th.

\n\n\n\n

First, there is the WP Diversity Workshop. This is added workshop for us to help promote the ideas of building diverse and inclusive WordPress events. And so, this is not necessarily one of those events for people who want to increase their skills in speaking so that they are able to, to speak confidently at a WordPress event. These are for people who are organizing WordPress events and want to make them more inclusive and more diverse from the start. I encourage any organizer to go to it, regardless of whether you’re doing WordPress events or not, but certainly for WordPress events that is something that we care about and want to have included in our entire event series.

\n\n\n\n

The other thing that’s happening on Thursday, because like I said, two things happening on Thursday, is that we have a WordPress 6. 3 live product demo. We’ve been doing these for the last few releases, and you get a couple of people from either the release squad, or like folks who do that kind of developer relations work in WordPress, who sit down and just do a general click-through, a general run through, a public demo of what we expect to land in the release.

\n\n\n\n

And so that also is on Thursday. I will also have a link for you in the show notes. If you are listening to this not on WordPress.org and you don’t know where the show notes are, don’t worry. The show notes are on WordPress.org. You go to WordPress.org/news/podcast and in the transcript there are show notes that have links to all of these things.

\n\n\n\n

And that, my friends, is your big, small list of big things. Thank you for tuning in today for the WordPress Briefing. Thank you again for my guest, Mike’s, time. I’m your host, Josepha Haden Chomphosy, and I’ll see you again in a couple of weeks.

\n\n\n\n

( Outtro music )

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"15398\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:9;a:6:{s:4:\"data\";s:63:\"\n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:4:{s:0:\"\";a:6:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:23:\"Designed with WordPress\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:59:\"https://wordpress.org/news/2023/07/designed-with-wordpress/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 14 Jul 2023 22:33:07 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"category\";a:3:{i:0;a:5:{s:4:\"data\";s:6:\"Design\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:1;a:5:{s:4:\"data\";s:3:\"6.3\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}i:2;a:5:{s:4:\"data\";s:9:\"Gutenberg\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=15401\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:11:\"isPermaLink\";s:5:\"false\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:342:\"The Gutenberg project has aimed to revolutionize how we manage web content as much as Johannes Gutenberg did the printed word. The project’s roadmap is comprised of four unique phases: With the upcoming release of WordPress 6.3, Phase 2 of the Gutenberg project is coming to a close; a journey worth celebrating. This video is […]\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:15:\"Chloe Bringmann\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:40:\"http://purl.org/rss/1.0/modules/content/\";a:1:{s:7:\"encoded\";a:1:{i:0;a:5:{s:4:\"data\";s:4271:\"\n
\"\"
\n\n\n\n

The Gutenberg project has aimed to revolutionize how we manage web content as much as Johannes Gutenberg did the printed word. The project’s roadmap is comprised of four unique phases:

\n\n\n\n
    \n
  1. Easier Editing — Already available in WordPress, with ongoing improvements
  2. \n\n\n\n
  3. Customization — Full site editing, block patterns, block directory, block themes
  4. \n\n\n\n
  5. Collaboration — A more intuitive way to co-author content
  6. \n\n\n\n
  7. Multilingual — Core implementation for Multilingual sites
  8. \n
\n\n\n\n

With the upcoming release of WordPress 6.3, Phase 2 of the Gutenberg project is coming to a close; a journey worth celebrating.

\n\n\n\n

This video is an ode to Gutenberg’s editing and customization phases, celebrating the new design tools and the possibilities they create. The piece encapsulates the exciting steps made in the past that propel the vibrant future of WordPress.

\n\n\n\n
\n\n
\n\n\n\n

Everything showcased in the video is built entirely with the WordPress Editor, using currently available blocks, patterns, and themes. This new era has opened the ability for the design community to contribute to the project directly without depending on developers to translate their ideas into designs. Consider this an invitation for designers to join a new generation that embraces the diverse and expressive capabilities of WordPress.

\n\n\n\n

The work that goes into Gutenberg is a powerful testament to the collaboration of coders, developers, and designers in our community. United, we strive to build WordPress into a realm of significance and lasting impact.

\n\n\n\n

Video credits

\n\n\n\n

Video credits: Tino Barreiro, Beatriz Fialho, Takashi Irie, Henrique Lamarino, Rich Tabor, Pablo Honey, Matías Ventura, and Holographik.

\n\n\n\n

Thank you to the post authors Tino Barreiro, Nicholas Garofalo, Dan Soschin, Rich Tabor, and Chloé Bringmann.

\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:7:\"post-id\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"15401\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}}}s:27:\"http://www.w3.org/2005/Atom\";a:1:{s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:0:\"\";s:7:\"attribs\";a:1:{s:0:\"\";a:3:{s:4:\"href\";s:32:\"https://wordpress.org/news/feed/\";s:3:\"rel\";s:4:\"self\";s:4:\"type\";s:19:\"application/rss+xml\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:44:\"http://purl.org/rss/1.0/modules/syndication/\";a:2:{s:12:\"updatePeriod\";a:1:{i:0;a:5:{s:4:\"data\";s:9:\"\n hourly \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:15:\"updateFrequency\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"\n 1 \";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:30:\"com-wordpress:feed-additions:1\";a:1:{s:4:\"site\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"14607090\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}}}}}}}}s:4:\"type\";i:128;s:7:\"headers\";O:48:\"WpOrg\\Requests\\Utility\\CaseInsensitiveDictionary\":1:{s:7:\"\0*\0data\";a:11:{s:6:\"server\";s:5:\"nginx\";s:4:\"date\";s:29:\"Thu, 10 Aug 2023 05:53:16 GMT\";s:12:\"content-type\";s:34:\"application/rss+xml; charset=UTF-8\";s:4:\"vary\";s:15:\"Accept-Encoding\";s:25:\"strict-transport-security\";s:12:\"max-age=3600\";s:6:\"x-olaf\";s:3:\"⛄\";s:13:\"last-modified\";s:29:\"Tue, 08 Aug 2023 23:38:54 GMT\";s:4:\"link\";s:63:\"; rel=\"https://api.w.org/\"\";s:15:\"x-frame-options\";s:10:\"SAMEORIGIN\";s:16:\"content-encoding\";s:2:\"br\";s:4:\"x-nc\";s:9:\"HIT ord 7\";}}s:5:\"build\";s:14:\"20211220193300\";}','no'), -(146,'_transient_timeout_feed_mod_9bbd59226dc36b9b26cd43f15694c5c3','1691689996','no'), -(147,'_transient_feed_mod_9bbd59226dc36b9b26cd43f15694c5c3','1691646796','no'), -(148,'_transient_timeout_feed_d117b5738fbd35bd8c0391cda1f2b5d9','1691689997','no'); -INSERT INTO `wp_options` VALUES -(149,'_transient_feed_d117b5738fbd35bd8c0391cda1f2b5d9','a:4:{s:5:\"child\";a:1:{s:0:\"\";a:1:{s:3:\"rss\";a:1:{i:0;a:6:{s:4:\"data\";s:3:\"\n\n\n\";s:7:\"attribs\";a:1:{s:0:\"\";a:1:{s:7:\"version\";s:3:\"2.0\";}}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:1:{s:0:\"\";a:1:{s:7:\"channel\";a:1:{i:0;a:6:{s:4:\"data\";s:61:\"\n \n \n \n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:1:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"WordPress Planet\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"http://planet.wordpress.org/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:8:\"language\";a:1:{i:0;a:5:{s:4:\"data\";s:2:\"en\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:47:\"WordPress Planet - http://planet.wordpress.org/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"item\";a:50:{i:0;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:123:\"WPTavern: WordPress Plugin Review Team Addresses Backlog of 900+ Plugins, Implements Strategies to Improve Approval Process\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=147639\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:132:\"https://wptavern.com/wordpress-plugin-review-team-addresses-backlog-of-900-plugins-implements-strategies-to-improve-approval-process\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4003:\"

WordPress’ Plugin Review team is wading through a backlog that was over 900 plugins awaiting approval earlier this week. The current count has 870 plugins sitting in the review queue, with an average wait time of 61 days before initial review.

\n\n\n\n
\n\n\n\n\n\n\n\n

WordPress developer Marcus Burnette drew attention to the matter on Twitter after submitting a plugin he created to display a gallery of your own WordPress Photo Directory photos on your website. Other developers commented on his post, reporting that their recently-approved plugins took two months.

\n\n\n\n

WordPress Executive Director Josepha Haden Chomphosy responded with an invitation to contributors who want to learn how to review plugins and apply to join the team.

\n\n\n\n
\n

There\'s an open application for anyone who wants to learn how to review these plugins and help us chip away at the backlog! https://t.co/nDF3tiOuvH https://t.co/28lrCFtx4U

— Josepha Haden Chomphosy (@JosephaHaden) August 8, 2023
\n
\n\n\n\n

The volunteer team responsible for reviewing plugins has undergone significant restructuring after the departure of long-time contributor Mika Epstein. In June, the team added six new sponsored volunteers and opened applications for more team members. They have selected new team reps and have more than 20 applicants who have expressed interest in volunteering.

\n\n\n\n

“The first challenge we found during our onboarding was the fact that a lot of processes were not clearly documented,” newly selected team rep Francisco Torres said in a recent update. “We asked A LOT of questions during this process and ensured that all the answers Mika shared with us were added to the team’s internal docs. This effort should make it a lot easier for new contributors to join the team down the road.

\n\n\n\n

“We have also improved our internal tools to catch the most common coding mistakes and have built our predefined responses into the output provided by this tool. We still review this content manually before sending out replies, but by merging the two tasks into one (reviewing the code and drafting the message) we have been able to cut down review time considerably.”

\n\n\n\n

In strategizing ways to cut through the formidable plugin backlog, the team has begun speeding up the process by performing a cursory initial review, followed by a more thorough one once the plugin author has fixed the most obvious issues.

\n\n\n\n

“In order to tackle the backlog faster, we’re now spending less time on initial reviews,” Torres said. “We begin checking issues that take us less time, and then as soon as we spot one or two issues with the plugin that would prevent it from being approved, we email the plugin author to ask them to fix the initial issues. If the author gets back to us with those first fixes, then we proceed with an in-depth review.”

\n\n\n\n

A two-month wait can be demoralizing for developers who are excited to share their open source plugins with the world. Now that the whole process is getting documented and refined to be more efficient, the Plugin Review Team will be better able to onboard new reviewers and put them in place to tackle the backlog.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 10 Aug 2023 01:39:54 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:1;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:62:\"WPTavern: Kadence Blocks 3.1.11 Patches Critical Vulnerability\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=147644\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:73:\"https://wptavern.com/kadence-blocks-3-1-11-patches-critical-vulnerability\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:1925:\"

The Kadence Blocks plugin, which is used on more than 300,000 WordPress sites, has patched a critical vulnerability in its Advanced Form Block file upload capability. Version 3.1.11, released on August 8, 2023, patches the security issue with the form uploads.

\n\n\n\n

The plugin’s development team is getting out ahead of the situation by posting an advisory on their blog, with a short description of the vulnerability and its potential for exploit.

\n\n\n\n
\n

The Kadence Advanced Form Block, introduced in Kadence Blocks 3.1, offers site owners the ability to add a file upload capability to their site. The code within the Advanced Form Block had insufficient tests to limit what types of files can be uploaded. This could allow attackers to upload a file claiming to be a valid image type that actually contained malicious PHP code. That PHP code could be malicious, and in so doing, take over a vulnerable WordPress website. Exploiting this vulnerability would require a settings at the server level that would be considered insecure. Most premium hosting providers secure upload folders from PHP execution at the server level, though many budget hosting providers do not.

\n
\n\n\n\n

Kadence Blocks developer Ben Ritner said sites that are not using the Advanced Form Block file upload capability are not subject to this vulnerability. At this time the vulnerability is not known to have been exploited.

\n\n\n\n

Kadence Blocks users are encouraged to update immediately and check for unexpected users, admin accounts, and content changes. The advisory also includes ways to make file uploads more secure, including limiting file type, adding authentication, and scanning for viruses.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 09 Aug 2023 20:36:09 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:2;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:116:\"Post Status: WordPress 6.3 • Release Workflows • European Union Cyber Resiliency Act • Gutenberg Accessibility\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"https://poststatus.com/?p=150107\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:37:\"https://poststatus.com/wordpress-6-3/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:18999:\"

This Week at WordPress.org (August 7, 2023)

\n\n\n

WordPress 6.3, Lionel, has been released. It’s time to test out the details and footnotes blocks, give the WP_DEVELOPMENT_MODE a try, and check out the new Get Involved tab on the Welcome screen.

The WordPress Training team announces its first course cohort for Learn.WordPress.org. The course will cover Developing Your First WordPress Block, and offer real-time collaborative learning.

In December of 2021, Log4j vulnerability sparked governmental-level decision-making implications in the EU (Cyber Resiliency Act) and USA (SBOM). WordPress, Drupal, Joomla, and Typo3 have shared concerns regarding the EU CRA.

\n\n\n
\n\n\n\n\n\n\n\n

\n\n\n\n

News

\n\n\n\n\n\n\n\n

\n\n\n\n
\n\n
\n\n\n\n\n\n\n\n
\n\n\n\n
\n\n
\n\n\n\n
\n
\n
\n\n\n\n\n
\n

Polyglots

\n\n\n\n\n\n\n\n

Project

\n\n\n\n\n\n\n\n

Sustainability

\n\n\n\n\n\n\n\n

Test

\n\n\n\n\n\n\n\n

Theme

\n\n\n\n\n\n\n\n

Training

\n\n\n\n\n\n\n\n

Tutorials

\n\n\n\n\n\n\n\n

Online Workshops

\n\n\n\n\n\n\n\n

Courses

\n\n\n\n\n\n\n\n

WordPress TV

\n\n\n\n\n\n\n\n

WPTV

\n\n\n\n\n
\n
\n
\n
\n\n\n\n
\n\n\n\n\n\n\n\n\n\n\n\n

Thanks for reading our WP dot .org roundup! Each week we are highlighting the news and discussions coming from the good folks making WordPress possible. If you or your company create products or services that use WordPress, you need to be engaged with them and their work. Be sure to share this resource with your product and project managers.

Are you interested in giving back and contributing your time and skills to WordPress.org? \"🙏\" Start Here ›

Get our weekly WordPress community news digest — Post Status’ Week in Review — covering the WP/Woo news plus significant writing and podcasts. It’s also available in our newsletter. \"💌\"

\n\n\n\n
\n\n\n\n
\"Post
\n

You — and your whole team can Join Post Status too!

\n\n\n\n

Build your network. Learn with others. Find your next job — or your next hire. Read the Post Status newsletter. \"✉\" Listen to podcasts. \"🎙\" Follow @Post_Status \"🐦\" and LinkedIn. \"💼\"

\n
\n\n\n\n
\n

This article was published at Post Status — the community for WordPress professionals.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 09 Aug 2023 20:02:54 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Courtney Robertson\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:3;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:63:\"Akismet: How to Disable Comments in WordPress (and When Not to)\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"http://akismet.com/?p=160334\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:62:\"https://akismet.com/blog/how-to-disable-comments-in-wordpress/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:20675:\"

The heart of an online presence lies in its engaging community, and what better way to foster such engagement than allowing users to post comments? Yet, there are moments when it might be necessary to hit the “off” switch. If your comments section gets flooded with spam, your impulse may be to automatically close comments before things get too messy. 

\n\n\n\n

But you don’t necessarily need to do that. Today, we’ll delve into how to disable comments in WordPress and also discuss situations where this isn’t the best decision. And we’ll explore solutions to common concerns, such as managing spam, using powerful tools like Akismet.

\n\n\n\n

Let’s get right to it.

\n\n\n\n\n\n\n\n

Turning off comments to stop spam? Install Akismet instead

\n\n\n\n

Before you disable comments altogether, consider what’s really bothering you.

\n\n\n\n

Is it the flood of spam making your management duties unbearable? Or, are trolls wreaking havoc on your site’s overall positive vibes? It’s natural to feel overwhelmed and think of disabling comments as the quick fix. But there’s a better method you can employ.

\n\n\n\n

Enter Akismet, your staunch ally in the battle against spam. This robust tool packs quite a punch when it comes to filtering out spammy content, letting you revel in the genuine, quality interaction with your users.

\n\n\n\n\"Akismet\n\n\n\n

A blend of simplicity and power, Akismet is astoundingly easy to use. Once installed and set up, it works quietly behind the scenes of your entire WordPress site, sifting through incoming comments, and sweeping away spam. All you’re left with are the comments that truly matter. You’ll see the difference immediately and wonder how you ever managed without it.

\n\n\n\n

Here are a few features that make Akismet your hero:

\n\n\n\n
    \n
  • Automatic spam detection: It checks and filters every comment, so you don’t have to spend your precious time discerning real comments from spam.
  • \n\n\n\n
  • A flexible discard feature: You have complete control. You can choose to discard the worst and most pervasive spam, so you’ll never have to see it.
  • \n\n\n\n
  • A visible comment status history: For each comment, Akismet provides a status history, so you can understand where the spam was caught, cleared, or missed.
  • \n
\n\n\n\n

This is all fine and well, but maybe it seems like too much trouble. Couldn’t you just disable comments across the board and be done with it? Certainly, you could. But there are tangible benefits to keeping comments turned on in WordPress. 

\n\n\n\n

For instance, comments can:

\n\n\n\n
    \n
  • Boost community engagement
  • \n\n\n\n
  • Encourage repeat visitors
  • \n\n\n\n
  • Provide a way to get quick feedback
  • \n\n\n\n
  • Improve on-page SEO
  • \n
\n\n\n\n

But if left to run amuck, an overabundance of spam comments can leave a sour taste in visitors’ mouths. An unmoderated comment section can:

\n\n\n\n
    \n
  • Look unprofessional
  • \n\n\n\n
  • Affect site security
  • \n\n\n\n
  • Attract more spam comments
  • \n\n\n\n
  • Create more work for admins
  • \n
\n\n\n\n

All that being said, before you decide to disable comments in WordPress for future posts entirely, give Akismet a shot. It’s the solution that preserves your community engagement while keeping your WordPress website clean and spam free.

\n\n\n\n

Still, there might be situations where you want to learn how to turn off comments in WordPress. Perhaps you’ve decided to repurpose your blog as a purely informational site, or maybe you have a specific WordPress post that doesn’t require engagement. Whatever your reasons, we’ll walk you through the process next.

\n\n\n\n

Still want to disable WordPress comments? Here are four ways to do so:

\n\n\n\n

While we advocate for keeping the comments section activated, there are times when you may feel it necessary to hit that “disable” button. If you’ve made up your mind, here are four ways to turn off comments in WordPress:

\n\n\n\n\"man\n\n\n\n

1. Turn off comments in your WordPress settings

\n\n\n\n

One way to disable comments site-wide is through the WordPress Discussion settings.

\n\n\n\n

Here’s how you do it:

\n\n\n\n
    \n
  1. From your WordPress Dashboard, navigate to Settings → Discussion.
  2. \n\n\n\n
  3. In the Default post settings section, uncheck the box that says Allow people to comment on new posts.
  4. \n\n\n\n
  5. Scroll down and click Save Changes.
  6. \n
\n\n\n\n\"discussion\n\n\n\n

Remember, this setting only applies to future posts. Your old posts will still have comments enabled unless you disable them individually or in bulk, which brings us to our next point.

\n\n\n\n

2. Disable comments on a specific post

\n\n\n\n

Maybe you just want to turn off comments for one or a few specific posts. That’s easy to accomplish as well:

\n\n\n\n
    \n
  1. From the WordPress dashboard, navigate to Posts or Pages and find the post or page where you want to disable comments.
  2. \n\n\n\n
  3. Click Edit to open the post or page.
  4. \n\n\n\n
  5. On the right-hand side of the screen, in the Post tab, scroll down to Discussion.
  6. \n\n\n\n
  7. Uncheck Allow comments.
  8. \n\n\n\n
  9. Update or Publish the post to save your changes.
  10. \n
\n\n\n\n\"comment\n\n\n\n

Or, you can do this from the Post or Pages list. Instead of clicking on the post to open the Block Editor, click Quick Edit, uncheck the box that says Allow Comments. then click Save.

\n\n\n\n\"turning\n\n\n\n

3. Disable comments in bulk on a group of posts

\n\n\n\n

If you need to disable comments on multiple posts, you can do so quickly with the bulk edit feature:

\n\n\n\n
    \n
  1. Go to Posts in your WordPress dashboard.
  2. \n\n\n\n
  3. Check the boxes next to the posts where you want to disable WordPress comments.
  4. \n\n\n\n
  5. From the Bulk Actions drop-down at the top, choose Edit, then click Apply.
  6. \n\n\n\n
  7. In the Bulk Edit box that appears, find Comments and select Do not allow.
  8. \n\n\n\n
  9. Click on the Update button to save your changes.
  10. \n
\n\n\n\n\"turning\n\n\n\n

4. Turn off comments using custom code

\n\n\n\n

If you feel comfortable tinkering with your site’s code, you can turn off comments by adding a few lines to your theme’s single.php file. This is the file that controls specifications for your site’s blog posts.

\n\n\n\n

Note: Before making any changes to your site’s code, always make a backup. Accidents can happen, and you don’t want to lose your site’s data. Jetpack VaultPress Backup is the ideal solution for this purpose. Finally, it’s important to use a child theme in a staging environment before pushing your changes to your live site.

\n\n\n\n

Once you’re ready, locate your single.php file and open it in an HTML editor. Find the follow line of code in the file:

\n\n\n\n
<?php comments_template(); ?>
\n\n\n\n

Highlight this bit of code and replace it with the following:

\n\n\n\n
<!-- Begin Comment\n\n<?php comments_template(); ?>\n\nEnd Comment -->
\n\n\n\n

This code will turn off comments for all the posts on your WordPress site (and will even remove existing comments). By using this method, you’re “commenting out” the line of code that enables comments on your WordPress site. This turns that line of code into a “note” (such as ones you might make for other developers to reference if they’re troubleshooting your work) instead of a line that would actually be executed. 

\n\n\n\n

Disabling comments in this way is a better solution than simply removing the line of code entirely because you can more easily re-enable comments again in the future. 

\n\n\n\n

You can repeat this process for additional post types, including your site’s pages.

\n\n\n\n

Alternative solution: Keep comments enabled, but block spam

\n\n\n\n\"\"\n\n\n\n

If you feel hesitant about taking the last-ditch approach to disable comments in WordPress altogether, there is a better solution. Consider keeping comments enabled but blocking spam. It’s the middle-ground solution that lets you foster community engagement while keeping spam at bay.

\n\n\n\n

Akismet is your go-to tool for this purpose. Once enabled, it screens every comment and filters out those that look like spam. You’re left with genuine interaction without the headache of moderating every single comment manually.

\n\n\n\n

To get started with Akismet, you’ll first need to install and activate the Akismet plugin. Here’s a step-by-step guide to get you up and running:

\n\n\n\n
    \n
  1. From your WordPress dashboard, navigate to Plugins and then click on Add New.
  2. \n\n\n\n
  3. In the search box, type “Akismet”. It should be the first result that appears.
  4. \n\n\n\n
  5. Click on the Install Now button and then Activate.
  6. \n
\n\n\n\n

Now that the Akismet plugin is activated, you’ll need to set it up:

\n\n\n\n
    \n
  1. Go to Settings → Akismet Anti-Spam.
  2. \n\n\n\n
  3. You’ll be asked for your Akismet API key. If you don’t have one, go to the Akismet website, where you can sign up for an account and create a key.
  4. \n\n\n\n
  5. Once you’ve got your key, enter it in the API Key field, then click Save Changes.
  6. \n\n\n\n
  7. Akismet is now connected to your WordPress site.
  8. \n
\n\n\n\n\"settings\n\n\n\n

That’s it! Akismet is now set up and ready to start blocking spam.

\n\n\n\n

You can view stats and see how many spam comments Akismet has blocked by visiting the Akismet Stats page in your WordPress dashboard.

\n\n\n\n

Remember, enabling comments doesn’t have to mean opening the floodgates to spam. With Akismet on guard, you can enjoy the best of both worlds: an engaged community and a spam-free commenting experience.

\n\n\n\n

How to delete past comments in bulk

\n\n\n\n

Whether you’ve decided to disable comments or simply need to clear out old, irrelevant chatter on existing published posts, WordPress provides easy ways to delete all the comments from the past.

\n\n\n\n\"crumpled\n\n\n\n

Let’s start with handling this task in bulk:

\n\n\n\n
    \n
  1. Create a backup of your WordPress site before making any major changes.
  2. \n\n\n\n
  3. Navigate to the Comments section in your WordPress dashboard.
  4. \n\n\n\n
  5. By default, all comments are displayed. You can filter them by clicking on the All, Pending, Approved, Spam, or Trash links at the top.
  6. \n\n\n\n
  7. Once you’ve chosen the comments you wish to delete, check the box next to Author at the top to select all comments on the page. Alternatively, you can manually select individual comments.
  8. \n\n\n\n
  9. From the Bulk Actions dropdown menu, choose Move to Trash and then click Apply.
  10. \n
\n\n\n\n

This will send all selected comments to the trash. If you want to permanently delete these comments:

\n\n\n\n
    \n
  1. Click on the Trash link at the top.
  2. \n\n\n\n
  3. Click the Empty Trash button.
  4. \n
\n\n\n\n

And that’s it. Your selected comments are gone for good.

\n\n\n\n

The only problem here is that, by default, you can only bulk delete 20 comments at a time. To get around this, click Screen Options at the top of the Comments page. Beside “Number of items per page,” change “20” to whatever you’d like and click Apply.

\n\n\n\n\"selecting\n\n\n\n

How to delete past comments on individual posts

\n\n\n\n

If you’re only interested in pruning comments from specific existing posts, WordPress offers an efficient way to do so. Here’s how:

\n\n\n\n
    \n
  1. Navigate to Posts in your WordPress dashboard.
  2. \n\n\n\n
  3. Find the post from which you want to remove comments and, in the Comments column, click the number of published comments for that post.
  4. \n\n\n\n
  5. You’ll now see a list of all comments for that post. Hover over the comment you want to delete to reveal a menu and click Trash.
  6. \n\n\n\n
  7. If you want to permanently delete this comment, click on the Trash link at the top to view all trashed comments. Hover over the comment you just trashed, and click Delete Permanently.
  8. \n
\n\n\n\n

That’s it! You’ve successfully learned how to manage and control the comments section on your WordPress site. While it might be tempting to disable comments during tough times, tools like Akismet can make the task a lot easier, ensuring your site remains a place for valuable discussion.

\n\n\n\n

Frequently asked questions

\n\n\n\n

Having shed light on how to disable comments in WordPress, let’s now address some frequently asked questions.

\n\n\n\n

Why use Akismet instead of disabling comments?

\n\n\n\n

Akismet is a powerful spam filtering service that can significantly reduce the time and effort you spend moderating comments. By using Akismet, you can maintain an open forum for your users to engage and interact without the headache of dealing with comment spam. 

\n\n\n\n

This helps foster a sense of community around your content and can also improve your site’s SEO by encouraging user-generated content. In contrast, disabling comments shuts down these possibilities.

\n\n\n\n

What are other advantages of enabling comments?

\n\n\n\n

Enabling comments on your site creates a two-way communication channel between you and your visitors. This can lead to insightful discussions, provide feedback, and generate new ideas for content. Comments also increase the time people spend on your site, which can boost your SEO.

\n\n\n\n\"black\n\n\n\n

What should I do if comments are disabled but still showing?

\n\n\n\n

If you chose to disable comments in WordPress, but comments are still appearing on your site, it might be that they were posted before you disabled comments. In such a case, you’ll need to manually delete these comments. You can refer to our sections on how to delete comments in bulk or on individual posts for step-by-step instructions.

\n\n\n\n

How can I disable comments on media files?

\n\n\n\n

WordPress treats media files (images, videos, etc.) as separate posts, which means they can have their own comment sections. To disable comments on media files, you’ll need to do the following:

\n\n\n\n
    \n
  1. Go to Media → Library in your WordPress dashboard.
  2. \n\n\n\n
  3. Click on the media file you want to disable comments for.
  4. \n\n\n\n
  5. On the right hand side of the screen click Edit more details.
  6. \n\n\n\n
  7. Under the Discussion section, uncheck the box that says Allow comments. If you don’t see this option, click Screen Options at the top and check the box next to Comments
  8. \n\n\n\n
  9. Click Update to save changes.
  10. \n
\n\n\n\n

Repeat this process for each media file you want to disable comments for.

\n\n\n\n

How can I remove the “Comments Are Closed” message?

\n\n\n\n

The “Comments Are Closed” message typically appears when comments have been disabled on a post that had comments previously published. One way to remove this is by adding this CSS to your site.

\n\n\n\n

In your dashboard, go to Appearance → Additional CSS. Add this line of code to the bottom:

\n\n\n\n
.nocomments {\n\n    display: none;\n\n}
\n\n\n\n

Then, click Publish. 

\n\n\n\n

This should work for the majority of themes. If, however, your theme uses a different CSS class for the “Comments Are Closed” message, you’ll need to replace “.nocomments” with the correct line.

\n\n\n\n

How can I remove the comment counter on my blog?

\n\n\n\n

The comment counter is a feature that comes with many WordPress themes. To remove it, you’ll need to edit your theme’s files. Again, back up your site before making any changes.

\n\n\n\n
    \n
  1. Go to Appearance → Additional CSS.
  2. \n\n\n\n
  3. Next, you need to hide the .comments_count class. To do this, paste this code snippet at the bottom:
  4. \n
\n\n\n\n
.comments-count {\n\n display: none;\n\n}
\n\n\n\n
    \n
  1. Click Publish to save your changes.
  2. \n
\n\n\n\n

Akismet: AI-powered anti-spam for WordPress comments and forms

\n\n\n\n

Comments form a vibrant part of any blog or website, sparking discussions, fostering community, and generating valuable user engagement. However, managing spam can turn this asset into a hassle. That’s why Akismet is such a valuable plugin — it can transform the chore of comment moderation into an automated process.

\n\n\n\n

Harnessing the power of AI, Akismet helps keep your comments section clean, filtering out spam and allowing genuine interactions to shine. While disabling comments might seem like a tempting quick fix, consider this alternative: a world where your users can freely submit comments to share their thoughts, ideas, and appreciation without you having to worry about an onslaught of spam.

\n\n\n\n

Get started with Akismet

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 09 Aug 2023 13:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"Kathryn Marr\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:4;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:108:\"WPTavern: WordPress 6.3 “Lionel” Introduces Command Palette, Expands Pattern Management and Design Tools\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=147591\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:112:\"https://wptavern.com/wordpress-6-3-lionel-introduces-command-palette-expands-pattern-management-and-design-tools\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:8466:\"image credit: Lionel Hampton.November 1956. Örebro, Sverive\n\n\n\n

WordPress 6.3 “Lionel” was released today, named for Lionel Hampton, an American jazz vibraphonist, pianist, percussionist, and bandleader.

\n\n\n\n

As the last release in Phase 2 of the Gutenberg project, many updates in WordPress 6.3 are targeted at polishing up customization features and the UI that supports them.

\n\n\n\n

Content, templates, and patterns can now be edited together, without the user having to leave the Site Editor. This streamlines the workflow across templates and content, making it easier to build out a website with live previews. Users can now create new pages and view page details in the sidebar, an experience that is very similar to editing a page in the block editor except that it keeps the process inside the flow of design editing.

\n\n\n\n
\n\n\n\nvideo credit: Gutenberg 16.0 release post\n\n\n\n

Pattern Management Expands to Include Creating and Syncing Patterns

\n\n\n\n

Pattern management was a major focus of the 6.3 release. Users can now arrange blocks to create their own patterns and save them to a library where they can be searched and edited.

\n\n\n\n
\n\n\n\nChanges to Patterns – Gutenberg 16.2 release post\n\n\n\n

Reusable blocks have been renamed to synced patterns but still function the same way. They can be created and edited in the block editor and then inserted into posts or pages with the edits synced. Block patterns, once inserted, can be edited and are not synced across other instances.

\n\n\n\n

The difference between synced and non-synced patterns is shown in the sync status details section within the pattern sidebar navigation screen. A new lock icon designates theme patterns as unable to be edited or modified.

\n\n\n\n
\n\n\n\nimage credit: Gutenberg PR #51990\n\n\n\n

New Command Palette Tool Enables Quick Search and Command Execution

\n\n\n\n

WordPress 6.3 introduces a new Command Palette that was designed to be an extensible quick search and command execution tool. Users can do things like navigate to a page or post, add new content or a template, and toggle UI elements and editor preferences, among other things. It can be activated by using keyboard shortcuts (⌘+k on Mac or Ctrl+k on Windows) or by clicking the sidebar search icon in Site View, or clicking the Title Bar.

\n\n\n\n

Contributors are considering adding support for WP-CLI commands in future iterations. The Command Palette is launching with a public API so developers can explore extending it to add their own commands.

\n\n\n\n
\n\n\n\nimage source: WordPress 6.3 About Page\n\n\n\n

WordPress’ Design Tools Updated to Include More Customization Capabilities

\n\n\n\n

This release significantly expands the capabilities of existing design tools to make it easier to customize the finer details. Users can now design their own caption styles through the Styles interface without writing any CSS. Duotone filters are now available to be managed in Styles for blocks that support them and there is an option to disable them entirely. The Cover block’s settings capabilities have been expanded to include text color, layout controls, and border options.

\n\n\n\n

A few other notable new features and improvements in WordPress 6.3 include the following:

\n\n\n\n
    \n
  • Style revisions in the Site Editor let users revert to previous versions of the design
  • \n\n\n\n
  • New Footnotes block automatically links annotations throughout the content
  • \n\n\n\n
  • New Details block allows users to easily show or hide content
  • \n\n\n\n
  • Preview block themes before activating
  • \n\n\n\n
  • Set aspect ratio on images
  • \n\n\n\n
  • Distraction-free mode now available in the Site Editor
  • \n\n\n\n
  • Revamped top toolbar
  • \n\n\n\n
  • Improvements to List View’s drag-and-drop functionality
  • \n\n\n\n
  • New modal for building templates with patterns
  • \n\n\n\n
  • Failed update safeguards
  • \n\n\n\n
  • Minimum supported version of PHP updated to 7.0.0
  • \n\n\n\n
  • 50+ accessibility improvements for labeling, tab and arrow-key navigation, revised heading hierarchy, and new controls in the admin image editor
  • \n
\n\n\n\n

This release also brings more than 170 performance improvements and is significantly faster than previous versions.

\n\n\n\n

“Based on the performance benchmarks conducted for RC3, WordPress 6.3 loads 24% faster for block themes and 18% faster for classic themes, compared to WordPress 6.2, based on the Largest Contentful Paint (LCP) metric,” Google-sponsored contributor Felix Arntz said in a summary on the improvements. “For WordPress 6.2, those improvements amounted to 18% and 5% respectively, so it is fair to summarize that WordPress 6.3 is a major achievement in terms of performance. “

\n\n\n\n

The most notable performance gains came from the introduction of defer and async support for the Scripts API and fetchpriority support for images, along with optimization of the emoji-loader.js script.

\n\n\n\n

WordPress 6.3 is the result of the efforts of more than 650 contributors across 52 countries, with ~32% of them (205) being first-time contributors.

\n\n\n\n

After updating to WordPress 6.3, users may notice a new “Get Involved” tab on the About page, designed to help new contributors find their place in the WordPress project. This addition closes a 10-year old ticket that suggested adding a “Contribute” tab to the About page. It features both code-based and no-code contribution opportunities with a link to a new WordPress.org/contributor page. This page debuts a new interactive tool that helps visitors find contributor teams that might be a good fit for their interests and capabilities.

\n\n\n\n

“As the community looks to the future, all efforts turn to 6.4 and, subsequently, the transition into Phase 3, which is expected to introduce powerful collaboration tools to the website creation and management experience,” WordPress 6.3 release lead Matías Ventura said.

\n\n\n\n

For more details on all the changes included under the hood in this release, check out the documentation for 6.3, the WordPress 6.3 Field Guide, and 6.3-related developer notes.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 08 Aug 2023 21:29:33 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:5;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:46:\"WordPress.org blog: WordPress 6.3 “Lionel”\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=15718\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:42:\"https://wordpress.org/news/2023/08/lionel/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:64206:\"\"\"\n\n\n\n

Say hello to WordPress 6.3 “Lionel,” named after Lionel Hampton, the celebrated American jazz artist. A prolific jazz vibraphonist, pianist, and percussionist, Hampton gained notoriety working in harmony with greats from Charles Mingus to Quincy Jones and as bandleader of the eponymous Lionel Hampton Orchestra. His artistry and charitable work have been recognized with a Grammy, a star on the Hollywood Walk of Fame, and the National Medal of Arts.

\n\n\n\n

Be sure to turn up the volume of the musical stylings of Lionel Hampton as you discover all “Lionel” has to offer.

\n\n\n\n

With “Lionel” you can create beautiful and compelling websites more efficiently than ever. Whether you want to build an entire site without coding or are a developer looking to customize every detail, WordPress 6.3 has something to pique your interest. As you unpack and explore this latest release, you will discover updated functions and navigation designed to help you work and create with less effort, design tools that give you more control over layout, and added functionality enriching the site-building experience.

\n\n\n\n
\n

“Lionel” marks a major chapter in the evolution of WordPress as a tool for expression. It’s the culmination of years of work from hundreds of contributors, bringing a more powerful and cohesive editing experience for crafting websites with blocks. It continues the quest of making web publishing approachable for everyone—so it’s also just a new beginning!

\nMatías Ventura, WordPress 6.3 Release Lead
\n\n\n\n\n\n\n\n

What’s inside

\n\n\n\n

This momentous release opens new possibilities for the creative expression of designers, creators, and builders. Powerful tools and refined controls give users confidence and allow them to easily manage their sites.

\n\n\n\n

Do everything in the Site Editor

\n\n\n\n

WordPress 6.3 brings your content, templates, and patterns together in the Site Editor for the first time. Add pages, browse style variations, create synced patterns, and enjoy fine-tuned control over navigation menus. Spend less time switching across different site areas—so you can focus on what matters most. Creation to completion, all in one place.

\n\n\n\n\"ImageDo everything in the Site Editor\n\n\n\n

Preview Block themes

\n\n\n\n

Experience block themes before you switch and preview the Site Editor, with options to customize directly before committing to a new theme. 

\n\n\n\n\"ImagePreview a new block theme before you switch and commit\n\n\n\n

Create and sync patterns

\n\n\n\n

Arrange blocks and save them to the ‘My Patterns’ section for use throughout your site. You can even specify whether to sync your patterns (previously referred to as “Reusable blocks”) so that one change applies to all parts of your site. Or, utilize patterns as a starting point with the ability to customize each instance.

\n\n\n\n\"ImageMy patterns: All your patterns in one place\n\n\n\n

Work faster with the Command Palette

\n\n\n\n

Switch to a specific template or open your editor preferences with a new tool that helps you quickly access expanded functionality. With simple keyboard shortcuts (⌘+k on Mac or Ctrl+k on Windows), clicking the sidebar search icon in Site View, or clicking the Title Bar, get where you need to go and do what you need to do in seconds.

\n\n\n\n\"ImageGet to know the new Command Palette \n\n\n\n

Sharpen your designs with new tools

\n\n\n\n

New design controls bring more versatility for fine-tuning, starting with the ability to customize your captions from the Styles interface without coding. You can manage your duotone filters in Styles for supported blocks and pick from the options provided by your theme or disable them entirely. The Cover block gets added settings for text color, layout controls, and border options, making this powerful block even more handy.

\n\n\n\n\"ImageNew design tools\n\n\n\n

Track design changes with Style revisions

\n\n\n\n

With a new audit trail, you can now see how your site looked at a specific time. Visualize these revisions in a timeline and access a one-click option to restore prior styles.

\n\n\n\n\"ImageStyle revisions: See your style revision history \n\n\n\n

Annotate with the Footnotes block

\n\n\n\n

Footnotes add convenient annotations throughout your content. Now you can add and link footnotes for any paragraph.

\n\n\n\n\"ImageAdd footnotes effortlessly with the new Footnotes Block\n\n\n\n

Show or hide content with the Details block

\n\n\n\n

Use the Details block to avoid spoiling a surprise, create an interactive Q&A section, or hide a long paragraph under a heading.

\n\n\n\n\"ImageDisplay or hide content with the new Details Block\n\n\n\n

Performance gets a boost

\n\n\n\n

WordPress 6.3 has 170+ performance updates, including defer and async support for the Scripts API and fetchpriority support for images. These improvements, along with block template resolution, image lazy-loading, and the emoji loader, can dramatically improve your website’s perceived load time.

\n\n\n\n

Accessibility remains a core focus

\n\n\n\n

Incorporating more than 50 accessibility improvements across the platform, WordPress 6.3 is more accessible than ever. Improved labeling, optimized tab and arrow-key navigation, revised heading hierarchy, and new controls in the admin image editor allow those using assistive technologies to navigate more easily.

\n\n\n\n

Other highlights

\n\n\n\n

Set aspect ratio on images

\n\n\n\n

Specify your aspect ratios and ensure design integrity, especially when using images in patterns.

\n\n\n\n

Build your site distraction-free

\n\n\n\n

Distraction-free designing is now available in the Site Editor.

\n\n\n\n

Rediscover the Top Toolbar

\n\n\n\n

A revamped Top Toolbar offers parent selectors for nested blocks, options when selecting multiple blocks, and an interface embedded into the title bar with new functionality in mind.

\n\n\n\n

List View improvements

\n\n\n\n

Drag and drop to every content layer and delete any block you would like in the updated List View.

\n\n\n\n

Build templates with Patterns

\n\n\n\n

Create unique patterns to jumpstart template creation with a new modal enabling access to pattern selection.

\n\n\n\n

Changes in PHP support

\n\n\n\n

Support for PHP 5 is discontinued. The new minimum supported version of PHP is 7.0.0.

\n\n\n\n

Failed update safeguards

\n\n\n\n

WordPress will now auto-restore the previously installed version of plugins or themes if something goes wrong during a failed manual update.

\n\n\n\n
\n\n\n\n

Learn more about WordPress and 6.3

\n\n\n\n

Explore Learn WordPress for quick how-to videos, online workshops, and other resources to level up your knowledge of the latest features in WordPress. 

\n\n\n\n

Check out the WordPress 6.3 Field Guide for detailed developer notes to help you build with WordPress and get the most out of the latest release. Read the 6.3 release notes for additional technical details about this release, including feature recaps, installation information, file changes, fixes, and updates.

\n\n\n\n

Read and subscribe to the Developer Blog for even more helpful WordPress content. 

\n\n\n\n

WordPress is a global software platform

\n\n\n\n

61 locales have translated 90 percent or more of WordPress 6.3 into their language. Community translators are working hard to ensure more translations are on their way. Thank you, gracias, ありがとう, धन्यवाद, and ευχαριστώ to everyone who helps to make WordPress available in 200 languages.

\n\n\n\n

Contributing to WordPress

\n\n\n\n

WordPress believes in democratizing publishing and the freedoms that come with open source. Supporting this idea is a large community of people collaborating to strengthen the software. A big thank you to everyone who makes WordPress.

\n\n\n\n
\n

Our community of contributors has always been what makes WordPress wonderful. You are what makes sure our project continues to thrive, and our software remains secure, usable, and impactful. Thank you so much for joining together to make the web (and the world) a better place!

\nJosepha Haden Chomphosy, Executive Director, WordPress.org
\n\n\n\n

WordPress 6.3 arrives thanks to more than 650 contributors’ collective passion and effort in at least 52 countries. This release also includes over 205 first-time contributors! 

\n\n\n\n

The 6.3 release squad

\n\n\n\n

The 6.3 release was led from start to launch by an active set of contributors from across many disciplines. Over several weeks, they kept the release on track and moving forward by connecting ideas, resolving issues, and removing roadblocks.

\n\n\n\n\n\n\n\n

6.3 contributors

\n\n\n\n

Complimenting the release squad is a diverse group of contributors whose global collaboration delivered hundreds of enhancements and fixes, ensuring a stable release for all—a testament to the power and capability of the WordPress community. 

\n\n\n\n

Özgür KARALAR · 6adminit · Aaron Jorbin · Aaron Robertshaw · Abha Thakor · abhi3315 · Abhishek Sharma · Abir · abitofmind · Adam Silverstein · Adam W. Warner · Adarsh Akshat · Adel Tahri · Aditya Jain · Ahmed Chaion · Ahsan Chowdhury · Aki Hamano · akmelias · Akramul Hasan · Alex Concha · Alex Dimitrov · Alex Kozack · Alex Lende · Alex Stine · Alexandre Lara · allancole · Alvaro Gómez · Alvi Tazwar · Amaan Khan · amansurov · amin · Amy Hendrix (sabreuse) · Anatoliy · Anatoliy Dovgun · Andrea Fercia · Andrei Draganescu · Andrew Nacin · Andrew Ozz · Andrew Serong · Andrey \"Rarst\" Savchenko · André Maneiro · Andy · Andy Fragen · Andy Peatling · Anil Vaza · Ankit K Gupta · Ankit Panchal · Ankur Chotai · Anna · Anne McCarthy · Anne-Mieke Bovelett · annziel · Anthony Burchell · Anton Timmermans · Anton Vlasenko · Antony Agrios · anver · Anveshika Srivastava · Arafat Jamil · Ari Stathopoulos · Artemio Morales · Arthur Chu · Arunas Liuiza · Asad Polash · Ashar Irfan · Ashikur Rahman · Atanas Antonov · Aurooba Ahmed · Austin Matzko · Ayesh Karunaratne · azizantoun · Aznadesign · bangank36 · bartkalisz · Ben Dunkle · Ben Dwyer · Benjamin Grolleau · benjibee · benlk · Bernie Reiter · Bhavik Kalpesh · Bhrugesh Bavishi · Bijay Yadav · Birgit Pauli-Haack · bitnissen · bonger · Boone Gorges · Boro Sitnikovski · Brandon DuRette · Brandon Kraft · Brandon Payton · brasofilo · Brennan Goewert · Brian Alexander · Brian Coords · Brian Fischer · Brian Gardner · Bridget Willard · Bronson Quick · Brooke Kaminski · Brooke. · caraffande · Carlos Bravo · Carlos Garcia · Carolina Nymark · Cathi Bosco · ceer · Chad Chadbourne · Chintan hingrajiya · Chirag Rathod · Chloe Bringmann · Chouby · Chris Flannagan · Chris Lubkert · Chris Malone · chriscct7 · Christoph Daum · ckoerner · Code Amp · Colin Stewart · corentingautier · Courtney Robertson · Crixu · crs1138 · crstauf · cshark · Daisy Olsen · Dan Bernardic · Dan Soschin · Daniel Bachhuber · Daniel Richards · Daniele Scasciafratte · danyk4 · darerodz · Darshit Rajyaguru · Dave Whitley · David Baumwald · David Biňovec · David Calhoun · David Herrera · David Smith · davidmusnik · davidwebca · Dean Sas · Deepak Vijayan · Delete My Account · Denis de Bernardy · Denis Žoljom · Dennis Snell · Dennys Dionigi · densityapps · Derek Ashauer · Derek Blank · devshagor · Dharmesh Patel · Dhrumil Kumbhani · Dhruvi Shah · DigTek · Dilip Bheda · dimijazz · Dion Hulse · doems · Dominik Schilling · Drew Jaynes · dsar · dustyreagan · ebai4 · ecorica · Ed Beck · eduwass · Edward · Edwin Takahashi · ehsanakhgari · Ehtisham S. · Ella van Durpe · Emily Clarke · emirpprime · Enrique Sánchez · eric.7186 · Erik Betshammar · Ernest Behinov · Estela Rueda · Fabian Kägy · Fabian Todt · Faisal Ahammad · Falguni Desai · Farhan Ahmed · Felipe Elia · Felix Arntz · Femy Praseeth · Firoz Sabaliya · Florian TIAR · Francesca Marano · Frank Klein · franrosa · gaeldenysiak · Gal Baras · Gan (a11n) · Garth Mortensen · Gary Cao · Gary Jones · Gary Pendergast · Gennady Kovshenin · George · George Mamadashvili · Gerardo Pacheco · gilles66 · Gio Lodi · Glen Davies · GrandSlambert · Grant M. Kinney · Greg Ziółkowski · Gudmundur Haraldsson · Guillaume TURPIN · gvgvgvijayan · Hanzala Taifun · Hardik Thakkar · Hareesh S · Harit Panchal · Harsh Gajipara · Hasan Misbah · Hasanuzzaman · Haz · hbhalodia · Heiko Mamerow · Helen Hou-Sandi · HelgaTheViking · Hendrik Luehrsen · Hilay Trivedi · Himani Panchal · hrdelwar · Hridoy Mozumder · Hugo Baeta · hugod · Huseyin Berberoglu · Huzaifa Al Mesbah · Héctor Prieto · Iain Poulson · Ian Belanger · Ian Dunn · Ibrahim Khalil · Ibrahim Sharif · Ignat Georgiev · imanish003 · intoxination · Ipstenu (Mika Epstein) · Isabel Brison · jacknotman · Jahid Hasan · Jakaria Istauk · James Koster · James Roberts · james0r · Jan Boddez · jane · jankyz · janpaulkleijn · Jarda Snajdr · Jason Crist · Jason Johnston · Jason LeMahieu (MadtownLems) · Javier Casares · jbcouton · Jean-Baptiste Audras · Jeff Ong · jeffmora · Jeffrey Paul · Jen · Jenil Kanani · Jeremy Felt · Jeroen Rotty · Jerry Jones · jhnstn · jigar bhanushali · Joe Dolson · Joe McGill · Joen Asmussen · John Blackbourn · John Hooks · John James Jacoby · jomonthomaslobo1 · Jon Bourne · Jonathan Desrosiers · Jonathan Pantani · Joni Erkkilä · Jonny Harris · Joost de Valk · jordesign · Jorge Costa · Jos Klever · Josep Morán · Joseph G. · Josepha · Josh Habdas · Josh Pollock · Joy · jqz · Juan Aldasoro · JuanMa Garrido · Juliette Reinders Folmer · Juzar · K. Adam White · KafleG · Kai Hao · Kailey (trepmal) · Kajal Gohel · Kantari Samy · Kapil Paul · Karol Manijak · Karthik Thayyil · Kathryn P. · Kausar Al Mamun · Kausar Alam · Kelly Choyce-Dwan · kenwins · Kevin Behrens · Khoi Pro · Kjell Reigstad · Knut Sparhell · koenschipper · Konstantinos Xenos · Krishna Neupane · Krunal Bhimajiyani · Krupa Nanda · Krupal Panchal · kutsu · KZeni · Léa McAleese · Lachezar Gadzhev · Lana Codes · laurelfulford · Lauren Stein · laurentmagnin · Lena Morita · Leonardus Nugraha · lessbloat · Levdbas · Linda van Tol · Linkon Miyan · lowlydev · lphk · Luigi · luisherranz · Luke Cavanagh · madejackson · Madhu Dollu · Madhu Dollu · Maggie Cabrera · Mahdi Hasan · Mai · Maja Loncar · Malae · Malav Vasita · manfcarlo · maniu · Marc · Marcelo de Moraes Serpa · MarcGuay · Marco Ciampini · Marek Dědič · margolisj · marianne38 · Marin Atanasov · Marine EVAIN · Mario Santos · Marius L. J. · Mark Jaquith · Mark Parnell · markdoliner · Marko Heijnen · Marko Ivanovic · Markus · Markus Kosmal · martin.krcho · marybaum · masteradhoc · mastrup · Mat Lipe · Matias Benedetto · Matias Ventura · matmoe · Matt Mullenweg · Matt Watson · Matt Wiebe · matt_fw · Matteo Enna · Matthew Boynes · Mauriac AZOUA · maurodf · Max Lyuchin · maxcgparis · maysi · Mayur Prajapati · McAlyster · mcliwanow · Md Mahamudur Rahaman · Md Monir Hossain · MD Shakibul Islam · megane9988 · Meher Bala · Mel Choyce-Dwan · Menaka S. · mensmaximus · mgol · Michael Adams (mdawaffe) · Michael Burridge · Michael Day · MichaelH · Michal Czaplinski · Miguel Fonseca · Mike Schinkel · Mike Schroder · mikecho · mikeyzm · Mikin Chauhan · Milana Cap · Milen Petrinski - Gonzo · Mitch Canter · mitchellaustin · mitcho (Michael Yoshitaka Erlewine) · Moe · Mohammad Jangda · Mohan Raj · Mohip Patel · Mohiuddin Omran · Monique Dubbelman · Monzur Alam · Morten Rand-Hendriksen · Mrinal Haque · mtxz · Muhammad Yeasin · mujuonly · Mukesh Panchal · Mushrit Shabnam · nadimcse · Naeem Haque · Nahid Hasan · Narthur · nataliat2004 · Nate Allen · Nazgul · Nazmul Hosen · Nazmul Huda · nendeb · Neycho Kalaydzhiev · Nicholas Garofalo · Nick Diego · nickpap · nidhidhandhukiya · Nihar Ranjan Das · Nik Tsekouras · Nilo Velez · Niluthpal Purkayastha · Nithin John · Nithin SreeRaj · njsamsatli · nkeller15 · Noah Allen · obliviousharmony · Okamoto Hidetaka · Olga Gleckler · OllieJones · opr18 · Orestis Samaras · Ov3rfly · owi · Paal Joachim Romdahl · Pamela Ribeiro · Paragon Initiative Enterprises · Pascal Birchler · Patel Jaymin · patriciahillebrandt · Paul Biron · Paul Kevan · Paul Von Schrottky · Paulo Trentin · Pavan Patil · Pedro Mendonça · Peter Westwood · Peter Wilson · Petter Walbø Johnsgård · Philipp Bammes · Phill · Pierre Sylvestre · Pieterjan Deneys · Piotrek Boniu · Pitam Dey · Piyush Tekwani · pkbhatt · Platon Kristinin · Pooja Derashri · Pooja N Muchandikar · pouicpouic · Prashant · Prashant Singh · Pravin Parmar · Presskopp · Priyanka Adhikari · Przemek Hernik · Rachel Baker · Rafa Poveda · Rafael Fischmann · Rajan Panchal · Rajin Sharwar · Ramon Ahnert · Ramon James · Ratnesh Sonar · Rehan Ali · rembem · ren · Riad Benguella · Rian Rietveld · Rich Tabor · richards1052 · Richie Carey · rjasdfiii · rob1n · Robert Anderson · Robert O\'Rourke · Robin · Rolf Allard van Hagen · Ronak Ganatra · Ruman Ahmed · Rutvik Savsani · Ryan Boren · Ryan Fredlund · Ryan Kienstra · Ryan McCue · Ryan Welcher · Sé Reed · Sébastien SERRE · Sérgio Gomes · Süleyman Kenar · Sahil B. · Sajjad Hossain Sagor · Sakib Mohammed · salvoaranzulla · Sam Fullalove · samiamnot · SamNajian · Samuel Wood (Otto) · Sarah Norris · Sarequl Basar · Saxon Fletcher · Scott Reilly · Scott Taylor · scribu · Sean Davis · Sergey Biryukov · Shail Mehta · Shalin Shah · Shannon Little · Shipon Karmakar · Shreyas Ikhar · shubhamsedani · shuvo586 · shvv · Shweta Bathani · Siddhant Wadhwani · siddharth ravikumar · Siddharth Thevaril · Simon Dowdles · Simone · Siobhan · Sirajum Mahdi · Sjoerd Boerrigter · Sjoerd Linders · skorasaurus · Smit Rathod · Soren Wrede · Spencer · sque · srikanthmeenakshi · Stanimir Stoyanov · Stefano Minoia · Stephan Nijman · Stephen Bernhardt · Steven Lin · Subrata Sarkar · Sudip Dadhaniya · Sumit Bagthariya · Sumit Singh · sunyatasattva (a11n) · Suvro · Suzette Franck · Suzette Franck · syamraj24 · Sybre Waaijer · Syed Nuhel · Synchro · Taco Verdonschot · Tahmina Jahan · Takashi Kitajima · Tammie Lister · Tanner Moushey · Thakor Darshil · thomask · thunder rumbles · Tijmen Smit · Till Krüss · Tim Brathärig · Timothy Jacobs · tmatsuur · TobiasBg · tobifjellner (Tor-Bjorn Fjellner) · Tom de Visser · Tom J Nowell · Tomoki Shimomura · Toni Viemerö · Tonya Mork · tonythomas01 · Toro_Unit (Hiroshi Urabe) · Torsten Landsiedel · Towhidul I Chowdhury · Tryon · twstokes · TyB · Ugyen Dorji · Umesh Gupta · Umesh Patel · Upadala Vipul · Utsav tilava · uxtremist · Vagelis · valterlorran · Vasilis Manthos · victoranto · Viktor Szépe · vivekawsm · Vlad T · Weston Ruter · whaze · williampatton · wlindley · Wojtek Szkutnik · wplmillet · xerpa43 · xmarcos · Yani Iliev · Yui · Zdrobau · Zeba Afia Shama · Zebulan Stanphill · Zenaul Islam · zieladam · Zunaid Amin

\n\n\n\n

WordPress support forums

\n\n\n\n

Many thanks to the community volunteers who contribute to the support forums by answering questions from WordPress users worldwide.

\n\n\n\n

Get involved today

\n\n\n\n

If contributing to WordPress appeals to you, learning more and getting involved is easy. Discover the teams that come together to Make WordPress and explore the product roadmap on the core development blog. You can also use this interactive tool to help you decide which team is right for you.

\n\n\n\n

Looking toward the future

\n\n\n\n

20 years ago this past May, WordPress shipped the very first version, 0.7. What started with a blog post from co-founder Matt Mullenweg and a subsequent comment by co-founder Mike Little eventually evolved into the world’s most popular web publishing platform.

\n\n\n\n

WordPress software continues to evolve and iterate based on the needs and desires of its robust and diverse user community. This release is the capstone of Phase 2 along the WordPress development roadmap. As the community looks to the future, all efforts turn to 6.4 and, subsequently, the transition into Phase 3, which is expected to introduce powerful collaboration tools to the website creation and management experience.

\n\n\n\n
\n\n\n\n

6.3 Haiku

\n\n\n\n

A capstone release
Ships tools for building great sites
Collaboration

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 08 Aug 2023 20:03:16 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Matias Ventura\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:6;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:88:\"Do The Woo Community: A Look at Weglot, the Product and the Company, with Thomas Fanchin\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"https://dothewoo.io/?p=75815\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:85:\"https://dothewoo.io/a-look-at-weglot-the-product-and-the-company-with-thomas-fanchin/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:455:\"

Thomas Fanchin, Weglot\'s partnership manager, discusses their involvement in WordPress, partnerships, and community engagement.

\n

>> The post A Look at Weglot, the Product and the Company, with Thomas Fanchin appeared first on Do the Woo - a WooCommerce Builder Community .

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 08 Aug 2023 09:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"BobWP\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:7;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:109:\"WPTavern: ConvertKit Updates WordPress Plugin, Adds Members Only Content, Newsletter Feed, and Product Embeds\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=147547\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:116:\"https://wptavern.com/covertkit-updates-wordpress-plugin-adds-members-only-content-newsletter-feed-and-product-embeds\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:2808:\"

ConvertKit has updated its official WordPress plugin and WooCommerce add-on to support a range of new features. More than 40,000 sites use ConvertKit’s plugin to integrate their newsletters, email campaigns, and digital products with WordPress. The service is free for the user’s first 1,000 subscribers but offers more automated features and third party integration on its paid tiers.

\n\n\n\n

The latest version of the ConvertKit plugin for WordPress brings the “Members Content” feature out of beta. It allows site owners to set up gated content for things like courses, e-books, or curated content without having to switch platforms, keeping members on the WordPress site.

\n\n\n\n

In the WordPress admin, under the ConvertKit >> Member Content settings, admins can now specify a ConvertKit Commerce product to be required in order to view a post, page, or WooCommerce product page.

\n\n\n\nWordPress content gated by ConvertKit subscription – image source: ConvertKit documentation\n\n\n\n

This update also adds a “Newsletter feed” that ConvertKit users can embed on their WordPress sites to display a paginated list of their public broadcast emails. It can be shown as a grid with images and descriptions or a list with subject and date.

\n\n\n\n

Recent updates to the plugin also introduce product embeds, allowing site owners to create a storefront of their ConvertKit products on their WordPress sites. The styles for the embedded products can be edited inside the Site Editor.

\n\n\n\n

Other notable improvements in this round of updates include the following:

\n\n\n\n
    \n
  • The WooCommerce add-on for ConvertKit has been updated to map customer first and last names to ConvertKit custom fields
  • \n\n\n\n
  • New “Form Trigger Block” creates a button that triggers a pop-up modal
  • \n\n\n\n
  • PHP SDK now available for building on top of the ConvertKit API
  • \n
\n\n\n\n

More detailed information on the settings for the new features is available in the ConvertKit documentation on customizing subscribers’ experience on WordPress websites.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 08 Aug 2023 02:58:48 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:8;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:95:\"WPTavern: The First Learn WordPress Course Cohort Will Teach Participants How to Develop Blocks\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=147549\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:106:\"https://wptavern.com/the-first-learn-wordpress-course-cohort-will-teach-participants-how-to-develop-blocks\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:2101:\"

WordPress’ Training Team is launching its first Learn WordPress Course Cohort, which is a social learning method where a group of people go through the learning process together with some synchronous group activities. One of the benefits of cohorts is the sense of community and connection that can develop between the participants, fostering more support and collaboration.

\n\n\n\n

The first course cohort topic is “Developing your first WordPress Block,” aimed at first-time block developers who have never built a block before. It lasts six weeks and covers the following topics:

\n\n\n\n
    \n
  • Week 1: Introduction, preparing your environment for block development.
  • \n\n\n\n
  • Week 2: Using create-block to scaffold your first block, Internationalisation. 
  • \n\n\n\n
  • Week 3: Block styling, block supports, block controls
  • \n\n\n\n
  • Week 4: Block attributes, block components 
  • \n\n\n\n
  • Week 5: Interacting with WordPress data
  • \n\n\n\n
  • Week 6: Dynamic blocks
  • \n
\n\n\n\n

The cohort is limited to 14 participants who will be selected at random if they meet the requirements. These include a WordPress.org profile, a Make Slack account, and availability every Wednesday at 8:00 UTC for the duration of the course.

\n\n\n\n

A course on beginning block development is likely to be very popular, so the Training team has committed to maintaining a waiting list for any applications that are not selected in the first round. This is a remarkable opportunity for any developer who has not yet experimented with building blocks but thrives in a more social learning environment. Future cohort courses on the same topic will be scheduled after this one is complete.

\n\n\n\n

The deadline to apply to the very first Learn WordPress course cohort is August 20, 2023, and the course will run from September 4th to October 9th, 2023.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 07 Aug 2023 20:02:16 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:9;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:126:\"Gutenberg Times: Big Changes coming, Hallway Hangout, new course cohort and building custom design tools—Weekend Edition 264\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://gutenbergtimes.com/?p=25117\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:133:\"https://gutenbergtimes.com/big-changes-coming-hallway-hangout-new-course-cohort-and-building-custom-design-tools-weekend-edition-264/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:17242:\"

Howdy,

\n\n\n\n

I’ll be on vacation for the next two weeks and during that time, I will stay away from the computer or phone as much as possible. Really disconnect from the net. I’ll let you know how that went when I’ll get back 🧐

\n\n\n\n

While I am gone, WordPress 6.3 will come out next week, and I hope my efforts to share all that information prepared you, your clients, and teammates well for the next major release.

\n\n\n\n

In case you missed it, the comments on this post by Josepha Haden Chomphosy WordPress 6.4: What’s on your wishlist? will be open until August 15, 2023. “Adding your ticket here won’t necessarily guarantee inclusion. But no one can fix things they can’t see, so bravely share your thoughts!

\n\n\n\n

So I am almost out the door! Be well!

\n\n\n\n

Yours, 💕
Birgit

\n\n\n\n

PS: I might share some photos on Instagram @idx

\n\n\n\n\n\n\n\n\n\n\n\n

Developing Gutenberg and WordPress

\n\n\n\n

Doc Pop interviewed Justin Tadlock on the podcast Press This: Big Changes Coming to WordPress 6.3. They discussed the upcoming WordPress 6.3 release, which marks the end of Phase Two of Gutenberg development.

\n\n\n\n

As some of you already know, the features in WordPress 6.3 include a revamped site editor interface with better navigation and stylebook support, making it easier for non-coders to customize their sites visually.

\n\n\n\n

A new Command Palette is introduced, enabling users to quickly access various functions in Gutenberg. There are also performance improvements, such as fetch priority support for images and updates to the cache and file system API.

\n\n\n\n\n\n\n\n
\n\n\n\n

Joen Assmussen collected all the great work of the WordPress design team in his latest Design Share: Jul 3-Jul 28, among those

\n\n\n\n
    \n
  • Search views and a Meta search for Openverse
  • \n\n\n\n
  • Refined revamp of the showcase pages with additional filter component on WordPress.org
  • \n\n\n\n
  • Assemble a WordPress Design Library for various teams to use
  • \n\n\n\n
  • Details page for Template parts
  • \n\n\n\n
  • Improved Confirm dialog modals, and
  • \n\n\n\n
  • Lots of design work for the new pattern screens in the Site Editor
  • \n
\n\n\n\nScreenshot of Showcase redesign\n\n\n\n
\n

🎙️ Latest episode: Gutenberg Changelog #87 – Patterns, Gutenberg 16.3 and WordPress 6.3. with Anne McCarthy as special guest, hosted by Birgit Pauli-Haack

\n
\n\n\n\n

Plugins, Themes, and Tools for #nocode site builders and owners

\n\n\n\n


In his latest video, Dustin Hartzler wants you to Master Text Formatting in WordPress Block Editor.

\n\n\n\n
    \n
  • 🔍 Learn the basics of bold, italics, and underlining to add emphasis to your content.
  • \n\n\n\n
  • 📌 Discover the power of heading levels to structure and organize your articles effectively.
  • \n\n\n\n
  • 🔠 Personalize your text with different font styles and sizes that match your unique brand.
  • \n\n\n\n
  • 🌈 Paint with words by changing text colors and adding a splash of creativity to your content.
  • \n\n\n\n
  • 🌟 Highlight key points and quotes to make them shine and stand out.
  • \n\n\n\n
  • 🔧 Master text alignment to achieve visually appealing and well-balanced content layouts.
  • \n
\n\n\n\n

Hartzler is a long-time podcaster in the WordPress space, who just published his 525th episode of the Your Website Engineer podcast. Congratulations!

\n\n\n\n

Theme Development for Full Site Editing and Blocks

\n\n\n\n\n
\n\n \n
\n \n \n
\n \n \n \n \n
\n
\n
Live Q & A: Design Systems and theme.json
One of the key challenges of running a site or series of sites at scale is ensuring design consistency and compliance with a design system. During this show, David Bowman,… Read more.
\n
\n
\n \n \n \n\n \n \n
\n\n
\n\n\n\n\n

You must have been waiting for the part 3 of the Beyond Block Styles to come out! Don’t wait not more! Justin Tadlock pushed it over the finish line! Beyond block styles, part 3: building custom design tools. You learn how to add a button and a set of icons to the block toolbar for the Separator block. It’s a great tutorial for advanced theme developers.

\n\n\n\n

You would need to to read the other two parts before it, though:

\n\n\n\n\n\n\n\n

It’s a great project to study from beginning to end. I learned so much about the inner workings of the block editor.

\n\n\n\n\n\n\n\n\n

 “Keeping up with Gutenberg – Index 2022” 
A chronological list of the WordPress Make Blog posts from various teams involved in Gutenberg development: Design, Theme Review Team, Core Editor, Core JS, Core CSS, Test and Meta team from Jan. 2021 on. Updated by yours truly. The index 2020 is here

\n\n\n\n\n

Building Blocks and Tools for the Block editor.

\n\n\n\n

Early Gutenberg adopter and freelance developer, Igor Benic shared in his post How to Read WordPress Block Content Programmatically and read blocks from content in WordPress. You’ll learn how to tap into the functions of the core/block-editor packages. ICYMI, Benic also published How to programmatically add a block in the WordPress Block Editor earlier this year.

\n\n\n\n
\n\n\n\n

Sarah Gooding reported on how you should Start Testing WordPress’ New Interactivity API. It’s still unsure of the Interactivity API will be ready for 6.4 release in November, the Interactivity API packages and features made their way to the Gutenberg plugin with version 16.2. “Developers can follow the API’s “Getting Started” guide on GitHub to scaffold an interactive block with `@wordpress/create-block`. Take a look at the roadmap, which has an extensive list of tasks the team has in mind for the initiative and will include tracking issues for features as they progress.” Gooding wrote.

\n\n\n\n
\n\n\n\n

Upcoming WordPress Events

\n\n\n\n

Join Nick Diego and Justin Tadlock for a Hallway Hangout on August 17, 2023, at 1:00 PM CST (18:00 UTC) on Extending blocks with custom design tools. They’ll have a casual conversation about creating custom design tools for blocks from a theming perspective. You’ll learn how to go beyond the Block Styles API and build your own custom controls, like an emoji-based icon picker for the Separator block. Tadlock and Diego will also explore the possibilities of using block development to extend block themes and discuss current theme development limitations.

\n\n\n\n

Everyone is welcome, but if you’re interested in block theming or building block themes for clients, this session is especially for you. RSVP for the event through the Learn WordPress Meetup group to access the meeting link. Don’t miss it!

\n\n\n\n
\n\n\n\n

WordCamp US organizers published their schedule for the talks on August 25 and 26, 2023. As with all Regional Flagship events, there will be a live stream. Here is a list of the block related topics.

\n\n\n\n\n\n\n\n

I love the emphasis on contributing, community and accessibility!

\n\n\n\n
\n\n\n\n

Jonathan Bossenger announced the first Learn WordPress course cohort on the training team’s blog: On September 4th, a 6-week cohort titled “Developing your first WordPress Block” starts. Bossenger will facilitate the course designed for first-time WordPress block developers. The structure includes weekly sessions covering block development topics such as block styling, attributes, and interacting with WordPress data.

\n\n\n\n

The cohort will meet in both asynchronous and synchronous sessions, with a one-hour real-time session every Wednesday at 8:00 UTC. If interested, read more about the application and selection processes in the blog post

\n\n\n\n
\n\n\n\n

Nathan Wrigley and Anchen le Roux scheduled this year’s Page Builder Summit for 18th – 22nd September 2023. They put together is a great slate of new and veteran speakers. It’ll have plenty of Gutenberg topics, and it doesn’t hurt to learn about all the businesses and products in the WordPress space.

\n\n\n\n\n

Need a plugin .zip from Gutenberg’s master branch?
Gutenberg Times provides daily build for testing and review.
Have you been using it? Hit reply and let me know.

\n\n\n\n

\"GitHub

\n\n\n\n\n

Questions? Suggestions? Ideas? Don’t hesitate to send them via email or send me a message on WordPress Slack or Twitter @bph.

\n\n\n\n

For questions to be answered on the Gutenberg Changelog, send them to changelog@gutenbergtimes.com

\n\n\n\n
\n\n\n\n\n

Featured Image: “Mumbai Lab Architecture” by BMW Guggenheim Lab is licensed under CC BY-NC-ND 2.0.

\n\n\n\n
\n\n\n\n

Don’t want to miss the next Weekend Edition?

\n\n\n\n

We hate spam, too and won’t give your email address to anyone except Mailchimp to send out our Weekend Edition

Thanks for subscribing.
\n\n\n\n
\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 05 Aug 2023 10:00:28 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Birgit Pauli-Haack\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:10;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:125:\"Post Status: WordPress 6.3 RC3 • Cyber Resilience Act • Accessibility in Block Editing • Merging Gutenberg during Alpha\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"https://poststatus.com/?p=150074\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:124:\"https://poststatus.com/wordpress-6-3-rc3-cyber-resilience-act-accessibility-in-block-editing-merging-gutenberg-during-alpha/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:25593:\"

This Week at WordPress.org (July 30, 2023)

\n\n\n

What do WordPress, Drupal, Joomla, and TYPO3 have in common? Leaders across these Content Management Systems have come together to express their concerns and seek dialogue with EU legislators regarding the proposed Cyber Resilience Act. They emphasize the vital role of Free and Open Source Software in fostering innovation, security, and economic prosperity.

We’re just a few days away from August 8th’s WordPress 6.3 release.

Two Gutenberg-related topics are worth consideration. First, Alex Stine shares how he sees WordPress using his screen reader. Secondly, consideration is underway to merge Gutenberg plugin releases into alpha releases.

\n\n\n
\n\n\n\n\n\n\n\n

\n\n\n\n

News

\n\n\n\n\n\n\n\n

\n\n\n\n
\n\n
\n\n\n\n
\n\n\n\n\n\n
\n\n\n\n
\n\n\n\n
\n\n
\n\n\n\n
\n
\n
\n
\n

Accessibility

\n\n\n\n\n\n\n\n

Community

\n\n\n\n\n\n\n\n

Core

\n\n\n\n\n\n\n\n

Phase 3 Ideations

\n\n\n\n\n\n\n\n

Developer Blog

\n\n\n\n\n\n\n\n

Meetings

\n\n\n\n\n\n\n\n

Docs

\n\n\n\n\n\n\n\n

Hosting

\n\n\n\n\n\n\n\n

Meta

\n\n\n\n\n\n\n\n

Mobile

\n\n\n\n
    \n
  • \n
\n\n\n\n

Openverse

\n\n\n\n\n\n\n\n

Performance

\n\n\n\n\n\n\n\n

Plugins

\n\n\n\n\n
\n\n\n\n
\n

Polyglots

\n\n\n\n\n\n\n\n

Project

\n\n\n\n\n\n\n\n

Support

\n\n\n\n\n\n\n\n

Sustainability

\n\n\n\n\n\n\n\n

Test

\n\n\n\n\n\n\n\n

Theme

\n\n\n\n\n\n\n\n

Training

\n\n\n\n\n\n\n\n

Tutorials

\n\n\n\n\n\n\n\n

Online Workshops

\n\n\n\n\n\n\n\n

Courses

\n\n\n\n\n\n\n\n

WordPress TV

\n\n\n\n\n\n\n\n

WPTV

\n\n\n\n\n
\n
\n
\n
\n\n\n\n
\n\n\n\n\n\n\n\n\n\n\n\n

Thanks for reading our WP dot .org roundup! Each week we are highlighting the news and discussions coming from the good folks making WordPress possible. If you or your company create products or services that use WordPress, you need to be engaged with them and their work. Be sure to share this resource with your product and project managers.

Are you interested in giving back and contributing your time and skills to WordPress.org? \"🙏\" Start Here ›

Get our weekly WordPress community news digest — Post Status’ Week in Review — covering the WP/Woo news plus significant writing and podcasts. It’s also available in our newsletter. \"💌\"

\n\n\n\n
\n\n\n\n
\"Post
\n

You — and your whole team can Join Post Status too!

\n\n\n\n

Build your network. Learn with others. Find your next job — or your next hire. Read the Post Status newsletter. \"✉\" Listen to podcasts. \"🎙\" Follow @Post_Status \"🐦\" and LinkedIn. \"💼\"

\n
\n\n\n\n
\n

This article was published at Post Status — the community for WordPress professionals.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 04 Aug 2023 19:29:53 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Courtney Robertson\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:11;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:52:\"WPTavern: WordCamp Asia 2024 Opens Call for Speakers\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=147494\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:63:\"https://wptavern.com/wordcamp-asia-2024-opens-call-for-speakers\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:2689:\"

WordCamp Asia 2024 is happening in Taipei, Taiwan, next year from March 7-9, at the Taipei International Convention Center (TICC). With the dates locked in and venue secured, organizers have now opened the call for speakers. The event will feature three days of talks, workshops, and networking events, and organizers expect more than 2,000 attendees.

\n\n\n\n

Talks will be given in English and there will be four different formats for sessions:

\n\n\n\n
    \n
  • Long Talks: 40 minutes total (30 minutes for talk + 10 minutes for Q&A)
  • \n\n\n\n
  • Lightning Talks: 10 minutes total (10 minutes for talk only. No Q&A)
  • \n\n\n\n
  • Panel Discussions: Approximately 60 minutes with Q&A
  • \n\n\n\n
  • Workshops: 90 minutes up to half a day
  • \n
\n\n\n\n

WordCamp Asia’s organizers suggested nearly two dozen acceptable topics across a wide range of disciplines, including accessibility, SEO, marketing, Web3, AI, security, case studies, and more. They are especially “interested in hearing about diverse topics and inspirational stories. Topics such as trends, new approaches, and upcoming changes in related software and WordPress itself will be encouraged.”

\n\n\n\n

The call for speakers includes those who are hoping to host or join a panel discussion or host a workshop. Speakers do not have to be experienced at public speaking to be selected for WordCamp Asia. Those who do not have videos of previous talks can record a 5-10 minute video talking about their topic and link to it in the speaker form.

\n\n\n\n

WordCamp Asia has launched an Underrepresented Speaker Support Initiative alongside this call for speakers with the goal of removing financial barriers for speakers. The program calls on companies to invest in creating a more diverse, equitable, and inclusive tech community by sponsoring underrepresented speakers, helping them practice their talks, and promoting the cause.

\n\n\n\n

The event’s organizers are also calling for sponsors, media partners, and volunteers. Prospective speakers are limited to two presentation submissions and can also indicate if they would be willing to be selected as a backup speaker. Applications will close on September 30, 2023. Speakers will be notified about the outcome of the selection process in November, followed by speaker announcements in December.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 04 Aug 2023 04:12:03 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:12;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"BuddyPress: BuddyPress 12.0.0-beta1\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"https://buddypress.org/?p=330655\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:55:\"https://buddypress.org/2023/08/buddypress-12-0-0-beta1/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:9511:\"

Dear contributors, BP Plugin & BP Theme developers,

\n\n\n\n

BuddyPress 12.0.0-beta1 is finally available for testing! \"🏄‍♀️\" \"🏖\"

\n\n\n\n
    \n
  • Please note the plugin is still in development, so we recommend running this beta release on a testing site.
  • \n\n\n\n
  • Please note BuddyPress 12.0.0 will require at least WordPress 5.8.
  • \n
\n\n\n\n

You can test BuddyPress 12.0.0-beta1 in 4 ways :

\n\n\n\n
    \n
  • Try the BP Beta Tester plugin.
  • \n\n\n\n
  • Download the beta here (zip file).
  • \n\n\n\n
  • Check out our SVN repository: svn co https://buddypress.svn.wordpress.org/trunk/
  • \n\n\n\n
  • Clone our read-only Git repository: git clone git://buddypress.git.wordpress.org/
  • \n
\n\n\n\n

The current target for final release is: October 30, 2023. Considering the major change we’re introducing with this release, we decided to plan for a 3 months beta testing period to:

\n\n\n\n
    \n
  • leave enough time for BuddyPress plugin & theme authors to adapt their code to our new BP Rewrites API.
  • \n\n\n\n
  • Update our existing add-ons to demonstrate the changes needed for optimum 12.0 compatibility (e.g., BP Attachments & BP Search Block)
  • \n\n\n\n
  • Explain how the new code affects ways to extend BuddyPress from now on, and document as much as we can the progressive BuddyPress reboot that we’re starting with 12.0.0.
  • \n\n\n\n
  • Identify potential issues or improvements for this release and the BP Classic add-on which neutralizes the BP Rewrites API and ensures 12.0.0 backwards compatibility with plugins & themes that are not ready yet for this API.
  • \n
\n\n\n\n

More than ever in BuddyPress history, testing for bugs is the key to a safe upgrade. It’s the main reason we actually package beta/RC versions. \"👉\" Please, with the goal of making this a smooth transition for our end-users, give us a bit of your time to ensure your specific theme or plugin works with this pre-release. If you find something weird, please report it on BuddyPress Trac, post a reply to this support topic or get in touch with us on our WordPress.org Slack channel.

\n\n\n\n
\n\n\n\n

One massive change & around 60 other changes to expect in 12.0.0

\n\n\n\n

You can check out this report on Trac for the full list of them. Below are the ones we believe will require your attention a lot and improve your BuddyPress experience in the most significant way.

\n\n\n\n
\n\n\n\n

\"✍\" The BP Rewrites API (the massive change!)

\n\n\n\n
\n

BP 12 is replacing the transmission in the car

\n@dcavins on April 17, 2023.
\n\n\n\n

This is a 10-year-old issue we are solving in BuddyPress 12.0.0, initializing a reboot was the right opportunity to finally comply with the WordPress way of generating rules to analyze requested URLs and route the visitor to the right site content: the WP Rewrite API. If we’ve tried to minimize as much as we could the needed changes for BuddyPress plugins and themes, 2 constraints couldn’t be worked around:

\n\n\n\n
    \n
  • WordPress fully analyzes a URL later in the load process than our Legacy URL parser does its job
  • \n\n\n\n
  • Supporting plain permalinks & customizable slugs required us to completely rethink the way we build BuddyPress URLs
  • \n
\n\n\n\n

That being said, the impressive benefits will outweigh the small efforts we all need to accomplish in the coming 3 months:

\n\n\n\n
    \n
  • Site Administrators will now have a full control over all BuddyPress-generated URLs. They can choose slugs (or portions of URLs) that reflect their community, maybe using localized language or special terms that are more meaningful to their members. All also means, the URLs generated by 3rd party BuddyPress Add-ons using the BP Rewrites API.
  • \n\n\n\n
  • BuddyPress will be fully compatible with plain URL permalinks.
  • \n\n\n\n
  • Parsing BuddyPress URLs is faster, more reliable, extensible, testable and fully compliant with WordPress best practices.
  • \n\n\n\n
  • We now have a solid foundation to dream bigger!
  • \n
\n\n\n\n
\n\n\n\n

\"🔐\" A new community visibility level: members only

\n\n\n\n

We’ve heard from BuddyPress end-users that being able to easily restrict access to their community is a necessary feature. And thanks to the BP Rewrites API, we are able to reach this standard. With this first iteration, a site admin can now choose whether the community is fully public or is only accessible by logged-in members. In future versions, we hope to add granularity to this choice, so that community administrators can choose to highlight their members but share activities only inside the community “gates” for example. 

\n\n\n\n
\n\n\n\n

\"🧙‍♂️\" More than 80 deprecated functions & 2 removals

\n\n\n\n

12.0.0 deprecates more functions than any of our previous releases (The 1.5 version, which was the previous “leader”, deprecated 40 functions). 26 of these deprecated functions was actually moved into the BP Classic plugin as they were specific to our legacy way of building, parsing and analyzing URLs.

\n\n\n\n

The BP Default theme and our BP Legacy widgets have also moved to BP Classic, the future is blocks!

\n\n\n\n

This is important: you really need to test BuddyPress 12.0.0 to get ready for it!

\n\n\n\n
\n\n\n\n\n\n\n\n
\n\n\n\n

\"🤝\" Props @dcavins for his review & great improvements about this announcement post.

\n\n\n\n

\"🕹\" Happy testing! Thanks for your help!

\n\n\n\n
\n\n\n\n

Thanks to BuddyPress: get together safely, in your own way, in WordPress.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 03 Aug 2023 22:16:40 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"Mathieu Viet\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:13;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:63:\"WPTavern: WordPress Remembers: A Memorial To Those We Have Lost\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=147472\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:73:\"https://wptavern.com/wordpress-remembers-a-memorial-to-those-we-have-lost\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:2065:\"

WordPress is honoring contributors the community has lost over the years through a new memorial page called WordPress Remembers:

\n\n\n\n
\n

WordPress dedicates this page to the memory of those we’ve lost. They’ve shaped our project and enriched our community. As we remember their passion and commitment to WordPress and open source software, we celebrate their spirit.

\n\n\n\n

Forever in our hearts, their legacy endures through every line of code and every user they’ve impacted.

\n
\n\n\n\n

The page lists code and community contributors who left a lasting impact on the WordPress project, and links to their profiles and external blogs and memorial pages.

\n\n\n\n
\n\n\n\n\n\n\n\n

“As WordPress continues through the decades, we have to deal with all parts of life, including death,” WordPress co-creator Matt Mullenweg said, introducing the page on Twitter. “As a community, we now have a memorial place we can remember and honor those who contributed to WordPress but are no longer part of this world.” In a followup tweet he added, “I will be on this page someday.”

\n\n\n\n

For a software project that is 20+ years old, with an aging contributor base, departures from this world will soon become more common. Visiting this memorial page is a heart gripping experience if you had the privilege of knowing any of these beloved contributors. It’s sobering to consider the impact and legacy of one’s investments in WordPress, but this elegantly designed memorial calls those questions to mind.

\n\n\n\n

If you know of someone who is missing from this page, you can contact memorials@wordpress.org and volunteers will add them.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 03 Aug 2023 20:59:54 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:14;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:91:\"Post Status: What is Coaching & What Are Key Times to Have a Coach with Kelly Gallagher\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"https://poststatus.com/?p=150057\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:96:\"https://poststatus.com/what-is-coaching-what-are-key-times-to-have-a-coach-with-kelly-gallagher/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:47846:\"
\n\n
\n\n\n\n\n\n\n\n

Transcript

\n\n\n\n

In this podcast episode, Cory Miller introduces his professional coach, Kelly Gallagher, to discuss the role of coaching in personal and professional growth. They explore the difference between coaching and therapy and how they can complement each other. They highlight the value of coaching for high achievers and how it can help with career changes, improving performance, and enhancing communication skills. Cory shares his personal experience with coaching and expresses its positive impact on his life.

\n\n\n\n

Episode Highlights:

\n\n\n\n
    \n
  • [00:00:00] The role of coaching and introduction of Kelly Gallagher-Cory introduces Kelly Gallagher as his professional coach and discusses their working relationship for four and a half years.
  • \n\n\n\n
  • [00:01:25] Kelly’s background in business development and coaching training- Kelly shares her background in business development and her coaching journey, including her training and pursuit of a master’s degree.
  • \n\n\n\n
  • [00:07:38] The difference between coaching and therapy, and the value of coaching for high achievers-Cory and Kelly discuss the definition of coaching, the distinction between coaching and therapy, and the importance of coaching for high achievers.
  • \n\n\n\n
  • [00:11:39] The distinction between therapy and coaching-Discussion on the differences between therapy and coaching and how they complement each other.
  • \n\n\n\n
  • [00:12:41] The value of having a coach for high achievers-Exploration of the benefits of coaching for high achievers and the importance of self-awareness.
  • \n\n\n\n
  • [00:13:55] Times when people seek coaching-Identification of common situations that lead individuals to actively seek coaching, such as career conflicts, the desire for personal growth, and the need for support during organizational changes.
  • \n\n\n\n
  • [00:23:31] The role of coaching and the importance of ICF certification-Discussion on the role of coaching, the significance of ICF certification, and the difference between coaching and therapy.
  • \n\n\n\n
  • [00:28:34] The value of having a coach for high achievers-Exploration of the benefits of coaching for high performers and the potential negative stigma associated with coaching as a remedial tool.
  • \n\n\n\n
  • [00:31:58] Coaching for entrepreneurs-The essentiality of coaching for entrepreneurs, particularly in navigating change, making big decisions, and improving performance.
  • \n\n\n\n
  • [00:34:24] The role of coaching and seizing opportunities-Cory reflects on the importance of having a coach and making the most of opportunities in business.
  • \n\n\n\n
  • [00:35:18] The importance of personal happiness and joy in work-Kelly discusses the significance of finding joy and personal happiness in one’s work and how it affects performance.[00:37:09] The passion for helping others and personal growth-Kelly shares her passion for helping others find personal growth in coaching and how it is more rewarding than pure sales.
  • \n
\n\n\n\n
\n
\n
\n

\"🙏\" Sponsor: Elementor

\n\n\n\n

Elementor enables web creators to build professional, pixel-perfect websites with an intuitive visual builder. Quickly create amazing websites for your clients or your business with complete control over every piece, without writing a single line of code. Join a vast community of web creators from all around the world who deliver exceptional websites using Elementor.

\n
\n\n\n\n
\n\"Elementor\"Elementor
\n
\n
\n\n\n\n

\"🔗\" Mentioned in the show:

\n\n\n\n\n\n\n\n

\"🐦\" You can follow Post Status and our guests on Twitter:

\n\n\n\n\n\n\n\n

The Post Status Draft podcast is geared toward WordPress professionals, with interviews, news, and deep analysis. \"📝\"

Browse our archives, and don’t forget to subscribe via iTunes, Google Podcasts, YouTube, Stitcher, Simplecast, or RSS. \"🎧\"

\n\n\n\n

Transcript

\n\n\n\n

Cory Miller (00:00:00) – Hey everybody. Welcome back to Post Status Draft. I’ve got a special guest today and I’m excited because I’ve worked with this awesome person professional for I think it’s been five years now. Four years? No, probably four and a half years now, Kelly. And. So back when I had just sold items, I was working the, you know, my job at trying to transition team, get some things done in the year after we had sold and I was starting to percolate. Okay, I’ve got this huge career change coming up, this huge business, whatever change in my professional life. And I sought out a coach and found Kelly Gallagher. So she’s my professional coach for four and a half years. We’re going to have a great conversation talking about coaching times when it’s so helpful to have a coach. And I’ll share personal experiences, too, but you’re in for a treat today. So Kelly, thanks so much for being on the podcast.

\n\n\n\n

Kelly Gallagher (00:01:02) – Thank you for having me. I’ve been watching some of your podcasts, and I’m just honored to be the subject of one of them.

\n\n\n\n

Kelly Gallagher (00:01:07) – So thank you.

\n\n\n\n

Cory Miller (00:01:09) – I often refer to Kelly as my secret weapon because a lot of the big things that have happened in the last five years, for sure in my life I’ve rehearsed, practiced, talked through all of these with Kelly. So, Kelly, tell us a little bit about your background.

\n\n\n\n

Kelly Gallagher (00:01:25) – Um, Cory, I came from a business development specialty within corporate America, specifically pharmaceuticals and the medical industry, and also diagnostics and lab testing. So I was a road warrior. I was out closing deals and my responsibilities escalated and escalated to the point where. Um, the last ten years, I was with a diagnostic lab, and I was also training other salespeople. I was interviewing them, hiring them and then coaching them. But I didn’t know I was coaching because I wasn’t sure even what coaching was. I wanted to take over the training department. So I was told, Well, you have no experience, even though I was already doing it. So I challenged and said I would like to go back and get my masters.

\n\n\n\n

Kelly Gallagher (00:02:16) – And I entered the coaching program, which is a just gold standard industry. I don’t know. It turned out to be one of the best. And so I entered that. And then while I was doing it, I thought, why not just get a master’s in business administration? Because I already know these things. So I went to school for five years and it was the best five years of my life. Um, I learned that I love to learn, and I think that may be what separates good coaches from great coaches. Is that. Constant wanting to move the bar up, that constant going to class mentality to be at another level. And that’s what’s really defined my career. There’s not really a time of the year when I’m not in continuing education and it’s my passion. I just want to be a master of my craft. So that was my journey. The interesting sidebar is I was told you can do all this, but if your sales performance drops, we’re done. We’re not paying. I said, okay.

\n\n\n\n

Kelly Gallagher (00:03:29) – But the more I studied coaching and communications, the higher myself through. And there’s actually a correlation between the two. It doesn’t seem like there would be, but I learned how to really listen. I was a good listener to begin with, but I became just a great listener and observer of behavior. And I also learned how to challenge people. So if a buyer told me, yes, yes, I’m definitely going to get the contract signed. And I sensed a hesitancy, I would call them out and go, you know, you’re sending one thing, but I’m hearing something else. It sounds like you’re still uneasy. And a lot of times by doing that, I could tease out that they weren’t going to buy it and we can have further discussion. So the coaching actually when I finished up. My sales career. It was as far as I could take it, but I owe it all to the coaching training.

\n\n\n\n

Cory Miller (00:04:32) – That’s awesome. Now, I know you have ICF credentials and all that and you can share a little bit about what ICF is, but so I know you are very involved there.

\n\n\n\n

Cory Miller (00:04:45) – Have done there’s so many regular like you said, I do a lot of work with mental health practitioners and there’s such a very, I would say regulated, but no like very intense and purposeful way to do therapy. A lot of guidelines, a lot of regulations, a lot of licensure things, ethical consideration, continuing. Ed But coaching has so much of that too. And that’s where ICF comes into yes.

\n\n\n\n

Kelly Gallagher (00:05:12) – And unfortunately, there’s not a specific license. I wish there was, but because there isn’t, the consumer has to really be discerning. And one way to start is that ICF because it’s the gold standard and for coach is not doing continuing education and involved with ICF. I don’t know. Chances are there will be less rigor to what they’re going to be able to do. It’s not that they wouldn’t be good coaches.

\n\n\n\n

Cory Miller (00:05:40) – Yeah, I think the ICF stuff is strong. Sometimes I feel like it’s a little bit too limiting, but I go, Gosh, it’s so good because it’s trying to really professionalize the coaching industry where anybody can just say, Oh, I’m my coach, I’m a life coach, whatever it is.

\n\n\n\n

Kelly Gallagher (00:05:57) – People just hang out a shingle and say, Boom, magic, I’m a coach. I two think it can be limiting, but I offer a bit of a hybrid because I have so much business experience. I’ll often tell my clients, Hey, I’m going to shift out of coaching if you want. Is it okay if I put on my business act and they almost never had anyone say no in interviews? And so then I’m able to interject a little, you know what this happened to blah, blah, blah. And I think that’s what differentiates me from other coaches. But the ICF standards are just critical. And the other thing about the ICF is you have to have 250 hours of continuing education to keep getting the licensure. That’s not a license to keep, you know, being indoors. And so that really raises the bar and enables the coach to really grow because you’re constantly taking a course. Yeah.

\n\n\n\n

Cory Miller (00:07:02) – So super, super strong. By the way, if you’re listening, you want to look if the coach has ICF certifications and all that, that’s really important, rigorous, rigorous work that they do to keep that up means to me it goes through taking it very seriously their profession.

\n\n\n\n

Cory Miller (00:07:19) – So Kelly, what is a coach? We’re going to spend some time talking about the times in which coach has been so, so valuable to your clients, to me, and we’re going to share experiences around that. But first, I kind of want to get a baseline of like, what is a coach?

\n\n\n\n

Kelly Gallagher (00:07:38) – Great question. Mean a coach. I had this conversation this morning at the pool at 5 a.m. Someone said, Oh, you’re going to coach. They just want content. I said, No, that’s not really what coaching is. I’m not really delivering content. I think a coach is someone that walks on a journey with a professional who wants to raise the bar. Um, it can be a life coach too. So then you’re walking the journey with an individual who has an area of life where they want to improve or progress. And that’s still the same formula for going through the coaching process, whether it be an executive or whether it be. Someone who wants to increase communication with their husband or wife.

\n\n\n\n

Cory Miller (00:08:25) – So, yeah. And part of how we were working together when we first started working together was I was going to the same school you went to, which is fantastic. University of Texas and Dallas and their coaching program is incredible. And being mentored by you. And because I was getting asked when when I left our teams and I was trying to do my own thing, I thought, okay, it’s going to be coaching People go, What is it, Coach? What do you do? And I was like, Oh gosh, I’m struggling with these. But it’s so much that it’s that walking alongside a person on a journey and I like what you added to it, is like they want to raise the bar, they want to do something more. And, you know, I have so much reflected about my business entrepreneurial career for the last 15 years ago. If I had a coach from the beginning, it would have been so much better in many ways. Not just success, success for sure, but also health clarity.

\n\n\n\n

Kelly Gallagher (00:09:23) – It’s funny you say that, Cory, because even 20 years ago when I was in pharmaceuticals and I was doing very well, had I had a coach, I would have been a rock star because there were rough edges that I couldn’t see. You can’t see them in yourselves the way someone else can who’s actively listening to you.

\n\n\n\n

Cory Miller (00:09:43) – Yeah. Well, and you know, the parallel we always give is sports. You know the best. Greatest of all time. Athletes have coaches and have people around them. Like you just assume they wake up and they’re just as good naturally. No, they work on their craft. And I think about that so much. Like, I know you work with a lot of high achievers and oftentimes so many of the entrepreneurs I’ve worked with very high achievers too. I’ve had the pleasure of having people on my team big time, high achievers. And you just go, like, if you really want to do well in what you’re doing, you need to have somebody that’s on your side.

\n\n\n\n

Cory Miller (00:10:23) – Nobody does it alone. I think that’s the fast that we perpetuate in our culture and especially in business, like with entrepreneurs, is like, Oh, I’m the rockstar. I do this by myself, that you got these icons out there. You know, Steve Jobs is the one you hear over and over and over 100,000 times. You go, He didn’t do it alone. No, there’s no way you can do it alone. And having someone in your corner that’s helping you perform at the highest level is so critical.

\n\n\n\n

Kelly Gallagher (00:10:54) – Yes, I agree. And, you know, oftentimes people will also say, well, isn’t it like therapy? I would call it therapy. Ten x. Because therapy’s great and I think everyone should go through that process at some time in their life. I really believe in it. But at some point it’s limited because it’s just keeps moving into the past and feelings and often sad feelings. Whereas coaches moving the person forward so high achievers get bored in therapy after a while, after a while, and they might go back and forth to therapy.

\n\n\n\n

Kelly Gallagher (00:11:34) – But generally they find that coaching helps them because it’s goal oriented.

\n\n\n\n

Cory Miller (00:11:39) – Yeah, well, and I know there’s a big distinction between therapy and coaching and really, you know, really try to their distinct things. And oftentimes probably you have taught this mentioned like therapy is looking back, coaching is looking forward. Is that how you kind of see that?

\n\n\n\n

Kelly Gallagher (00:11:56) – Yes. And you know, as a coach and a credentialed coach, I’m ethically bound if I feel like someone continually goes into therapy. Waters and themes, um, I’m bound to refer them on to therapists till they are more stabilized. And then oftentimes a lot of my clients are in therapy and coaching together. They really work well hand in hand.

\n\n\n\n

Cory Miller (00:12:22) – Yes. In fact, for the bulk of the time right now, I am not currently seeing a counselor, however, for the last see two months, but for the bulk of the time we’ve worked together have had a counselor and a coach. So I think their yin yang, their.

\n\n\n\n

Kelly Gallagher (00:12:41) – Right. And the people that come to me and have had some therapy, even if it was limited, they have just a little bit more self awareness.

\n\n\n\n

Kelly Gallagher (00:12:49) – So coaching progresses faster.

\n\n\n\n

Cory Miller (00:12:52) – Yeah. If you’re doing your work to.

\n\n\n\n

Kelly Gallagher (00:12:55) – Because other otherwise get clients. Sometimes we’ll say, Well, what does it matter how I’m feeling about this? Well, it matters a lot because, you know, your heart is just as involved in these decisions and actions and creative things you’re asking yourself to do as the frontal lobe of your brain. So they are connected.

\n\n\n\n

Cory Miller (00:13:14) – Yeah. Okay. So we talked about what coaching is a little bit we talked about the distinctions, therapy versus coaching and how they’re additive and can exist together. And in fact, or even better sometimes, oftentimes, especially in my experience, I would say. Well, I’m curious, Kelly So I know my own personal experience is related to our coaching professional relationship. But I’m curious, what are the times you you see people getting into the meat of this kind of conversation between us is like, what are those times when people go, okay, they’re thrust out to go actively look for a coach and end up, you know, in a in a room or a meeting with you.

\n\n\n\n

Kelly Gallagher (00:13:55) – I would say that generally there’s some type of struggle. It can be a conflict at work. That’s a huge one because that dips into, well, do I want a career change? And sometimes people come and they don’t know what they want. They’re just not happy. Um, people who want to progress with that and find meaning and integrate what they’re learning about themselves will come to coaching because that process. It really it’s like turbocharging the job search and turbocharging people to take interviews and move on and move up without really any kind of formal instruction to just that self-awareness that it builds. So that’s one of the big ones. Um.

\n\n\n\n

Cory Miller (00:14:44) – Let’s talk about struggle for a second. So struggle back to that. So is that so you mentioned a couple of factors there. I want to hit both sides. One is maybe I need to make a change, like move out of what I’m doing. But there’s another one, which is maybe I want to get promoted or have been promoted or, you know, within an organization to and I’m curious your experiences around around that too.

\n\n\n\n

Cory Miller (00:15:10) – So I like that it starts with like there’s some kind of struggle and they’re seeking outside perspective and help support with that. But it starts with some things they’re trying to change and wrestling against. Sounds like.

\n\n\n\n

Kelly Gallagher (00:15:24) – Right? And many times, you know, when you’re in a new position or you’re in a position where you are striving to do something else within that company, you will conform to their expectations and almost wear a mask. The to the degree that you lose something in the translation because then you’re not really connecting with your creative side or your problem solving side or your heart. And so a lot of work can be done to find that balance for people. The other thing that touches on is fear of failure. Your fear of failure is. It’s just a sweet spot because so many. Points of wanting to change. If we whittle down and we go with the client, what’s beneath that? What’s beneath that or what’s beneath that? And we get down to the core or the middle of the onion. It’s fear of failure.

\n\n\n\n

Kelly Gallagher (00:16:19) – And that’s that’s just a part of being human. No one wants to humiliate themselves or fall down. But I think, too, in our society, think about schools nowadays. Everyone’s given a trophy. Soccer, Everyone’s campaigning, trophy swimming. Everyone makes the team. No one’s not on the team. Great. So children are raised to not really fail or understand that they founded something and think in a way, I like the philosophy, but in a way I think I see a lot of young adults who come out into the world and they are terrified of not getting a trophy of not. And the reality is, in real life, you don’t get that many trophies.

\n\n\n\n

Cory Miller (00:17:06) – Yep. Well, we that was that fear of failure thing. We, we talked our last coaching session about that specifically and totally like, you know, when you’ve especially if you’ve been accustomed to winning, doing succeeding and then you hit some failures and or trying to do anything big and new, take that next job, start that new endeavor, whatever that is, and that, you know, oh, this is not a guaranteed success.

\n\n\n\n

Cory Miller (00:17:35) – So that that definitely resonates.

\n\n\n\n

Kelly Gallagher (00:17:37) – Right? And if I fail, that also relates to a further theme of then the fear of being actually seen for who you are. Um, yeah, it’s a heavy topic and it can take a while to work through, but it’s, I think most of my clients will say that’s valuable work. And it’s not that they become fearless, but I think they’re able to notice the emotion name and then kind of negotiated.

\n\n\n\n

Cory Miller (00:18:08) – Yeah, you mentioned the word emotions. And I think when I first started working with you, I didn’t I didn’t go to that realm. I was, you know, okay, more intellectual thinking process and stuff. And you’re extremely helpful with that. And probably because of some of the, you know, understandings between therapy and coaching or misunderstanding to say, I didn’t really get into that. But I think our best work has come with the emotions. Like my my definitely I’ve benefited every time we’ve talked. I’ve been better for it. However, I think the most profound times is when we get into, okay, I’m doing this thing.

\n\n\n\n

Cory Miller (00:18:48) – It’s an event, like you said, a struggle or something new or a change or something I’m preparing for. But then okay, the emotion around that and understanding that and leveraging, you know, really deep dive into that where I’m trying to improve. I can’t remember how many times you’ve said to me, okay, well they are not in this call. What is the what about you? And I was like, Oh man, doing that hard work, which is made I know it’s made me better as a professional and a leader for sure, because oftentimes you kind of redirect back to me and go, okay, well, they’re not here. Let’s talk about what this means to you, for you. And I’m always like, Well, let me take a deep breath on that one.

\n\n\n\n

Kelly Gallagher (00:19:31) – That’s a hard one. I learned that actually didn’t learn that at Utd or anywhere. I learned that as a young rep out in the field and I complain about these idiot customers. Right? And the manager told me once, he said, Turn your rearview mirror to your face.

\n\n\n\n

Kelly Gallagher (00:19:48) – And I didn’t. He goes, Now look at that. That’s the person that would have to change. The client’s not going to change. And it was the most profound thing. It kind of hurt my feelings, but it was so true.

\n\n\n\n

Cory Miller (00:20:01) – Well, I’ve talked through everything with you from partner team issues, all that. And it’s been so helpful because I think oftentimes kind of thinking, okay, yeah, they’ve got to change. There’s something with them. And the real work, profound and deep, that continues to get deeper is what does that mean for me about me? What do do I need to change something and what is that? And those are the times really in reflective work that I go, okay. And more and more I think I’m getting it. Or I go, okay, So something I’m not aware about myself potentially pointing outwards and then going, I kind of need to turn the rearview mirror back to myself.

\n\n\n\n

Kelly Gallagher (00:20:46) – Back to your face? Yes.

\n\n\n\n

Cory Miller (00:20:48) – It’s not the easiest thing to do, but I’m glad you do it.

\n\n\n\n

Kelly Gallagher (00:20:50) – It’s not the easiest thing to do. And in periods of conflict or intense conversations with bosses or calling people, you’re supervising, it’s extremely hard to stop yourself and say, wait a minute, who am I? And yeah, it’s it’s really, really hard. But I think as people progress in coaching, they become almost a coach within themselves.

\n\n\n\n

Cory Miller (00:21:16) – Yes. Yes. I can hear you quite a bit doing that.

\n\n\n\n

Kelly Gallagher (00:21:21) – Yeah. Oh yeah. So that would be my goal is that when I’m not there because I’m not there all the time and I don’t know of it, even though I know so much, I don’t know all of it. But my goal would be when that person’s gone for a week or they’re in a high stress situation, they’re able to somewhat coach themselves through it.

\n\n\n\n

Cory Miller (00:21:44) – Absolutely. Well, okay. So we talked about like the struggle conflict. Something’s going on there. Want to do reach something new? Maybe they’re evaluating a big change. I mean, that resonates with me. I was that’s how we kicked off our thing.

\n\n\n\n

Cory Miller (00:21:59) – It was like I was changing my profession career very substantially, knew I was going to be leaving the company I started. And, you know, okay, here’s a totally new avenue and having somebody to talk that through the fear of failure, the emotions of being an achiever, especially a high achiever, trying to do something in the world like an entrepreneur, what are some other things that you you see often in your coaching?

\n\n\n\n

Kelly Gallagher (00:22:27) – Well, I would say the other thing, the theme is some type of organizational change, because your organization, of course, they’re always changing. And there are new standards that people don’t. We talked about that before we went on tape that sometimes people don’t like change. So being able to go in and help a person challenge their assumptions about the change really recognize within themselves the any negative thinking loops or or extra baggage they’re bringing in the situation and then thrive throughout the change would be a big thing. Um, and as they go along to they learn about themselves and then to integrate that learning.

\n\n\n\n

Kelly Gallagher (00:23:12) – Back into the organization. That’s changing because change is constant. Yep. I don’t think I’ve ever been in an organization in 30 years that wasn’t doing some type of change. It’s almost never stay.

\n\n\n\n

Cory Miller (00:23:31) – It’s yeah, absolutely. Well, there’s two things I think about when we’ve worked together and what I know of coaching too. It’s it’s the word change that you said. Some change. Big change oftentimes big change. The other side of the coin for me is performance.

\n\n\n\n

Kelly Gallagher (00:23:47) – So yeah.

\n\n\n\n

Cory Miller (00:23:49) – Continual performance. So like and I think about those listening in why you won’t get you want to get coaching for yourself and your team is that performance factor like it’s an investment back into yourself or your team if you’re providing coaching. I think some great organizations, particularly in WordPress I’ve heard of because I’ve referred people to you that happen to be in WordPress. I go, Oh, I love the forward thinking of that. You’re going, it’s an investment in their people, but the performance side. So we’ve talked a lot of some about this change side.

\n\n\n\n

Cory Miller (00:24:24) – There’s something going on and how we wrestle and adapt to that change where we talk about motions and different things and then but the other side to me is like, I can’t remember how many times I call it performance, but what I think it is, is like preparation. I mean, some of the biggest deals I’ve done in five years have been rehearsed, practiced, polished, perhaps even with you. And gosh, I didn’t have that my previous ten years. And I thought, wow, I went into so many situations. I thought I had done my preparation. But doing it with you with a coach was made things so much better, I think, through that process. Kelly It also eliminated like things I wasn’t aware of, things I hadn’t thought about, and just an approach to get some, like, clarity.

\n\n\n\n

Kelly Gallagher (00:25:12) – Flirty, some big one. And I think that goes into the third bucket of communication skills. Just people sometimes come to me and in her struggle or there’s conflict or they’re going into a big sales promotion and they’re not quite sure how to go about it.

\n\n\n\n

Kelly Gallagher (00:25:29) – So that would all fall into the bucket of communication skills. And that that’s a big one. I don’t think oftentimes people think they’re coming across one way, but it’s quite different if you’re observing them. The other thing is. They, you know, like you said, you’ll rehearse. And rehearse. But when you get in that situation sometimes. Hopefully you’re primed with enough rehearsal to lean back. If you forget what you’re going to say, you can lean back into the gist of it. So I think for performance, though, it comes down to communication skills and confidence, because in selling some time it’s not what you said anyway, it’s how you said it. And you can walk in if you say it with conviction and you have that internal clarity, as you mentioned, and conviction. The little wordsmithing and nuances of it aren’t going to matter. They’re going to matter. But the big the capital A to achievement or performance is how you set it.

\n\n\n\n

Cory Miller (00:26:36) – Well, I didn’t say this in the beginning, but we we now meet twice a week and we’ve I think we’ve met twice a week for the last year or two.

\n\n\n\n

Cory Miller (00:26:44) – And that was out of, oh, I need these times. We’re kind of booking them at the front of the week and the end of the week. But oftentimes I realize so many times it’s just seeking clarity for myself and those of us who are leaders out there trying to give a clear vision to somebody else, I’ll just say it. Maybe other leaders just wake up with clairvoyant vision. I don’t. I need rehearsal. I need work. I need to bounce it off people. I need a coach to help me kind of ask questions, think, think it through. And every single time I’m better. I remember some of the biggest ones that I’ve, like, talked to you. And it’s not even one session, maybe 2 or 3. They end up talking about it. But I go, Gosh, if I hadn’t had that, I would have made so many mistakes going into that big decision or time of presentation, whatever that was. And I’m so better for like I just need to practice and realize I couldn’t just do that.

\n\n\n\n

Cory Miller (00:27:40) – I needed someone else to help me. And that’s where you’ve come in and done that. And so clarity for me is like when you say, what? When people would ask me, What’s the biggest takeaway for coaching? I go clarity and what is clarity? Build what you said confidence. And those two alone have made me a better leader. That’s why I can say, let’s just go back to the start of my career. If I’d had a coach, it started my career. Everything would have been better because I’ve been more clear, more confident.

\n\n\n\n

Kelly Gallagher (00:28:03) – Being a millionaire ten times over just had a coach because I did so many stupid things along with the good things. That you don’t know, but you do learn from failure. You do learn. Oh, and so, you know, maybe not, but I sure would have liked to have a coach. It is a perk for high performers. If if if you if it’s a if there’s an employer listening in and they’re thinking of who does that need coaching? Yes, it can be remedial, but sometimes then it’s not the employees idea.

\n\n\n\n

Kelly Gallagher (00:28:34) – The high performance will progress the fastest because it generally will be their idea. They want that perk and they want to grow a career.

\n\n\n\n

Cory Miller (00:28:44) – This is my personal opinion, not Kelly. So I want to be clear about that. But I’ve been around organizations that use coaching as remedial, and I go, Then what happens is coaching gets stigmatized within that organization of if you’re not performing and you’re doing a crappy job, you’re going to get sent. And it has a negative tint to coaching, which is not what it’s supposed to be. It’s supposed to be progressing positive, helping improving, navigating situations. And this one organization in particular, it’s like that’s how they use coaching. I go, Oh man, Like, then they then all these high performers have this worry about it and don’t want to potentially go into coaching and miss this incredible benefit to what coaching is.

\n\n\n\n

Kelly Gallagher (00:29:31) – That’s so true. There’s someone at my door. Can I. Can we pause?

\n\n\n\n

Cory Miller (00:29:36) – Yeah.

\n\n\n\n

Kelly Gallagher (00:29:45) – Yeah, we’re talking about, like, high performers and performance coaching. And I do want to make the point that that’s kind of what I think is my differentiator is that I have all that coaching training, but also I’ve been in the business world for 30 years selling. So if someone asked me about that, it’s easy for me to switch out. Yeah, most coaches have like a background, so they’ve never really had to go out into the world and perform, right?

\n\n\n\n

Cory Miller (00:30:17) – Yeah. You bring both sides to that coin I think is incredibly helpful. Like I’ve talked so much with you about cells because it’s a weak area. I feel like it’s a weak area for me, but something I’ve had to do but forced to do and now trying to begrudgingly trying to do it. But I know you’ve got such an extensive sales background, business development background that totally leveraged that. In fact I think that’s how our two times a week started was a sales academy where it wasn’t necessarily coaching, it was more like sales coaching.

\n\n\n\n

Kelly Gallagher (00:30:47) – Right. And it’s very hard for someone to coach you if they haven’t walked down the street, guide you down the path. If I’ve never been on it, I can coach and I can move you in many ways, but can’t exactly help you to perform because I don’t know how to perform. So I think that is the differentiator in my coaching style as I’ve been there. I’ve been in sales meetings where I got humiliated. I’ve had clients slam doors in my face. You know, I’ve executed $1 million contract. So. I just think it helps me to bring more to the party.

\n\n\n\n

Cory Miller (00:31:25) – Yeah. And you understand the complete picture. That’s why, you know, our community is a lot of founders and a lot of high achiever leaders. You know, I’m curious your thoughts about entrepreneurship, entrepreneurs and coaching. You know, I don’t know your risk, your client base, but I am one. I know I’ve benefited from incredibly navigating change, big decisions and the performance side. But what do you say to entrepreneurs about coaching?

\n\n\n\n

Kelly Gallagher (00:31:58) – I’d say it’s essential because of everything we’ve talked about in the end.

\n\n\n\n

Kelly Gallagher (00:32:04) – As an entrepreneur, you’re alone, right? That’s what it is. That’s the gig. You might have a few people on your team, but generally you’re alone. It’s very hard to win deals in isolation. So I would say having a business coach is key to moving forward. Not only in all the things we mentioned, the clarity, the communication, the conflict, the struggle, but then sometimes you just have to go execute. And so for me, it’s very helpful because I’ve been in that sales situation so many times and understand features, benefits. I understand how to extrapolate from a client what’s going to really matter and what’s not. And I can help people with their slide deck or, you know, whatever it is they want to. So I will generally I can come in in that regard like we do and be a consultant on Friday, but a coach on Mondays. And then and most of my clients who are entrepreneurs use me in that way. Like they will sometimes just bring us like back or we’ll practice a presentation or they’ll practice what they’re going to say to their team before they say it.

\n\n\n\n

Cory Miller (00:33:18) – Yep.

\n\n\n\n

Kelly Gallagher (00:33:18) – Get some clarity around it to understand. How they’re feeling in that moment of saying these wonderful things they think are are going to move the team. And sometimes they come out of the meeting and they’re going to say something completely different. Once we do the coaching, it’s not that I ever told them to say anything different, but we, you know, polished it. Let’s say, you know, they come out with this big chunk of coal and they leave and they’ve got a little diamond and it’s polished. And like you said earlier, they feel confident.

\n\n\n\n

Cory Miller (00:33:50) – Maybe there’s some entrepreneurs that that come fully birthed into the whole process, but most of us have to learn it and grow through it. What I’m hearing, though, you know, big decisions, big challenges, big changes, and then the performance side preparation, Polish getting ready for those big things, too. And then the simply put, just trying to make the most of the opportunity. That’s what I think about. Like so many high achievers that go with an entrepreneur’s, like we have an opportunity.

\n\n\n\n

Cory Miller (00:34:24) – We often like my my story is I stumbled into it, stumbled into it and go, wow, I have this amazing opportunity. So much with business. You go like, it’s right timing, it’s right place, right people, right, partners, all the things that have to go together for something to go really well. And then you go, I want to make the most of that. And that’s my reflection, is that I had an opportunity. I wanted to seize that opportunity to make the most of it. Now, seeing, Oh, wow. Now I did have a coach during about half of my business time, invaluable to help us with the organization. But I go like having someone that this is why we keep working together as I go. I just need it. It’s just a part of making the most of who I am and my opportunities that come my way to to do even more. And it’s not necessarily just about money, but it’s about making the most of the opportunity.

\n\n\n\n

Kelly Gallagher (00:35:18) – Right.

\n\n\n\n

Kelly Gallagher (00:35:19) – And Joy, while you’re doing you we haven’t even touched about that. But there’s that personal happiness factor and a lot of my clients either are working out or I have them. I try to persuade them to start a fitness program while they’re with me. But that joy, that love of what you’re doing, you know, if it’s not there, it’s very hard to perform on your.

\n\n\n\n

Cory Miller (00:35:43) – Yeah. And you’ve been such a good coach and you walk that talk. Kelly was telling me before we started the recording that she just ran a mile and swam, and I was like, Gosh, you overachiever. But it’s such a good inspiration for me for sure, because that other aspect of just life and business and everything is just being physically healthy. And you are a great encourager and you walk your talk.

\n\n\n\n

Kelly Gallagher (00:36:07) – I try. I try. I try. I mean, no one’s perfect. But yeah, I definitely try. And I also find because I work out a lot and I’m more effective for people because, you know, it brings all that blood flow to the brain.

\n\n\n\n

Kelly Gallagher (00:36:20) – So I shared with Cory that sometimes in between clients I’ll just run up the hill outside my house 4 or 5 times just to sharpen myself for the next person because I can feel it within myself. Then I come in their house and I’m all happy again and I’m feeling creative and supercharged and ready to go.

\n\n\n\n

Cory Miller (00:36:41) – Oh yeah. You can tell what the energy you have for sure. Well, Kelly, thanks so much for taking the time to talk to us about what you’re doing. Share a little bit of the experience. I mean, they resonate with me. Everything you’ve talked about are things that we’ve worked on in our coaching sessions, and I’ve been better for it as a person on Earth, as a human, on earth, as a business entrepreneur, leader, all those. But anything else that you want to share that we didn’t get to talk about?

\n\n\n\n

Kelly Gallagher (00:37:09) – No, I mean, what you just said, that’s what I live for. That’s my passion is did I, you know, did I help someone? Did they feel better after we, you know, did we move the bar? And I just live for success stories.

\n\n\n\n

Kelly Gallagher (00:37:23) – And I find it so much more rewarding than just pure sales. Although I would have argued back then that I was making people’s lives better because I had a terrific product or whatever, but somehow that what you just said, just seeing personal growth in other people, I just kind of live for that. So thank you.

\n\n\n\n

Cory Miller (00:37:43) – Bet. Well, thanks, Keller, for being on. And thanks, everybody, for listening. We’ll share in the show notes how you can get a hold of Kelly if you’re interested in talking more with her. She’s fantastic. Coach, you can’t. I’ve referred you numerous times to people that now I believe are our regular clients with you. And we they’re defensive minded and we always talk like, yep, I just had my Kelly session, just had my Kelly Sessions, so.

\n\n\n\n

Kelly Gallagher (00:38:08) – Well, thank you for doing that. Yes. I don’t really advertise. I haven’t ever. I only did maybe in the first year. But I think that’s the other thing. Good coaches just kind of get referrals and.

\n\n\n\n

Kelly Gallagher (00:38:21) – That’s the way it should be.

\n\n\n\n

Cory Miller (00:38:23) – You do. All right. Thanks, everybody, for listening to Post Status Draft. It’s been another episode kind of went out of our league but love to introduce people that have made an indelible difference in my life and to share their wisdom. So we’ll see everybody next time. Thank you.

\n

This article was published at Post Status — the community for WordPress professionals.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 03 Aug 2023 20:51:43 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:11:\"Cory Miller\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:15;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:63:\"Do The Woo Community: Scaling and Performance with Justin Mazzi\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"https://dothewoo.io/?p=75777\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:62:\"https://dothewoo.io/scaling-and-performance-with-justin-mazzi/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:392:\"

Zach and Carl are joined by Justin Mazzi from A2 Hosting to chat about all things hosting, performance and more.

\n

>> The post Scaling and Performance with Justin Mazzi appeared first on Do the Woo - a WooCommerce Builder Community .

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 03 Aug 2023 10:43:46 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"BobWP\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:16;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:105:\"WPTavern: BuddyPress 12.0 to Introduce Community Visibility Feature that Restricts Access to Members Only\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=147320\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:116:\"https://wptavern.com/buddypress-12-0-to-introduce-community-visibility-feature-that-restricts-access-to-members-only\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:2165:\"

BuddyPress 12.0 is set to introduce a new Community Visibility feature that gives site administrators the option to restrict access to the community sections of the site. Sites set to “members only” will show an access error message and a login form when a non-logged-in user tries to view a page generated by BuddyPress.

\n\n\n\n\n\n\n\n

The Community Visibility setting makes it possible to create a private community site without adding any plugins to BuddyPress, a feature that has frequently been requested by BuddyPress site admins. It is being introduced as a basic toggle but BuddyPress contributor David Cavins, who worked on the feature, said it lays the groundwork for future, more granular privacy controls.

\n\n\n\n

The BuddyPress core development team has also published the BP Classic plugin ahead of the 12.0 release. The plugin provides backwards compatibility for sites using plugins or themes that are not ready for the BP Rewrite API that will be introduced in 12.0. It includes features and templates that are fully deprecated:

\n\n\n\n
    \n
  • The BP Legacy widgets (these were migrated as Blocks in BuddyPress 9.0.0).
  • \n\n\n\n
  • The BP Default theme.
  • \n\n\n\n
  • The BP Legacy navigation globals (buddypress()->bp_nav & buddypress()->bp_options_nav).
  • \n
\n\n\n\n

An advisory about BP Classic was posted to the official BuddyPress blog to help site owners figure out if they will need this plugin. Those who require it before upgrading can install it ahead of time and it will be dormant until it is needed.

\n\n\n\n

The new Community Visibility feature was committed to trunk five days ago and is on track to be included in the next major release. BuddyPress 12.0 is anticipated to be released on October 30, 2023, and Beta 1 is overdue and expected any day.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 02 Aug 2023 21:02:10 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:17;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:99:\"WPTavern: WordPress.com Makes a Bid for Google Domains Customers, Offering 1 Million Free Transfers\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=147374\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:109:\"https://wptavern.com/wordpress-com-makes-a-bid-for-google-domains-customers-offering-1-million-free-transfers\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:5370:\"

WordPress.com is making a strong bid for Google Domains customers after the the product was sold to Squarespace in a deal reportedly worthy $180 million. Shortly after the sale was announced, WordPress.com pitched Google Domains customers, reminding the public that the company is also a domain registrar, but the call to action didn’t include much incentive to switch.

\n\n\n\n

This week WordPress.com is putting the heat on with a new offer to pay transfer fees and an additional year of registration for the first million domains moved from Google Domains. WordPress.com is also guaranteeing Google Domains customers the same pricing or lower for 400+ top-level domains.

\n\n\n\n

“This will also apply to existing WordPress.com customers across most domains, meaning that in many cases we’re lowering your prices.” Automattic CEO Matt Mullenweg said in the announcement this week.

\n\n\n\n

“This isn’t a temporary thing. We’re committed to keeping domain prices low, and will only raise them if our wholesale costs go up (we’ll run our domains business like Costco).”

\n\n\n\n

Squarespace has committed to honor the renewal prices previously set by Google Domains existing customers for 12 months but will set its own prices after this time.

\n\n\n\n

In an interview with The Verge, Squarespace CEO Anthony Casalena said his company is already using a lot of the same infrastructure Google is using in their Cloud DNS product, having resold Google Workspace for almost a decade. Squarespace currently employs 1,750 people with revenue under a billion dollars this year. Acquiring Google Domains gives the company the opportunity to cross-sell website packages to its incoming domain customers. There are approximately 10 million domains up for grabs in the transfer of customers.

\n\n\n\n

Casalena said that being a reseller of Google Workspace was a major factor in Google’s decision to offer the domains to Squarespace, in addition to having the infrastructure to manage the business. This partially explains what was an otherwise bewildering deal that came as a surprise to the industry:

\n\n\n\n
\n

First off — once in a lifetime opportunity for us. Incredibly grateful that we were selected as the stewards of that business. We weren’t asking them, like, ‘Hey, planning on shutting down domains or anything?’ It wasn’t exactly outbound. I think they made the decision that it’s not a business that they were going to be in. And they contacted a couple of legitimate parties who could potentially even take on a business of that size because, again, it’s not the code or the employees are moving — it’s basically the domains themselves and the hosting services and the registrations, that sort of thing. So that really narrows it down to the number of companies that could even support that.

\n\n\n\n

Then the other thing that was a big factor is we’ve been a huge fan and big reseller of Google Workspace for nearly a decade now, which was very important to them, and we’re incredibly sophisticated in selling Domains, selling Google Workspace, servicing it, and managing that for millions of people. So we were able to find a transaction that worked for us. 

\n
\n\n\n\n

Automattic CEO Matt Mullenweg reacted to the deal on Twitter this week, saying that he was disappointed Google didn’t make it a more competitive process.

\n\n\n\n

“This might cost a ton of money but I was bummed we didn’t even get a crack at this, my guess is Cloudflare, Godaddy, and Bluehost didn’t either—why Google didn’t make this a competitive process?” Mulleweng said. “Concerning to have so many domains going to a proprietary CMS.”

\n\n\n\n

WordPress.com has been slowly inching towards becoming a one-stop shop for users’ website needs. The company recently made its monetization features available for free, making the platform more attractive to creators who are just starting out online. Based on the reaction to Mullenweg’s tweet, it seems many people are still not aware that they can buy their domains from a registrar and host their websites elsewhere. If you are just hearing about WordPress.com’s domains, it’s natural to think they are only for WordPress sites, so the company has some work to do in making prospective customers aware.

\n\n\n\n

Users can be hesitant to move to a new registrar when they don’t fully understand the process and don’t want to negatively impact their online presence. In the case of Google Domains customers, they are moving to a new registrar after the sale closes later this year, whether they like it or not. WordPress.com’s deal is a compelling offer if they can better position their domains as an independent service.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 02 Aug 2023 17:11:49 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:18;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:62:\"Gutenberg Times: Live Q & A: Design Systems and theme.json\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://gutenbergtimes.com/?p=25092\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:66:\"https://gutenbergtimes.com/live-q-a-design-systems-and-theme-json/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:62095:\"

One of the key challenges of running a site or series of sites at scale is ensuring design consistency and compliance with a design system. During this show, David Bowman, principal designer and Alec Geatches, JavaScript Developer, both at WordPress VIP will demonstrate the process to export the design system tokens from Figma and import to WordPress. Joni Halabi, Georgetown University, shared how her team at the university works within a different design system. The Panel also discussed WordPress as an enterprise-ready software and Gutenberg being a design system in the making. The show was hosted by Birgit Pauli-Haack, curator of the Gutenberg Times.

\n\n\n\n
\n
\n
\n\n\n\n

Shared Resources:

\n\n\n\n\n\n\n\n

Also:

\n\n\n\n\n\n\n\n\n\n\n\n

Transcript

\n\n\n\n

Birgit Pauli-Haack: Welcome, welcome to the 35th Gutenberg Times Live Q and A. Sorry. My name is Birgit Pauli-Haack, and I’m your host tonight, or this morning, depending on where you are. Thank you all for watching. It’s great to have you all. And today’s show, we will discuss how companies and institutions can organize the WordPress sites around established design systems in general. And then how to do this with Figma and WordPress theme.json. The folks of WordPress VIP team build a plugin for the workflow and we will see a demo of it. And later we’ll also hear how Georgetown University works with the design system. And then we’ll answer all your questions as well as mine. It’s the little privilege that I have.

\n\n\n\n

So I’m thrilled to have these three experts on the show for you. It’s David Bowman, principal designer at WordPress VIP, and then we have Joni Halabi, senior developer at Georgetown University, and Alec Geatches, also JavaScript developer at WordPress VIP.

\n\n\n\n

Alec Geatches: Hi.

\n\n\n\n

Birgit Pauli-Haack: Hi, everybody. Glad you joined me here on this little show. We do proper introduction of course, in a minute. I have just a few housekeeping notes. The questions for those who are watching on YouTube, on the right hand side, you have a chat window, that’s where you can put your questions and also your comments. And then here on Zoom, we have the Q and A bubble on the bottom and the chat bubble to share your thoughts and questions. And please, please be kind, even if you disagree. This is a family friendly endeavor. And with that out of the way… I need to group… Yeah, so we’ll get into introductions. I have two questions for each of you. From where are you calling in today and what is your day job like? So David, do you want to start and then Alec and then Joni?

\n\n\n\n

Introductions

\n\n\n\n

David Bowman: Sure. I’m calling in from northern Utah where I work from home here. And my day job, I’m a principal designer at WordPress VIP. That’s my background. I’m a graphic designer by trade, but have gotten into product design and web development via WordPress over the years. And now I work at WordPress VIP, focusing mostly on design systems and on how we can increase enterprises and big organizations to adopt Gutenberg and block theming, which I’m super stoked about.

\n\n\n\n

Birgit Pauli-Haack: Yeah.

\n\n\n\n

David Bowman: And I’ll pass… Should I pass to someone? I’ll pass to Joni.

\n\n\n\n

Birgit Pauli-Haack: Yeah.

\n\n\n\n

Joni Halabi: Oh, thanks. Hi everybody, my name is Joni Halabi. I’m calling in from the United States in the DC metro area. My day job, I am a senior web developer at Georgetown University, mostly working on WordPress customizations. And my specialty is custom block creation, so that is probably 80% of what I do.

\n\n\n\n

Birgit Pauli-Haack: Mm-hmm. Excellent. And it’s up to you, Alec.

\n\n\n\n

Alec Geatches: Hi, I’m Alec. I’m calling in from the States as well. I’m in Colorado. I work at WordPress VIP along with David, and I’m a developer. I’ve been a web developer for 10-plus years. Right now I’m working on a team that’s been focused on making the Gutenberg editor work better for enterprising companies. So that’s some of the stuff we’re talking about today, like design systems, how to integrate those with WordPress, editor curation, locking down the editor, things like that. And my team’s also done some work with decoupled slash headless WordPress as well.

\n\n\n\n

Birgit Pauli-Haack: Awesome. Awesome. So cutting edge right there. Joni, and you also published on the developer blog about the difference between static blocks and dynamic blocks. And I think that was very helpful to a lot of developers who started out with Gutenberg development. Thank you so much for doing that.

\n\n\n\n

Joni Halabi: Thank you.

\n\n\n\n

Birgit Pauli-Haack: And Dynamic Blocks will get a little bit more promotion with the interactivity API, but that’s a different show. But that’s coming with 6.4, not 6.3, 6.4. So let’s get into the show. 

\n\n\n\n

Finding and Working with Design Systems

\n\n\n\n

For someone who’s a little bit not so in these big systems, what are design systems and how would you connect them? How do you find them and how do you work with them?

\n\n\n\n

Alec Geatches: David was the first one to explain this to me, so I would defer to David.

\n\n\n\n

David Bowman: I’ll try to be brief. I have a tendency to ramble and get lost in my thoughts when I’m talking about design systems, but the textbook definition that I give everybody is that a design system, the purpose of it, is in a classical sense to speed application development. So it makes it easier for designers and developers to work together to build some software application. And there are three parts to it. There’s code, there’s code. So it’s usually a set of reusable components and styles and things. Usually lives in a package that developers pull into their project. There is a UI kit. In our case at WordPress VIP, that’s a big Figma library, a bunch of Figma files with components and styles and things that mirrors what exists in code. And then there’s documentation to explain how everything works together. Because it’s inherently complex, a lot of it needs explaining. We do our best to just make it all smooth and seamless, but at the end of the day, a lot of stuff needs to be explained, so there’s always a documentation component.

\n\n\n\n

Those are the three bits. Classically meant for just speeding application development. I think what we’ll talk about today, and why I’m so excited about Gutenberg is that I think that Gutenberg adds content creators and page builders into the design system equation. So when you’re building a WordPress theme, you’re not really building a website. If you’re building a block theme, you’re building a tool that someone else is going to use to actually build the website. And so you have to include the content creator in the design system club, which I think Gutenberg blocks do pretty effectively. But yeah, that’s, I guess, how WordPress makes it a little different. That’s my answer. If you ask anyone, everyone has different opinions, but that’s mine.

\n\n\n\n

Birgit Pauli-Haack: Yeah. Alec, Joni, do you have a different opinion? Do you want to add something to it?

\n\n\n\n

Joni Halabi: Yeah, so at Georgetown, we’re building our own system of websites. We support just about 400 websites on our WordPress systems, and they fall under one of two different themes. But we built this design system… It’s a homegrown system that is inspired by atomic design, but we’re not using those atomic terms. So we came up with our own terms. So we have foundational elements, and then we have those come together to make blocks and those will come together to make page templates and so on and so on. And one of our goals at Georgetown is to really lock down our design system to be super, super hyper specific to the university because we have some very strict visual identity guidelines. We strive to adhere to WCAG 2.1, AA standards for accessibility. And we have a whole host of just interactivity opinions that we want to at least try to enforce across all of our websites.

\n\n\n\n

So what we do on my team, I’m part of the web services team there, we are creating this system that’s going to be used by individuals across the university who are in charge of their own websites. And some of these people, they are pretty well versed in web technologies and some of them, they have day jobs, and this is something that they do on the side. And it’s part of that infamous, other duties as prescribed, sentence that we all see in our job descriptions. So we might have somebody working on their website for their office, and they don’t know HTML, so we’re trying to make things as easy as possible with our design systems.

\n\n\n\n

Figma and Theme.json

\n\n\n\n

Birgit Pauli-Haack: Yeah. But what you did on WordPress VIP was also to… You said the word Figma, which is a design system by itself where you can build them, and then you bridged it to… Because WordPress block themes have this theme.json, which is pretty much a machine readable code of design styles and settings pretty much. And how to get it from the Figma into a block theme or theme.json, so you can spin up new sites. Is that how I explained that right?

\n\n\n\n

David Bowman: Pretty much, yeah. I think the way that, and I have a demo that I’ll show of exactly how this works, but the way that our design system workflow works, I think we’re similar to how you guys run, Joni, but at a much smaller scale, because we’re a company, but we only maintain really two marketing sites right now, some documentation sites, so it’s a much smaller footprint. But we know that there are organizations like Georgetown and like every other enterprise company out there that runs a significant web presence where they’ve got just a ton of stuff. There’s all sorts, and it’s all different. Everyone has their own special needs. And at the end of the day, something you said, Joni, that really struck me, was that at the end of the day, the people that are actually pulling the levers on the website might as well be bloggers.

\n\n\n\n

They’re not some developer. A lot of times they’re doing it and they don’t want to, because they don’t have a lot of time, and they just want it to be easy. And that’s actually why I think WordPress is most viable as an enterprise product. I think WordPress is perfect for this, because it’s designed for bloggers, it’s designed to be easy, and at the end of the day, everyone at work, that’s what they are. They’re not all a bunch of fancy web experts. And Gutenberg really provides a way for us to deliver that design system to them in a way that they can actually make use of it. And I guess the way that we do that, our flow is that our designers make stuff in Figma. We are designing our blocks, we’re designing our page layouts, we design, pick our colors, design all sorts of things.

\n\n\n\n

And then a large portion of that gets exported from Figma as something called design tokens, which is a fancy term in the design system world, and it’s a variable. You can basically think of it as a variable. If you want to be philosophical about it, it’s a design decision represented in a little piece of code, and it’s something like, “My brand color is red.” That’s how you would say it in words. And a bunch of those get exported from Figma to a code base in GitHub where we store our design system. And then that gets further exported from the design system down into theme.json in our WordPress applications. And the introduction of theme.json, is like, I can’t overstate how revolutionary that was for WordPress applications.

\n\n\n\n

I say all the time that Gutenberg is a design system, and it hasn’t realized it yet. It’s in its teenage years, it’s still coming of age and finding itself, and give it another five years and it’s going to realize what it is, it’s design system. And that theme.json file is the config for your design system and gives you a landing place for all of those design decisions that you’ve made. And because it’s all nice in code in a nice little json file, you can automate all that.

\n\n\n\n

And that’s my litmus test for whether something is a, quote, real design system or not, is that if at any point of the step from designer thinks of something, developer builds it, content creator uses it, anywhere along that chain, if you have to rely on a human API to make sure something works, like if someone has to copy paste something or refer to a style guide or copy stuff out of an inspect mode and Figma, then it’s not a real design system. If you want to be real hard-nosed about it. But the goal is all the robots do the work for you, but theme.json lets you do that.

\n\n\n\n

Joni Halabi: Yeah. If I can interject. To piggyback off of that. Theme.json was such a game changer for us, because… I alluded to this before, we really want to lock down our designs and out of the box WordPress, it gives you so many options in terms of color palettes and typography settings. I personally love that for a one-off site that is not affiliated with Georgetown. If I were to go and build a site, having that many options is great. Within the Georgetown universe, we don’t want that. We don’t want that. So being able to say, “I want to turn off custom palettes. I want to restrict the palettes to just our approved colors. I don’t want people to mess with the typography settings.” You get two choices for sizes. It has been absolutely wonderful. As soon as we saw that come into Core, we added it to our theme, and it was love, just love.

\n\n\n\n

Theme.json or Classic Theme

\n\n\n\n

Birgit Pauli-Haack: Are you using theme.json on a classic theme, or are you moving into block themes as well? So gradually?

\n\n\n\n

Joni Halabi: So we’re currently using it on a classic theme, and this is a much longer story and probably a different talk. I did an experiment to see how easy it was to convert that classic theme into a block theme and also incorporate our design system, which uses external twig templates into that block theme. And it was an amazing experiment and a very complicated experiment, and I just spoke about that at a conference last week. So if anybody’s interested, you can follow me. I’m sure the video will be up in a month or so.

\n\n\n\n

David Bowman: Oh, I want to watch that video. Absolutely. I want to watch that video.

\n\n\n\n

Joni Halabi: Yeah.

\n\n\n\n

David Bowman: It’s a real journey whenever someone embarks on that task. That’s a real quest.

\n\n\n\n

Birgit Pauli-Haack: Yeah. I will do a switch from my site from a classic theme to a block thing I haven’t migrated yet. Although I’m talking with people about block themes since 2020, the first time about it, but I still haven’t done the switch yet. But talking about videos, I think, David, you have a demo for us, and I think that’s now a good place to play that and to talk about it afterwards.

\n\n\n\n

Website Demo

\n\n\n\n

David Bowman: Awesome. I will play this demo and… Yeah, it’s a… Oh, hang on, I got to share my sound. Can’t forget that one. Yeah, let’s play. It’s pretty casual demo, but it gives you a little taste of how we’re using this stuff on our websites with our WordPress theme and how we use blocks. Let’s start from the beginning. Here we go.

\n\n\n\n

Hi, I wanted to give a quick demo to show you how we integrate Figma with our WordPress theme and how we use blocks as an extension of our design system. So here we are in Figma, and the foundation of our design system is our design tokens. And these mainly manifest in Figma as color and type styles, but we use a lot of other tokens in production for things like spacing, border radius. You use design tokens for all sorts of things. They have a lot of uses.

\n\n\n\n

So using a common token structure between our applications is a big part of how our design system works smoothly and has good interoperability. And this here, what we’re looking at is the file that manages all the color and type styles that we use across our designs. And to link all these things up to our tokens and ultimately to our WordPress theme, our tokens live in GitHub, we use this plugin here called Token Studio. And this is a community created plugin, and it provides two main things for us. It gives us a way to push design changes from Figma here to GitHub, and it also gives us a way to manage design tokens that Figma doesn’t support right now. And it lets us do that within our design tool where we’re working on these things, and that makes the code a lot more accessible to designers.

\n\n\n\n

So to demonstrate how all of this works, I’m going to show you how we can swap themes, and then I’ll show you what that looks like on the front end of an application and then what that looks like in the block editor. So we use themes and there’s a lot to this plugin. There’s videos, there’s documentation, there’s a lot going on here. There’s a lot going on here, but right now, this is the file that manages the styles for wpvip.com, and I’m going to go ahead and swap it for the token set for our other application Parse.ly, which you can see you swap it and it swaps out all the colors. So colors is the easiest place to see this change happening.

\n\n\n\n

So there you go. So we’ve effectively swapped everything for a different set of tokens. So if we were to publish this library, it would update all of our designs with new values. So you can see how that switching works. And likewise, if a designer were to make a change to one of these, say they want to make the background color something else, they could make that change here, and then go ahead and push it up to GitHub. And from there we go to our tool, to the Design Bridge tool to get the tokens from the standard format in which they’re stored out into our WordPress theme. So I will show you that next.

\n\n\n\n

So here we are. This is our design system repository that houses all of our tokens and then all the components of our design system for our React application, for our dashboard. So in terms of WordPress or WordPress applications, this just houses the tokens. Everything else in terms of components and things are the Gutenberg blocks. That’s all coming from WordPress Core, and then any custom block plugins that we’ve made. So what you’re looking at here, is this is how all of our design tokens are saved. So yeah, it’s a standard format. The W3C is working on a new web standard for design tokens, and this is what Token Studio outputs to GitHub. And you see that we’re able to alias between tokens. We have a core set that has all of our underlying color palettes and type scales and things, and we, from all those raw values, curate the values that are going to get used in our WordPress applications.

\n\n\n\n

So you can see here our body one short style are these attributes that then get applied as CSS in our WordPress application. So this is how they’re stored. And in order to get things from here into theme.json, where they can be applied to our blocks, into our global styles, we created a tool called the Design Bridge. So I’m going to go ahead and I’m going to run it. It doesn’t look like a whole lot, but I’ll show you what it does on the other side. So it runs in the command line right now. And we did that so that people can automate this, you can work it into an existing dev workflow to just make it more flexible. It could run as a GitHub action. You can do a lot to automate this process.

\n\n\n\n

But for right now, I’m going to do it manually. And all it does, is it takes two arguments. So it takes the token path, which is the path to where the tokens live, which is right here, what we’re looking at. And then it takes the path to the theme where it will look for a theme.json file, and then you pass it the value of a token theme. So these are things that Token Studio creates to tell it what token files to activate basically. And then you choose whether you want it to overwrite your existing theme.json file or not. And we’ll go ahead and hit enter. It will do its magic, and then it will tell you that it’s done. Say, “Hey, we did it.” So next we’ll pop over to pop to our WordPress application and see what that looks like.

\n\n\n\n

So here we are in our theme.json file, and what our tool does, is it outputs all of our design tokens as variables in the custom object in theme.json. So if you’ve done any amount of theme.json work and working with global styles, you’ll know there’s this little custom object that sits inside of the settings object in theme.json. And this is just a blank thing that you can put whatever you want in. And everything that you put in here will be exposed to CSS variables along with any global styles that you are adding. So this has just been reformatted and output here into theme.json. And the format’s very similar. It’s not exactly the standard format, but it is pretty close. But it does go ahead and output the design system, essentially.

\n\n\n\n

And so what this does is it exposes it in a predictable way in the DOM as CSS variables that are named according to the standard way that Gutenberg names all of its CSS variables. And that means that you can reference them in block development and you can point all of your blocks and all the work you’re doing to style your theme. You can point it at a constant set of variables that can be swapped out exactly the same way that we swapped out the styles and Figma, like I just showed you, you can do the same thing on a WordPress application.

\n\n\n\n

Yeah, so I’ll show you what that looks like now. All right. So here we are. This is Parse.ly. This is the website for our content analytics product at WordPress VIP. And this is one of the two web applications right now that we have running on our theme that is set up to integrate with our tool here. And as you can see, it looks all green and looks branded appropriately. And I’m going to go ahead and swap the tokens and you can see what happens when it does that. So I’m going to go ahead and run our sync and do it. And there you go. You can see what happens is it changes, you see font styles, you see colors changing. It’s not a huge change, because we haven’t designed it to be very divergent between the brands, but you do see the front end styles get swapped out and it works pretty well and makes it pretty easy to manage a multi-brand system of WordPress applications. And so next, let’s look at what this looks like in the block editor.

\n\n\n\n

Okay, so now we’re in a local dev site here, and this for me is really where the magic and the value of this really happens. So this is a sample page and we’ve got this set up with our styles. We’ve got this set up to be pulling from the global styles we’ve defined, all the block styles we’ve defined. You can see in here we’ve got our pallets defined for this particular brand, Parse.ly, and these are coming from theme.json. And so if we go ahead and run the same sync… I’m going to run the sync and then refresh the page here. You can see what happens if I swap the theme from Parse.ly back to WPVIP. And looks like that sink is done. I’m going to refresh. And you see everything changed. Everything goes gold. You get the brand colors from VIP. And this stuff is achievable with CSS. You can swap out CSS styles, you can point at a different style sheet.

\n\n\n\n

But I think what makes the integration in theme.json super valuable is that you get all of your block options are updated as well, because all of these are also coming from theme.json. So not only are you getting front end style updates, but you’re getting updates in interactivity in the backend, which is great. That’s really what you want to be able to make a good user experience and to be able to manage multiple user experiences and have it all get integrated easily with your design tooling. So yeah, there you go. That’s the high level, a lot of detail to talk about, but this is the quick rundown of what the tool can do.

\n\n\n\n

Birgit Pauli-Haack: Excellent. Excellent.

\n\n\n\n

David Bowman: There you go.

\n\n\n\n

Birgit Pauli-Haack: Well, thank you so much for the demo. It’s kind of whose head is spinning, but I really love that flow from the designers work here, and then you can just write some script or run some scripts and then you have it all in the theme already. Does it also work backwards, or is it only one direction?

\n\n\n\n

Bidirectional

\n\n\n\n

David Bowman: It’s bidirectional. What it does is it sets up… Our GitHub repo, our design system repo is the actual source of truth. And so that means that a developer can use an IDE to edit that code file and save it. Or a designer can use Figma to edit that same file and save it and its version controlled with Git and they can both pull down each other’s changes and it brings designers into an actual dev workflow on a design system. At least for the tokens. Just for the tokens.

\n\n\n\n

Birgit Pauli-Haack: Just for the tokens, yeah. We don’t have any questions from the audience right now, but Joni, do you have any questions? Or David and Alec?

\n\n\n\n

Joni Halabi: I don’t know where to start. 

\n\n\n\n

Birgit Pauli-Haack: Are you muted or… No.

\n\n\n\n

Opinions using WordPress

\n\n\n\n

Joni Halabi: I was at a loss for words. It was a very cool demo. I’m very excited by that switch where both the front end and the block options change, because that’s something that could… So at Georgetown we have two different themes and they look pretty different. They’re similar in terms of colors, but not exactly the same, slightly different fonts, slightly different colors. And to be able to have the ability to switch between the two… Because we have a lot of sites who are wanting one theme over the other.

\n\n\n\n

Birgit Pauli-Haack: Yeah.

\n\n\n\n

David Bowman: I mean I have questions for you. I am extremely curious about… Because like I said, everyone does this their own way. Every organization that I know that has a design system… I think there’s a reason that every big company out there has made their own. Google made one, Amazon made one, Salesforce. They all make their own because they all do it differently. And so I guess, is WordPress your primary user facing surface that you’re maintaining or do you have other stuff? Do you have React applications or is it pretty much just WordPress sites?

\n\n\n\n

Joni Halabi: For our team, it’s pretty much just WordPress sites. The history of our team, we’ve actually worked with a number of CMSs. I think this might be our fourth or fifth overall, but WordPress is our primary UI just because it’s a very easy UI, especially for those content editors who don’t have a ton of experience, it’s easy for them to pick up. And I feel like it’s gotten easier. I’m hoping it’s gotten easier since the classic editor. But yeah, I mean in the future, one of the big reasons why we created our own design system, we call it our pattern library, and the reason why that pattern library is external is in the future, if we do have some external application that we want to hook into or we have a piece of software like an LMS or something that will let us customize the front end, we can say, “Hey, you can go grab this twig file and there’s your custom header, or here’s your custom footer, or here is the color palette that we want this to use.”

\n\n\n\n

We wanted something that was a little bit more universal and not necessarily in WordPress. So we built this pattern library. Actually my colleague was the one who really architected the entire thing. It’s built-in kss-node and it’s really slick. We can take those styles and take those twig files and import them into our WordPress build, but we also have a front end interface for this pattern library that includes documentation and different variations on patterns and such so that somebody who just wants to see all of these different foundational elements or what a block looks like, they can do that with a front end that isn’t necessarily associated with our WordPress installation.

\n\n\n\n

David Bowman: That’s super interesting, because it sounds like you guys are doing the part of the integration that has terrified me up until now. I think design tokens are… Well, not easy, but it’s easier. They’re just little variables. They’re little bits of data that you can pass back and forth, and it’s a mapping exercise to get it to go to the right place. But when it comes to actually having… Like if you look at another design system, there’s their tokens, and then they have their components and all of those components, when we started working on design system integration stuff, I went under the assumption that the WordPress Core blocks are your component library. That if you’re integrating with WordPress, you get a component library and you should think of it as another framework that you support.

\n\n\n\n

So Google material supports React and View, and if your design system supports library A also supports Gutenberg. And Gutenberg is very opinionated about what blocks it has and how you use them. And so I took all that for just for granted. I was like, “Cool, we’re going to assume core blocks and go from there and then build some custom stuff.” But it sounds like you’ve gotten much further than that. You have this whole… You got a whole thing run in to put all the core blocks together. Are you using Core blocks? What are you… I guess, tell me more about this.

\n\n\n\n

Using Core Blocks

\n\n\n\n

Joni Halabi: Yeah, so that, that’s actually the core part of my job. So we are using Core blocks because it was very important for us to be able to maintain that basic, basic blocks, so header list, paragraph image, things like that. But we’ve also taken away access of some of the blocks that we don’t necessarily want our content editors using. So a lot of the full site editing focused blocks, so like page title query. I’ve said this before, we like lock things down. So we’ve locked those down. And to replace those blocks, we’ve actually created a number of custom blocks.

\n\n\n\n

So our custom blocks will give our content editors the ability to grab posts by category, which, yes, there’s a core block for that, but we also really, really wanted control over the markup for that scenario. We have a bunch of blocks that will allow you to have an image and text next to each other or video and text next to each other. And again, for us, it’s a control issue. We really want control over that markup. So all of the blocks that I’ve written to be custom for installation, they are dynamic blocks. And the beauty of the dynamic block is it makes it really, really easy to hook those dynamic blocks. We just take the render function in PHP, we hook that via timber to our twig files from the external pattern library. So we have one block we call premo with image.

\n\n\n\n

So it’s an image next to some text and maybe a call to action link. And what I’m doing in that render function is I’m just taking all of that information, the image object information, the text, the link, and I’m sending it as an array, just an array of parameters to my twig file in the pattern library. And the pattern library does the rest on the front end. So it means if we ever want to switch out the front end, if we discover, “Hey, we have an accessibility bug. Our CTA link isn’t really accessible, we need to change the Aria label on it, or we need to change the color contrast on this button,” we can do that within the pattern library. And WordPress is unaffected by it, so we don’t have to worry about things like deprecation errors. We don’t have to worry about having people go in and update their page to a new version of the block or anything like that. It just automatically happens as we make those changes to our pattern library.

\n\n\n\n

David Bowman: That sounds awesome. I have so many questions, but I’m talking a lot. Alec, do you have any thoughts?

\n\n\n\n

Patterns

\n\n\n\n

Birgit Pauli-Haack: Before you get to your questions, I have a small clarification, when you talk about patterns, you are not talking about WordPress patterns, or are you?

\n\n\n\n

Joni Halabi: I am not. No, sorry, I am talking about design patterns. We’re still struggling with terminology because pattern is a very loaded word. It could be WordPress patterns, it could be design patterns. Block is another big one that we struggle with because there’s WordPress blocks, but then there’s also blocks of information and blocks of HTML. And so thank you for…

\n\n\n\n

David Bowman: Even theme means like 10 things in different contexts.

\n\n\n\n

Birgit Pauli-Haack: Yeah. When you talk about Figma themes, it’s like, “Oh yeah, those are totally different than WordPress themes.”

\n\n\n\n

David Bowman: Everyone’s got a theme. There’s a lot. You got to really keep your theme straight.

\n\n\n\n\n\n\n\n

Birgit Pauli-Haack: Yeah. So we got one question, and thank you Alec, for answering that, from Bridget Vessel. Is that the best place to get the links? And she linked to a page on WordPress VIP, and then Alec had added two additional links there. And I will put those also in the show notes after the show.

\n\n\n\n

Alec Geatches: Okay, yeah, I can talk about that a little bit if that’s okay.

\n\n\n\n

Birgit Pauli-Haack: Yeah, please do.

\n\n\n\n

Alec Geatches: So when we first designed this with David, we wanted to be able to… If you watched what David was doing, have no idea what happened or you just want to try it yourself, we have this long readme, or it’s in our design system bridge repository, but it’s a whole walkthrough. We have a little tiny material UI, basic design system, Figma document. You can clone that. You can see how the Figma tokens plugin that David was using, connects to it and how the token sync. And then you can use our tool to pull down those tokens and sync it up with a theme.json and then you can like, “Oh look, the color changed as I made a change in Figma, synced it, now it’s in WordPress,” and see how all of those links work together. The secret sauce in that is that custom section in theme.json. So that’s where you can dump all of your CSS variables, mostly colors, typography, things like that, units, and then you can just re-reference those in other parts of your theme.json.

\n\n\n\n

So like your palette, you can say, “Give me the primary color.” And then in Figma, you can change your primary color. It gets synced to the same spot. Then your block pulls in a different primary color for its options. It’s all magical, but it’s really based off of that custom section. And what the design system bridge does, is it reads all that json, puts it in a format that’s comfortable for CSS and for WordPress using Style Dictionary, which is this Amazon product. It’s basically used for design tokens for this exact purpose or similar, where you have some design constructs, you want to put them in a different format. So we have some transforms in there. It’s like add some pixel units here. It’s really basic stuff. For the most part, we take that json, modify it a bit, put it right in the theme.json custom list, and from there it just works. Anyways, check out the tutorial I linked. We can put that in the show notes for a walkthrough, it’s really simple. You might not learn a lot from it, but it can at least show you the full end-to-end process.

\n\n\n\n

Birgit Pauli-Haack: Well, thank you.

\n\n\n\n

David Bowman: As soon as you implement it, as soon as you use it a couple of times, it feels really good. Changing something in Figma and then watching it update in WordPress theme. It’s pretty cool.

\n\n\n\n

Changing Design Practices – How to Start

\n\n\n\n

Birgit Pauli-Haack: Yeah, I can imagine how that… Amazing. So we get from an attendee, we have a developer who’s deep in the Gutenberg ecosystem and he has a question about how would you go about inspiring hesitant designers to a) embrace things like the site editor style book, and b) adapt their existing, if applicable, design systems like Figma, XD and whatever those two become post-acquisition, to work more in what Gutenberg already provides. I’m struggling to achieve internal buy-in to change design practices, even though I have full internal buy-in from ownership for Gutenberg and block-based theming. That’s the loaded question, right? The million dollar question. So, thank you for that question. That’s a really good one. Yeah. Who wants to take it on first? You all work with developers.

\n\n\n\n

David Bowman: It’s a good question.

\n\n\n\n

Birgit Pauli-Haack: Yeah. So how do you embrace things like site editor style book?

\n\n\n\n

David Bowman: I guess I would, maybe this isn’t an answer to the question, I’ve been talking a lot again, but I’ll just say this quickly. As a designer who went on this journey who was like, “I got to use Gutenberg, let’s figure it out,” and having to go through that process, a couple of things were really helpful to me. The first one was to maybe as a non-starter for some people, but just get into block theme development. Block theme development is not hard. And I think that one of the best things about block themes is that the code of a WordPress theme includes very little PHP now, it includes very little JavaScript by default. And if you want to start doing things like getting custom styles and really doing things, it’s pretty simple. And the meat of their block theme development, so much of it is happening in json files and block markup files that are HTML, that it’s very accessible.

\n\n\n\n

And so if you’re a designer that is wanting to understand Gutenberg, just go build a block theme. Go really get in there and try and figure it out, because doing that, you’ll see that there are a lot of places where you can really integrate it with what you already have. So theme.json, getting tokens out of Figma and into theme.json is… Just that is a really big step. And that’s the other piece of advice I would give is to just focus on small things. Just because Gutenberg is so opinionated and truly has not realized that it’s a design system yet.

\n\n\n\n

There’s a lot of the dynamic blocks, static blocks, there’s a lot, there’s a lot of pitfalls, but if you can focus on the small things, like getting global styles hooked up to your existing design styles, you’ll get a long way. At least that was my experience, is that just doing those things, I was like, “Oh, cool, I can actually really craft this experience in the editor and I can craft the front end and I can influence it as a designer without having to go bug a developer to make a PR for me.” Often I can just go and change it. I can go change my Figma files and that was pretty rad. That was longer than I wanted it to be, but that was my answer.

\n\n\n\n

Joni Halabi: Yeah, I would definitely echo that. But I think it almost feels like there is a social aspect to this question as well. And I would want to dig deeper into why the designers are hesitant about getting their hands in there. It almost seems like, are they feeling overwhelmed? Are they feeling like they don’t have the technical chops for it? I would start to have those conversations with the designers and maybe developers and designers can get into a room, virtual or physical, however you all work, and just see where that pain point is. Sometimes I know personally when I feel like oh my goodness, something is really difficult, something is just mentally blocking me from starting that task, it might be easier to talk it out or to have somebody hold my hand, at least for the first couple of steps, and maybe that will give them the inspiration to just jump in.

\n\n\n\n

Create Block Theme

\n\n\n\n

Birgit Pauli-Haack: And yeah, I understand that not everybody who gets into a car knows how to drive it. You need somebody to show it to you. Or another metaphor is if books would help or documentation would help, there wouldn’t be universities attached to libraries. So what I shared in the chat window was two links. One is to a course on learn.WordPress. That is develop your first low-code block theme. So to get a scaffolding and use the tools that are in the site editor, and they have been really expanding and they will be with 6.3. I don’t know if you are watching here and you want to see what’s coming, 6.3, there was a product walkthrough last night and it will be published on news on WordPress. And then the other link that I shared is just a tag of other courses on how to use the site editor.

\n\n\n\n

I think it really helps to know how a content creator is going to use the site editor as well to help with the design and what would be needed. Of course, that’s the beginning. So the theme team, WordPress theme team, also developed a plugin. It’s called Create block theme plugin, which also lets you then create style variation, create patterns, as well as export the theme from the site so you can upload it to another site. That’s helping with the workflow of block themes development. And I’m sure I’m going to get the link when I’m doing it live and talking. That’s never a good thing.

\n\n\n\n

David Bowman: It’s easy to search for. Create block theme.

\n\n\n\n

Birgit Pauli-Haack: Create block theme.

\n\n\n\n

David Bowman: It’s a good one.

\n\n\n\n

Birgit Pauli-Haack: Yeah, and it has its active development and the designers that are actually creating themes for the repository, they’re start out with that plugin and then do some modifications later on if they needed to. But it’s very good to create some.

\n\n\n\n

David Bowman: I would add maybe one little note to the create block theme thing, which is that… So the site editor and tools like create block theme, it’s rapidly getting so much better to the point that their goal is to have the site editor be a design tool so that you can sit down and craft a theme and be able to use it like a design tool. And it’s going to get there and it’s getting there pretty quickly. But I would, maybe this is a spicy hot take for me, is that I would not think of WordPress as a no-code solution. There are definitely, if you need that and you want to use WordPress, there’s options for you. But as just a designer being like, “Hey, I want to make a website. I need a no-code solution to make a website,” there’s stuff out there that’s really good that’s not WordPress.

\n\n\n\n

And I think you give up a lot when you go with those, but you do get no-code. But what WordPress has, that some of these other things don’t, is that the code that you need to make a WordPress theme, it’s really easy, and it might not be fully, “no-code,” but it is very accessible code. And if you have ever, ever, ever made a website ever, like in college, ever, if you’ve ever done it, you can figure out how to do a block theme. And in addition to really digging into the site editor, go read the docs on theme.json. If you go read the docs on theme.json, you’ll be like, “Oh, it’s just a json file.” And you can go and find yourself developing, quote, block themes before you know it. And that’s pretty rad.

\n\n\n\n

Birgit Pauli-Haack: Yeah, I like that analogy. There was this idea that block development raises the bar for entry. Because with the JavaScript and the React and the build tool and all that, the theme.json, got us back to the tinkering kind. We want to, “Oh, I want to make this border bigger, or I want to make that color more red. And I go into the theme.json and I just change it and boom, it’s done.” So it really is a good way to get your hands dirty again, with a little bit of code. We got some more information from our developer and they said, “Thank you all. I’m not certain my design colleagues will feel comfortable diving into WordPress themselves based on our experience together. I myself am very comfortable with coding block themes, SCSS under the hood and such, and how once I’m done, we set up the theme.json, that the process is largely no-code. It’s a whole new world.”

\n\n\n\n

Primer – Getting Started

\n\n\n\n

As a more overarching question for David and all, Figma or otherwise, what would be a good primer to share with my designers who I think are intimidated by development’s expectations. Now that I’m working exclusively in Gutenberg, I’m suspicious that there isn’t a robust design system in place on their end. And the question I ask when it comes to populating my theme.json are challenging their current practices. Is there a good getting started with web design systems resource you would recommend to them? And I give it back to David or Alec or Joni?

\n\n\n\n

David Bowman: That’s a good question and I’ll tell you what resources I used when I was doing this, because I think a lot of, “web designers,” nowadays you learn… If you’re as old as me and learn to doing stuff in Photoshop and you’re used to… Design systems is a relatively new thing. And it is made designing things for the web more technical, but it’s also made it a lot more efficient and you hand off to devs easier. There’s a lot of benefits to it. And the way that I got into design systems was by honestly mostly by checking out existing design systems. And the big guys like IBM Carbon was very influential for me. Google material is ubiquitous in our lives. If you go check out the documentation sites for these big design systems, they really lay it out very nicely, because they’ve got whole teams supporting them.

\n\n\n\n

And so they’re like, “Here, this is our design system. Here’s our Figma files that you use. Here’s this.” They’re all open source and you can download and play with them and build stuff with them. That can be a lot. If you’re really interested in getting into design systems, that’s a great place to start. If it’s too much, honestly Figma. If you’re not already using Figma, you should probably be using Figma. And Figma, with their latest releases at their config conference just a few weeks ago, introduced variables into Figma. They introduced modes into Figma. And so they now natively support some really fundamental design system concepts and have a bunch of really great little tutorial files that you can go play with, and this is how it works. You change from light mode to dark mode. And it’s mirroring how it’s going to work in code and point them at those. If they’re not Figma people then tell them to get into Figma. Hopefully Adobe XD just dies a slow death and they just, which I think is their plan.

\n\n\n\n

Alec Geatches: Yeah, I’d also say searching Figma templates or just the word design systems or the words you can find a whole bunch, everything from these huge ones with 10 pages of buttons and things to just a little baby one that’s just a color palette and then you can take one and change it up. And that’s how I learned about them and got a hands-on knowledge.

\n\n\n\n

Birgit Pauli-Haack: Joni, do you have any input?

\n\n\n\n

Joni Halabi: I was just going to say, I’m a developer. Everything I suggest is going to be code, so you probably don’t want to take a suggestion from me, but Figma looks amazing.

\n\n\n\n

David Bowman: Figma’s great.

\n\n\n\n

VIP Plugins

\n\n\n\n

Birgit Pauli-Haack: Awesome. So I’m really glad that we all got together today. We’re leading up on the hour. I have two questions for you. I know VIP is also working on two other plugins. Do you want to talk about it Alec, briefly, so we can wet the…

\n\n\n\n

Alec Geatches: The first one still internal beta, so I don’t have a good link for it, but it’s super relevant to what we’ve been talking about, what Joni was talking about. Just locking things down. David posted here. Let me find that link real quick. I had that ready. A great issue in the Gutenberg repository last year and it was talking about theme.json. It’s great for design systems, but it loses the scope of these higher level design system things like if you embed this block in a hero, how does it look different now? Usually that’s part of a design system. These typography options are available here but not here. And theme.json just has a flat block structure. Every block has these settings when you design them that way in theme.json. Where was I going with this?

\n\n\n\n

We’re working on a plug in that is looking to extend Gutenberg and the way that David is talking about, but also have a very allow list approach to everything which blocks you have, which roles get access to them, which block settings you have, things like that. So we want to make this super enterprise focused, because Gutenberg gives you the ability to just do crazy things. Even if you lock it down to a design system, you still get a lot of options for a lot of things and it’s very hard to get those all out if you’re running 40 websites for other people. So we’re working on a plugin that…

\n\n\n\n

Birgit Pauli-Haack: Or 400.

\n\n\n\n

Alec Geatches: Yeah, yeah. Or 4,000 or yeah. WordPress goes crazy. So yeah, we’ll have more information when that becomes public or when we talk about it more. But anyways, we’ve been heads deep in this trying to work with Gutenberg to allow these enterprise things, because Gutenberg is meant to be customizable. We don’t want to be customizable at all, want everyone’s job to be easy and not have that many typography options. And so the other plugin that we’re working on…

\n\n\n\n

Yeah, just have good options and not that many of them. And the other thing that we worked on, this is released now, it’s called the block data API. This is a headless or decoupled thing, but there’s this issue with the way that post work in Gutenberg that make it tricky to use sometimes in like a node. If you have a node front end and you want to consume that, pretty much for a post, if you use the rest API, you just get a big blob of HTML. And it’s got class names in it and sometimes it’s got styling in it and there’s not a lot you can do with it other than just put it on the page and try to supply enough styles so that it looks decent.

\n\n\n\n

But it can be hard to map onto custom components and things. There are ways to do it, but it’s pretty tricky. So we added this block data API. If you just search that in Google, you’ll find it. Check it out, look at the first GIF. It explains how it works, but it’s just we read through the HTML, parse it into json, and then pass that back. So you just get a bunch of json that you can map onto your own custom components instead of just having to rely on HTML string somewhere. So that’s pretty cool. We just released it for the first time this year. We’ve got one customer who will be launching it soon. I don’t think I can say any more specific on either part of that, but pretty cool.

\n\n\n\n

David Bowman: It’s going to be big.

\n\n\n\n

Alec Geatches: I’m excited about that.

\n\n\n\n

David Bowman: It’s going to be cool.

\n\n\n\n

Alec Geatches: Yep. Anyway, so those are the two main things our team’s been working on.

\n\n\n\n

Birgit Pauli-Haack: Yeah, so there are quite a few enterprise companies who actually use WordPress as a content creation tool, but not on the front end, because they need other data match up with things. So yeah, the headless is the way that they go via the rest API. So that block data API is probably going to be embraced by quite a few agencies as well and not just the clients of VIP.

\n\n\n\n

Alec Geatches: Yeah, hopefully.

\n\n\n\n

Contact Info

\n\n\n\n

Birgit Pauli-Haack: Yeah, we do. So we have three minutes to go. If the viewers want to get in touch with you, what’s a good place to reach you? Joni? Or do you have anything else that you couldn’t talk about but you want everybody to know?

\n\n\n\n

Joni Halabi: Yeah, if folks want to reach me, you can find my contact info on my website. It’s jhalabi.com. I’m also @jonihalabi on most socials.

\n\n\n\n

Birgit Pauli-Haack: All right. Thank you. Alec and David?

\n\n\n\n

Alec Geatches: David, go for it.

\n\n\n\n

David Bowman: Alec.

\n\n\n\n

Birgit Pauli-Haack: You’re too nice.

\n\n\n\n

Alec Geatches: I’m going to be quiet.

\n\n\n\n

David Bowman: So find me on LinkedIn if you want to talk WordPress stuff. That’s probably the best place to find me to talk about WordPress things. I’m also social media. You find me at hanging out in the Gutenberg GitHub repository sometimes. And yeah, I also, I blog with my family at americanfieldtrip.com about, totally not related to WordPress, but you can find me there. It’s mostly about national parks and travel stuff.

\n\n\n\n

Birgit Pauli-Haack: Oh, wonderful.

\n\n\n\n

David Bowman: But yeah, that’s how you find me. There’s a few different ways if you really want to track me down.

\n\n\n\n

Alec Geatches: I’ve searched my name, Alec Geatches. I think I’m the only one so far. So you’ll find me there. You can email me at alecg@automattic.com.

\n\n\n\n

Birgit Pauli-Haack: Excellent. Well thank you so much, and I think we are right at the hour. Very punctual. Yeah, it’s a German show. Well, thank you, all three of you, for spending the time with me and explaining all this good design systems and how you work with WordPress. I learned a lot about it, and I’m sure the viewers learned a lot too. Thank you so much for coming and I hope you have a wonderful weekend. It’s Friday night, or Friday morning, depending on where you are. Thanks everybody, and goodbye.

\n\n\n\n

David Bowman: Thanks, everyone.

\n\n\n\n

Birgit Pauli-Haack: And we got a thank you from our anonymous developer. We use CD and with a pending acquisition of Figma by Adobe, I’m cautiously giddy and design system distraught. So here’s hoping. All right. That’s a good way to end it. Thank you all so much.

\n\n\n\n

David Bowman: Take the plunge.

\n\n\n\n

Birgit Pauli-Haack: You take care, and I’ll end it here.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 02 Aug 2023 15:55:31 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Birgit Pauli-Haack\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:19;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"Akismet: OpenAPI specification for Akismet now available\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"http://akismet.com/?p=174137\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:73:\"https://akismet.com/blog/openapi-specification-for-akismet-now-available/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:1163:\"

We have just released our first OpenAPI specification for Akismet, which is hosted on Github:

\n\n\n\n

https://github.com/Automattic/akismet-api

\n\n\n\n

The file describes our API and each of its endpoints, including what parameters they accept and what the response looks like.

\n\n\n\n

You can import the spec to explore the API using tools like SwaggerHub and Postman. You can also use it to automatically generate code for the Akismet API in your chosen programming language using OpenAPI Generator.

\n\n\n\n

We’re here to help

\n\n\n\n

If you need help using our OpenAPI spec, or have any questions about our API endpoints, please don’t hesitate to get in touch.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 02 Aug 2023 14:31:38 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:17:\"Chris Rosser 🏔\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:20;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:83:\"WordPress.org blog: Concerns over the European Union’s Cyber Resilience Act (CRA)\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=15686\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:94:\"https://wordpress.org/news/2023/08/concerns-over-the-european-unions-cyber-resilience-act-cra/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4086:\"

As the world’s most popular open source content management system, WordPress acknowledges the European Union’s initiative to bolster the cybersecurity of digital hardware and software products with the Cyber Resilience Act (CRA). The Act’s effort to counter the increasing threat of cyberattacks and promote informed usage of digital products with increased security updates and transparency is commendable. 

\n\n\n\n
\n

While we wholly endorse the objectives of the CRA, we are apprehensive about the Act’s implications on open source software due to unclear terms and definitions.

\n
\n\n\n\n

Specifically, the Act’s prohibition on “unfinished software” and ambiguous definition of “commercial activity” could inadvertently inhibit innovation and economic participation in the European digital landscape.

\n\n\n\n

Open source projects, like WordPress, often rely on continual updates and improvements—a process that may technically fall under the label of “unfinished.” Furthermore, the ambiguous definition of “commercial activity” could unintentionally encompass open source projects that are largely driven by communities and operate on a not-for-profit basis.

\n\n\n\n

Our letter to the EU Commission

\n\n\n\n

We have jointly authored an open letter addressing these concerns alongside fellow open source projects Drupal, Joomla!, and TYPO31. The letter emphasizes the significant contribution of Free and Open Source Software (FOSS) to the EU’s economy and how the proposed regulations might undermine these efforts. Our shared goal is to further bolster the security of digital products without compromising the values of freedom, democracy, and innovation inherent to both the open source community and the EU’s Aims and Values.

\n\n\n\n

The letter invites the EU Commission and interested parties to participate in a seminar in Brussels to discuss how we can align the objectives of the CRA with the realities and needs of the FOSS community. We are optimistic that, with mutual understanding and cooperation, we can achieve secure digital products without limiting the vital contributions of open source projects.

\n\n\n\n\n\n\n\n
\n\n\n\n
  1. Drupal, Joomla!, TYPO3, and WordPress are the most popular FOSS content management systems on the web today. While all are based on the PHP programming language and distributed under the GPL open source license, each platform takes a different approach to website publishing. With strength in diversity, they form the Inter-CMS Working Group, promoting the values and benefits of free and open source software. \"↩\"
\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 02 Aug 2023 14:25:55 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:7:\"Josepha\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:21;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:78:\"WPTavern: #86 – Dan Walmsley on How WordPress Can Adapt to the Reality of AI\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:48:\"https://wptavern.com/?post_type=podcast&p=147378\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:92:\"https://wptavern.com/podcast/86-dan-walmsley-on-how-wordpress-can-adapt-to-the-reality-of-ai\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:60788:\"Transcript
\n

[00:00:00] Nathan Wrigley: Welcome to the Jukebox podcast from WP Tavern. My name is Nathan Wrigley.

\n\n\n\n

Jukebox is a podcast which is dedicated to all things WordPress. The people, the events, the plugins, the blocks, the themes, and in this case how AI works and how it might integrate with WordPress.

\n\n\n\n

If you’d like to subscribe to the podcast, you can do that by searching for WP Tavern in your podcast player of choice, or by going to WPTavern.com forward slash feed forward slash podcast. And you can copy that URL into most podcast players.

\n\n\n\n

If you have a topic that you’d like us to feature on the podcast, I’m keen to hear from you and hopefully get you, or your idea featured on the show. Head to WPTavern.com forward slash contact forward slash jukebox, and use the form there.

\n\n\n\n

Before we begin, just a quick alert that there will not be a podcast next week. It’s summer here and I’m having a few days away, but we’ll be back the week after that.

\n\n\n\n

So on the podcast today we have Dan Walmsley. Dan is a long time user of WordPress, having started using it even before version one was released. With a passion for experimenting with different publishing technologies, Dan eventually discovered WordPress and he’s been using it ever since.

\n\n\n\n

Currently working at Automattic as a code Wrangler, dan is part of the applied AI team. Although the team is relatively new, with only a few members, their mission is to coordinate and guide the various AI initiatives within the company.

\n\n\n\n

Recently he’s been focusing on automating internal workflows and communications. A particularly crucial aspect, given the distributed work set up which spans 70 countries, and multiple time zones.

\n\n\n\n

We start the conversation talking about Dan’s background. He’s recently decided that AI is a truly transformational technology, and so has taken steps to learn the skills needed to understand and implement it.

\n\n\n\n

Dan talks about how Large Language Models work, and how ChatGPT has driven awareness and demand for AI technologies in a way that was almost impossible to predict just a year ago. This has caused many companies to become deeply interested in AI and what it can do for their business workflows.

\n\n\n\n

We get into whether the reality of AI can live up to the hype. Do we have enough understanding of AI to know what its impact will be on the workplace, or are we just in the middle of a media frenzy, which will die down over time?

\n\n\n\n

Dan challenges, the notion that AI will take many of our jobs and emphasizes the economic value that AI can bring.

\n\n\n\n

We move on to explore the differences between site generators and site builders, and Dan introduces the concept of the copilot era, in which website creation can be somewhat automated. He highlights tools like Jetpack AI, which can generate content and modify the tone of voice right inside of WordPress.

\n\n\n\n

Dan stresses the importance of building AI tools with user interfaces that learn from human inputs in order to improve over time. He thinks that companies, which measure user responses and interactions will gain a significant advantage in AI development. While those who fail to improve that AI content generation will be left behind.

\n\n\n\n

Whether you’re new to AI or have been paying attention for awhile, this podcast offers a fascinating insight into its impact on society and how it can accelerate progress in fields like scientific research.

\n\n\n\n

If you’re interested in finding out more, you can find all of the links in the show notes by heading to WPTavern.com forward slash podcast, where find all the episodes as well.

\n\n\n\n

And so without further delay, I bring you Dan Walmsley.

\n\n\n\n

I am joined on the podcast today by Dan Walmsley. Hello, Dan.

\n\n\n\n

[00:04:35] Dan Walmsley: Hello Nathan. Great to be here.

\n\n\n\n

[00:04:37] Nathan Wrigley: Yeah. Thank you for joining us. Dan, I wonder if you wouldn’t mind spending just a very quick moment or two just introducing yourself. Obviously, this is a WordPress podcast. I suspect that today we might stray out of the boundaries of the WordPress ecosystem a little bit. I have a feeling with our preamble talk that we’ve had, that may well happen. Nevertheless, given that it is a WordPress podcast, can you just tell us a little bit about your background, the work that you do, who you work for, that kind of thing.

\n\n\n\n

[00:05:01] Dan Walmsley: Yes. So I have been using WordPress since before version one, or whenever the first version came out. Because I remember back at the time I was playing around a lot with Movable Type and, oh gosh, I can’t even remember the name of all the different things. I’d gone through quite a few different publishing platforms, just experimenting with the web. And I discovered WordPress and I’ve literally still got that same blog, and it’s still on WordPress, and it’s been upgraded through every different version ever since.

\n\n\n\n

I work at Automattic. I am on the Applied AI team. I am a Code Wrangler, or code mangler. We all give ourselves our own titles and mine changes a bit. My colleague calls himself an applied AI artisan. And we’ re a pretty new team. We’ve been around just a couple of months. And we’re very small, as in right now it’s just me and a couple of data scientists. But we have a lot of AI at Automattic. Our team’s job is to sort of try to coalesce, coordinate, guide, align it. So that we’re not just operating at the leaf nodes, that there’s a bit of larger thinking going into things.

\n\n\n\n

And as such, my days are mostly spent building weird prototypes on LangChain and chatbots. The most interesting thing I’ve looked at recently is automating some of our internal workflows and communications. Because we operate async, we’re remote. We’re in 70 odd countries around the world in different time zones. And so using AI to capture people’s knowledge and repeat it later when they’re asleep is pretty useful.

\n\n\n\n

[00:06:25] Nathan Wrigley: When the word Automattic is announced, I usually think of WordPress, but I think I’m right in saying that Automattic is the parent of quite a few different companies. So the connection between WordPress, the open source project, download from .org, may not be quite so obvious. But the implementation, it may well go into some of the SaaS offerings that you’ve got I’m guessing as well.

\n\n\n\n

[00:06:48] Dan Walmsley: Yeah, so we are trying to build out AI infrastructure that really doesn’t have a direct dependency on WordPress. You know, GPUs are GPUs, and we’re running a Python based stack on those, because that’s where a lot of the open source activity is. You might have seen that OpenAI announced some changes to their APIs, and in just a few hours, LangChain had a new release, incorporating those features.

\n\n\n\n

Good luck even finding that in TypeScript, let alone PHP, right? So if you want to move fast, you want to be on the cutting edge, got to stand up a bunch of Python. I’ve built a version of LangChain in PHP that runs on WordPress.com for the purposes of producing knowledge bases from blogs. It’s possible that if it turns out to be useful and reliable, that we’ll open source some of that. But right now it’s just there to provide some quick indexing for chat interfaces.

\n\n\n\n

[00:07:34] Nathan Wrigley: So your team is fairly new. Give us an idea of how old that word new means. Are we going back two years or 18 months or a couple of months?

\n\n\n\n

[00:07:43] Dan Walmsley: Two months maybe?

\n\n\n\n

[00:07:44] Nathan Wrigley: Really, new. Okay. And did that sort of trickle down from the Automattic leadership? Was it that people up there decided that, okay, now we’ve got OpenAI in the space, everybody’s, I mean, literally everybody seems to be talking about it.

\n\n\n\n

I don’t think I’ve picked up a newspaper, certainly an online newspaper, in the recent past without there being some kind of AI story in there. So was it that, or was it more a groundswell of Automatticians saying, look, if we’re going to stay in the game, we need to be moving with this.

\n\n\n\n

[00:08:11] Dan Walmsley: There’s some people who have been pushing on LLMs and transformer technology since pre GPT three or two. Which includes me. When I had my sabbatical a couple of years ago. So Automattic has a three month sabbatical, and I was like I’m going to learn AI. This seems really cool.

\n\n\n\n

So I did Andrew Ng’s Deep Learning course and a couple of other ones. There’s some really great courses out there now, even better ones now, this was about three years ago. And I just thought, oh my god, if this grows up, which it looks like it’s going to, it could be amazing for generating content. It could be amazing for conversational interfaces.

\n\n\n\n

I had a little Roomba running around my house, pretending to be a psychopathic robot with chainsaw arms, when in fact it was a little plastic Roomba. But it was like vaguely self-aware that it didn’t have chainsaws for arms. And so it would be like, when I get my chainsaws back on, you’re a toast buddy.

\n\n\n\n

I had an Australian robot that trundled around, it would try to get you to stop working and go to the beach. But it had no way of getting to the beach, which is hilarious. Anyway, that’s a long way of saying, some of us have been pushing for this stuff for a while, but I think what changed, obviously ChatGPT came out and created a lot of public awareness and public demand and conversation.

\n\n\n\n

People started to see this as a race. Companies started to see this, I don’t think Automattic necessarily falls in this bucket, but a lot of companies started to see this as existential. Either you have an AI plan or you’re dead. And so it made sense to put together a team that’s sort of looking at what is this for the whole organization.

\n\n\n\n

Because like you said, it’s a complicated organization. We’ve got podcasting apps, we’ve got diary apps. We’ve got Woo. We’ve got Day One and all these different things. Sensei is a learning management platform. And so we really needed to figure out how we could scale these efforts up, and not end up duplicating things or having tons of different approaches where it’s hard to get economies of scale, or build knowledge or build capability.

\n\n\n\n

[00:09:53] Nathan Wrigley: Now, given that the rate of change seems to be so incredibly fast. Give us an idea over those last two months, how much knowledge you’ve had to ingest. And I don’t necessarily mean knowledge, but how has it been, trying to keep up over those last couple of months?

\n\n\n\n

Is it genuinely as fast moving as it appears from the outside to be? What you learned last month probably doesn’t apply this month. And so therefore staring into the future, and if I asked you the slightly banal question, what will we be doing with AI in two years time? Is there really any realistic chance that you can offer us an answer to that?

\n\n\n\n

[00:10:27] Dan Walmsley: Well in terms of keeping up with it, there really is no way to keep up with everything. And I mean, there’s multiple different dimensions here, right? There’s the research dimension, what papers are coming out and how practical are those papers. And where are the outcomes of those papers showing up in libraries?

\n\n\n\n

And then there’s like, where is it showing up in products? What are our competitors doing, or what products might we plug into our own stack? For example, we can use GPT4 to generate help responses, but we have to sort of, stand up maybe a vector database and some other infrastructure, various job management things.

\n\n\n\n

There’s other third party services where you can point them at some public documentation and they figure all that stuff out for you, and just give you one endpoint that just chats with you. And it’s oh, well how much do we embrace this plus that? A lot of the day to day involves build versus buy versus don’t bother.

\n\n\n\n

And it’s really hard because our team currently has not that many full-time developers on it, and we do want to move really fast and understand these technologies and do the judicious integration. I personally in my horrifyingly long career have done lots of integrations and they’re almost always bad news.

\n\n\n\n

And I’m almost always fighting to do some minimal thing like in-house, rather than integrate. But it’s a constant. That’s really the battle. It’s like less so the awareness of what’s happening and more so wrestling with the idea of like, how do we incorporate this or not?

\n\n\n\n

And people wondering if something’s strategic or aligned or whatever. And there’s all these different time horizons you’re looking at. Like, are you talking about today? In a week, in two weeks, in a month, in a year? Because they’re all different answers.

\n\n\n\n

[00:11:57] Nathan Wrigley: Yeah, I feel like if I was to to you about AI two years ago, I genuinely think the conversation about what we would be doing in 2023, 2024, I honestly don’t think we could have got any kind of line of sight into what happened. Even maybe a year ago. Nobody would’ve thought that mainstream media, mainstream products, would be using AI. And like you said, falling over each other to have some kind of policy on AI. So I don’t quite know how conversation will go.

\n\n\n\n

But it feels as if we’re in the infancy of this still, and it does feel if we are going propel ourselves through this at an exponentially faster rate. The thing that just popped into my head was that when humanity first came up with the motor car, it was, at least in the UK, you had to have somebody walking with a flag in front of the motor car. And most people probably looked at it and thought, that’s ridiculous. I could walk there just as quickly as I could get into that vehicle and be driven there because it’s going so slowly.

\n\n\n\n

Give it 10 years, got a little bit faster. Give it another 10 years, it got faster and more beautiful and more efficient. But of course it then polluted the world, which brings us onto the inherent problems that we may have with AI. There’s a lot of concern about unexpected consequences. The fact that it hallucinates. The fact that it may give information out which is inaccurate. Given that this is your work, are you fairly sanguine that things built with AI are broadly speaking safe? Or are we just working out what the guardrails even are?

\n\n\n\n

[00:13:25] Dan Walmsley: Well there’s a few pieces to that question, and I keep failing to address all the pieces of your question, so I’ll try to genuinely do it this time. But, the first piece is sort of like where we’re at in this AI timeline, and you talked about various analogies.

\n\n\n\n

I think of this as the BBS era. If you’re in your forties, you know what a BBS is. If you’re not, it was when people used to connect to a single computer using a modem, and the modems were slow enough that you could see the text appearing on the screen. Sometimes slower than you could read. Certainly when I started using BBSs, it was slower than you could read, and even slower for images.

\n\n\n\n

And obviously subsequent to that we got the internet, through various stages. And now, you look at a BBS and it’s unrecognizable. It’s like why would you ever look up information this way when you can look at the whole internet? I think we’re going to go through the same thing with AI.

\n\n\n\n

There was another part to your questions which was the danger piece. There are alignment techniques that we use today on large language models and other kinds of models, that are fairly reliable at the scales at which those models operate, or at least useful.

\n\n\n\n

And the worst things that those models can do are not yet super terrible. if you’ve got one plugin that talks to your bank and another plugin that can pick up the phone, then a rogue AI can hallucinate its way into destroying your life, no problem.

\n\n\n\n

I sometimes talk about this with, we’ve experimented with building ChatGPT plugins for different products, including wordpress.com. And one of the hardest things is, you have to put user confirmation stuff everywhere because you simply can’t predict when the AI’s going to start invoking your API in backwards ways, and just deleting all your posts because it thought that’s what you wanted to do. Turning every post synopsis into the word red paper clip.

\n\n\n\n

There’s a broader alignment thing that I think goes way beyond that. It goes way beyond these hallucinations. Because you know, I think people get caught up with, oh well it’s not that useful because of the size of the context window. It’s not that useful because it hallucinates. So it’s not that useful because it was last updated in September, 2021. As if all of those aren’t things that are going to change immediately, right?

\n\n\n\n

Those are all solvable problems. We know we can make larger context windows. We know we can update it more often. We know we can inject additional information. We know that various alignment techniques can encourage it to reason more thoughtfully and activate pathways that have more expertise, and that will continue to be the case. And as the models get larger, those pathways with expertise will have more expertise. And so it’s obvious and predictable, those things.

\n\n\n\n

So the really hard thing to predict is where does this interface with society? And you know, we touched briefly on jobs and other things. Or whether, obviously people talk about rogue states getting an unhinged intelligence to go do crazy scientific research for them, or invent a nuclear weapon or a chemical weapon.

\n\n\n\n

Google Brain just invented protein folding. So get this, the Google Brain team, Google Deep Mind, they invented a protein folding system that can fold a protein in a few seconds, which is the equivalent of about at least four years of PhD time. And so in that single invention, they eradicated, I suppose you could say, or avoided over a million years of PhD time. By folding all those proteins instantly.

\n\n\n\n

The thing I think we’re not ready for is that rate of progress. I call it Moore’s Law for everything. Where you have a self-reinforcing centralized paradigm, where you have AIs that, by their very progress, make it easier to build the next AIs.

\n\n\n\n

And then at the same time you have this fanning out into different disciplines, where those newer AIs are also making it easier to make scientific progress. You could use, for example a score like Perplexity, feed in all of the papers in the world and find the most useful research questions to ask that have not been answered, by basically large scale language based statistics.

\n\n\n\n

[00:17:03] Nathan Wrigley: I think this is the piece where my knowledge breaks down because my interaction with AI has largely been ChatGPT. Certainly the most recent versions of ChatGPT. Plus also the image creation tools. And, I’m amazed by how quickly I’ve become, unimpressed is the wrong word, but how quickly I just expect it to give me something akin to a human.

\n\n\n\n

The first couple of times I used ChatGPT my entire endeavor was to see what it would produce, and be utterly, utterly flabbergasted by the fact that it could in any way give me something coherent back. And the same with the image creation tools, Stable Diffusion and a few others that I’ve tried. Typing in some kind of prompt, and then just jaw droppingly quickly, something half decent comes back. And you know you try a little bit harder and you tweak the input that you’re putting in and something slightly better comes back.

\n\n\n\n

I’m kind of amazed by how quickly that became uninteresting and just normal. In the same way that when I was a child, I first got on the bike and suddenly I could ride a bike and wow, this was amazing. Two weeks later you have to basically pay me to get on the bike at that point, it’d lost its interest.

\n\n\n\n

But I’m wondering if that interface, because it is replicating a human in many ways, you know, the ability to do art and the ability to give us answers, whether it’s hallucinating or not. I wonder if that’s something that we all think that’s the way the AI’s going to go. But the examples that you gave just then, like medical research and probably research in all sorts of scientific domains, if that’s something which just never quite gets out into the public.

\n\n\n\n

So the fear that a lot of people have, and there are some parts of that that I share, is never counterbalanced by the, but listen we’ve just done thousands and thousands of hours of PhD equivalent work in a matter of moments. Look how fantastic this is. I don’t think that message gets out very often.

\n\n\n\n

[00:18:56] Dan Walmsley: Well, you know, and without launching into a critique of the media, I think we can all recognize that dramatic headlines sell. And I’m sure if the headlines of these articles were slightly hard to predict whether AI will be good or bad, stay tuned. Then they wouldn’t sell so many newspapers.

\n\n\n\n

You know, I don’t think anybody can actually, at a large scale, predict the outcome of the current AI revolution. That there are people who think that it will be a nothing burger. And there are people who think that it will more likely than not, result in the eradication of the human species. And there are people who think it’ll be cyborgs. And there are people who think it’ll be utopia. They’re all neither right nor wrong, yet.

\n\n\n\n

I will say though, that people narrowly pushing, AI will take all the jobs line, definitely wrong in my opinion. Part of that we really alluded to this before the show, but part of that is, humans are really good at inventing new jobs. We added like 8 billion humans to the planet in the last a hundred or so years, and we gave them all jobs, no problem. We can invent new jobs like dog tickler and it’s fine.

\n\n\n\n

People will just find ways to keep themselves busy. And if AIs come and take away a huge amount of jobs, particularly those jobs that are mostly typing and mostly repetitive, like similar things over and over again, then maybe those people get a chance to like move their bodies and stand up.

\n\n\n\n

We forget how incredibly dysfunctional it is to sit there and type all day. If we can just take away all the typing. I have a gym membership because my body’s falling to pieces because I have to sit there and move my fingers and unblinkingly for like seven hours a day. It’s ridiculous. It’s torture. Can AI make that go away? That’d be amazing. What a revolution.

\n\n\n\n

And so we sort of think about this in terms of jobs as if there’s some fixed number of jobs and the AI’s going to take them. And then there’s going to be no jobs to replace them. We don’t really think about it holistically, in this sense of if it’s doing all that work it’s producing huge economic value and unlocking human potential.

\n\n\n\n

[00:20:48] Nathan Wrigley: One of the things that really has sort of crept up is the use of the word intelligence. So we’ve got AI, artificial intelligence. I’m not entirely sure that, at the moment, is really the right word to be deploying, because that is a fairly scary word.

\n\n\n\n

You’ve seen films going back half a century or more where some kind of intelligent cyborg, something created by a human being at least, Frankenstein onwards, is able to outthink humans and therefore wreak havoc and so on and so forth. But my understanding is that the implementations that we are broadly using, ChatGPT and so on and so forth, are based on these large language models.

\n\n\n\n

It would be interesting to get into the weeds of that if you’re willing. Can you explain how that technology works and why perhaps it’s more of a fluke that it gets anything right? Well, that’s not true. It’s not really intelligent in the sense that you or I would subscribe to a human, but it appears, it masquerades as intelligent.

\n\n\n\n

[00:21:48] Dan Walmsley: Right. That’s very true. So, I’ll try to make this brief but accessible to people who might not have heard this explained before. There was a paper came out, I think it was around 2017, might have been earlier from Google, called Attention is All You Need. And that was the paper that described an architecture called transformers. Where you could feed in a sequence of text that they would turn into these tokens representing, not quite a character, not quite a word, but a numeric string of stuff representing the text.

\n\n\n\n

And then it would be able to predict the next word with a pretty high degree of accuracy, based on paying selective attention to the previous words. So we all know that words like and, or, or not, aren’t always salient but then there’s other words that are sort of really important to the text.

\n\n\n\n

It gets really good at picking up genre and tone and language. It’s important to note that ChatGPT was never trained to speak English. It was Hindi or anything else. It was just fed huge amounts of text, and they hide a piece of the text and say, can you guess what that is? And if you do that enough times with this selective attention model, then you end up with a system that is very good at continuing text where you left off.

\n\n\n\n

Now this by itself is what they call a foundation model. It’s not that useful. The only thing that really does well is generate plausible sounding text. So if you start something that looks like a scientific paper, it will continue. If you start something that looks like a poem, it will continue.

\n\n\n\n

So, once you have that foundation model, it’s not very useful for chat. It will go off the rails. Because it turns out, as soon as a transformer introduces one mistake into its output. Let’s just say it’s producing an output and it changes somebody’s name from Bob to Bill. It will continue to refer to them as Bill, even if it knows in its heart of hearts the correct answer is Bob, because all it’s trying to do is be as plausible as possible. Ah, I said Bill, I better stick with Bill. Or I said, up is down, I better continue with up is down.

\n\n\n\n

I did about eight years of improv. It’s like an improviser in that respect. And in fact, that was one of the first things I used it for was generating scripts and improv things. Little musicals and stuff. Because it can take an absurd premise and run with it. So you give it an absurd premise like bogans in space, that’s a very Australian reference. It will generate the most plausible script it can for bogans in space. And that’s wonderful if what you’re doing is trying to create sort of a fantasy thing, but it’s less wonderful if you’re trying to do something grounded.

\n\n\n\n

And so then they go through these various alignment processes where they feed it a huge amount of handwritten, curated, expert questions and answers on top of that whole internet that they fed it in the first place. And these are supposed to be illustrative of, I’ve got a question, I need a step by step answer that is clear and concise. And I also need it to refuse to tell me how to make a chemical weapon and other things like that.

\n\n\n\n

So there’s some safety stuff there where you look at examples of people asking for malicious things. It’s crazy. I asked it to tell me a joke the other day, an Irishman, Englishman, American joke, right? And so ChatGPT refused to generate it. Because well, I can’t make a joke about people based on specific aspects of their race or whatever. Which is sort of like, fair enough in the general case but also weird in the context of me just wanting that joke for myself to see what it could do. That’s the kind of alignment stuff that they’ve put in.

\n\n\n\n

And so finally what you get at the end of the day after a few more steps, is a model that has a little background thing where developers can align the model. Has all these different safety mechanisms. Has the ability to spell out instructions step by step,. Avoids as much as it can certain mistakes that would lead to it repeating itself or hallucinating too much. And has the ability to recognize now and use tools that accept JSON structured input as part of its cognition. That’s the latest level of alignment that they’ve introduced. And in the future there’ll be more and more as it gets bigger and more capable.

\n\n\n\n

[00:25:31] Nathan Wrigley: So the fact that we’re on GPT4 at the moment, we’re recording this in June 2023. We’re on GPT4, and prior to that there was GPT3. And I think everybody can agree that each iteration is better. But the way that the technology is structured at the moment, will each version in the large language model, the token version that you described, the transformer model, will that simply get better at creating fewer and fewer mistakes?

\n\n\n\n

Or are we approaching something which we could point to and say okay that now really is intelligent? In other words, are we heading towards a general intelligence? An AGI where we can now no longer disassociate it from being a human. It can come up with its own incentives, its own reasons to do things and then figure things out all by itself, based upon no human input whatsoever?

\n\n\n\n

[00:26:18] Dan Walmsley: Yes. When I think of an AGI, I think of an autonomous AGI, right? Where it’s HAL 9000. I don’t really know when that will happen. And I don’t know if it’s a great idea necessarily. I think in between here and there, there’s like a huge amount of work to be done to bring this technology to life in ways that help people with their work.

\n\n\n\n

It’s one thing to switch tabs and go to ChatGPT and type, write me a program that does x or y. It’s another thing to have GitHub Copilot living in the editor, which is an absolute game changer. And I suspect what’s coming next is AIs that work with your programmers and produce pull requests, or patches on pull requests, that fix linting or reduce complexity.

\n\n\n\n

For example, I would pay at least $10,000 a month for an AI that comes in and reduces the complexity of the code that our teams write every single day. Finds methods that shouldn’t be there. Renames things to more align with each other. Move stuff between classes, and documents things publicly. Maybe pings developers if it’s not sure something’s useful anymore. Can you just imagine? Because not only is that cleaning up the code, it’s reducing the number of developers you want, it’s removing one of the most annoying things about being a developer.

\n\n\n\n

So it’s making your job as a developer more pleasant. It’s not like it’s inventing new stuff, but it’s making it so much easier to invent new stuff because you’re working on super clean, minimal code that only does what you need it to do. And now just imagine if every company had that, how much progress we would see.

\n\n\n\n

[00:27:46] Nathan Wrigley: Yeah, it’s interesting isn’t it because at the hub of that is, it almost feels like if you paid that $10,000, a large proportion of your team have to go away. Because probably a significant proportion of the team is people going in and cleaning things up and what have you.

\n\n\n\n

[00:27:59] Dan Walmsley: Does it work that way though? Because let’s just imagine that somebody is on my team. Unless your company is losing money, right? Large amounts of money, and you’re desperately looking for some way to cut, right? If you have a programmer on your team and you can give them this tool and they become four times as productive. Then why would you want fewer programmers? Every programmer you add is four new programmers.

\n\n\n\n

I don’t think this is going to result in people being fired en masse. People look around at Silicon Valley right now, there’s a lot of companies copying the Elon Musk strategy of, oh boy we just realized that we need to trim the fat. Over the long term, I don’t know if that necessarily means fewer programmers. Although I do think more people will get to be a programmer.

\n\n\n\n

My dream is that every human being has their own open source stack that is completely proprietary to them. That is built and managed by an AI that is completely personal to them. Runs on a device that they own and control.

\n\n\n\n

And so then you can simply describe how you want your life to be, and your personal software stack adapts and makes sure that I only see the information that is valuable and actionable to me. And because of this AIs role in my life, I’m able to get insights about what’s really working, and avoid distractions and nobody will ever be able to spam me again.

\n\n\n\n

I actually literally am building an AI that scrapes the bajillion inscrutable emails from the school and plucks out the things that actually need to go in my calendar. It’s easy now, right? It’s 50 lines of code. And I can do the same thing for other digital parts of my life and just make that whole thing go away.

\n\n\n\n

[00:29:29] Nathan Wrigley: Yeah, I think there’s three places to sit on this seesaw. There’s either I’m terrified by AI, or I’m really pro AI, or I think where I’m finding myself at the minute is more in the middle. There are parts of it that I can see which clearly have enormous utility, and are really going to put us on a rocket ship to Mars if you like.

\n\n\n\n

There’s just no downside, but I think there is a part of me which does genuinely worry about the incentives. Whether or not it’s a great idea to automate all the things. Whether the landscape is just going to become flooded by noise, which actual humans can’t go through. So we then have to employ more AI to figure out how to get rid of the fake content. I’m not a hundred percent sold on it. I can certainly see there’s bits of it which have benefits.

\n\n\n\n

However, I’ve just come back from WordCamp Europe and part of the final address, we had Matt, Josepha and Matias on stage. And Matt is clearly very, very bullish about AI. In the same way that five years ago he was telling everybody to learn JavaScript deeply. I think the lasting message I got certainly from that presentation was start using AI deeply. Obviously you’re an Automattician, what he says matters. I’m just wondering, just to bring it back to WordPress, I’m wondering where we are going to begin to see AI in our WordPress sites? What are the kind of places where we may see it surfacing in the future?

\n\n\n\n

[00:30:51] Dan Walmsley: Yeah, I’m going to start with the quote from Matt, learn AI deeply. We don’t really know where AI is going to go but we see a certain rate of progress. And it’s faster than Moore’s Law. And so if you use an imperfect AI tool today and you get familiar with it and fluent with it, let’s just say GitHub Copilot. You can be pretty sure that tool will accelerate in progress over time. Because it’s already an AI tool that’s like standing on the shoulders of this like industry. So it’s going to get faster, it’s going to get better.

\n\n\n\n

The people who don’t embrace AI are going to continue on their linear or plateau trajectory. And so I feel like any human being alive today should probably start embracing some piece of AI in their life so that they can get a sense for how it’s shifting and changing and improving. So if it’s just a matter of using ChatGPT to like make plugin snippets, oh it’s good at this, it’s not good at that. Make it a habit. Then you’ll bear witness to what’s going on and you’ll know where to jump both feet into the stream and start leveraging this stuff more at scale.

\n\n\n\n

In terms of where we’re going to see it show up in WordPress. I was on a panel recently and one of the things that I said was, a question worth asking is what content management system would an AI choose? If you’re an AI and you’ve been asked to create a website for someone and you haven’t been told what technology to use, would you use WordPress?

\n\n\n\n

And the answer today is, probably. Because most of the public documentation for content management systems is WordPress documentation. So the AI has access to like 20 years of all this stuff. And that’s really, really powerful. It means it can reason about WordPress in a really impressive way.

\n\n\n\n

It’s actually a great testimony to keeping WordPress roughly the same all of that time with minimal breaking changes. Because, you know, one of the things that I’ve noticed is there are lots of breaking changes between libraries in the Python ecosystem. And that means that ChatGPT very rarely writes working Python code for me. I have to modify it to use the latest API or whatever. It almost always produces working PHP WordPress code, because what works hasn’t changed, which is quite amazing.

\n\n\n\n

[00:32:58] Nathan Wrigley: I mean, that is actually phenomenal to see that happen.

\n\n\n\n

[00:33:01] Dan Walmsley: Yeah. Now we have to capitalize on that, but that’s a really great start. And you know what CMS would an AI choose, okay it’s one that it’s familiar with. And then the next level is, well it would be one where you can modify it and extend it easily. WordPress certainly checks that box to infinity, right? There’s all of these existing plugins and an AI can read the documentation of plugins and choose one for you or whatever it needs to do.

\n\n\n\n

So the plugin mechanism is amazing because you can basically take a statement that someone makes about how they want their website to be different, and turn it into a function that runs a bunch of hooks.

\n\n\n\n

It doesn’t have to go modifying the existing code of WordPress and forking it. It can just like inject the things that you ask it for, and correlate them back to the statements that you made. And in the future if it finds out that there was a better way to implement that request then it can implement it differently. Because it has the original things you asked for. So that’s one way I think I see AI helping with WordPress over time. Not that that’s a product that I’ve built I’m just sort of reasoning broadly about it.

\n\n\n\n

[00:33:59] Nathan Wrigley: I think one of the areas that I really would like to see is the ability to leverage what’s just come around. I’m really excited about blocks and block patterns in particular. I’m quite a visual person, so I love to see images of what I’m about to get. And the idea of, I don’t know, I want to build a website for a local industry. A real estate agent, a lawyer or something like that. And the AI has some kind of interpretation of what that means. It probably has a little understanding of the geography of where I live and what kind of imagery might go into a website like that.

\n\n\n\n

I live on the coast and there is some things which people always take pictures of and they often end up on websites for the places where I live. But also it understands typically what a lawyer is, you know? And it would understand that, okay, you probably need a page that has this on it, and a page that needs this on it, and probably a form and blah, blah, blah.

\n\n\n\n

And then it would just throw at me, I don’t know 100, 200 designs, something like that, that I can look at. And because of the fact that it’s all built with blocks I could input that pattern, and then start to tweak things as I like it. I just love the idea of the choice that it might be able to give me, and short circuit, I mean me building 200 different designs, that’s going to take me weeks. This potentially could happen in the blink of an eye and I love that choice.

\n\n\n\n

[00:35:13] Dan Walmsley: Yeah. Think about a few years ago, if you had like a site generator versus a site builder, right? So let’s just say I generated a site and we’ve all be familiar with site generators, you give it like, what kind of color scheme you want and what kind of industry you’re in and kind of thing.

\n\n\n\n

And this has been possible for 10 or 20 years that you can generate a site. But the problem is, okay, now you’ve generated a site and then you make some content and you’re like, ah, I want to change that one decision. Well you can either regenerate it from scratch and blows away everything you’ve done. Or you can try and manually make the change, but you have no idea how to do that because you didn’t build it in the first place. And then you’re going to learn the whole system.

\n\n\n\n

That sort of like magic trick of generating the site back in the day is the thing you can only do once. But in the copilot era, which I think Microsoft correctly identified this paradigm. You can jump in and out of automating the site creation experience as much as you want. And so the idea is, okay, I’m going to generate the content on this page. Jetpack AI block is actually really, really good at this. I’m not here to like boost our products too much. But it’s like a really good example.

\n\n\n\n

You can generate a page and then you can just change the tone of voice. And it will go and take the same content and change the tone of voice, non-destructively, you know what I mean?

\n\n\n\n

And so the AI is able to work with whatever changes you’ve already made and make some more. I think that that’s going to be the paradigm for a long time. And anybody building AI tools needs to be very careful about building the UI in such a way that it takes these hints from the human. And uses them to make the AI better over time. Better at getting the first guess right.

\n\n\n\n

And any company that does that is going to have an AI flywheel. And any company that just generates content directly but doesn’t measure how the users respond to it or interact with it or change it over time is going to be stuck on a plateau, with no way to get to the next level.

\n\n\n\n

[00:37:04] Nathan Wrigley: I really find the whole idea of that curious. Literally you could go to bed one night, wake up in the morning and the AI has decided that we’ve gathered lots of data and well you had a real blitz of users during the course of the night and it’s really shown us that no, they don’t like this bit, so we’ve changed it entirely on your behalf. So it’s like split testing but on steroids.

\n\n\n\n

That seems like a really interesting idea. Obviously people will not wish to hand some aspects of that over but if you can prove that a WooCommerce sale, for example, this configuration of a checkout system seems to be 20 times more popular than this one. Okay, we’re going to get rid of that one. Now we’re going to start working our way through whether we can improve this one. All of that seems to be a bit of a no-brainer.

\n\n\n\n

[00:37:47] Dan Walmsley: Yes. Building an awareness of when humans need to make discriminating decisions, and when you can make them on their behalf. And the product design aspects of what expectations do you set about what’s going to happen, or whether it’s reversible, or whether it requires confirmation or authentication or et cetera, et cetera. Taking a backup.

\n\n\n\n

That’s all stuff that you don’t get for free with AI. That’s all the infrastructure of actually making it useful. And I will say the AI itself is dead simple to use, right? it’s conceptually unbelievably easy. 99.99% of the work is just like aligning the whole rest of the system around it so that you can make sure that customers have a good experience.

\n\n\n\n

The normal stuff of building products, right? Setting expectations, all these different things. It feels different because watching a generative AI talk like a person is weird, but it’s not, it’s not work that requires you go do a deep learning course.

\n\n\n\n

The thing that is transformative about this is it’s generality. These techniques have existed for years. We’ve always been able to classify, well, not always, for a long time been able to classify images for a long time been able to sort of grammatically parse out text or detect languages or sentiment or other things.

\n\n\n\n

But they were all specialized models with vast data sets. And now you can fine tune it on 500 of your own examples and have it go answering entire support requests straight out of your knowledge base. And so it’s that generality that is really powerful.

\n\n\n\n

[00:39:13] Nathan Wrigley: I’m curious to see what the UI for all of these different things are going to be in the future. In the sense that, you know, if you look at WordPress from when you began using it, it’s a very different animal. Although it hasn’t changed dramatically in the last five or six years. When you began using it, it was a different animal to the way it looks now.

\n\n\n\n

And then these sort of page builder technologies came along and further democratized publishing and made things easy and it was a point click interface. I’m just curious to see how, what the pieces are that live inside WordPress. Whether it’s going to be text input. Whether we’re just going to start talking to our website and, you know, move it left a bit, a little bit more, make it red. Not that red, the other red.

\n\n\n\n

I want a picture of a, I don’t know, a sausage over there, that kind of thing. How all this gets surfaced. We’re obviously in the era of trying to get everybody to use Gutenberg. Whether it fits into there or whether we need a brand new interface because the AI will just take care of everything. That bit is for me going to be really interesting.

\n\n\n\n

[00:40:06] Dan Walmsley: Yeah. I’m really excited to see what happens with Gutenberg. I’m completely convinced Gutenberg will not go away. And actually AI makes Gutenberg look like a better and better decision versus the classic editor as AI comes into view.

\n\n\n\n

[00:40:21] Nathan Wrigley: Can you develop on that? I think I know what you mean but I want to hear what you mean. Yeah.

\n\n\n\n

[00:40:25] Dan Walmsley: So having things embedded as blocks with parameters provides a much more semantically rich interface than just a bunch of HTML. It’s similar as to how we see markdown used a lot more in AI than HTML as a formatting language, input, output. And why is that?

\n\n\n\n

Well, it’s because the structure tells you something about the meaning of the document, right? This is a table, this is an image, this is a whatever. Obviously you get an HTML but more sophisticated than that, right? This allows the AI, so say you’ve got like a cover block with an image and a text. This allows the AI to have some confidence about how that’s going to appear when it shows up on a webpage.

\n\n\n\n

As opposed to arbitrary HTML that may be pulling in CSS from various places and like all that kind of stuff. Gutenberg provides an incredible foundation for collaboration. And collaboration is key, right? If we’re talking about the copilot era here, I don’t think for a long, long time we’re ever going to have necessarily AIs. Like you’re not going to have a CMS come out that like, doesn’t have an editor, because it just has a chat interface. You tell the AI what to do and hope that it does the right thing.

\n\n\n\n

Like that’s not going to be the case for a really, really long time, if ever. What you need is an editor where you can seamlessly collaborate with an AI. And if I was to take Matt’s words and bring them back into the conversation about learning AI deeply, I would love to see people in the community experimenting with UX concepts for collab.

\n\n\n\n

We are in the collaboration phase. Now is the time to start bringing your ideas to the table about what it looks like to collaborate with an AI in Gutenberg and how revolutionary that could be.

\n\n\n\n

[00:42:01] Nathan Wrigley: Are you open to those conversations? Is your team keen to hear from the community? And if that’s the case, where do we go to begin that conversation?

\n\n\n\n

[00:42:08] Dan Walmsley: That’s all happening in the open source community. I’ve had a couple of conversations with Matias or others, but really at a high level. I think it’s the community that needs to help drive that. We’ve shown what’s possible with Jetpack AI. It’s like the first quickest, most sane thing we could build.

\n\n\n\n

But in terms of the collaboration phase, my team is aligning the AI efforts of a large multinational corporation across many, many, many different modalities. Not just in the editor, but across image classification, and trust and safety, and all sorts of other things.

\n\n\n\n

On a day-to-day basis I don’t have a huge amount of bandwidth for one thing like the Gutenberg editor but I really encourage the community to get involved and share ideas.

\n\n\n\n

[00:42:53] Nathan Wrigley: Yeah. I’ll put links to the presentation that you were involved in, with, I know it was at least Anne McCarthy. I can’t remember who the other contributors were now but that was really fascinating. Interesting kind of first steps in, well, tell us what we want out of AI because we can see what it can do out in the wild with other things. You mentioned co-pilot and there’s obviously ChatGPT and all fun images that you can create with mangled fingers.

\n\n\n\n

Interesting to find out what the community want from it. How it will look in two or three years time? And getting involved in that conversation could really impact the project right now.

\n\n\n\n

[00:43:25] Dan Walmsley: I would also say, dark horse here, but I would love to see more people get involved in WordPress Playground. So for those don’t know, WordPress Playground they demoed it last year and I was actually in the room in New York for the WordCamp US there.

\n\n\n\n

[00:43:38] Nathan Wrigley: That is some astonishing tech.

\n\n\n\n

[00:43:41] Dan Walmsley: It is game changing. I mean, and it’s funny because it’s on the one hand you could look at it and be like, well, this is like a cute hack, but it’s you know, you would never run a website this way. But think about it, if you’re a person creating or modifying or wanting to come up with a new website. With no hosting, with no nothing, just sitting there like running a blob of JS in the browser.

\n\n\n\n

You can ask an AI to generate the entire site and remix it and destroy it and build it again, and like when you’re happy enough with it, click a button to download and put it on a real web host. It’s lowering the barrier to entry. And I can imagine if we get lots of good contributions, there’s already really good JavaScript API access for saying, install this plugin, or like, modify this file, right?

\n\n\n\n

And so if you go a step further, oh, generate an AI block that does X, Y, Z, right? And if you’re a developer that doesn’t already have WordPress or know WordPress, and you don’t have to pull down PHP, you don’t even have to write PHP. You have this like ephemeral WordPress in the browser and you can see what it’s capable of.

\n\n\n\n

I think that could bring so many potential developers into the WordPress community. Who are able to see what’s possible, have this low barrier entry, who have zero dependencies and can provide plugins and blocks and other cool ideas into the WordPress community who might not have had a chance to contribute before.

\n\n\n\n

[00:44:56] Nathan Wrigley: It’s amazing when you actually use it because you just assume that there’s a machine somewhere remotely that’s serving up that website and it just spun it up in a heartbeat. But of course it’s not. You can entirely unplug from the internet and there it is. It’s still working. And it took all of no seconds at all to get the whole thing going. It’s amazing.

\n\n\n\n

[00:45:17] Dan Walmsley: Yeah, it really is.

\n\n\n\n

[00:45:19] Nathan Wrigley: I will link to that as well. Yep.

\n\n\n\n

[00:45:21] Dan Walmsley: I hope that becomes the way that a lot of people build stuff on WordPress actually. It is a playground. It’s really fun. It reminds me of when I was playing with the first version of WordPress. But it’s just accessible to vastly, vastly more people. You know, anyone with a web browser?

\n\n\n\n

[00:45:35] Nathan Wrigley: Yeah, it’s kind of like having a blank piece of paper next to you, one of a thousand bits of paper that you can just scribble on and screw it up and throw it over your shoulder and, okay, that didn’t work. Let’s try again. We’ll just blank canvas, start again. And actually, I don’t know if you did see the address that Matt gave at WordCamp Europe. That was one of the other things he discussed. So you are very much in alignment.

\n\n\n\n

[00:45:54] Dan Walmsley: It’s in my queue.

\n\n\n\n

[00:45:56] Nathan Wrigley: Okay. Well, sadly, I mean, I could honestly talk about this with very little authority for hours and hours and hours. But we’ve probably used up our allotted time.

\n\n\n\n

Dan, if anybody wants to reach out to you specifically, do you make yourself available in that way? And if so, where do we find you? Are you a Twitter fan? Or are you on, you know, you’re going to throw an email in our direction or a Slack channel? Let us know.

\n\n\n\n

[00:46:17] Dan Walmsley: Well, you can reach me on Twitter. Twitter.com/danwalmsley. d a n w a l m s l e y. It’s a tricky one. And, that’s a start.

\n\n\n\n

[00:46:28] Nathan Wrigley: Perfect. Well, thank you so much for chatting to us today about AI. I’m just sorry that I, uh, I can’t kind of keep up with the level of intelligence that’s probably required to make this conversation worth while, but I appreciate it.

\n\n\n\n

[00:46:40] Dan Walmsley: I super appreciate being on the podcast. I’m really, really excited about the next couple of years. And especially for WordPress. I think we’ve got like a lot of strengths that if we leverage them, can put us in an amazing position to empower a lot of people to, you know, publish and to continue to democratize publishing.

\n
\n\n\n\n

On the podcast today we have Dan Walmsley.

\n\n\n\n

Dan is a long-time user of WordPress, having started using it even before version one was released. With a passion for experimenting with different publishing platforms, Dan eventually discovered WordPress and has been using it ever since. Currently working at Automattic as a Code Wrangler, Dan is part of the Applied AI team. Although the team is relatively new, with only a few members, their mission is to coordinate and guide the various AI initiatives within the company. Recently, he has been focusing on automating internal workflows and communications, a particularly crucial aspect given the distributed work setup, which spans 70 countries and multiple time zones.

\n\n\n\n

We start the conversation talking about Dan’s background. He’s recently decided that AI is a truly transformational technology and so has taken steps to learn the skills needed to understand and implement it.

\n\n\n\n

Dan talks about how Large Language Models work, and how ChatGPT has driven awareness, and demand, for AI technologies in a way that was almost impossible to predict just a year ago. This has caused many companies to become deeply interested in AI and what it can do for their business workflows.

\n\n\n\n

We get into whether the reality of AI can live up to the hype. Do we have enough understanding of AI to know what its impact will be on the workplace, or are we just in the middle of a media frenzy which will die down over time? Dan challenges the notion that AI will take many of our jobs, and emphasises the economic value that AI can bring.

\n\n\n\n

We move on to explore the differences between site generators and site builders, and Dan introduces the concept of the ‘copilot era’ in which website creation can be somewhat automated. He highlights tools like Jetpack AI which can generate content and modify the tone of voice right inside of WordPress.

\n\n\n\n

Dan stresses the importance of building AI tools with user interfaces that learn from human input in order to improve over time. He thinks that companies which measure user responses and interactions will gain a significant advantage in AI development, while those who fail to improve their AI content generation will be left behind.

\n\n\n\n

Whether you’re new to AI or have been paying attention for a while, this podcast offers a fascinating insight into its impact on society, and how it can accelerate progress in fields like scientific research.

\n\n\n\n

Useful links.

\n\n\n\n

Moveable Type

\n\n\n\n

Automattic

\n\n\n\n

LangChain

\n\n\n\n

OpenAI

\n\n\n\n

TypeScript

\n\n\n\n

Andrew Ng’s Deep Learning course

\n\n\n\n

Day One

\n\n\n\n

WooCommerce

\n\n\n\n

Sensai

\n\n\n\n

Google Deep Mind

\n\n\n\n

Perplexity

\n\n\n\n

Stable Diffusion

\n\n\n\n

Google’s ‘Attention is all you need‘ paper

\n\n\n\n

GitHub Copilot

\n\n\n\n

Jetpack AI

\n\n\n\n

AI and the future of WordPress – Panel session

\n\n\n\n

WordPress Playground

\n\n\n\n

Dan’s Twitter

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 02 Aug 2023 14:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Nathan Wrigley\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:22;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:45:\"WPTavern: Jetpack Launches Newsletter Product\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=147385\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"https://wptavern.com/jetpack-launches-newsletter-product\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:6345:\"

Jetpack 12.4 was released today, launching the plugin’s Newsletter product. It allows users to send blog posts as newsletters, without the hassle of having to copy and paste from the WordPress editor into another newsletter service’s campaign editor and reformat it for email. This launch comes seven months after WordPress.com launched its newsletter offering, which uses the same underlying infrastructure to deliver emails.

\n\n\n\n

Jetpack Newsletter is launching as a free product, with a percentage of fees collected from creators who choose to offer paid subscriptions:

\n\n\n\n
\n

Fees are only collected when you accept payments. Fees are based on the Jetpack plan you have and are calculated as a percentage of your revenue from 10% on the Free plan to 2% on the Complete plan (plus Stripe fees). 

\n
\n\n\n\n
\n\n\n\n\n\n\n\n

Jetpack users are probably familiar with the plugin’s ability to send posts to subscribers via email. The newsletter feature uses this same infrastructure that site owners have relied on for years to allow subscribers to get updates in their inboxes when new posts are available.

\n\n\n\n
\n\n\n\n\n\n\n\n

Newsletters can be turned on under the Discussion tab in the Jetpack settings. Many Jetpack users likely already have this turned on.

\n\n\n\n
\n\n\n\n\n\n\n\n

The Subscribe block can be placed anywhere on the site and new subscribers will be sent a confirmation email to confirm their subscription. They have the option to choose between instant, daily, or a weekly digest, as well as control the time and day they receive their digests. Subscribers can also pause or unsubscribe from the site.

\n\n\n\n

Subscriber import and other features, such as newsletter stats for opens and clicks, is available via the Jetpack admin pages on WordPress.com.

\n\n\n\n

At this time, newsletter creators can only import up to 100 subscribers via CSV file. This is severely limiting for all but the smallest of newsletters, but the Jetpack team has confirmed that it is high on their list of priorities to change as it creates too much of a barrier. The limit was set for spam prevention, but it makes it nearly impossible to migrate to Jetpack Newsletter if you have a popular newsletter. Those who are on paid plans can upload unlimited subscribers.

\n\n\n\n
\n\n\n\n\n\n\n\n

Newsletter creators can change the site name and logo for their emails and paid users will have more customization options in the future.

\n\n\n\n

One thing that sets Jetpack Newsletter apart from the vast majority of other traditional email service providers is that it allows unlimited email sends and unlimited subscriber lists for both free and paid users.

\n\n\n\n

Most popular services like Mailchimp, Brevo, and SendGrid, allow only a few hundred emails to be sent per day or up to 1,000 per month for free users. Paid plans get expensive quickly as a newsletter’s subscriber base grows. Emails and subscriber numbers usually determine the pricing for these services, which makes Jetpack’s product stand out from the crowd, especially for those who intend to independently monetize their newsletter through ads and paid sponsorships.

\n\n\n\n

Jetpack Marketing Lead Rob Pugh said that although popular newsletter services are more limited in emails and subscriber numbers, they also offer a completely different feature set. The Jetpack Newsletter product is aimed at competitors like Substack.comBeehiiv.com, and Ghost.org, which also all offer unlimited email sends. On paid plans, Jetpack Newsletter’s offer beats Substack, as it collects 2% (plus Stripe fees) as compared to Substack’s take of 10% plus credit card fees.

\n\n\n\n

Newsletter creators should be aware that Jetpack Newsletter’s unlimited emails and subscribers may not last forever, as the FAQ section of the product states that it is an introductory offer:

\n\n\n\n
\n

As an introductory offer, we do not limit you or charge you based on your email list size. This may change in the future. Fair usage policy applies.

\n
\n\n\n\n

Jetpack representatives were not able to confirm the limits of fair usage or how long the introductory period will last.

\n\n\n\n

“Launching without a limit on emails isn’t the most financially responsible thing, but we’re most excited to get this feature into the hands of people to get feedback,” Pugh said. “We’re focused on the immediate roadmap to make the product better, although there will likely be a limit at some point in the future if we see extreme use from people on free plans.”

\n\n\n\n

He said the Jetpack team goes out of its way to make pricing changes as fairly as possible “and we don’t want to pull the rug out from anyone, so we’ll certainly consider how people are impacted before making changes.” 

\n\n\n\n

Until the limited subscriber import issue has been solved, any pricing changes down the road are only likely to affect newsletters that are just starting out getting people signed up. Apart from this limitation, Jetpack Newsletter is making a competitive debut in the market. For those who are already using Jetpack and have an existing subscriber base, it makes it nearly effortless to add paid subscriptions. Using the block editor is far easier than most newsletter campaign editors out there, and Jetpack streamlines the sending process so creators don’t have to copy and paste between email services.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 01 Aug 2023 22:24:35 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:23;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"WordPress.org blog: WordPress 6.3 Release Candidate 3\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=15615\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"https://wordpress.org/news/2023/08/wordpress-6-3-rc3/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:6189:\"

WordPress 6.3 RC3 is ready for download and testing.

\n\n\n\n

This version of the WordPress software is under development. Please do not install, run, or test this version on production or mission-critical websites. Instead, you should evaluate RC3 on a test server and site. 

\n\n\n\n

The WordPress 6.3 release is scheduled for August 8, 2023—just one week away. Now is your last opportunity to test it before the general release. 

\n\n\n\n

For a deeper look into this release, read this overview of the 6.3 release cycle, check the Make WordPress Core blog for 6.3-related posts, review new features in WordPress 6.3, or watch a recorded demo

\n\n\n\n

What’s new since RC2

\n\n\n\n

Since the RC2 release on July 25, 2023, there have been approximately 14 issues resolved in Github and Trac. To prepare for 6.3 general availability, RC3 also addresses several bugs and adds fixes for retrieving templates (#4940) and resolving child theme issues (#53138). Thank you for testing, WordPressers!

\n\n\n\n

Developers and extenders should review the comprehensive WordPress 6.3 Field Guide for detailed technical notes regarding new features and improvements.

\n\n\n\n

Ways to contribute

\n\n\n\n

WordPress is open source software made possible by the community of people collaborating on and contributing to its development. The resources below outline a variety of ways you can help, regardless of your technical expertise.

\n\n\n\n

Download RC3 for testing

\n\n\n\n

You can test WordPress 6.3 RC3 in three ways:

\n\n\n\n
    \n
  • Option 1: Install and activate the WordPress Beta Tester plugin (select the “Bleeding edge” channel and “Beta/RC Only” stream).
  • \n\n\n\n
  • Option 2: Direct download the RC3 version (zip).
  • \n\n\n\n
  • Option 3: Use the following WP-CLI command:
    wp core update --version=6.3-RC3
  • \n
\n\n\n\n

Keep WordPress bug-free—help with testing

\n\n\n\n

Testing for issues is a critical part of developing any software, and it’s a meaningful way for anyone to contribute—whether you have experience or not. While testing the upgrade process is essential, trying out new features is too.  

\n\n\n\n\n\n\n\n

Search for vulnerabilities

\n\n\n\n

The monetary reward for reporting new, unreleased security vulnerabilities is doubled between the Beta 1 release and the final release candidate (RC). Please follow responsible disclosure practices as detailed in the project’s security practices and policies outlined on the HackerOne page and in the security white paper.

\n\n\n\n

Update your theme or plugin

\n\n\n\n

Do you build themes or plugins? Your products play an integral role in extending the functionality and value of WordPress for users of all types worldwide. 

\n\n\n\n

This is your final opportunity to test your latest versions against RC3. You will want to continue your testing and update the “Tested up to” version in your plugin’s readme file to 6.3. 

\n\n\n\n

If you find compatibility problems, please post detailed information to the support forums.

\n\n\n\n

Help translate WordPress

\n\n\n\n

Do you speak a language other than English? ¿Español? Français? Português? Русский? 日本? Help translate WordPress into more than 100 languages. 

\n\n\n\n

Release the haiku

\n\n\n\n

Phase two, soon complete
A monumental release
Then onto six-four.

\n\n\n\n

Thank you to the contributors who collaborated on this post: @Meher, @DanSoschin, and @jpantani

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 01 Aug 2023 16:55:21 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:16:\"Jonathan Pantani\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:24;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:88:\"Do The Woo Community: Welcome Katie Keith from Barn2 Plugins to the Do the Woo Host Team\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"https://dothewoo.io/?p=75760\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:52:\"https://dothewoo.io/katie-keith-new-do-the-woo-host/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:446:\"

Today Marcus talks with his new co-host of Woo BizChat, Katie Keith, as she shares her Woo story and what you can expect from these two moving forward.

\n

>> The post Welcome Katie Keith from Barn2 Plugins to the Do the Woo Host Team appeared first on Do the Woo - a WooCommerce Builder Community .

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 01 Aug 2023 10:25:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"BobWP\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:25;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:58:\"WPTavern: Start Testing WordPress’ New Interactivity API\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=147355\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:66:\"https://wptavern.com/start-testing-wordpress-new-interactivity-api\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:2510:\"

Earlier this year, WordPress contributors announced that they are working on a new Interactivity API that will allow developers to build interactive blocks. This API will support the kinds of frontend experiences that let visitors interact with content and get feedback without having to refresh the page.

\n\n\n\n

Automattic-sponsored contributor Luis Herranz, who has been working on the API, is now encouraging developers to test it with their own blocks. Gutenberg 16.2 included the Interactivity API under the Experiments flag and this version or later is required for testing it.

\n\n\n\n

Developers can follow the API’s “Getting Started” guide on GitHub to scaffold an interactive block with `@wordpress/create-block`. Take a look at the roadmap, which has an extensive list of tasks the team has in mind for the initiative and will include tracking issues for features as they progress.

\n\n\n\n

Those who are testing the Interactivity API can follow and participate in the discussions happening in the new Interactivity API category on GitHub. This early testing invitation is for those who are eager to help shape the API and offer feedback.

\n\n\n\n

“If you want to use the Interactivity API in your projects, please subscribe to this discussion where we will provide updates with instructions for migrating your code each time there is a breaking change,” Herranz said.

\n\n\n\n

There is no official documentation yet, but a the team is working towards creating a bare-bones version first which will be used as the base for the official docs further down the road. The documentation efforts are being led by Automattic-sponsored contributor JuanMa Garrido and anyone willing to collaborate is invited to join the conversation on GitHub.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 31 Jul 2023 21:38:47 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:26;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:56:\"WordPress.org blog: People of WordPress: Ihtisham Zahoor\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=15589\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:71:\"https://wordpress.org/news/2023/07/people-of-wordpress-ihtisham-zahoor/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:10231:\"

From administrator to web developer thanks to the supportive WordPress community. Through learning from other software users in Pakistan, Ihtisham Zahoor knew that his life would change. He moved cities and careers to make his life through open source.

\n\n\n\n

The People of WordPress series shares inspiring stories of how people’s lives can change for the better through WordPress and its global community of contributors.

\n\n\n\n\"Ihtisham\n\n\n\n

Ihtisham, from Haripur, a city in northern Pakistan, said: “The WordPress community made me a firm believer in the power of open source software. This is why I am an enthusiast and one who enjoys contributing back to the community via writing, speaking, and helping organize meetups.”

\n\n\n\n

When Ihtisham discovered WordPress, his fascination for working with computing grew. He knew he did not want to just work in administration his entire career.

\n\n\n\n

Ihitsham describes himself as an ‘introvert’ and therefore the idea of remote work appealed as he could still add value to others through technology. He was intrigued by the thought of the freedom to choose his work hours. However, without access to others who had already transformed their careers and lives through web development, he felt he ‘had no path to follow to turn my dream into a reality.’

\n\n\n\n

Challenges become opportunities to learn when there is an active community  

\n\n\n\n\"Ihtisham\n\n\n\n

Lacking any kind of informed support network to advise or guide him, Ihtisham devoted time to online research to find the next steps he could take. Looking back, he believes that for those who are not in a network with others with similar interests, it can be hard to keep learning and experimenting with new things. Isolation can be a barrier to working in web development.  

\n\n\n\n

He said: “I think it is not easy to stay motivated when there aren’t immediate rewards for the hard work we do. Sometimes, weeks would go by when my only focus would be to stay motivated rather than give up.”

\n\n\n\n

After another two years of combining learning and work, Ihtisham took up using WordPress as a full-time career. He moved to the capital of Pakistan, Islamabad. It was not easy at first. He recalls: “After many failed attempts at getting hired and desperate moments, I finally received an offer from a digital agency as a web developer focused on the WordPress platform.”

\n\n\n\n

He added: “Moving to work with a bigger agency was one of the best decisions of my life as it helped me with my professional growth by becoming familiar with the whole WordPress ecosystem in a supportive environment. I was valued for my opinions in the web projects in which I was involved. I was also appreciated and encouraged for the open source work I did for the company.” He summarized his enthusiasm for WordPress like this: “It is really interesting figuring out what is happening in the backends. I like problem-solving and finding solutions which you can do with WordPress.”

\n\n\n\n

During the Covid-19 pandemic, Ihtisham moved to join a start-up based in his hometown which provides web development services to international clients. He works as a developer and has the opportunity to learn more about client communication and project management. “WordPress has opened up so many opportunities for me. It has been an exciting journey for me with lots of learning every day,” he said. In particular, he has discovered an interest in APIs and regularly uses his spare time to follow tickets in the hope of one day contributing even more to topics, such as, third-party app integration through APIs on WordPress sites.

\n\n\n\n

Give back through WordPress community

\n\n\n\n\"Ihtisham\n\n\n\n

It was not just software that made a difference in Ihtisham’s life. Joining a welcoming and sharing community was transforming for him. Recalling those early days of isolation, he values the WordPress community and is wholly committed to the power of open-source software. He now enjoys writing, speaking, and organizing meetups to give back to both to the community. He has written software for the platform and contributes to the Core work, which he describes as a ‘humbling’ experience. He is fond of WordCamp Islamabad and in 2023 is on the organizing team to help bring both WordPress and its community to others in Pakistan.

\n\n\n\n

“My first experience,” he said, “was that everyone was so friendly and open to sharing what they have learned, even though they were all busy working. This really had an impact on me. It really helped me and gave me the confidence that I could work with WordPress…. It was a real step forward for me joining this community.”

\n\n\n\n\"Ihtisham\n\n\n\n

A particular meeting in 2018 led to new friendships through the WordPress community. Ihtisham was on a train to Karachi for the first ever Pakistani WordCamp in 2018 and met a group of fellow attendees he now regards as close friends. What impressed him most about the camp was that although he met many people with considerable expertise, they also had a generosity of spirit and humbleness in their willingness to share this knowledge. in sharing it. Now, he and this group of friends make a point to taking trains across the country, which allows him to fulfil another dream of traveling widely. He says these things and other ‘side benefits’ have been made possible by the WordPress community, and for that, he is ‘forever grateful’.

Ihtisham particularly wanted to share his story through this People of WordPress article to encourage those starting with little or no support to remain persistent. He knows from experience breaking into the tech world can be hard, especially when you may be switching from doing something else and have no ‘track record’ to offer.

\n\n\n\n

He feels he is a living example of how perseverance can lead to success. He offers these words to anyone thinking of making a move into development using the WordPress platform: “I attribute my success (financial and mental well-being) to the open-source nature of WordPress and its amazing community. It would not be possible to learn and use the plethora of free tools WordPress provides if it weren’t an open-source platform. It is for that reason I feel obligated to contribute back to this platform to the best of my abilities.” To those who are finding getting going difficult, as he did, he adds: “Get yourself a clear learning path and just dive in doing WordPress, and things will get better for you over time as they were for me, I promise. Good Luck!”

\n\n\n\n

Share the stories

\n\n\n\n

Help share these stories of open source contributors and continue to grow the community. Meet more WordPressers in the People of WordPress series.

\n\n\n\n

To help you discover more about how to use the WordPress software, there is a free resource from the community, Learn.WordPress.org

\n\n\n\n

Contributors

\n\n\n\n

Thanks to Ihtisham Zahoor (@shaampk1) for sharing about his adventures in WordPress.

\n\n\n\n

Thank you to Abha Thakor (@webcommsat), Nalini Thakor (@nalininonstopnewsuk), and Meher Bala (@meher) for interviews, the feature and collaborating on images. To Chloe Bringmann (@cbringmann), Mark Smallman (@marks99), and Mary Baum (@marybaum) for reviews. Thanks to the late Surendra Thakor (@sthakor), Maja Loncar (@majaloncar), Maedah Bahtool (@maedahbatool) and other members of the Marketing and Polyglots Team for their contributions.

\n\n\n

The People of WordPress series thanks Josepha Haden (@chanthaboune) and Topher DeRosia (@topher1kenobe) for their support.

\n\n\n
\"HeroPress
\n

This People of WordPress feature is inspired by an essay originally published on HeroPress.com, a community initiative created by Topher DeRosia. It highlights people in the WordPress community who have overcome barriers and whose stories might otherwise go unheard. #HeroPress

\n
\n\n\n

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 31 Jul 2023 20:22:31 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:11:\"Abha Thakor\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:27;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:93:\"WPTavern: WordPress Performance Analysis Finds Translations May Significantly Slow Down Sites\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=147322\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:104:\"https://wptavern.com/wordpress-performance-analysis-finds-translations-may-significantly-slow-down-sites\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:3110:\"

After a recent in-depth performance analysis earlier this year showed that translations can have an impact on server response times, WordPress contributors are proposing half a dozen technical solutions for consideration to improve performance for the ~56% of WordPress sites that use translations.

\n\n\n\n

“Initial benchmarks showed that the median loading time for a localized site can be up to 50% slower than for non-localized sites, depending on which themes and plugins are being used,” Google-sponsored WordPress core committer Pascal Birchler said.

\n\n\n\n

Based on recent discussions on GitHub, the Performance team has whittled it down to an updated list of six possible top contenders for speeding up sites with translations, including the advantages and disadvantages of each:

\n\n\n\n
    \n
  • Solution A: Use different file format
  • \n\n\n\n
  • Solution B: Native gettext extension
  • \n\n\n\n
  • Solution C: Cache translations
  • \n\n\n\n
  • Solution D: Lazily evaluated translation calls
  • \n\n\n\n
  • Solution E: Optimize/Rewrite existing MO parser
  • \n\n\n\n
  • Solution F: Splitting up translation files
  • \n
\n\n\n\n

Localized WordPress sites currently download .po and .mo files that contain the translations, but the first suggested solution proposes storing translations in .php files and using the .mo file as a fallback, as Birchler proposes that PHP loading and executing another PHP file would be a faster approach. He has a proof of concept on GitHub at at swissspidy/wp-php-translation-files and swissspidy/ginger-mo.

\n\n\n\n

“When looking at all these factors, it appears that a revamped translations parser (solution E) could bring the most significant improvements to all localized WordPress sites,” Birchler said. “Especially when combined with a new PHP translation file format (solution A), which Ginger MO supports, the i18n overhead becomes negligible. Of course the same risks associated with introducing a new format apply.

\n\n\n\n

“On top of that, a revamped i18n library like Ginger MO could also be combined with other solutions such as caching or dynamic MO loading to potentially gain further improvements. However, those routes have yet to be explored.”

\n\n\n\n

The Performance team plans to test these ideas further on a wider scale through its Performance Lab feature project after gathering feedback from the broader community. August 6, 2023, is the deadline for leaving feedback on the proposal, which includes benchmarks and more details from the analysis.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 31 Jul 2023 19:29:02 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:28;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"BuddyPress: BP Classic 1.0.0\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"https://buddypress.org/?p=330594\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:48:\"https://buddypress.org/2023/07/bp-classic-1-0-0/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:8040:\"

Dear end-users, site owners,

\n\n\n\n

The BP Classic BuddyPress Add-on has been built to provide backwards compatibility for sites that will not be ready yet for the important changes we will introduce in BuddyPress’s next major release, 12.0.0. As we will soon publish the first pre-release version (beta1) of BuddyPress 12.0.0, we thought it was a good idea to have this compatibility add-on available right away in the WordPress Plugin Directory.

\n\n\n\n\n\n\n
\n\"11.0.0
\n\n\n
\n\n\n\n

On the 11.0.0 “hello screen” that is shown when you activate BuddyPress or that you can reach from the “Hello, BuddyPress!” link of the BuddyPress plugin row of your Installed Plugins Administration, we explained our plan for this move, today we’re making the orange highlighted text concrete.

\n\n\n\n
\n\n\n\n

Will my site be affected / do I need to install BP Classic \"😱\" ?

\n\n\n\n

There’s no easy answer to these questions: it depends on how you use BuddyPress on your WordPress site. Let’s take some examples.

\n\n\n\n

I use the BP Default theme:

\n\n\n
\n\"BP
\n\n\n
\n\n\n\n

 You absolutely need BP Classic   because we removed this theme from the BuddyPress plugin as we deprecated it almost 10 years ago.

\n\n\n\n

PS: If you’d copy the bp-default directory inside your /wp-content/themes directory, you’d still need BP Classic as BP Default uses functions we will deprecate in BuddyPress 12.0.0.

\n\n\n\n

I want to keep using BP Legacy Widgets:

\n\n\n
\n\"The
\n\n\n
\n\n\n\n

 You absolutely need BP Classic  because after having migrated these to Block Widgets in 9.0.0, we decided to move them into the BP Classic Add-on. 3 major versions later, we believe we’ve offered enough time to migrate your Legacy Widgets to the new Block versions.

\n\n\n\n

I’m using a 3rd party BuddyPress theme and/or 3rd party BuddyPress plugins:

\n\n\n\n

It’s too early to say/predict \"🔮\".

\n\n\n\n

We really hope that authors will update their code during the BuddyPress 12.0.0 beta period. We decided to make it last a least 3 months and started to document the changes for our 2 most used APIs. You can help us by contacting their support team to draw their attention on the importance of beta testing BuddyPress 12.0.0 with their plugins/themes to check their compatibility and eventually adapt their code.

\n\n\n\n

NB: in BP Classic & BuddyPress 12.0.0 we’ve tried to consider all scenarios, including the possibility that no plugin/theme authors would update their code. If you don’t want to take any risk, you can already activate BP Classic in anticipation of the 12.0.0 upgrade which should happen on October 30.

\n\n\n\n
\n\n\n\n

What is BP Classic doing, exactly?

\n\n\n\n

Apart from becoming the new home for the BP Default theme and the BP Legacy widgets, BP Classic mainly neutralizes the important change we are introducing in version 12.0.0 about the way BuddyPress will build, parse & analyze URLs from now on. In other words, it preserves the BP Legacy URL parser and disables the new BP Rewrites API.

\n\n\n\n
\n\n\n
\n\"BP
\n\n\n
\n\n\n\n

Above is a screenshot of what happens if you activate BP Classic in concert with a BuddyPress version < 12.0.0, for example the current stable version 11.2.0. A warning notice is displayed every week to remind you this activated plugin is in sleep mode and will wake up once BuddyPress will be upgraded to 12.0.0. You can decide to deactivate it and reactivate a bit before October 30, or leave it active in anticipation of this date.

\n\n\n\n
\n\n\n
\n\"BP
\n\n\n
\n\n\n\n

Once BuddyPress has been upgraded to 12.0.0, the most visible part of it in your WordPress Administration will be the BuddyPress settings pane. 12.0.0 will replace the “Pages” tab with a new “URLs” tab to allow full customization of every possible BuddyPress URL, BP Classic will carry on using WordPress pages for component directories and will keep this “Pages” tab in place.

\n\n\n\n
\n
\n\n\n\n
\n\n
\n\n\n\n
\n
\n\n\n\n

We’re aware such a big change may worry you, we have until October 30 to prepare it, let’s all work together to make it a successful first step of the BuddyPress reboot we told you about in reply to your feedback.

\n\n\n\n

If you have questions about this change, we invite you to share them with us as replies to this forum topic. We’ll take the time to give you answers.

\n\n\n\n
\n\n\n\n

Many thanks to @dcavins for his review \"😍\"

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 31 Jul 2023 17:08:50 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:12:\"Mathieu Viet\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:29;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:88:\"Gutenberg Times: Gutenberg Changelog #87 – Patterns, Gutenberg 16.3 and WordPress 6.3.\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"https://gutenbergtimes.com/?post_type=podcast&p=25089\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:58:\"https://gutenbergtimes.com/podcast/gutenberg-changelog-87/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:57711:\"

Anne McCarthy and Birgit Pauli-Haack chat about patterns, Gutenberg 16.3 and WordPress 6.3.

\n\n\n\n

Show Notes / Transcript

\n\n\n\n\n\n\n\n

Show Notes

\n\n\n\n

Anne McCarthy

\n\n\n\n\n\n\n\n

WordPress 6.3

\n\n\n\n\n\n\n\n

Gutenberg 16.3

\n\n\n\n\n\n\n\n

Stay in Touch

\n\n\n\n
\n\n
\n\n\n\n

Transcript

\n\n\n\n

Birgit Pauli-Haack: Well, hello and welcome to our 87th episode of the Gutenberg Changelog podcast. In today’s episode, we will talk about Gutenberg 16.3 and WordPress 6.3. I’m your host, Birgit Pauli-Haack, curator at the Gutenberg Times and a full-time core contributor for the WordPress open source project. And today, I have the special pleasure of welcoming Anne McCarthy on the podcast with me. Anne is a product manager in Automattic and also a sponsored contributor on the Automattic’s Five for the Future program. I’m thrilled to have you on, Anne, how are you today?

\n\n\n\n

Anne McCarthy: I’m thrilled to be here, so thank you for having me. I’m doing pretty well, I’m talking all about WordPress all day, which is a wonderful day in my book, so.

\n\n\n\n

Birgit Pauli-Haack: In mine too. Yeah, so that’s why we’re good on this podcast together. So, you are just coming from the latest Hallway Hangout with the performance team. I know it’s only a half an hour ago or so, is there anything on the takeaways that you want to share right here with the listeners?

\n\n\n\n

Anne McCarthy: Yeah, so one of the things that stood out to me on the call, and beyond just the performance improvements that will be out of the box when you’re using WordPress, is a resolution to a 14-year-old track ticket, which blew my mind, where WordPress 6.3 will actually introduce support for registering scripts with async and defer attributes. And the reason I bring this up, it’s all part of the script API, is that people have to adopt it to see the impact. So, this is something that’s bundled under performance improvements and something that actually wasn’t on my radar in the same way, but I wanted to call it out for plugin authors because it’s one of those things that we need people to adopt in order to see the benefits.

\n\n\n\n

And there’s also great backwards compatibility. One of the things Felix called out was, let’s say you have a really large plugin and you have your own extensions within that plugin sphere, if those extensions haven’t adopted these changes, it will default to a more conservative approach. Meaning, there’s backwards compatibility, and if they’re… All of your extensions have it, your major plugin has it, and anything dependent on that major plugin that has that script in place and has the defer async attributes in place, will then upgrade automatically to use the new and improved stuff. So, I just wanted to call that out, I think it’s a great thing to have in place and we just need folks to adopt it. So, that was a big takeaway for me, beyond just the many improvements.

\n\n\n\n

And the last thing I’ll say is we did a data deep dive live on the call, looking at graphs and all this nerdy stuff, which was awesome, showing that basically after releases came out, seeing improvements in things like Core Web Vitals and actually in the data, which proves things from the lab. They talk about, “The lab shows this,” so meaning the confined environment versus in the field, so what you actually see in the real world, and what’s being shown in the lab ahead of WordPress releases is being proven in the field on live sites that are being indexed. So, that was really exciting to see. I don’t fully understand every aspect of the data but it was cool to go through with people who do.

\n\n\n\n

Birgit Pauli-Haack: Well, thank you so much for this just-in-time note about the Hallway Hangout. I know your process is that the Hangouts were recorded and you will make a post on the Make Blog in the next few days, where you summarize it and then have all the resources linked up on the post. I also will dig into a little earlier this year, I don’t know if it was April or May, Felix Arntz, from the performance team, also posted a blog post about the changes and how the improvements were with block themes and these kinds of things. But I think there was one on the Make Blog but they were also on his personal blog.

\n\n\n\n

So, I’m going to link that up just to recall that, it was also in the weekend edition but not everybody reads that, or remembers that. I don’t always remember things, but I know it was in there. Yeah, so performance has been a big, big improvement on WordPress, I saw something like 17% with classic themes and about 20% with block themes, right out of the box, if you don’t slow your site down with very old plugins, of course. But that’s another story and outside the scope of this Changelog podcast episode. So, thank you so much. Yeah.

\n\n\n\n

Anne McCarthy: Yeah, thanks for giving us space to talk about that, it’s exciting.

\n\n\n\n

Listener Questions

\n\n\n\n

Birgit Pauli-Haack: Yeah. So, I got an email from a listener, thank you so much, an accessibility advocate, and she wanted to know about the best practices to build sites with sidebars on the block themes, and those are read through assistive technology. So, screen readers, when they come to a website, they use the script to content link that comes out automatically with WordPress, but that skip the content also needs a target where to stop.

\n\n\n\n

So, content needs to be tagged with main to actually have that work. If people are creating sites or layouts with column blocks and each column doesn’t have any tag, but one is a sidebar that’s a reusable block, or it’s a template part, it will read through that every single time on every page, if it’s not tagged non-content, or a sidebar, or side, or something like that, or the main content is not tagged. Now, you couldn’t do that with a classic theme from a user interface, but you can do it actually with a group block that has these HTML elements that you can designate your content being either a main or a side. But the most important part is that you wrap whatever sidebar you have into a group block and then select those HTML elements. They’re also not very prominent, they’re in the advanced section.

\n\n\n\n

So, I just wanted to, those who are creating themes through the site editor or helping others to create templates, to be aware of these accessibility ramifications, or to make it known what people who are not visually impaired can see, that that’s repeated content, but the screen readers that help those that are impaired to go through the internet websites need a little help from the content creators or from the template creators. So, I’m sure there will be some more information about that, I just wanted you to be aware, and thank you for the listener to pick up on that and point that out. Accessibility is such an important part of web design and web building, that we need to make sure that if we use just the interfaces that we have those tools in place.

\n\n\n\n

Anne McCarthy: I couldn’t agree more. Thanks for going through that too, it’s always good to learn about this stuff and to make sure that the default implementation ideally, can be done well. And this is where folks can create patterns into the parts to have this set up automatically in their themes with the right stuff in place. So I also encourage blocking authors to think about that.

\n\n\n\n

Birgit Pauli-Haack: Yeah. And I think it’s sometimes really hard on the user documentation to point out the higher ramification. If you just point out this little piece on the sidebar that is a new interface, what is the bigger objective for that? 

\n\n\n\n

Announcements

\n\n\n\n

So, I’m really glad that the listener sent me that email and let me know about that, that’s a good question. So, Anne, you just published a post on the news site, speaking of changes for wordpress.org and it’s titled, Synced Patterns: the Evolution of Reusable Blocks. On the Podcast, we talked a little bit about the upcoming changes, so what is this post all about?

\n\n\n\n

Anne McCarthy: Yeah, so this builds on work that’s done in 6.3, to bring the creation of patterns to the experience, and that’s part of that you can sync or unsync patterns, which basically consolidates the concept of reusable block into the new concept of synced patterns. So this post is just trying to flag the change for people because reusable blocks is a known concept in the WordPress community, and retiring such a known concept deserves a lot of attention. And as part of this, there will be documentation updated, I am keeping an eye on that there, but this is just one of many efforts, including nudges in the interface to help communicate this change to folks. So, just see this as part of a larger effort to make sure that we’re bringing folks along as things evolve. I’m personally really excited because I think compared to the concept of reusable blocks, which sounds almost more technical than it should be, I think patterns is a much more approachable concept for folks to get behind and to use.

\n\n\n\n

So, I’m really excited and I hope it helps surface this more for folks, whenever they’re working with WordPress. But yeah, it’s pretty exciting. So, unseen patterns are essentially what you know and love as patterns today, you can put them in your post or page or template and customize it as you’d like, it’s not synced across the entire system. Sync patterns are just exactly how our usable blocks worked. They’re synced across things, you can have a way to convert to blocks if you want to edit it individually and turn it into an unsynced pattern. But yeah, there’ll be a whole interface to manage all your patterns, if you’re using a block theme, if you’re using a classic theme, we basically just reuse what’s in place for the reusable block screen. So, honestly, it’s a lot of just interface changes for, if you’re using a classic theme and for a block theme it unlocks a lot of functionality in terms of being able to manage all your patterns across themes and plugins and all sorts of stuff.

\n\n\n\n

So, yeah, it’s a huge, huge step forward and a big change, so hopefully this helps get you prepared, and if you have questions or things that you want answered, yeah, I’m @annezazu, Let me know what we’re not thinking about because I’m sure there’s a lot.

\n\n\n\n

Birgit Pauli-Haack: Yeah, and I had some conversations before in the last two months, once I saw that this change is going to come, and I was really excited that finally we have the feature to grade your own patterns in your own site. I think there were quite a few plugins out there that had very high installs and it’s now coming to core. I think the design team and the developers did a great job in just changing the name but leave everything else in place, for those who use reusable block or created reusable block, everything will be familiar, just the names are going to change. The concept itself is not necessarily retired, it’s just going to build into the pattern metaphor more. Because really, the only difference between a pattern and a reusable block was the synchronization over the instances. Yeah, definitely.

\n\n\n\n

Yeah, so we talked about it here at the podcast before and it brings us a leap forward, it also opens up the doors to additional changes. Because what I hear also, and you probably hear it even more, is what’s missing is that if you have a pattern and that’s used around the website, but all of a sudden you want to change styles, you’re not catching every pattern because you need to open up that, switch it out, you have to work around that. And so, partial synced patterns are now possible because we have an interface now, and it’s certainly further down the roadmap to find a way for the canvas to remember this was an unsynced pattern, but it can be partially synced. Because that is certainly missing in between where you don’t want to update content but you want to update the styling here, and the content stays the same that it was there.

\n\n\n\n

So, it’s all a little bit… But bringing it all together is reducing the cognitive load on things and have it all in one metaphor rather than have different ways on doing things. And you’ll find it just the same way you found it before. The icons are the same and the color is the same and the list views… I think you’ll find that the switch over to the new thing from reusable block to sync pattern is relatively… I wanted to say harmless, but smooth. Painless is, I think, the one that I was looking for.

\n\n\n\n

Anne McCarthy: Yes.

\n\n\n\n

What’s Released – WordPress 6.3

\n\n\n\n

Birgit Pauli-Haack: So, that brings us to our section on what’s released. WordPress 6.3 is coming fast, Release Candidate 2 is out, has been out since the beginning of the week, and is ready for testing. The final release is scheduled for August 8th, and that’s less than two weeks to go. So, what’s the latest information about 6.3? Is everything on track? The dev notes have been out, your post is out about the sync patterns, you also published a post about the accessibility improvements and there have been a ton of dev notes also for the performance improvements. Is there anything else that has been new or what are the features that you are most excited about?

\n\n\n\n

Anne McCarthy: Oh man, that’s a great question.

\n\n\n\n

Birgit Pauli-Haack: Can you pick?

\n\n\n\n

Anne McCarthy: Yeah, can I pick? I will say, actually, I’m very excited… I did a YouTube video on this. There’s some hidden features and one of them, that’s not really hidden, but I think it can be taken for granted, it’s really the block theme previews. That has been something, that people have been unable to preview a block theme. So to even try to explore a required setting up a test site required, or just fully activating it without knowing how it might impact your site, and the ability to preview… And the preview uses the site editor, so you’re both getting a sense of what the theme will do, how it might impact your site, what bells and whistles it has, and it allows you to actually dive into the site editor itself and get a feel for it. And I’m just completely excited about that.

\n\n\n\n

I think that will be a huge thing with adoption that will be the unsung hero of this release in my mind. It’s been something that’s been a pain point for a long time and a lot of work went in to make it smooth, and yeah, it’s something I’m very excited to play around with and to see how it impacts things and helps folks step into that world. The only other thing… Thank you for calling out the accessibility improvements as well, so much work has gone into that with a lot of these features and more work remains to be done. But I’m in particular excited about some of the improvements to List View, which I know Alex Stein spent a lot of time doing, and so I want to call that out in particular as something that I’m quite excited about. I think the only other thing on my mind relates to, right now, there is some conversation around footnotes and how footnotes are being stored, and there’s some interesting dialogue there.

\n\n\n\n

I think we’ll end up seeing fixes get in place for it, but it’s just neat how these tiny blocks that are packed full of power are continuing to be iterated on at this point and getting bug fixes. So thank you to everyone who’s testing, because a lot of that has come from testing and feedback. And I know it might seem like, oh, we’re in the RC, things are smooth sailing, but you never know. We’ve had to remove stuff, we had to remove something in 6.2, so we still have time for the final release and we want it to be as polished and bug-free as possible.

\n\n\n\n

So it’s a very high impact time to be testing WordPress 6.3. This is actually my favorite time, because if you find something now, it’s also not great, but if you find something now, you prevent it for millions of people, so I think it’s a really exciting and important time. But there’s nothing, I’m trying to think of anything else in my mind that’s super… Beyond all this pattern stuff and all the other stuff that we’ve been talking about, but the blocking previews really does stand out to me personally, as something as I’m particularly excited about.

\n\n\n\n

Birgit Pauli-Haack: I really like how the style book is happening around the site editor, that you can really see all the… Even if you change something on the style variation and then propagate it, you see how it changes all the blocks, or if it doesn’t change the blocks. So, is the theme preview actually also using the style book? If you go into a preview and then you see the site editor, can you access the style book to see how the…

\n\n\n\n

Anne McCarthy: Yes.

\n\n\n\n

Birgit Pauli-Haack: Yes. Yeah, that’s what I thought.

\n\n\n\n

Anne McCarthy: Yes, you can. Yeah, the entire site editor is using the preview, it’s amazing. The main thing that’s missing right now that some folks have brought up is the ability to schedule and save this draft, those different things. So that is work that needs to be done, that got brought up in the product demo, that needs to be done still, but we’ll get there. I think that’s part of the fun about iterating on this stuff, is like, yeah, yeah, totally, that is part of the roadmap, that’s something we’ll get to.

\n\n\n\n

Birgit Pauli-Haack: I still remember the excitement, when the customers got that feature to schedule updates.

\n\n\n\n

Anne McCarthy: Really?

\n\n\n\n

Birgit Pauli-Haack: Yeah, where people got ready for Christmas changes or for special sales on their website and then they could put it in the customizer and schedule it and then go on vacation or whatever.

\n\n\n\n

Anne McCarthy: Which is very cool.

\n\n\n\n

Birgit Pauli-Haack: Yeah, which is really cool. And it wasn’t so long ago, so that’s why people are still, come from that excitement and find it missing. But yeah, getting the previous in is really big. Yeah, absolutely.

\n\n\n\n

Anne McCarthy: Yeah.

\n\n\n\n

Birgit Pauli-Haack: So…

\n\n\n\n

Anne McCarthy: Now, also…

\n\n\n\n

Birgit Pauli-Haack: Mm-hmm, go ahead.

\n\n\n\n

Anne McCarthy: Revisions is the only other one that just came to mind, as we’re talking about revisions and saving and all that sort of stuff. The visual nature of the star revisions is so cool. Template and template part revisions didn’t make it for 6.3, but I’m hoping to see that in 6.4, and I think when that completion happens, I’m curious to see what kind of confusion might come up around if you have multiple different… I’ve already noticed that, some calls for testing, where people are like, oh, I made a change to the title of this, whatever, and then try to roll back with star revisions, and it’s like, oh no, you actually need do that with template revisions. So, having an intelligent system that works and makes sense, you know where to roll back, but there’s been so much good feedback about how visual and easy and beautiful the star revisions are. So, that’s another hidden feature that I like to talk about.

\n\n\n\n

Birgit Pauli-Haack: Yeah, that’s great. The hidden features of 6.3, with Anne McCarthy. Yeah.

\n\n\n\n

Anne McCarthy: Could be here for two hours if I do that.

\n\n\n\n

Birgit Pauli-Haack: Well, we have an open-ended thing here. Sooner or later I need to go to bed though. So, Anne and I, we are nine hours apart. So, Anne just got up and I’m at the end of the day, so. 

\n\n\n\n

Gutenberg 16.3

\n\n\n\n

So, Gutenberg 16.3, last time I looked it was about 180 PRs…

\n\n\n\n

Anne McCarthy: Ooh.

\n\n\n\n

Enhancements

\n\n\n\n

Birgit Pauli-Haack: …it’s one of the larger Gutenberg releases from 54 contributors. Two of them were first timers, and I think it was a lot of polishing and bug fixes, but there were also a few enhancements that made it into 6.3, and some of them don’t, probably, but let’s talk about them. So, the first one that I see was that you can have more intuitive archive titles for your query title block, there’s quite a few changes around that. Those don’t make it into 6.3 though, but it’s because it’s the first time it’s in there I think. So you can change the titles of your archive pages, remove the archive type, and what else is in there? 

\n\n\n\n

Anne McCarthy: I think this is hugely helpful because this is definitely something where we’ve gotten feedback from folks, where it was too generic before, it just showed archive title or whatever. It would not say specifically what you’re looking at, and when you’re creating a new template and you’re a first time user you might delete it, because you don’t know what it is. So knowing what it powers, knowing what it does, it’s a huge step up and I’m quite excited about this.

\n\n\n\n

Birgit Pauli-Haack: Yeah, yeah. And then the whole change the title of your archive pages is such an improvement towards the classic experience, because you always needed a developer to remove something or to change the title and now you can do it by yourself and you can create any kind of different templates with a query block, or the post template block. Yeah. So, yeah, next up is the add, renaming, duplication, and deletion option to patterns. That’s certainly coming into 6.3, patterns now have a dropdown menu, you can assess the three dots and then allow you to rename, duplicate and delete patterns easily. It wasn’t easy to do that before, especially the removal of patterns from your my patterns kind of thing. Yeah, it was a little bit convoluted because it wasn’t through the editor, now you can do it all through the editor. Yeah.

\n\n\n\n

Anne McCarthy: I’ll also note, one of the reasons why this is also so important to get in and why it was backported in my opinion, is that when you are setting… You create a pattern and you set the sync status, so synced or unsynced, you cannot change that status after the fact. So, let’s say you make a mistake, you create an unsync and you’re like, wait, actually, I want this to be synced. Before you’d have to go in and copy/paste, this whole convoluted process, now, with the duplication you can duplicate, and when you duplicate you can basically decide the sync status. So that’s one of the things that came up, was we wanted a way to make it easy to give people control without having the option to change the sync status back and forth because that will create some muddiness.

\n\n\n\n

Let’s say you synced a pattern and then you randomly unsynced it two months later, imagine how that might create some chaos across your site. So, to limit that, we just basically said you cannot change the sync status after it’s created, but we’ll add in options to make it easy to manage those things. And things like, renaming and deleting are also just important basics to have, so yeah, I’m glad to see this in, and I think not being able to set the sync status might cause some confusion, so I’m curious how that lands with 6.3 and how we can integrate it for 6.4.

\n\n\n\n

Birgit Pauli-Haack: Yeah. Yeah, I had some questions that were around that before, but the duplication feature, yeah, one click duplication, it’s pretty much, your work is not wasted, you just can replicate it and move forward with that. Yeah. The next piece is enable focus mode editing patterns. It was available for template parts before the focus modals, but now it’s also available for patterns, and it is then also backport it to 6.3… I’m just going to double check.

\n\n\n\n

Anne McCarthy: I’m nearly positive, yeah.

\n\n\n\n

Birgit Pauli-Haack: Yeah, me too, but…

\n\n\n\n

Anne McCarthy: Potentially not. Let’s see if it works.

\n\n\n\n

Birgit Pauli-Haack: Potentially not, yeah.

\n\n\n\n

Anne McCarthy: Maybe we should consider it. It might be because a new feature, but I’m like… We’re both on the corridor triage team here, it’s like, thoughts on backporting.

\n\n\n\n

Birgit Pauli-Haack: Maybe we should put it on the 6.3 editor task.

\n\n\n\n

Anne McCarthy: Yeah. Yeah, let’s drop it into the triage session we’re doing today. Nice, I love it.

\n\n\n\n

Birgit Pauli-Haack: All right, and the next part is that… Well, it’s the copy, to make sure that reusable is removed from menus and all that, for the reusable block. The next part is the sticky header and pagination for pattern page. That is really cool.

\n\n\n\n

Anne McCarthy: Yeah.

\n\n\n\n

Birgit Pauli-Haack: Yeah.

\n\n\n\n

Anne McCarthy: Yeah. I love seeing that. And that basically takes the patterns section of the block editor and ensures that when you’re scrolling down, unless you have a ton of patterns, that top heading that you can filter with will still appear, and it’s a quality of life improvement and definitely something that, if you have lots of patterns, which a lot of sites do with block themes, it’s pretty critical to be able to switch between and see what you’re actually seeing. So, I was pretty excited to see that in there.

\n\n\n\n

Birgit Pauli-Haack: Yeah. And I like the filter part, that you can just show me the synced patterns, just show me the unsynced patterns, so that’s really cool. The next one is, I wanted to mention it because that’s one of the changes, so the links that go to manage reusable blocks and manage patterns go to different places now. So, they go now to this site editor, where all the other interfaces are, to interact with patterns synced and unsynced patterns. There is that place, the WP admin looking place, still there, but now you can use all the site editor for the editing part. So, I think we will have that quite a bit in the next few releases, that we have a new managed thing, and then we can go back to the old thing, just because it might not be feature parity or so. I think that’s the first place where we can train ourselves with that.

\n\n\n\n

So, I like the site editor very much, but I’m still often going back to the WP admin and see a few things there. Yeah. Yeah, we talked about the sync status separation on the filter control already, but that’s coming also to 6.3, and it was backported to Beta 4. The components have been updated to support defined IDs for the text control component, that means that you can target them with CSS and also with JavaScript, and directly with the IDs, and identify…

\n\n\n\n

Anne McCarthy: Very cool.

\n\n\n\n

Birgit Pauli-Haack: …particular instances of the text control component, which is really important for a lot of extensibility usage there. There were some changes for the Interactivity API, and that’s only on the Gutenberg plugin. That, of course, every time we have a new thing in WordPress, we need to think about turning it off. What is necessary to turn things off? And so, the same with Interactivity API, it has been merged into 16.2, but not for 6.3, not for the WordPress, it’s coming in 6.4. But even with the Gutenberg plugin enabled, some people still want to turn off the Interactivity API because it interferes with their extensions.

\n\n\n\n

So, there’s now a filter to do this, and there’s also a runtime support to the WP style directive, so you can, on the fly, change the style for some of the Interactivity API entities. So, that’s these two things of Interactivity API. I’m sure there will be, very soon, a little bit more, a higher level, but also a more strategic announcement or strategic documentation about the Interactivity API. I know a few of our coworkers are working on that, to get this out, but with all the documentation it’s always a little bit behind the features there. So, go into the PRs to learn more about it.

\n\n\n\n

Anne McCarthy: Yeah, I’ll note too on that front. I got some really good feedback from someone saying, “Hey, this project’s been hard to keep on top of.” And so that was feedback that’s been brought back to the folks working on that. So, I think, last I can remember, from a conversation, my brain’s a bit mushy in the last couple of weeks, but I think they’re going to try and experiment with using discussion issues as a way to keep track of things, which is a bit of a departure from using overview or tracking issue labels in GitHub, but I think it’s going to be interesting and we can learn from that. But it is, as you said, anytime you add something, we need to think about removing it, and I know the Interactivity API is likely slated for 6.4, so it’s definitely something you can keep on top of and this was a great thing to call out. I could see folks skimming over this and not realizing how important it is. So, it’s a good one to keep in mind.

\n\n\n\n

Birgit Pauli-Haack: Yeah. In WordCamp Europe, I talked with quite a few people… Well, there were 2000 people there and I probably talked to 200 or so. So, I couldn’t talk to everybody. But there were quite a few people who were a little bit hesitant with a block editor because they’re PHP developers, and JavaScript is not really their thing, and they were really excited about the Interactivity API and the bigger emphasis on the dynamic blocks rather than the static JavaScript block. Because they can use the render that they did in shortcuts and then in widgets or something like that, all the render code, they can now use for blocks and then put the Interactivity API just in the directives in there to, to make it replicate some of the features that they had before. Which seems to be easier than the JavaScript, jumping all in on the JavaScript side. Yeah.

\n\n\n\n

So, well, from the block library section, there’s one component, the range control, that now has an additional attribute for the default size of 40 pixels. I think it does a few other sizes, but you can now use it if you use it in your own plugin settings pages or your own sidebar items, you can have a different size as a default size managed there. So that’s pretty cool.

\n\n\n\n

Anne McCarthy: My understanding of that one was that it was updating the component to use the 40 pixel size and the design, but I could be wrong about that. I know Rich was working on that. So, I think it’s less having a default set and more having consistency across the settings. It’s a design quality of life. Because right now I think that settings page has been shifted around, but yeah.

\n\n\n\n

Birgit Pauli-Haack: Yeah, that’s what I get from the PR too, but it’s an additional attribute or a different component for the range control, because they need to keep it backwards compatible. So, what goes for the core range controls, the previous attributes and range control sizes are still in there, so it’s practically an enhancement there. But the core view is the new default, 40 pixel thing there.

\n\n\n\n

Anne McCarthy: Yeah.

\n\n\n\n

Birgit Pauli-Haack: That’s what I understood. But I might be wrong, I’ve been wrong before, so.

\n\n\n\n

Anne McCarthy: Same. Same. Been looking at too much stuff anyway.

\n\n\n\n

New API

\n\n\n\n

Birgit Pauli-Haack: Yeah, sometimes you make it up as you go along, right? So, the next item is about the nested inner blocks. There’s a new API, or at least stabilizing existing API for default block, direct insert, and get direct insert block selectors, that were previously experimental, and it was hard to build on top of them. And one of the panelists that were on our past live Q&A, Seth Rubenstein, stabilized those, as a first time contributor, stabilize those APIs. So he can also work on a separate PR, that he shared some code from their Pew Research work on quizzes with the core developers, with core. So, that’s really good that community developers also stabilize some of the APIs so they can continue on their quest of making the plug editor more versatile.

\n\n\n\n

Anne McCarthy: Yeah, I love seeing this, and Seth has been awesome to be driving stuff forward, with really practical use cases, and I think it’s a great example of using and extending Gutenberg and the core editor, and then also contributing back in a way that furthers it and is in line with the goals of this project. So, I think it’s really exciting and cool to see this moving along.

\n\n\n\n

Birgit Pauli-Haack: Yeah. And they want to make some of the quiz code available as plugins, but you’re not supposed to put in plugins in the repo when you have experimental APIs in there. So yeah, that’s where this work also comes in, so it’s really important to make this all work in stable conditions. 

\n\n\n\n

Bug Fixes

\n\n\n\n

The next part is for patterns and alternative grid layout to improve keyboard accessibility. That’s one of the accessibility improvements that you were talking about before.

\n\n\n\n

Anne McCarthy: Yeah, as we’ve talked about just generally adding new features, accessibility does need to keep up and we need to have it accessible for all folks. And so, this just makes a change to using a standard UL, with keyboard tab indexes, to try and improve keyboard accessibility in particular. And I’m nearly positive… Scroll down. Yeah, I was going to say, AFercia who is, that’s the GitHub username, he is sponsored by Yoast, did a great job reviewing this, and to the point that Alex Stein was like, “This looks good to me.” And so, it’s another great example of showing the back and forth between the teams, but I also would love to get to the point where this is done by default and not caught later. So, it’s great to see the collaboration and to see this being done. And I know the accessibility team is always looking for more help, so it’s just great to see the back and forth and it is back forwarded to the release.

\n\n\n\n

Birgit Pauli-Haack: To 6.3, yeah. Yeah. Yeah, I’m really glad to see Andrea coming back to the accessibility team. He did take a break from working on the accessibility team, but I think he found quite a few contributors now really digging into Gutenberg. So he felt a little lonely about three or four years ago, before the pandemic definitely, and so I’m glad he’s contributing back again on the team. And sponsored by Yoast, just to mention that once in a while. Great. The next part, yeah, so there is a fix to apply text color selection to link color if link color isn’t active. That has been a long-standing issue with the block editor, that people who changed the text color on the paragraph didn’t get the same color also for the link color and needed to change that separately.

\n\n\n\n

And some people, because it’s not a default control on the paragraph, just didn’t know about the link color and how to change it, and it really wanted to not make the changes and couldn’t dream up the new design. So, I’m really glad that that is now by default. Well, of course if you want to change the link color you can, but if you just change the text color in a paragraph, it automatically also changes the link color.

\n\n\n\n

Anne McCarthy: And I want to call out, that that was part of an effort on a project board, which is a bit in the weeds, but the UX and Polish project board is a board within the Gutenberg project that is specifically for just super actionable issues, that are typically, quality of life, as the name suggest with Polish. And then user experience, so how can we make it just super intuitive? So, I just want to point that out, is the more you can write really targeted contained requests that are like, this is just a pain in the butt, I run through this a couple of times a week or something like that, it’s a great consideration for the UX and Polish board.

\n\n\n\n

I think there’s been maybe 80 items completed as a part of the UX and Polish board, which is kind of wild. And it’s something that I know a lot of folks keep an eye on, and it’s a great, if you’re a new developer and you want to get started, it’s also a great place to go and look at ways you can improve the project. So, I was excited to see that done as well.

\n\n\n\n

Birgit Pauli-Haack: Yeah. Does it make sense to share the link to the project board in our show notes?

\n\n\n\n

Anne McCarthy: Yeah, let’s do it.

\n\n\n\n

Birgit Pauli-Haack: … so all the developers can grab things on what they’re interested in, and see the progress on it? Or even just test some of the PRs that are available and see if they are doing what they’re supposed to do. 

\n\n\n\n

Performance

\n\n\n\n

Yeah. So, the next thing is add client-side pagination to the panel list, client-side means in your browser, so you don’t go back to the server to get the next pages of patterns. I think that’s definitely a quality of life improvement. And this also has been ported back.

\n\n\n\n

Anne McCarthy: This is the fun time with Gutenberg releases, where it’s like, what’s backported?

\n\n\n\n

Birgit Pauli-Haack: Yeah.

\n\n\n\n

Anne McCarthy: What’s not? It was cherry-picked for everyone.

\n\n\n\n

Birgit Pauli-Haack: Yeah, it’s synced with the core WordPress. Yeah, it doesn’t work. What’s backported? Yeah. What else? Do you want to talk about the work that’s done with the TinyMCE compatibility and the classic editor? Or the classic block in bigger projects?

\n\n\n\n

Anne McCarthy: Yeah. So, one of the things that’s fun about Gutenberg is there’s actually experiments you can turn on and off. And so right now, from what I’m seeing, is there’s an experiment for TinyMCE removal, basically to help with compatibility with the classic editor plugin, and other plugins that disable the block editor. So, previously an experiment was introduced to help with TinyMCE removal, and so they’re just trying to polish this to make sure that there aren’t any regressions or just weird edge cases, and make sure that it’s using the same filter for classic editor plugin is using.

\n\n\n\n

So, it’s not for a lot of folks who are, Gutenberg change log, who are Gutenberg forward, but I think it is important to consider when we think about broader adoption and folks still using the classic editor, work and thought is still put in there. I know sometimes that feedback bubbles up, but there are efforts underway to ensure that people who do want to disable it, it still works. But yeah, I would encourage folks to also just use blocks. But yeah, I would call this a maintenance task, something that is really to just plug in interoperability and make sure things still work as expected. And so, it’s something that might be not as glamorous and shiny, but it’s still important work to do as part of the wider WordPress ecosystem.

\n\n\n\n

Birgit Pauli-Haack: Yeah. And definitely, because there is this backwards compatibility promise for WordPress, and not only for the classic editor, but also for the classic theme. So, keeping that in mind, when you move forward in a different direction that people are still using the current stuff quite extensively and successfully, so they’re not impaired by any changes that are done. But sometimes these things are strategic and need to have a broader attention span on it and just not that one single feature. Excellent. So, I’m really glad that there is somebody on it. Yeah. 

\n\n\n\n

Documentation

\n\n\n\n

The next thing is mostly just to say that the documentation has been updated for the layout architecture after some of the APIs were stabilized. So, they are now showing up in the documentation and they’re not labeled as private or as experimental. So, that is definitely also a good thing, because a lot of people are a little bit hesitant to use experimental APIs or features.

\n\n\n\n

So, every time you can stabilize them and update the documentation so people know about it, is a good thing, it’s a good day. What else do we find? Oh yeah, there is an interactive template for talking about the Interactivity API. 

\n\n\n\n

Tools

\n\n\n\n

So, we have this scaffolding tool called Create Block, which speeds up your block development quite a bit when you start out with a new one or with putting additional blocks into a plugin. And now, there is also a template to use the Interactivity API on the next block that you are trying to build, that you’re working on, so you don’t have to include all the Interactivity stuff, for lack of a better technical term. And hook it up to all your other files, so there’s a template there. And it’s available now with a command line command, so that is certainly something for those people that want to dive into the Interactivity API. 

\n\n\n\n

Anne McCarthy: And when we make stuff like that easier, it’s so exciting, so great to call out.

\n\n\n\n

Birgit Pauli-Haack: Yeah. Yeah, I think the great block scaffolding tool actually has not gotten enough exposure into the developers, because it was so late when it came out, people tried to build blocks and then gave up quite a bit. But now, every course, every tutorial that comes out of WordPress education or for the developer block uses a great block scaffolding. We hope to get more people building blocks.

\n\n\n\n

Anne McCarthy: Yeah.

\n\n\n\n

Birgit Pauli-Haack: Yeah. So, I think we are through with the change log, that’s what we wanted to point out for 16.3. 

\n\n\n\n

What’s in Active Development or Discussed

\n\n\n\n

So, in active development, I think everybody, we talked about, just briefly about the phase three collaboration phase and all the posts that are there, we didn’t talk too much about it because WordPress 6.3 is such a big thing in front of us, the collaboration, we don’t know yet what’s going to be, but everyone’s excited, I think about the admin changes as well as the media library. And then, of course, the real time collaboration and the async collaboration, there’s a lot to come out. So, what are the next steps that we are going to see when people say, okay, some of us are still working on the Polish and UI changes for the site editor, and some of us are going to start and move over to the collaboration?

\n\n\n\n

Anne McCarthy: Yeah, I will say, I don’t anticipate to see any sort of real time collaboration added into 6.4. I think it’s such a short release cycle, so I just want to put that out there. I’m not seeing headwinds about that or momentum in that direction. But I do think that’ll give us lots of time to experiment, and I know Riad posted on Make Core about the realtime architecture, which is totally worth reading. And there’s also a GitHub issue, of course, it is a GitHub issue. But right now, the feedback that I’ve gotten and questions that I’ve gotten, since I run basically the phase two outreach program, the full site outreach program is, it’s, what outreach are we doing? What’s going to happen with that? Are you going to run one for that? There’s a lot of questions bubbling up, of what’s next.

\n\n\n\n

And right now, I will say, the focus remains on 6.3, but I would expect to see a lot of experimentation, a lot of stuff starting up. I have done some outreach to plugin authors, I’ve done related functionality like that. I’ve started talking to folks in a larger to medium to small publishing space and agencies and all that sort of stuff. But I encourage folks to stay tuned and as soon as something is ready, I planned, and I’m sure you planned, to shout it from the rooftops, try and get folks involved and figure out exactly how best to organize stuff. Because I think that is a big question is, these are such related but yet disparate initiatives, and I don’t think there’s necessarily an overarching, here is the next thing we’re doing. I think some folks, some individual contributors, are just kind of trying to explore and pave the path for now and see what we can learn, ahead of a more collective push, once 6.3 is out the door.

\n\n\n\n

But yeah, I expect things to be more experimental in the Gutenberg plugin, by the time 6.4 is released. And then 6.5 is when I am more anxious about what are we going to have in place and how can people help test. And so, right now, I encourage folks to comment on the post that Matias wrote, share your feedback, share your experiences. Are you a writer? Are you a journalist who’s had to work in collaborative situations? Talk about it, write your comments, what do you want to see? What do you like about other tools that have those kinds of features in place? What workflows does your team have?

\n\n\n\n

Yeah, I think there’s a plugin author who commented recently on a workflows post, after we had exchanged some emails, who works on a calendar. So, you have a calendar post coming up and you have workflows related to that. And he took the time to very kindly share his feedback. So, anything you can do there is super helpful, whether it’s your plugin or you’re a writer or you’re an organizational leader who has to manage this kind of stuff.

\n\n\n\n

Birgit Pauli-Haack: Yeah, that’s going to be real interesting. So, any feedback is really helpful in that. I just wanted to go back to what you said, okay, there’s not going to be a whole lot in 6.4 for phase three. I know there’s also quite a few things that are residual from phase two, contributors are aiming to get the funds API and the fund library into core, together with the typography management system. We talked about the Interactivity API, there’s certainly some front fund hydration kind of tools. We’re still waiting for the table of content block to be stabilized, and the time to read block, is something that is definitely on the list. And I’m really excited to see what’s coming as a default theme for 2024. And of course, all the publishing that goes into phase two interfaces and workflows for the site editor. Yeah, the default theme. Yeah.

\n\n\n\n

Anne McCarthy: There’s so much already slated for 6.4. 

\n\n\n\n

Birgit Pauli-Haack: Yeah. And then your central…

\n\n\n\n

Anne McCarthy: Provisions and templates and template parts, yeah, we could rattle off a bunch of stuff, let’s leave it.

\n\n\n\n

Birgit Pauli-Haack: And we already know there’s stuff in there, so Beta 1 is September 26th, that’s just eight weeks away. And that’s kind of interesting to see how short of a cycle we are going to have, but we won’t hit US big holidays, like Thanksgiving, it will be out before Thanksgiving, it will be out before Christmas, and nobody goes into a Christmas year-end sale with a changed WordPress. So, I think it’s a good thing for the community, but it’s going to be hard to make it a splashy new feature kind of thing, when you only have eight weeks to develop. And it’s-

\n\n\n\n

Anne McCarthy: It’s tight.

\n\n\n\n

Birgit Pauli-Haack: Yeah. But then Josepha started a wishlist post. We got quite a few comments there, and it’s still open until August 15th. She also made clear that it’s a wishlist, it’s not everything that’s going to be on there. It’s going to come into 6.4, but I think the jury is still out which part will be. If there is already a track ticket or a Gutenberg PR or issue, the chances might be going in, but a global, yeah, this is my wishlist kind of thing, it probably won’t get that attention. So, August 15th, that’s just before the community summit and WordCamp US. We will hopefully have, after WordCamp US, have a roadmap post, like you did for 6.3. Are you planning to doing something like that?

\n\n\n\n

Anne McCarthy: Yes, I am. It is on my to-do list, I think for the week after, maybe August 14th or something like that, to start compiling stuff and figuring out what we can write up. Because yeah, that is an important thing to get out, especially with a shorter release cycle.

\n\n\n\n

Birgit Pauli-Haack: Yeah. And it’s going to be interesting to see, it’s the underrepresented gender lead release. The last one was 5.6 and now we are 6.4, two years later, three years later. So, there are some awesome people on the release team, so I’m really looking forward to working with you and so many other, 40 on the direct release team or on the cohort, so it’s a great group of women/non-binary people working on the release. 

\n\n\n\n

So, we are at the end of the show, Anne, it was wonderful to talk to you and you sharing all your knowledge… Not all your knowledge, we would be here another 10 hours. 

\n\n\n\n

Anne McCarthy: The highlights.

\n\n\n\n

Birgit Pauli-Haack: The highlights of the most immediate thoughts in the show. It was wonderful to have you, is there anything that you want our listeners to be aware of beyond what we talked about today, that we didn’t touch upon yet?

\n\n\n\n

Anne McCarthy: Oh, gosh. No, I don’t think so. I think the only thing that I’m noodling on is the next call for testing for the outreach program, and how we can get some feedback and get it going for 6.4, and just how 6.3 lands. So, stay tuned for that, if you’re not part of the FSE Outreach Program, it is still kicking, it’s still going over three years on. 

\n\n\n\n

Birgit Pauli-Haack: That’s wonderful.

\n\n\n\n

Anne McCarthy: Yeah.

\n\n\n\n

Birgit Pauli-Haack: Yeah. I really love that, how that turned out. And together, more people involved in testing themes, and no code and code people as well. So, is there a chance that you’re going to remove the experiment on that particular channel too?

\n\n\n\n

Anne McCarthy: Oh, gosh. I know, it’s so funny, I think it’s called FSE Outreach Experiment. Yeah, which is funny, because it’s like, how long can the experiment go for? We’re on very scientific terms right now, but yeah, no, we should remove it. I think I just referenced it everywhere, as FSE Outreach Experiment, so I’ve been nervous about getting rid of it.

\n\n\n\n

Birgit Pauli-Haack: Oh, okay. Yeah, I can see it.

\n\n\n\n

Anne McCarthy: And FSE is also an old term… It’s just kind of a weird snapshot in time. But yeah, we’ll see.

\n\n\n\n

Birgit Pauli-Haack: All right, well, it was wonderful to have you. If people want to get in touch with you, would be through the channel FSE Outreach Experiments?

\n\n\n\n

Anne McCarthy: Yeah, that’s probably the easiest. I’m @annezazu on Make Slack, and then I have a site, Nomad.blog. I’m on LinkedIn, but otherwise, not really typically on any social media. So not on X, or whatever they’re calling it, the kids are calling it these days. I don’t know how you even refer to that anymore.

\n\n\n\n

Birgit Pauli-Haack: Yeah, it’s now a Boomers network, right? All right, well, thank you so much for being here, and we are going on holiday, the next recording will be August 25th and we will have Ellen Bauer.

\n\n\n\n

Anne McCarthy: Oh, amazing.

\n\n\n\n

Birgit Pauli-Haack: …lead for design, or co-lead, on the design release team for 6.4. And we’re going to talk about their work on block themes, and of course the next two Gutenberg releases, Gutenberg 16.4 and 16.5. So, stay tuned for the next one. And there’s always, dear listeners, the show notes will be published on gutenbergtimes.com/podcast, and if you have questions as suggestions or news you want us to cover, send them to changelog@gutenbergtimes.com. That’s changelog@gutenbergtimes.com. And that’s it for me, I wish everybody a great summer, and I will be back end of August. Take care.

\n\n\n\n

Anne McCarthy: Amazing. Thank you for having me.

\n\n\n\n

Birgit Pauli-Haack: All right, bye-bye.

\n\n\n\n

Anne McCarthy: Bye.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 29 Jul 2023 20:28:20 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Birgit Pauli-Haack\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:30;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:76:\"Gutenberg Times: Patterns, Block Styles and Slotfills—Weekend Edition #263\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://gutenbergtimes.com/?p=25029\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:83:\"https://gutenbergtimes.com/patterns-block-styles-and-slotfills-weekend-edition-263/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:14894:\"

Howdy,

\n\n\n\n

One more week, and I will start my Summer vacation. It’ll be a mixture between, pursuing neglected passing projects, giving family support, birthday celebrations and home improvement projects. My husband and I will join my in-laws (MIL + SIL) on a river-cruise on the Danube and visit new places and revisit familiar places.

\n\n\n\n

The last touches on the WordPress 6.3 release are happening. If you haven’t yet, check out all the information that’s out there, and you find in the last two weekend editions.

\n\n\n\n

Yours, 💕
Birgit

\n\n\n\n\n\n\n\n\n\n\n\n

Developing Gutenberg and WordPress

\n\n\n\n

WordPress 6.3

\n\n\n\n

On the WordPress News site, Anne McCarthy published Synced Patterns: The Evolution of Reusable Blocks. You’ll learn everything there is to know about how the term “Synced patterns” is replacing the term “Reusable blocks”, and how this brings a unified creation experience for new pattern to your WordPress site with the new version.

\n\n\n\n

Many users have been applying reusable blocks to CTA, bios and compliance copy on their sites. Those will stay intact. Nothing changes here. The same mechanism you used to create reusable blocks, is also used to create synced patterns. It’s now also expanded to create standard patterns. A feature many site owners and designers have been waiting for. McCarthy and I also talked about this during our podcast recording.

\n\n\n\n\n\n\n\n
\n\n\n\n

Matt Medeiros, publisher of WPMinute, asked in his latest episode:
Will WordPress 6.3 be the best ever? “There are a lot of exciting features coming to WordPress 6.3 which will set the tone for the next few years of our favorite CMS.” he wrote.

\n\n\n\n
\n\n\n\n

Jonathan Bossenger provides a recording of his Testing WordPress 6.3 – Developer Edition session. You’ll learn how to install the WordPress Beta Tester plugin, convert a local installation to 6.3 RC for testing. Then use this setup to test it against a theme that is in active development, and then revert it back to WordPress 6.2.2. With WordPress 6.3 due on August 8, 2023, now would be a great time to help test the release candidate, as well as confirm that your plugins and themes are ready for the 6.3 release.

\n\n\n\n

Gutenberg 16.3

\n\n\n\n

Michael Burridge led the latest Gutenberg release. It was mainly a maintenance release and comprised of a myriad of bug fixes for features slated for WordPress 6.3. Burridge highlighted in his release post What’s new in Gutenberg 16.3? (26 July) 

\n\n\n\n\n\n\n\n\n\n\n\n
\n\n\n\n
\n
\n

🎙️ Latest episode: Gutenberg Changelog #87 – Patterns, Gutenberg 16.3 and WordPress 6.3. with Anne McCarthy as special guest, hosted by Birgit Pauli-Haack

\n
\n
\n\n\n\n

Anne McCarthy and I talked about this release and, of course, also about WordPress 6.3 while recording the Gutenberg Changelog 87. It’s always a great joy to listen to Anne and take a deep dive into the Site editor with her. The episode is still at the editor, but will be available via your favorite podcast app over the weekend. My favorite Podcast app is Pocket Casts and I have been a paying subscriber for many years.

\n\n\n\n\n\n\n\n
\n\n\n\n

Sarah Gooding reported on the release as well in her article: Gutenberg 16.3 Adds New Tools for Patterns. “Most notably, custom user patterns now have a dropdown menu for renaming, duplicating and deleting them. Patterns and template parts that come with themes will only have the “duplicate” option available since they cannot be deleted or renamed.” she wrote.

\n\n\n\n\n

 “Keeping up with Gutenberg – Index 2022” 
A chronological list of the WordPress Make Blog posts from various teams involved in Gutenberg development: Design, Theme Review Team, Core Editor, Core JS, Core CSS, Test and Meta team from Jan. 2021 on. Updated by yours truly. The index 2020 is here

\n\n\n\n\n

Plugins, Themes, and Tools for #nocode site builders and owners

\n\n\n\n

Jamie Marsland released a new video with a tons of WordPress News that you probably missed with a demo of the Justin Tadlock’s Breadcrumbs Block, the time to read block, and vertical text feature, and finally short appearances from Mike McAlister and Kevin Geary, with strong opinions on block themes specifically and Gutenberg as a whole.

\n\n\n\n
\n\n\n\n

When users are new to WordPress, taxonomy is one of the concepts, that is harder to explain. Sarah Snow published a tutorial: Categories vs. Tags: What’s the difference? on the Learn.WordPress site. She shows you how to use them and that they are good for SEO juice and enhances content discovery for your readers. And never have posts “uncategorized” again.

\n\n\n\n

Theme Development for Full Site Editing and Blocks

\n\n\n\n

Last week, Justin Tadlock published part 1 of his Beyond Block Styles series. In part 2 he walks you through how to build custom styles for the core Separator Block. Beyond block styles, part 2: building a custom style for the Separator block. It’s a deep dive into the inner workings of creating block styles for core blocks. You would need to have a certain set-up in place to follow along, and Tadlock takes you by the hand on using the WordPress scripts package with themes. I can hardly wait for the third part. I probably see first drafts next week.

\n\n\n\n\n\n\n\n

Oh, and while I have you: Are you a developer with a topic idea that you would like to share with the community? How about publishing it WordPress Developer Blog? Read the tips and guidelines and find out how you can contribute. Our next monthly meeting will be on August 3rd, 2023 at 13:00 UTC in the WP Slack #core-dev-blog channel. Or just DM me on Slack @bph and we’ll set up a talk.

\n\n\n\n

If you are a novice to working with NodeJS or npm, Jonathan Bossenger has a tutorial for you on Learn.WordPress: Installing Node.js and npm for local WordPress development.

\n\n\n\n

Building Blocks and Tools for the Block editor.

\n\n\n\n

In his live coding session on twitch, Ryan Welcher covered – it seems – his most favorite topic: Using custom SlotFill to extend a codebase, using is ever evolving Advanced Query Loop plugin and adding more settings to the plugin’s sidebar.

\n\n\n\n
\n\n\n\n

Michael Burridge and Justin Tadlock presented at this month’s Developer Hours about Styling Blocks. The recording is available on WordPress TV. The panel talked about CSS custom properties (also known as CSS variables). You learn how to leverage them in custom blocks to give users more control over the styling and presentation of their sites.

\n\n\n\n\n

Need a plugin .zip from Gutenberg’s master branch?
Gutenberg Times provides daily build for testing and review.
Have you been using it? Hit reply and let me know.

\n\n\n\n

\"GitHub

\n\n\n\n\n

Questions? Suggestions? Ideas? Don’t hesitate to send them via email or send me a message on WordPress Slack or Twitter @bph.

\n\n\n\n

For questions to be answered on the Gutenberg Changelog, send them to changelog@gutenbergtimes.com

\n\n\n\n
\n\n\n\n\n

Featured Image: CCO licensed photo by lanche86 from the WordPress Photo Directory.

\n\n\n\n
\n\n\n\n

Don’t want to miss the next Weekend Edition?

\n\n\n\n

We hate spam, too and won’t give your email address to anyone except Mailchimp to send out our Weekend Edition

Thanks for subscribing.
\n\n\n\n
\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 29 Jul 2023 09:34:30 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Birgit Pauli-Haack\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:31;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:92:\"WPTavern: Ninja Forms Version 3.6.26 Patches Multiple High Severity Security Vulnerabilities\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=147292\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:103:\"https://wptavern.com/ninja-forms-version-3-6-26-patches-multiple-high-severity-security-vulnerabilities\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:1893:\"

If you use the Ninja Forms plugin and your sites aren’t set to get automatic plugin updates, add a round of updates to your weekend plans. Patchstack is reporting multiple high severity security vulnerabilities in the plugin, including the following:

\n\n\n\n
    \n
  • a POST-based reflected XSS (7.6 CVSS 3.1 score)
  • \n\n\n\n
  • a broken access control on form submissions export feature that allows Subscriber and Contributor role users to export all of the Ninja Forms submissions on a WordPress site (7.6 CVSS 3.1 score)
  • \n
\n\n\n\n

Patchstack researchers discovered the vulnerabilities on June 22, 2023, and Ninja Forms patched them on July 4, 2023. The security advisory was publicly released on July 27, 2023.

\n\n\n\n

The plugin’s changelog for version 3.6.26 transparently identifies the security fixes included in the release:

\n\n\n\n
\n

Security Enhancements:
* Prevent unauthorized download of submission
* Prevent scripts in dashboard field labels; responsibly reported by Sayandeep Dutta
* Prevent front-facing label scripts; responsibly reported by Jonathon Zamora & WordPress.org
* Prevent excess extra data through automated form submission
* Prevent override access where not permitted

\n
\n\n\n\n

Ninja Forms is used on more than 800,000 WordPress sites. The majority of the plugin’s users are on version 3.6.x (73.6%) but WordPress.org doesn’t offer a more detailed breakdown of minor versions, so it’s not clear how many are still vulnerable. Ninja Forms users are recommended to patch their sites immediately. At this time, the vulnerabilities are not known to have been exploited.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 28 Jul 2023 22:11:38 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:32;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:48:\"WPTavern: WordPress Launches Slack/Matrix Bridge\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=147271\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:59:\"https://wptavern.com/wordpress-launches-slack-matrix-bridge\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:3144:\"

WordPress meta contributors have just logged an important milestone in their efforts to explore replacing Slack communication with Matrix, an open source federated chat system. The team hosted a meeting on the Meta Slack channel and the corresponding #meta:community.wordpress.org Matrix room simultaneously, enabled by the project’s new Slack/Matrix bridge.

\n\n\n\n

The bridge allows users to follow the chat and participate from either Matrix or Slack, with messages showing up in real-time. It’s a tool that will make the transition easier as the WordPress project moves towards replacing Slack. The team is still in the process of importing the history for channels but the bridges are already in place for all public Slack channels/Matrix rooms.

\n\n\n\n

DM’s do not work over the bridge, although they work between Matrix users. The bridge doesn’t have access to anything that is private, and the historic data import into Matrix will only apply to public Slack channels. DMs and private channel history will not be ported over.

\n\n\n\n
\n\n\n\nMeta contributor meeting inside Chatrix instance with room switcher disabled \n\n\n\n

The Matrix team has created a Gutenberg block that embeds a Matrix client called Chatrix, which can be added to any WordPress page/post or P2 blog, as shown in the screenshot above. This example can be accessed at https://make.wordpress.org/meta/chat/. WordPress.org users can sign in with SSO inside the block and authorize their accounts to connect:

\n\n\n\n\n\n\n\n

Now that the Matrix server is live at community.wordpress.org, WordPress users who want to attend team meetings or join rooms via Matrix can now do so using their choice of Matrix clients that support SSO. Logging in uses the same credentials as the WordPress.org account.

\n\n\n\n

“Compared to Slack this means a vastly simplified onboarding process,” Automattic-sponsored contributor Alex Kirk said. “Instead of waiting for an e-mail arriving at a special e-mail address, you set the server in your Matrix client to community.wordpress.org and click ‘Login with WordPress.org’ (the name of that button might vary by client).”

\n\n\n\n

As the channels’ history gets migrated over, Kirk said WordPress users will be automatically invited to rooms on Matrix that they have already joined from the Slack side. The team is planning to make more wide-scale public announcements after the Slack/Matrix bridge has demonstrated that it is running stable.

\n\n\n\n

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 28 Jul 2023 21:31:35 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:33;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:25:\"Matt: Ottawa Can Bring It\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:22:\"https://ma.tt/?p=92586\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:42:\"https://ma.tt/2023/07/ottawa-can-bring-it/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:470:\"

Ottawa reminds me a lot of Houston. A city that is a microcosm of Canada’s diversity and vibrance.

\n\n\n\n

When you visit Ottawa, I’d recommend checking out Aiana Restaurant Collective (powered by WordPress, natch!) and Stolen Goods Cocktail Bar to see craftspeople operating at the top of their game. Riviera was also nice.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 28 Jul 2023 02:52:40 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:4:\"Matt\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:34;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:89:\"WPTavern: ClassicPress Community Considers Re-forking WooCommerce for Classic Commerce v2\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=147238\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:100:\"https://wptavern.com/classicpress-community-considers-re-forking-woocommerce-for-classic-commerce-v2\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4802:\"

ClassicPress, the fork that has been keeping WordPress 4.9 on life support for those who don’t want to use the block editor, will soon be moving into version 2.0 after the community voted to re-fork a newer version of WordPress (6.x) to keep moving forward. Version 1.6.0 was released a few weeks ago as the last minor release before version 2.0.

\n\n\n\n

ClassicPress contributors are discussing the future of Classic Commerce, which is a fork of WooCommerce 3.5.3 created to provide a reliable e-commerce solution for ClassicPress users. The community is now bracing for the inevitable compatibility issues introduced by version 2.0 that will require a massive undertaking to resolve.

\n\n\n\n

In a forum thread seeking community input, @shimmy, an IT solutions business owner with an interest in supporting a long term e-commerce solution, proposed the following options for Classic Commerce’s future:

\n\n\n\n
    \n
  • Re-Fork Woo-Current
  • \n\n\n\n
  • Re-Fork Woo-Previous
  • \n\n\n\n
  • Fork a different eCommerce solution
  • \n\n\n\n
  • Migrate CCv1 to current
  • \n\n\n\n
  • Complete Rewrite
  • \n
\n\n\n\n

“We can talk about re-forking, using something that works or asking ourselves: are we ready to really fork and support it on our own developing it in a way it works in ClassicPress or do we fork it and continue to patch it every time it doesn’t work because blocks or just keep it frozen?” Elisabetta Carrara said.

\n\n\n\n

After some discussion multiple participants in the conversation were in agreement that forking the latest version of WooCommerce to make it work with ClassicPress is not a viable option.

\n\n\n\n

ClassicPress director Viktor Nagornyy suggested exploring a refork similar to the method used for ClassicPress 2.0.

\n\n\n\n

“With CP v2.0, we didn’t take WP v6.2 and rip out blocks, FSE, and React,” he said. “@MattyRob merged develop branch with CP v1, and worked his way through all the files to resolve merge conflicts. That was a lot of work, and he did a great job. WooCommerce and Classic Commerce are plugins, so I assume they have fewer files than WP/CP core.

\n\n\n\n

“This type of ‘merge-fork’ could be a viable option for CC to save time and effort.”

\n\n\n\n

@shimmy, who would be leading this effort, said he is leaning toward this approach.

\n\n\n\n

“I think this provides a more natural upgrade path and to some degree backwards compatibility,” he said. “At some point in the course of merge-fork WC plugins will no longer be compatible with CC; which is fine because I think that CC should have it’s own plugin ‘bazaar.’ This ensures compatibility with CC; if you need a feature then it should be a filtered result with what you already have in place.”

\n\n\n\n

Nagornyy also encouraged a nascent plugin ecosystem to grow up around these forks to provide additional features. Although the WooCommerce plugin ecosystem has thousands of options for extending stores, they are not guaranteed to be compatible with forks built on older versions of WordPress and WooCommerce.

\n\n\n\n

“While the core CC is free, I encourage plugin developers to consider developing paid plugins for CC to ensure they get paid for their time and effort,” Nagornyy said. “It only strengthens CP and CC knowing premium, supported plugins are available. For e-commerce, the two profitable (and critically important) categories of plugins are payment gateways and shipping integrations.”

\n\n\n\n

With the major changes coming to the WordPress admin in Phase 3 of the Gutenberg project, maintaining these forks will continue to be an uphill slog, as fewer plugins from the wider ecosystem will remain compatible with ClassicPress.

\n\n\n\n

Maintaining payment gateways and shipping integrations for compatibility with these forks is also going to be challenging, as this discussion indicates that the community doesn’t have many experienced e-commerce developers who are eager to step up and donate their time to this project. If Classic Commerce cannot deliver on the ambitious ‘merge-fork’ option, users may need to look towards integrating external e-commerce solutions.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 27 Jul 2023 22:16:18 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:35;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:97:\"Post Status: WordPress 6.3 RC2 • Synced Patterns • Internationalization • Gutenberg Phase 3\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:32:\"https://poststatus.com/?p=150017\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:96:\"https://poststatus.com/wordpress-6-3-rc2-synced-patterns-internationalization-gutenberg-phase-3/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:25140:\"

This Week at WordPress.org (July 25, 2023)

\n\n\n

We’re under two weeks away from WordPress 6.3 release. Have you started testing?

Big changes are envisioned for the Media Library, Admin Dashboard, and more. You have an opportunity NOW to share ideas. What considerations do we need to account for? Read the Phase 3 post from Matías and share your feedback in the comments.

No longer will you find Reusable Blocks. In WordPress 6.3, you’ll now find Synched Patterns. Read on to learn why the name has been changed.

\n\n\n
\n\n\n\n\n\n\n\n

\n\n\n\n

News

\n\n\n\n\n\n\n\n

\n\n\n\n
\n\n\n\n\n\n
\n\n\n\n
\n\n\n\n
\n
\n
\n
\n

Community

\n\n\n\n\n\n\n\n

Core

\n\n\n\n\n\n\n\n

Phase 3 Ideations

\n\n\n\n\n\n\n\n

Developer Blog

\n\n\n\n\n\n\n\n

Meetings

\n\n\n\n\n\n\n\n

Docs

\n\n\n\n\n\n\n\n

Hosting

\n\n\n\n\n\n\n\n

Meta

\n\n\n\n\n\n\n\n

Mobile

\n\n\n\n\n\n\n\n

Openverse

\n\n\n\n\n\n\n\n

Performance

\n\n\n\n\n\n\n\n

Plugins

\n\n\n\n\n
\n\n\n\n
\n

Polyglots

\n\n\n\n\n\n\n\n

Project

\n\n\n\n\n\n\n\n

Support

\n\n\n\n\n\n\n\n

Sustainability

\n\n\n\n\n\n\n\n

Test

\n\n\n\n\n\n\n\n

Theme

\n\n\n\n\n\n\n\n

Training

\n\n\n\n\n\n\n\n

Tutorials

\n\n\n\n\n\n\n\n

Online Workshops

\n\n\n\n\n\n\n\n

Courses

\n\n\n\n\n\n\n\n

WordPress TV

\n\n\n\n\n\n\n\n

WordCamp Central

\n\n\n\n\n\n\n\n

WPTV

\n\n\n\n\n
\n
\n
\n
\n\n\n\n
\n\n\n\n\n\n\n\n\n\n\n\n

Thanks for reading our WP dot .org roundup! Each week we are highlighting the news and discussions coming from the good folks making WordPress possible. If you or your company create products or services that use WordPress, you need to be engaged with them and their work. Be sure to share this resource with your product and project managers.

Are you interested in giving back and contributing your time and skills to WordPress.org? \"🙏\" Start Here ›

Get our weekly WordPress community news digest — Post Status’ Week in Review — covering the WP/Woo news plus significant writing and podcasts. It’s also available in our newsletter. \"💌\"

\n\n\n\n
\n\n\n\n
\"Post
\n

You — and your whole team can Join Post Status too!

\n\n\n\n

Build your network. Learn with others. Find your next job — or your next hire. Read the Post Status newsletter. \"✉\" Listen to podcasts. \"🎙\" Follow @Post_Status \"🐦\" and LinkedIn. \"💼\"

\n
\n\n\n\n
\n

This article was published at Post Status — the community for WordPress professionals.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 27 Jul 2023 22:03:25 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Courtney Robertson\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:36;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:69:\"WordPress.org blog: Synced Patterns: The Evolution of Reusable Blocks\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=15541\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:84:\"https://wordpress.org/news/2023/07/synced-patterns-the-evolution-of-reusable-blocks/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4355:\"

Synced patterns are replacing Reusable blocks, offering a unified creation experience for new pattern functionality coming to WordPress 6.3. Patterns, first introduced in WordPress 5.5, are a collection of blocks that make it simple to add complex layouts and designs to any WordPress site without starting from scratch. With WordPress 6.3, set to be released on August 8th, you will be able to arrange blocks in unlimited ways and save them as patterns for use throughout your site, directly within the editing experience. You can also specify whether to sync your patterns, so that one change applies to all parts of your site, or to keep them unsynced, so you can customize each instance.

\n\n\n\n
\n\n
\n\n\n\n

Create your own patterns

\n\n\n\n

The ability to create your own patterns, on top of using the ones bundled into each WordPress release, opens up a world of possibilities. Need to repeat the same contact information across your site and keep it up to date? Create a synced pattern with all the details, and say goodbye to repeating yourself, with the ability to quickly insert the synced pattern wherever you need it. If you find yourself creating various banners for your site and want them to have the same layout with unique content, creating an unsynced pattern speeds up your workflow and ensures a level of consistency in approach. While themes and plugins have been able to offer patterns to users and curate the experience, this update allows agencies and site builders to do the same for their clients, directly in the site building process.

\n\n\n\n

Dig into the details

\n\n\n\n

Any previously made Reusable blocks will continue to function as they do now, just under the new Synced pattern name. To help adjust to these changes, a few contextual notices will be placed throughout the interface. Specifically, the menu item in the creation flow will show as “Create pattern/reusable block” until the prompt describing the switch is dismissed in one of the various locations, including the naming and syncing modal: 

\n\n\n\n
\n\n
\n\n\n\n

For folks using block themes, all patterns will be listed alongside template parts in the Site Editor > Patterns section, where you can enter a focused editing mode to make changes. For Classic themes, the prior reusable block management page will now house patterns in a list, similar to the Posts > All Posts view.

\n\n\n\n\"Patterns\n\n\n\n

For a complete overview of patterns on your site, all patterns provided by themes and plugins will be shown in this section but without the option to edit directly.

\n\n\n\n

Go further

\n\n\n\n

With the ability to create your own patterns baked into the creation experience, remember that you can copy the patterns available in the Pattern Directory and contribute back, an excellent way to democratize design for every WordPress user and the web.

\n\n\n\n

For more exciting features coming to patterns in WordPress 6.3, read on in the Advancing the Power of Patterns post. Thank you to the contributors who collaborated on this post: Chloé Bringmann, Jonathan Pantani, Josepha, Krista Stevens, Nicholas Garofalo, Peter Rubin.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 27 Jul 2023 14:45:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:8:\"annezazu\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:37;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:84:\"Do The Woo Community: Building Your Agency Stack with Judd Dunagan and Carlos Caneja\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"https://dothewoo.io/?p=75733\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:83:\"https://dothewoo.io/building-your-agency-stack-with-judd-dunagan-and-carlos-caneja/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:445:\"

Judd from Bright Vessel and Carlos from Britecode share insights and experience in building their WooCommerce Agency stack.

\n

>> The post Building Your Agency Stack with Judd Dunagan and Carlos Caneja appeared first on Do the Woo - a WooCommerce Builder Community .

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 27 Jul 2023 08:44:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"BobWP\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:38;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:52:\"WPTavern: Gutenberg 16.3 Adds New Tools for Patterns\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=147209\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:63:\"https://wptavern.com/gutenberg-16-3-adds-new-tools-for-patterns\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:2249:\"

Gutenberg 16.3 was released today as a maintenance release but includes several new tools that make pattern management smoother and easier for users. Most notably, custom user patterns now have a dropdown menu for renaming, duplicating and deleting them. Patterns and template parts that come with themes will only have the “duplicate” option available since they cannot be deleted or renamed.

\n\n\n\n
\n\n\n\nvideo credit: Gutenberg 16.3 release post\n\n\n\n

Gutenberg 16.3 adds a sticky header bar on the Patterns page. It also brings the “focus mode” to patterns, which is already available for template parts in the Site Editor but not available when editing patterns. Users may not notice but it provides more a consistent editing interface.

\n\n\n\n

Those who have been keenly following the evolution of the Patterns page will notice that the “Theme patterns” heading has been removed and the pattern categories rearranged. Theme and plugin patterns now appear above template parts.

\n\n\n\n
\n\n\n\nimage credit: Gutenberg PR #52570\n\n\n\n

The icon for synced patterns isn’t self evident and some users may need more context. A new tooltip identifies synced patterns as those for which edits will apply anywhere the pattern is used.

\n\n\n\n

Gutenberg 16.3 includes more than two dozen pattern interface-related fixes, among other editor bug fixes. If you are using and managing patterns frequently, having the Gutenberg plugin installed will enable a better experience with this interface until these updates make their way into core WordPress. Check out the release post for a full list of all the changes and fixes in 16.3.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Thu, 27 Jul 2023 02:49:22 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:39;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:65:\"WPTavern: WordPress 6.3 RC2 Released, Watch the Live Product Demo\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=147173\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:75:\"https://wptavern.com/wordpress-6-3-rc2-released-watch-the-live-product-demo\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4088:\"

WordPress 6.3 RC2 has been released and is ready for community testing. Since RC1 landed a week ago, 15 changes have come in from the Editor and Trac, including bug fixes for footnotes, internationalization fixes, a missing command for opening the distraction free in the Site Editor, and a few other issues. 

\n\n\n\n

This release also brings in work completing the About page and adds a “Get Involved” section, closing a 10-year old ticket that suggested adding a “Contribute” tab to the About page.

\n\n\n\n
\n\n\n\n\n\n\n\n

The new Get Involved page features both code-based and no-code contribution opportunities with a link to WordPress’ contributor teams.

\n\n\n\n

The video of the WordPress 6.3 Live Product Demo has been published so anyone who was not able to attend can get a preview of what is coming in the next release. Automattic-sponsored contributors Anne McCarthy and Rich Tabor hosted the demo, showing users how to use the new command palette to zip around the editor and manage settings views. They also guide viewers through browsing and editing pages within the Site Editor, managing synced patterns (formerly called Reusable Blocks), and showcased various new blocks and design tools.

\n\n\n\n
\n\n
\n\n\n\n

Check out the highlights post for all the links to features referenced in the demo and the Q&A portion of the broadcast.

\n\n\n\n

For those interested in performance improvements coming in 6.3, an upcoming hallway hangout is happening tomorrow Thursday, July 27, 2023 at 11:00 AM EDT. Participants can check the #core-performance Slack channel for the Zoom link before the event. Team leads will cover highlights from the 170+ performance improvements included in 6.3 and will discuss future improvements for 6.4.

\n\n\n\n

WordPress’ Training team is calling for volunteers to help with updating and revising existing Learn WordPress resources ahead of the 6.3 release. The team has created a board on their GitHub repository which highlights high priority tasks.

\n\n\n\n

WordPress 6.3 RC3 is expected to be released on August 1, and the general release is scheduled for August 8, less than two weeks away. There is still time to find and report some bugs. One easy way is to install the WordPress Beta Tester plugin on a local testing site or use a quick throwaway site from services like InstaWP or TasteWP. Bugs can be reported on Trac or via the Alpha/Beta section of the support forums.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 26 Jul 2023 19:19:54 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:40;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:79:\"WPTavern: #85 – Giulia Laco on the Importance of Typography for Your Websites\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:48:\"https://wptavern.com/?post_type=podcast&p=147116\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:93:\"https://wptavern.com/podcast/85-giulia-laco-on-the-importance-of-typography-for-your-websites\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:51871:\"Transcript
\n

[00:00:00] Nathan Wrigley: Welcome to the Jukebox podcast from WP Tavern. My name is Nathan Wrigley.

\n\n\n\n

Jukebox is a podcast which is dedicated to all things WordPress. The people, the events, the plugins, the blocks, the themes, and in this case the importance of typography for your websites.

\n\n\n\n

If you’d like to subscribe to the podcast, you can do that by searching for WP Tavern in your podcast player of choice, or by going to WPTavern.com forward slash feed forward slash podcast. And you can copy that URL into most podcast players.

\n\n\n\n

If you have a topic that you’d like us to feature on the podcast, I’m keen to hear from you, and hopefully get you or your idea featured on the show. Head to WPTavern.com forward slash contact forward slash Jukebox, and use the form there.

\n\n\n\n

So on the podcast today, we have Giulia Laco. Giulia is a web designer and developer who has been working on the web since the mid 1990s. Her primary interests are web typography and font design. In addition to project development, she’s a consultant and a trainer, mostly working with CSS, web fonts and web typography.

\n\n\n\n

This is the last of our podcasts from WordCamp Europe, 2023. I spoke to Giulia in Athens because she had just finished her presentation entitled “typographic readability in theme design and development”.

\n\n\n\n

In this session, she explored how designers can assist with the readability of websites through careful consideration of the fonts they choose and why they choose them.

\n\n\n\n

It turns out there’s quite a lot to consider. And if you’ve not given this topic much thought in the past, you’ll perhaps learn something new. I certainly did.

\n\n\n\n

We begin the podcast talking through how, at the start of the web, we were making do with a limited range of tools to help us make typographic choices. There were no web fonts available, but that started to change around 2010. Now we have access to hundreds of fonts and need to be mindful that some fonts can pose readability challenges for some users of your website.

\n\n\n\n

Giulia talks about the fact that the manner in which we read has changed since the dawn of the internet. Many people now mostly consume small passages of text, which need to be considered in a different way to longer writing.

\n\n\n\n

Concentrating upon the letters in the Latin alphabet, we talk about the ways in which readers typically break up words into smaller units, and the fact that the way letters are shaped can make them easier to parse. There’s some technical language here, ligatures X-height, apertures, and more. Which tell us about the shaping and spacing of letters. Giulia explains the current state of research into how these characteristics of fonts can affect readability.

\n\n\n\n

We talk about whether or not there are fonts which are more readable than others. Is there a collection of fonts, which you can use and be confident that you’re going to make it easy for all users of your websites?

\n\n\n\n

Giulia talks about how designs need to consider the spaces into which the text is put. Most people have a proclivity for the order in which they view a page. And knowing about this path across the page can help your readers access the text.

\n\n\n\n

The width of the text is also important. You want people to be able to read from side to side without having to move their head. How does this work across different device sizes and what can be said about text, which runs right to left, or top to bottom?

\n\n\n\n

We round off the conversation with Giulia telling us where we can find out more, as well as some of the thought leaders in this space.

\n\n\n\n

It’s a fascinating conversation about a subject that often gets overlooked. Web designers, this episode is for you.

\n\n\n\n

If you’re interested in finding out more, you can find all of the links in the show notes by heading to WPTavern.com forward slash podcast, where you’ll find all the other episodes as well.

\n\n\n\n

And so without further delay, I bring you Giulia Laco.

\n\n\n\n

I am joined on the podcast by Giulia Laco. Hello Giulia.

\n\n\n\n

[00:04:43] Giulia Laco: Hello.

\n\n\n\n

[00:04:43] Nathan Wrigley: It’s very nice to have you on. Giulia is joining me at WordCamp EU in Athens. It’s the last conversation that I’m recording, so very nice to have you on. You are going to be talking to us today about something that I genuinely didn’t know about.

\n\n\n\n

This was a really interesting topic to research from my point of view. You’re going to be talking to us a little bit about typography. That’s based upon a workshop that you did yesterday. How did it go?

\n\n\n\n

[00:05:12] Giulia Laco: I’m happy about that. I’m happy to hear that you are interested in typography as well.

\n\n\n\n

[00:05:17] Nathan Wrigley: Was it well attended? Did you get your information across? Did people engage with the topic?

\n\n\n\n

[00:05:22] Giulia Laco: I think so. I divided people in two groups, developers and designers. So to let them think about typography with the mentality of the others. So that was the point I was trying to have.

\n\n\n\n

[00:05:35] Nathan Wrigley: Well, the reason I wanted to talk to you was because when I was looking through the list of presentations and workshops, yours was really different, a topic that I genuinely hadn’t thought about in the way that you’ve made me think about it.

\n\n\n\n

Because whenever I think about typography, I am really just thinking about whether I like a font. So if I go to a website, I just make a quick judgment. Do I like that font? Do I not like that font? But there’s a lot more to it than that, which we’re going to get into. But can you just tell us why you’re interested in this? Do you have a history with working with type? Why are you so fascinated by typography?

\n\n\n\n

[00:06:17] Giulia Laco: Okay, well, maybe it’s because I’ve started making websites at the very beginning of the internet era. It was around, mid nineties. And we didn’t have the possibility to use web fonts of any kind on the web. We did what we could with very few tools. Whereas later on in 2009 or 10, we had this great possibility of using web fonts, and I started to get engaged with, with the typography. And that was the time when I was starting typography for the first time actually.

\n\n\n\n

[00:06:52] Nathan Wrigley: Are you interested in typography away from the internet? Are you interested in the way that type is presented in books and on paper?

\n\n\n\n

[00:07:00] Giulia Laco: Yes, everywhere. On menus as well.

\n\n\n\n

[00:07:03] Nathan Wrigley: Yeah, because when you actually turn your attention to typography, which is what I did after we booked this interview. Text is everywhere, and it’s really, really different wherever you look. So we are sitting in a room. There’s almost no text, but there’s a little bit of text behind you. It has a particular font.

\n\n\n\n

[00:07:22] Giulia Laco: Montserrat.

\n\n\n\n

[00:07:23] Nathan Wrigley: Montserrat probably, yeah. I’m looking at my computer. It has a font on it. I’ve just been downstairs, looked at a menu. It had three or four fonts on it. Wherever you look, there is text, and usually the typography has been thought about.

\n\n\n\n

But you were talking about typography from the point of view of how can be done better. How can be a problem for some people, and that I didn’t really realize. I knew that people would perhaps struggle to read text because it was too small, or there was a background color, which clashed with the color of the text. But I didn’t realize that the font itself could be a problem. So tell us how it can be a problem. How can some people struggle to read one font but not another?

\n\n\n\n

[00:08:08] Giulia Laco: Well, it’s a big question, because, there’s a lot of research about that, recent research on readability. Because very few people read a lot nowadays in each country. So a lot of countries are worried about that.

\n\n\n\n

So there are movements to let people read better by making some tools. And big companies like Adobe, Google are on this concern. They’re concerned about that. So they’re trying to study that subject. The Readability Consortium, a consortium from between these big companies and universities in America.

\n\n\n\n

And it’s working interdisciplinary. So with psychologists, typographers, graphic designers. And started to focus on what makes text legible. And what they are, as far as I know, they’re saying is that it’s different for everybody. So you test it.

\n\n\n\n

And so that’s why you need to make tools that help people adjust their texts when they read for long form reading, of course. Not for just a menu or, very few words you are going to read. And they’re trying to do those tools. And maybe it’s difficult for a user to know what they need.

\n\n\n\n

[00:09:30] Nathan Wrigley: Right.

\n\n\n\n

[00:09:30] Giulia Laco: So, they are working also with AI. Trying to have some patterns and, have some themes, let’s say. So that can adapt to very different kind of people. But they’re trying to reach that patterns by research, not by guessing. So that’s very intereting.

\n\n\n\n

[00:09:50] Nathan Wrigley: Yeah, really interesting. I mean, again, when I was researching this, it suddenly occurred to me that, I have children, they’re grown up largely now. But I remember when they came home from school, at the beginning, their homework was in child-friendly fonts. Let’s put it that way. Often it was something along the lines of comic sans something like that. And it didn’t occur to me at all at the time, I just thought, oh, well it’s a child-friendly font. It’s kind of round and it’s got, you know, there’s no hard edges.

\n\n\n\n

I just thought it’s just a pleasant thing to look at. But now that I’m thinking about it, it was probably an easier font for the child to begin to learn to read with. Because all of the letters were clear. There was no confusion between one letter and the other. You know, you couldn’t mistake the L for the I, for example. And I did wonder, you were saying that there’s less people reading than ever. If the typography is a, quotes, difficult font, it may be more difficult to begin learning to read. I don’t know if that’s something that you were trying to say there.

\n\n\n\n

[00:10:59] Giulia Laco: Well actually, when a child start reading has a very tough task. And helping that process is important. I remember seeing books in upper case letters only, it was meant to be simpler. But they started only to recognize only one kind of letters. In the Latin alphabet, we have upper case and lower case, and they’re very different because of their history.

\n\n\n\n

Uppercase letters comes from the engraved Latin letters. Whereas the small, lowercase, comes from calligraphy. So they’re very different origins,. And it’s not the same to learn lowercase a and a lowercase a. Recognizing them as the same letter, the same sound.

\n\n\n\n

And with sound is also difficult, especially in English, you have so much problem with sounds and letters.

\n\n\n\n

[00:11:57] Nathan Wrigley: Yeah. I think we have 44 sounds, but only 26 letters.

\n\n\n\n

[00:12:02] Giulia Laco: And the combination. When you use a letter and a sound, other languages are much more simpler on that respect.

\n\n\n\n

[00:12:09] Nathan Wrigley: Yeah again, remarkable. I’d never really given any thought to how different uppercase and lowercase are. But they don’t bear, in some cases they’re quite similar.

\n\n\n\n

[00:12:17] Giulia Laco: Yes.

\n\n\n\n

[00:12:18] Nathan Wrigley: So an l and a capital L, broadly the same. But something like an a, the capital letter A and the lowercase letter. They’re just utterly different, aren’t they? They’re really, really remarkably different. Oh, that’s fascinating. I hadn’t given any thought. So what makes text legible to a lot of people, or not legible to a lot of people? Are there any kind of guidelines around that?

\n\n\n\n

[00:12:41] Giulia Laco: Okay, I will distinguish between legibility and readability. Because, you have this distinction in English and it’s great. We don’t have it in Italian. I guess the legibility comes from lighting as we have for legibilita in Italian. And it’s something that has to do with decoding. So that’s something that has to do with the typeface.

\n\n\n\n

Whereas readability is something you want to read, you like to read something, you want to read. And not you’re just trying to decode things. So that’s a big difference, when you start to understand why a text is readable or not. I would say that trying to take a legible font means to have a font with certain characteristics.

\n\n\n\n

For example, it’s let’s say proved that a font with a higher X-height is more legible. I’m talking about running text, the body text for long reading experience. So X-height is basically the medium height of the lower case letters, based on the letter x, that’s why X-height, you see.

\n\n\n\n

And so for example, I don’t Helvetica has a higher X-height than Times New Roman, for example, if you compare it. And having a higher X-height is a typeface, be more readable.

\n\n\n\n

And another very important thing is with apertures. Apertures, how can I say, the white space inside the part of the letters that are open. Take a lowercase e in the lower part of the letter. You have this room. If it’s more closed, it’s less legible because it can be taken for an o for example, you see. So Helvetica, for example, is very well used, but it’s not legible as a body copy. Helvetica is wonderful for display type for titles, but not so well for body text.

\n\n\n\n

[00:14:42] Nathan Wrigley: So you are saying, so this X-height? So is typically the height of the letter x. So if I put an x next to the letter h, for example, it’s the height of the rounded bit of the letter h?

\n\n\n\n

[00:15:55] Giulia Laco: Yes, exactly.

\n\n\n\n

[00:14:57] Nathan Wrigley: Or it would be the height of the letter a? Or the rounded bit of the letter p? The more tall that bit is, the more legible it is for most people to read. I had no idea.

\n\n\n\n

[00:15:09] Giulia Laco: Well, it’s just one thing because, not only that, because it’s also how you set type. For example, if you have a large X-height, typeface and you set it with a very small space between the lines, the line height, the leading, they say in typography. You don’t take advantage of that highness, you see.

\n\n\n\n

[00:15:32] Nathan Wrigley: Okay. So if letters are squashed. If one line of letters is compressed, so line height.

\n\n\n\n

[00:15:37] Giulia Laco: Mm-hmm.

\n\n\n\n

[00:15:37] Nathan Wrigley: Is compressed up against another line of letters beneath it, that makes it more difficult to read because there’s just no room for the letters to breathe, There’s no gap. They’re all just squished together. Okay?

\n\n\n\n

[00:15:48] Giulia Laco: But you have to pay attention not to put too much line height. Otherwise you lose the next line when you jump from one line to the other, it’s too far and you can’t find it.

\n\n\n\n

[00:15:59] Nathan Wrigley: So this is the eyes ability to go from the end of one line and track, and immediately find the beginning the next line.

\n\n\n\n

[00:16:46] Giulia Laco: Yes exactlly.

\n\n\n\n

[00:16:47] Nathan Wrigley: I confess I have experienced that problem before, and I hadn’t noticed, until just now, that that was because of that. I’ve definitely had books that I’ve been reading where I’ve struggled to begin the next line, and sometimes repeated the line that I was supposed to be on. Or I’ve skipped a line and missed a line out and only halfway through thought, actually that doesn’t make any sense. Let me go back. I had no idea. But also you are saying that the amount of, what did you call it, the space?

\n\n\n\n

[00:16:30] Giulia Laco: Oh, typographers call it leading because it’s comes from lead, lead, lead, I don’t know, of the metal types. With metal types they used to put some space between the lines with some lead. So the lead bars.

\n\n\n\n

[00:16:45] Nathan Wrigley: Oh, okay. So they spaced them out with a physical object.

\n\n\n\n

[00:16:30] Giulia Laco: Yes, exactly.

\n\n\n\n

[00:16:45] Nathan Wrigley: And it was a bar of lead, and the wider the bar of lead, the more space. This is fascinating. But you also mentioned in the letter e for example, the lowercase e, forgive me if I misunderstood. So the bottom half of the letter e, there’s a gap, a little gap, and the amount of gap, if the gap is bigger.

\n\n\n\n

[00:17:07] Giulia Laco: That’s the aperture, yes.

\n\n\n\n

[00:17:08] Nathan Wrigley: The bigger the gap is, the more you are likely to be able to read it, typically?

\n\n\n\n

[00:17:13] Giulia Laco: Yes, because you’re likely to distinguish it from an o.

\n\n\n\n

[00:17:16] Nathan Wrigley: Of course.

\n\n\n\n

[00:17:17] Giulia Laco: You decode it easiest.

\n\n\n\n

[00:17:19] Nathan Wrigley: You keep mentioning Helvetica. Is that a font which has lots of problems? Is that why you mention it, because it’s full of things you can identify?

\n\n\n\n

[00:17:26] Giulia Laco: It’s very well known. That’s why I’m mentioning. And very much used. But it’s better to use it as a display type.

\n\n\n\n

[00:17:34] Nathan Wrigley: The only thing that I’ve ever had a problem reading, was the thing that I’ve just described where I have skipped a line or gone back and reread the other line. But I’m imagining that you’ve done this talk because there are problems which people experience, which I fortunately, don’t appear to have a problem with. What trips people up? If you were somebody that, I don’t know how to say this correctly. If you are somebody who struggles to read, what are the trip wires, if you know what I mean?

\n\n\n\n

What are the things in a font could be wrong that make you unable to read it? So you mentioned that the line height, you mentioned the X-height. Is there more to it than that?

\n\n\n\n

[00:18:14] Giulia Laco: Well, there might be a lot. One thing that I can think of are ambiguous forms of letters. Let’s take lowercase letters, p and q or b and d. So for these four letters in a sans serif font, for example, are usually with the same shape, just flipped or rotated. That’s said to be a problem with people that experience dyslexia. But it’s actually opinionated because we don’t know exactly how it works. Actually for everybody can be a problem to distinguish between similar shapes.

\n\n\n\n

For example, as you said before, a child who is starting to read, or to write as well, may experience the same problem. No matter if it’s, if there’s a problem of dyslexia or not. So if you are going to avoid these kind of things, you can pick a font, a serif font that generally has different letters, different forms. The four letters I mentioned, typically with small serfis in different parts of the letters so they can be distinguished, for sure.

\n\n\n\n

[00:19:27] Nathan Wrigley: Can you, I know it’s probably obvious to most people, but will you just tell people what a serif font is and what it isn’t? You know, if you’ve got a non serif font or serif font, what’s the difference?

\n\n\n\n

[00:19:39] Giulia Laco: Let’s take the example of Helvetica and Times New Roman. So maybe it’s easier for people to visualize the difference. Helvetica has straight lines, nothing at the termination of the strokes. Whereas Times New Roman has some small shapes that derive from the calligraphic or the, in that case, for the upper case, the engraving, the instrument that we use to engrave. And so they had this little [feet?] let’s say so, that distinguish the kind of font.

\n\n\n\n

And the font has a different mood, very different mood. And a lot of other characteristics. There are, well, history of typography is based on that more or less.

\n\n\n\n

[00:20:24] Nathan Wrigley: It always feels to me as if a font, a serif font, which has these, I think you use the word where the letter terminates. I’ve never really

\n\n\n\n

[00:20:31] Giulia Laco: thought about that. They always look as if they’re more, I don’t know, maybe in a legal document or something like that. They have this feeling of something more powerful or more important or something. It’s quirky that, isn’t it?

\n\n\n\n

I’m looking at a Google Doc where I’ve written my show notes and, I don’t see any that. I can’t tell you that either of those fonts are a serif font or a non serif font. I find them both equally easy to read. It doesn’t trip me up at all. But typically, is there a problem for some people with a serif font or a non serif font? Is there one, to catch everybody would it be better to not deploy a serif font or is there just no difference in people’s ability to cope with either?

\n\n\n\n

Each font is maybe very different. Most people at the first level, when they start talking about topography, they started to see this difference. But that’s not the main point. Maybe the main point in readability is the rhythm of letters. The rhythm where the white space and the black space, meaning when you have black text on white. They alternate each other.

\n\n\n\n

Try to figure out this word, minimum. You’ll have a lot of rhythm. Minimum in, written in lower case letters. You see? So, the rhythm is very, very different. And maybe that’s important in typography, in reading. And is very important for people who struggle with reading, because you don’t interrupt the rhythm. The rhythm helps reading.

\n\n\n\n

[00:22:03] Nathan Wrigley: It just sort of bounces along, doesn’t it? If you look at the word minimum, it genuinely has a, it’s almost like a little wave pattern going up and down, isn’t it? That’s fascinating. So what did you call it? Your ability to read it. There was a word you just said. Rhythm, rhythm. So words can have rhythm, and the more rhythm there is, the easier it is to read. So if a font provides rhythm, that’s a good thing.

\n\n\n\n

[00:22:24] Giulia Laco: I think so. But it depends also on the purpose. Long reading. I think that’s important. Otherwise it’s different. It’s totally different. I mean concepts with display types because they have a different purpose, you know, text and function. The titles have different purpose. They have to catch the attention. Whereas the long, the body text has to be read, so needs a different kind of attention.

\n\n\n\n

[00:22:53] Nathan Wrigley: Right. And are there any guidelines which kind of fonts catch the attention more, and which kind of fonts work better with the body content? You know, where you’re reading long paragraphs and so on? Does it matter or is there one kind of font that you would recommend in each case?

\n\n\n\n

[00:23:08] Giulia Laco: Generally, when you buy a font, you’ll have a font that is meant for body text and some other for display type. So if you rely on what the designer, the type designer, has done, you are safe. Otherwise you have to. try. But also if you go on a repository like Google fonts for example, you have this distinction among display types and other kind of types. So it’s quite a common mistake at the beginning to take display type and use it as a body text. And that’s a typographic crime.

\n\n\n\n

[00:23:47] Nathan Wrigley: I like it. Typographic crime. That’s great. We’re all of us using our devices more and more. It’s funny that you said that reading is becoming less and less, because it feels like we have text in front of us all the time now. So we’re constantly staring at our mobile phones, and our computers. But when I was a child, if I wasn’t holding book, I probably wasn’t reading.

\n\n\n\n

I mean, maybe there was a poster somewhere or something, but I’m surprised that reading is, there’s less desire to read, because it feels like every day I’m reading more or less constantly, you know, I’m scanning Twitter or Facebook or whatever.

\n\n\n\n

[00:24:26] Giulia Laco: It’s a new kind of reading, Because we had long form reading for books. Then we have glanceable reading for, I don’t know, street signs. Or maybe a manual in a website. And then we have this, they call it interlude reading. You read when you’ve time, you’re doing, you don’t have a lot of attention, you scroll. And then you have also that the way we read on the web is very different from what we read, elsewhere.

\n\n\n\n

For example, we have this shape, F shaped reading. When we, in a website, eye tracking has shown it quite a lot. You start from the top left where the logo generally is. Then you go on the right, then you go on the left, but a bit bottom, and then a bit, you are just drawing an F more or less, when you read.

\n\n\n\n

[00:25:17] Nathan Wrigley: So that’s what the eye typically does when it lands on a webpage.

\n\n\n\n

[00:25:20] Giulia Laco: Yes.

\n\n\n\n

[00:25:20] Nathan Wrigley: What was that? Top left, top right.

\n\n\n\n

[00:25:23] Giulia Laco: Bottom.

\n\n\n\n

[00:25:23] Nathan Wrigley: Bottom.

\n\n\n\n

[00:25:24] Giulia Laco: A bit in the middle, right. And then bottom again.

\n\n\n\n

[00:25:27] Nathan Wrigley: So it makes an, if you were to draw on top of that screen, it coincidentally looks a bit like a capital F.

\n\n\n\n

[00:25:32] Giulia Laco: Yes, exactly.

\n\n\n\n

[00:25:33] Nathan Wrigley: That’s fascinating.

\n\n\n\n

[00:25:34] Giulia Laco: Capital F reading.

\n\n\n\n

[00:25:36] Nathan Wrigley: Capital F reading. Presumably that’s on a desktop. On this, I’m not doing that am I? I’m holding up my phone. If I’m looking at a webpage, presumably it’s a different experience. It’s just left to right, left to right, left to right.

\n\n\n\n

[00:25:49] Giulia Laco: Also because you are hiding some part of the text with your thumbs. Are you right-handed? Left-handed? It depends what you do. And it change a lot. For example, in the UX design, we generally change some patterns with smartphones because we put some menus at the bottom because the area near the thumb, for example.

\n\n\n\n

So, if it changes where you put your fingers, your changes also where you put your eyes. Focusing in which part of the screen.

\n\n\n\n

[00:26:20] Nathan Wrigley: Yeah, that’s interesting. My experience of the internet is that usually the menu on a mobile device comes at top right. There’s usually some icon.

\n\n\n\n

[00:26:28] Giulia Laco: But that’s for convention.

\n\n\n\n

[00:26:29] Nathan Wrigley: But what you’ve just described is much more sensible, having the menu the bottom because.

\n\n\n\n

[00:26:33] Giulia Laco: I hope it will change soon.

\n\n\n\n

[00:26:34] Nathan Wrigley: Because my thumb can just go right to it. It’s just there. Yeah, that’s fascinating. It does matter what device you’re on. But are you using the same? I know that you’ve said that you reposition things like the menu or what have you, but are you using the same font on a desktop as you would be on a mobile device? Is it broadly the same? You don’t need to worry about the view port of a mobile device in terms of the CSS for setting the font. It’s just the same desktop, mobile, tablet, same fonts.

\n\n\n\n

[00:27:03] Giulia Laco: From the readability point of view, I would say yes. And it’s for branding. I guess it’s better to have different environments recognizable. Whereas you have to pay attention to licensing. If you buy a font, for example, you put it on an app, you might need a different license. If you’re using open type, open source phones, you are not going to have a problem. But if you buy, if you rent, web fonts, yeah, you might have some problem or you have to check if you can put that web front on an app. You might need a different license.

\n\n\n\n

[00:27:39] Nathan Wrigley: Yeah, I hadn’t really thought about that. It’s always quite common in the circle of friends that I have, comic sans is a font, which most of my friends ridicule. They think it’s a childish font. Nobody would put it on a professional website. Are there some fonts like that, which you would just always avoid? Not because they look childish, but because they are largely unreadable.

\n\n\n\n

[00:28:00] Giulia Laco: There might be some, for example, well comic sans has a very big history of love and hate, basically of hate actually. But remember the case and presentation of the Higgs Boson?

\n\n\n\n

[00:28:16] Nathan Wrigley: Yes. Was that done in comic sans?

\n\n\n\n

[00:28:18] Giulia Laco: Yes. There was a Twitter storm. Okay, you couldn’t use that informal font on a formal presentation, and that raised the topic actually. You have to use the font that is proper to the situation. It’s like clothing. The clothes you wear, it’s like the font you use. It depends on the situation.

\n\n\n\n

But I can understand the feeling that people have when they choose comic sans. And maybe I can suggest something similar, but a bit more proper, or a bit more interesting in that context.

\n\n\n\n

There’s one font. I am on Google fonts repository. That’s called Amantic Small Caps, and it’s a small caps, so it’s a more, it’s not lowercase. But it’s, I think has a similar mood and I would dare it’s quite a new comic sans in the mood. I mean, it has the same mood, in my opinion. I say in my opinion, it’s also because it’s in my culture, it’s very culture dependent. Because it’s based on what you saw, what you associate to those fonts for example.

\n\n\n\n

[00:29:28] Nathan Wrigley: Yeah, it’s really interesting when I travel to the US. The US have a really different set of fonts which they use, especially on government documents, than we have in the UK. And wherever I look, so I don’t know, I buy some sun cream or something like that. The font choice is utterly different from how it would typically look in the UK. And it’s kind of curious, that it’s so obvious to me that that’s an American box. And yet it’s merely a font that tells me that. But I can see it all the time.

\n\n\n\n

But what you’re saying though is you’ve got to use your intuition. There’s no rule for this is a good font, that’s a bad font. It’s really where are you putting it and your own personal preference. There are no fonts which are out of the question because they’re just literally unreadable by a subset of the people, no, you look like you’re about to say something.

\n\n\n\n

[00:30:18] Giulia Laco: Well, there might be some fonts that are really illegible, but there are some really nice experiment by a very talented type designers, David Jonathan Ross. He tried to push the boundaries of readability, making good fonts, but making how long you can go to draw a very new kind of letter and still have it readable. So that’s interesting to see. But made by people who know what they do.

\n\n\n\n

Whereas if you start, if you look at the, I don’t know, fonts that you can have on a lot of websites, just experiments by people who start. But if you, look at experiments by very good designers, oh, you know what they do.

\n\n\n\n

[00:31:06] Nathan Wrigley: You make client websites still. Do you get into this conversation quite a lot with your clients? Is typography something that you bang the drum of?

\n\n\n\n

[00:31:14] Giulia Laco: I try to listen as for everything else, to the client and understand what they need. And then I’ll try to suggest what I think is proper. It’s like also for the colour of a website for example. I ask and I give an advice maybe.

\n\n\n\n

[00:31:30] Nathan Wrigley: Are there any kind of hard and faster rules for where you, really, it would be unwise to put typography. In our show notes, I was talking about things like is it a bad idea to put, I don’t know, fonts into images.

\n\n\n\n

So you’re overlaying fonts on images. In other words, is it better always to have fonts on a plain background rather than on, let’s say you’ve got a mountain scene or something and you want to write something, you put it onto the image. Is it better to keep the text away from the images? That was just one thought.

\n\n\n\n

[00:32:02] Giulia Laco: That’s definitely better. But you have to distinguish between titles and body copy. A title might be, how can I say? It would be okay anyway. It’s only a word. You might have some tricks, for example, reducing the contest of the underground image. As long as you stick with accessibility guidelines, you’re safe for that regard.

\n\n\n\n

There are very good starting point for readability. I mean, I generally say that it’s better to start from accessibility and there are a lot of accessibility guidelines that help with the text. And then you go on and if you have some tools, like a very powerful web font, you can do more. And then you go with type setting and start type setting.

\n\n\n\n

Well, for example, you have to stop the line length. That’s very, very important. You don’t have to let your user go through all the screen, a very huge screen to go to the other line, to the second line.

\n\n\n\n

[00:33:04] Nathan Wrigley: Is there any guidance about how wide the text line should be? So maybe that’s a, I don’t know, you said using a number pixels is not always the best idea. But is there a character limit, or a word limit typically where the eye can cope with scanning from left to right and then beginning again. Because I’m staring at a Google Doc at the moment and it’s kind of interesting that the Google Doc looks like a piece of paper.

\n\n\n\n

And they’ve obviously deliberately taken it in. The Google doc could consume the whole width of my monitor, but it doesn’t. They’ve confined it to what looks like a piece of paper, and I presume that’s a convention, just so that my eye doesn’t have to go far left, far right, far left, far right. I could keep my nose pointed at the document and just let my eye do the work, whereas if it went from left to right, I would be moving my neck all the time as well. So is there a guidance of how wide text should be?

\n\n\n\n

[00:33:56] Giulia Laco: Typographers, for a long time, had recommended a line length of between 45 and 65 characters per line. It depends for Latin alphabets. The Web Accessibility Guidelines says, I think at the level Triple A. They say that they need 80 characters maximum per line for Latin, I think 40 for languages with ideograms. So they say something about that.

\n\n\n\n

And it’s very interesting to see that there’s a correlation between this line length and the way we read. The way we read is basically with eye and brain because, it’s a really complex process. But when we read with the eye, we just focus on few letters at the time, maybe six, seven characters. Then we jump to another area of fixation. And so you can do some math. A very good typographer Bruno Maag made that math.

\n\n\n\n

And he discovered that calculating the number of characters you see in each fixation has a relationship with what typographers said for years, for decades, for centuries actually. So they arrived at the same conclusions. So let’s say 55, 65 characters per line is a good measure.

\n\n\n\n

[00:35:18] Nathan Wrigley: Yeah.

\n\n\n\n

[00:35:18] Giulia Laco: On the other hand, all these factors are correlated. And especially font size, line height, and line length. Some typographers says that it’s like a triangle of these three elements have to be on balance. So if you change one, you have to change the others. Adapt the others.

\n\n\n\n

[00:35:40] Nathan Wrigley: So we’ve just been talking about the left to rightness, the line length. Is there anything about the length of the paragraphs that you use as well? I mean, I’m just used to reading books and obviously they’re confined by the width. The line length is taken account of. But I’m conscious that everything’s broken up into paragraphs and those chunks of meaning have often got little gaps between them. I’m imagining in many cases, paragraphs could go on for pages, but it’s better to break it up and it helps the brain to associate that this is a body of meaning and here’s another body of meaning and so on.

\n\n\n\n

[00:36:10] Giulia Laco: Yes. I think absolutely. The basic of our work as web designers actually. So it’s different from what we do on paper, because on screens we have to catch the attention. And so we need to make things very easy for the reader. That’s the purpose. Maybe it’s not always the case that that’s the purpose, but on web design generally, that’s the purpose.

\n\n\n\n

So it’s better to split a paragraph in a few small chunks, let’s say so, and give different, styling and introduce hierarchy as well. So that helps a lot in reading.

\n\n\n\n

[00:36:48] Nathan Wrigley: So headings and paragraphs and other headings and so on. You mentioned in the show notes that when you did your workshop, were going to give some helpful CSS to break up the text. Can you just tell us what that was? What helpful CSS did you have?

\n\n\n\n

[00:37:02] Giulia Laco: Basically, I would say that’s very important not to use an absolute unit when you set the font size. Where font size is what is more relevant in readability? Because if it’s too small, you can’t read at all. If it’s too big, also so you can’t read it well. So font size is very important and after the responsive web design, we’ve had the responsive web typography. It didn’t come at the same time. Because with responsive web design, we started to make things different for different devices. But we didn’t touch the font size.

\n\n\n\n

[00:37:40] Nathan Wrigley: Right, it was just the same. Yeah.

\n\n\n\n

[00:37:42] Giulia Laco: But it was really important to change the font size. At the beginning I thought that it was important to make smaller font size on smartphones. Because you had a very smaller screen, but that was not the reason I realized later on.

\n\n\n\n

And the reason is the distance of reading. So when you read something that is near, you don’t need a big font size. You generally keep an iPhone at 20, 30 centimeters of distance from your eye. Whereas if you read to a computer you are 70 centimeter, 80, 1 meter, I don’t know. If you read to a screen in a room, for example, yeah, it’s very, very different.

\n\n\n\n

For example, yesterday I had this at the workshop. I had this CSS Codepen. I realized I had some minimum and maximum font size in my slider. It was perfect for desktop reading. As soon as I was in the room, I said, oh no, I have to change, and I changed it to a different values because of that.

\n\n\n\n

[00:38:48] Nathan Wrigley: So, the presentation looked good on your computer, but as soon as it went on the big screen.

\n\n\n\n

[00:38:52] Giulia Laco: Okay, the presentation was okay because I knew it in advance. I mean, it was a presentation, but it was in the playground, I realized, yes. And because I had all those values, I was guessing what was reasonable values. But I didn’t test it before on such a big room.

\n\n\n\n

[00:39:10] Nathan Wrigley: So I’m guessing that at some point soon we’ll be able to make a link to WordPress TV. It occurs to me that the whole time we’ve been talking about typography, but we’ve probably been concentrating on English. Although it’s a common language, it’s by no means what everybody reads.

\n\n\n\n

So we’re going from top to bottom, left to right. But other parts of the world, let’s say people that read Arabic or Hebrew or Korean or Japanese or Chinese, whatever it is. They’re going in completely different directions, left to right, bottom to top and so on.

\n\n\n\n

Do they have similar concerns with their characters? Or is it just uniquely the Latin set of characters which has these problems?

\n\n\n\n

[00:39:54] Giulia Laco: I’m sure they have. Also maybe different problems. I’ll distinguish between Arabic to the other languages you mentioned, like Japanese, Chinese, and Korean, for example. They have ideograms. With Arabic it’s quite a calligraphic origin of the way of writing. And they make a lot of use of ligatures. It means it changes the shape of letters according to their combination.

\n\n\n\n

We have ligatures in Latin as well. For example, if you think of f and i, small lowercase letters f and y. Sometimes you have one glyph that put the dot of the i inside the f. And that’s coded inside the file, the font file.

\n\n\n\n

So in Arabic they have a lot of ligatures. And lately I’ve discovered that they also use color for accent. And Google fonts has some new fonts with this characteristic. Color fonts. Do you know color fonts?

\n\n\n\n

[00:40:54] Nathan Wrigley: No.

\n\n\n\n

[00:40:54] Giulia Laco: They’re very, very new. They’re coming.

\n\n\n\n

[00:40:57] Nathan Wrigley: How do you deploy color to. What? You’re going to have to explain that.

\n\n\n\n

[00:41:00] Giulia Laco: Well, they have color coded inside the typeface. It’s a new format we can use. And, it’s linked to CSS. It’s not so much ready, but it’s coming. It’s a new technology after variable fonts.

\n\n\n\n

[00:41:17] Nathan Wrigley: So certain aspects, certain portions of the letter receive different colors?

\n\n\n\n

[00:41:22] Giulia Laco: Yes.

\n\n\n\n

[00:41:23] Nathan Wrigley: And it provides, I have to just ask why? Why would you want to have a different portion of the letter in a different color?

\n\n\n\n

[00:41:30] Giulia Laco: Apart from Arabic, why not?

\n\n\n\n

[00:41:31] Nathan Wrigley: Oh, so it is, it’s just style. It’s not from the point of view of readability or legibility?

\n\n\n\n

[00:41:37] Giulia Laco: No. New frontiers of typography.

\n\n\n\n

[00:41:39] Nathan Wrigley: Oh, that is interesting.

\n\n\n\n

[00:41:40] Giulia Laco: But that was one point, but for Arabic might be for readability purpose. That’s why I mentioned it.

\n\n\n\n

[00:41:46] Nathan Wrigley: Honestly, this is such a fascinating subject. Unfortunately, we’re running out of time. Where would we go if we’ve been inspired by the talk that you’ve given today to me? Have you got any tips or places, websites to go to? If people are curious, where would you send them?

\n\n\n\n

[00:42:03] Giulia Laco: Okay. There are plenty of places and topography has been receiving quite an attention lately on the web. I’m always talking about on the web. But you can start with books from the tradition of typography. There are, I don’t know, from the sacred book of yypography, Robert Bringhurst, The Elements of Typographic Style. That’s a really nice starting point. Well, it’s not only a starting point.

\n\n\n\n

Erik Spiekermann’s, Stop Stealing Sheep and Find Out How Type Works. It’s very funny name. It has a history. I won’t spoiler it.

\n\n\n\n

Or I really, really liked the book by Richard Rutter, that is more on the web. It’s called Web Typography. It’s a manual on that.

\n\n\n\n

Or otherwise you can follow Jason Parmental that has been making a lot of experiments. It depends which part are you interested in.

\n\n\n\n

[00:42:59] Nathan Wrigley: You’ve given three or four things there. There’s probably something to get teeth into. And what about you? Where would we find you if people have listened to this and quite fancy having a chat with you about all this. Where do you hang out online?

\n\n\n\n

[00:43:09] Giulia Laco: Quite everyone. Maybe on LinkedIn, maybe you can reach me there so it’s better.

\n\n\n\n

[00:43:14] Nathan Wrigley: I will find your LinkedIn profile and I will link to that in the show notes. So let’s wrap it up there. Giulia, thank you so much for chatting to me today. Honestly, a real eye-opener. I’ve enjoyed that a lot.

\n\n\n\n

[00:43:24] Giulia Laco: Thank you. Me too.

\n
\n\n\n\n

On the podcast today we have Giulia Laco.

\n\n\n\n

Giulia is a web designer and developer who has been working on the web since the mid 1990s. Her primary interests are web typography & font design. In addition to project development, she is a consultant and a trainer, mostly working with CSS, web fonts and web typography.

\n\n\n\n

This is the last of our podcasts from WordCamp Europe 2023. I spoke to Giulia in Athens because she had just finished her presentation entitled “Typographic readability in theme design & development”.

\n\n\n\n

In this session she explored how designers can assist with the readability of websites through careful consideration of the fonts they choose, and why they choose them.

\n\n\n\n

It turns out there’s quite a lot to consider, and if you’ve not given this topic much thought in the past, you’ll perhaps learn something new.

\n\n\n\n

We begin the podcast talking through how, at the start of the web, we were making do with a limited range of tools to help us make typographic choices. There were no web fonts available, but that started to change around 2010. Now we have access to hundreds of fonts and need to be mindful that some fonts can pose readability challenges for some users of your website.

\n\n\n\n

Giulia talks about the fact that the manner in which we read has changed since the dawn of the internet. Many people now mostly consume small passages of text, which need to be considered in a different way to longer writing.

\n\n\n\n

Concentrating upon the letters in the Latin alphabet, we talk about the ways in which readers typically break up words into smaller units, and the fact that the way letters are shaped can make them easier to parse. There’s some technical language here, ligatures, X-height, apertures, and more, which tell us about the shaping and spacing of letters. Giulia explains the current state of research into how these characteristics of fonts can affect readability.

\n\n\n\n

We talk about whether or not there are fonts which are more readable than others. Is there a collection of fonts which you can use and be confident that you’re going to make it easy for all users of your websites?

\n\n\n\n

Giulia talks about how designs need to consider the spaces into which text is put. Most people have a proclivity for the order in which they view a page, and knowing about this path across the page can help your readers access the text. The width of the text is also important; you want people to be able to read from side to side without having to move their head. How does this work across different device sizes, and what can be said about text which runs from right to left, or top to bottom?

\n\n\n\n

We round off the conversation with Giulia telling us where we can find out more, as well as some of the thought leaders in this space.

\n\n\n\n

It’s a fascinating conversation about a subject that often gets overlooked. Website designers, this episode is for you.

\n\n\n\n

Useful links.

\n\n\n\n

Giulia’s WordCamp Europe 2023 Session “Typographic readability in theme design & development

\n\n\n\n

The Readability Consortium

\n\n\n\n

Amantic Small Caps font

\n\n\n\n

David Jonathan Ross’ website

\n\n\n\n

Web Accessibility Guidelines website

\n\n\n\n

Bruno Maag Wikipedia page

\n\n\n\n

Google fonts

\n\n\n\n

Robert Bringhurst’s The Elements of Typographic Style

\n\n\n\n

Erik Spiekermann’s Stop Stealing Sheep and Find Out How Type Works

\n\n\n\n

Richard Rutter’s Web Typography

\n\n\n\n

Jason Parmental’s website

\n\n\n\n

Giulia’s LinkedIn page

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Wed, 26 Jul 2023 14:00:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:14:\"Nathan Wrigley\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:41;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:53:\"WordPress.org blog: WordPress 6.3 Release Candidate 2\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://wordpress.org/news/?p=15460\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:69:\"https://wordpress.org/news/2023/07/wordpress-6-3-release-candidate-2/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:7320:\"

WordPress 6.3 RC2 is ready for download and testing.

\n\n\n\n

This version of the WordPress software is under development. Please do not install, or run, or test this version on production or mission-critical websites. Instead, you should evaluate RC2 on a test server and site. 

\n\n\n\n

While release candidates are considered ready for final release, additional testing and use by the community can only make it better.

\n\n\n\n

WordPress 6.3 is scheduled for release on August 8, 2023 – just two weeks from today.

\n\n\n\n

Get an overview of the 6.3 release cycle, check the Make WordPress Core blog for 6.3-related posts, review new features in WordPress 6.3, or watch a recorded demo.

\n\n\n\n

Developers and extenders should review the comprehensive WordPress 6.3 Field Guide for detailed technical notes regarding new features and improvements.  

\n\n\n\n

RC2 Highlights

\n\n\n\n

Since the RC1 release on July 18, 2023, there have been approximately 15 issues resolved in Editor and Trac.

\n\n\n\n

Notable updates for this release include:

\n\n\n\n
    \n
  • Footnotes will be reverted or restored with post revisions (#52686).
  • \n\n\n\n
  • Distraction free adds a missing command in the site editor (#52868).
  • \n\n\n\n
  • Global styles revisions will display text if no revisions are found (#52865).
  • \n\n\n\n
  • The About Page has been completed (#58067).
  • \n\n\n\n
  • The About Page now includes a “Get Involved” section (#23348).
  • \n\n\n\n
  • The dark mode option has been restored in the block editor iframe for Twenty Twenty-One (#58835).
  • \n\n\n\n
  • Max height value was fixed in the image scaling in the Edit Media screen (#50523).
  • \n\n\n\n
  • Additionally, some issues regarding internationalization were addressed (#58879#58067 and #58864).
  • \n
\n\n\n\n

Test features in WordPress 6.3

\n\n\n\n

Testing for issues is a critical part of developing any software, and it’s a meaningful way for anyone to contribute—whether you have experience or not. While testing the upgrade process is essential, trying out new features is too. 

\n\n\n\n\n\n\n\n

Vulnerability bounty doubles during the Beta/RC phases

\n\n\n\n

The monetary reward for reporting new, unreleased security vulnerabilities is doubled between the Beta 1 release and the final release candidate (RC). Please follow responsible disclosure practices as detailed in the project’s security practices and policies outlined on the HackerOne page and in the security white paper.

\n\n\n\n

Get WordPress 6.3 RC2

\n\n\n\n

You can test WordPress 6.3 RC2 in three ways:

\n\n\n\n
    \n
  • Option 1: Install and activate the WordPress Beta Tester plugin (select the “Bleeding edge” channel and “Beta/RC Only” stream).
  • \n\n\n\n
  • Option 2: Direct download the RC2 version (zip).
  • \n\n\n\n
  • Option 3: Use the following WP-CLI command:
    wp core update --version=6.3-RC2
  • \n
\n\n\n\n

Thanks to WordPress plugin and theme developers

\n\n\n\n

Do you build plugins and themes? Your products play an integral role in extending the functionality and value of WordPress for users of all types worldwide. 

\n\n\n\n

Hopefully, you have already tested your themes and plugins with WordPress 6.3 betas by now. With RC2, you will want to continue your testing and update the “Tested up to” version in your plugin’s readme file to 6.3. 

\n\n\n\n

If you find compatibility problems, please post detailed information to the support forums.

\n\n\n\n

Help translate WordPress

\n\n\n\n

Do you speak a language other than English? ¿Español? Français? Português? Русский? 日本? Help translate WordPress into more than 100 languages.

\n\n\n\n

Haiku for RC2

\n\n\n\n

Time is nearly here
WordPress shines thanks to you all
Let’s get testing, dear

\n\n\n\n

Thank you to the contributors who collaborated on this post: @Priethor, @AudrasJb, @DavidBaumwald, @DanSoschin, @JPantani and @Meher.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 25 Jul 2023 16:43:13 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:10:\"Meher Bala\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:42;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:77:\"WordCamp Central: WordCamp Malaysia 2023 is Looking for Speakers and Sponsors\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:39:\"https://central.wordcamp.org/?p=3240139\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:102:\"https://central.wordcamp.org/news/2023/07/wordcamp-malaysia-2023-is-looking-for-speakers-and-sponsors/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:2991:\"\"\"\n\n\n\n

WordCamp Malaysia 2023 is set to take place on 8-9 September 2023 at the Cheras North International Convention Centre (CNICC) in Kuala Lumpur, Malaysia. The first ever WordCamp Malaysia promises to be an unforgettable gathering, offering a platform for knowledge sharing, networking, and community building.

\n\n\n\n\"\"\n\n\n\n

Situated near the city center, CNICC provides convenient access to major transportation hubs, allowing attendees to make the most of their time in Kuala Lumpur. With a plethora of nearby amenities and attractions, visitors can immerse themselves in the city’s rich cultural experiences, explore its iconic landmarks, indulge in its diverse culinary scene, and even venture into the nearby natural parks.

\n\n\n\n\"\"\n\n\n\n

The organizing team behind WordCamp Malaysia 2023 is actively seeking speakers who can share their valuable insights, expertise, experiences, and inspiring stories with the WordPress community. If you have a passion for WordPress and a desire to contribute to its growth, this is your chance to shine. Interested individuals can submit speaker proposals now. Don’t miss the opportunity to be part of this prestigious event and make an impact on the WordPress community in Malaysia.

\n\n\n\n\"\"\n\n\n\n

In addition to speakers, WordCamp Malaysia 2023 is also actively seeking sponsors to showcase and elevate their brands and products to the WordPress community in Malaysia. This is an exceptional opportunity for businesses and organizations to gain exposure, connect with a highly engaged audience, and demonstrate their commitment to supporting the WordPress ecosystem. To explore the various sponsorship packages available and learn more about the benefits of becoming a sponsor, interested parties can visit the call for sponsors page.

\n\n\n\n

To stay updated and learn more about WordCamp Malaysia 2023, visit the official website at https://malaysia.wordcamp.org/2023/ . The website will serve as your go-to resource for event details, schedules, ticketing information, speaker profiles, and other important announcements.

\n\n\n\n

Don’t miss your chance to be part of WordCamp Malaysia 2023. Submit your speaker proposal or explore sponsorship opportunities today!

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 25 Jul 2023 12:53:17 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:10:\"Sam Suresh\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:43;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:134:\"WordCamp Central: WordCamp Masaka 2023: Celebrating Inclusion, Diversity, and Innovation with WordPress in Uganda’s Pearl of Africa!\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:39:\"https://central.wordcamp.org/?p=3166793\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:152:\"https://central.wordcamp.org/news/2023/07/wordcamp-masaka-2023-celebrating-inclusion-diversity-and-innovation-with-wordpress-in-ugandas-pearl-of-africa/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:3351:\"

WordCamp Masaka 2023 is the inaugural WordCamp event in Uganda’s Greater Masaka region. It will be held on October 6 and 7, 2023, at Equator University of Science and Technology in Masaka City, Uganda. The event is dedicated to celebrating inclusion, diversity and fostering innovation within Uganda’s WordPress community.

\n\n\n\n

WordCamp Masaka 2023 will offer a wide range of engaging workshops, informative talks, and student WordPress project showcases designed to cater to attendees of different skill levels. The workshops will provide hands-on learning experiences and practical knowledge to help both beginners and advanced users enhance their WordPress skills. The informative talks will cover a diverse range of topics, providing valuable insights and inspiring discussions. The student WordPress project showcases will offer a platform for attendees to share their WordPress projects, regardless of their skill level, and gain inspiration from the creativity within the community.

\n\n\n\n

In addition to the diverse range of activities, WordCamp Masaka 2023 will include a contributor session dedicated to translating WordPress from English to Luganda. This session will actively engage participants of all skill levels in the translation process, fostering collaboration and empowering Luganda (the most spoken language in Uganda) speakers to access WordPress in their native language.

\n\n\n\n

Get Involved

\n\n\n\n
    \n
  • Purchase Attendee Tickets: Secure your tickets to join the WordPress community in celebrating this inaugural event in the Greater Masaka region, Uganda. Tickets are available for purchase, offering a unique opportunity to engage with like-minded individuals and expand your WordPress knowledge.
  • \n\n\n\n
  • Call for Sponsors: Support the first-ever WordCamp Masaka and gain visibility for your company. Explore available sponsorship options to contribute to the success of this event and demonstrate your commitment to the WordPress community.
  • \n\n\n\n
  • Call for Speakers: Share your expertise, experiences, and insights by applying to be a speaker at WordCamp Masaka 2023. The call for speaker applications welcomes submissions, allowing you to contribute to a diverse range of topics during the event.
  • \n\n\n\n
  • Call for volunteers: Apply to be a volunteer and actively participate in the organization of WordCamp Masaka 2023. Volunteering offers a unique opportunity to contribute behind the scenes and play an integral role in the success of this inaugural event.
  • \n
\n\n\n\n

The full list of speakers, session descriptions, and schedule will be published in early September 2023. Be sure to follow us on Twitter and Facebook to get the latest updates.

\n\n\n\n

Please don’t forget to post about this event on your social media handles using the hashtag #WCMasaka.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Tue, 25 Jul 2023 08:50:19 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:15:\"Ssebuwufu Moses\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:44;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:47:\"WPTavern: Learn How to Use WordPress Playground\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=147137\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:58:\"https://wptavern.com/learn-how-to-use-wordpress-playground\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:3215:\"

WordPress Playground, an experimental project that uses WebAssembly (WASM) to run WordPress in the browser, was number 1 on Hacker News recently and was also featured on TechCrunch. Word is getting around about how easy it is to fire up a sandbox environment in just a few seconds for testing plugins and themes and even different versions of WordPress and PHP.

\n\n\n\n

Visiting playground.wordpress.net instantly creates a real WordPress instance with admin access and everything without having to install PHP, MySQL, or Apache. Instead, it runs inside the browser using a SQLite database.

\n\n\n\n

The Playground isn’t just for developers. It also makes it easy for users who would not ordinarily maintain a local development environment to quickly test plugins or themes they find on WordPress.org, or to just explore new WordPress features in a safe place where you can’t break anything.

\n\n\n\n

If you have found it difficult to wrap your head around WordPress Playground, Learn WordPress has published a timely new tutorial called How to start using WordPress Playground. In this 10-minute video, WordPress Playground creator Adam Zieliński offers a quick demonstration of how to install plugins and themes and customize a site, and how to export design work from a customized theme. He also covers how to download the entire site and import it into a new WordPress instance, and guides users through basic compatibility testing of a theme, by switching the WordPress version on the playground site.

\n\n\n\n
\n\n\n\nLearn WordPress Tutorial: How to start using WordPress Playground\n\n\n\n

Developers who want try some more complicated things with this tool can check out the Playground API and learn how to integrate it with an app in five minutes. It’s also useful for previewing pull requests from a repository or setting up a local WordPress development environment using the VisualStudio Code plugin or a CLI tool called wp-now.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 24 Jul 2023 22:09:30 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:45;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:74:\"WPTavern: Mojeek Search Engine Adds WordPress’ Openverse to Image Search\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=147123\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:82:\"https://wptavern.com/mojeek-search-engine-adds-wordpress-openverse-to-image-search\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:2116:\"\n\n\n\n

Mojeek, a UK-based privacy-oriented search engine, has added Openverse to its image search. For more than 15 years, Mojeek has provided independent, unbiased search without tracking or building profiles on users. It is one of just a handful of genuine search engines that uses its own technology and algorithms, unlike the metasearch engines that syndicate Bing, Google, and Yandex. In October 2022, Mojeek passed a major milestone of having indexed more than 6 billion pages.

\n\n\n\n

The search engine had previously provided Pixabay as the default for its image search with the option to use Bing as an alternative.

\n\n\n\n

“We have always wanted to eventually get rid of Bing,” Mojeek Head of Marketing Joshua Long said. “Due to both Microsoft’s API pricing decisions, and informed comments by people using Mojeek to search the web, we recently took that step.”

\n\n\n\n

Openverse’s openly-licensed media was a natural fit for the independent search engine. In 2021, Creative Commons Search was rebranded to Openverse when it came under the umbrella of the WordPress open source project. With more than 700 million Creative Commons licensed and public domain image and audio files, Openverse exceeds Pixabay’s 4 million+ royalty-free and stock images, greatly expanding users’ abilities to search deeper on more topics.

\n\n\n\n

Although Pixabay is still Mojeek’s default image search provider, users can change their preferences, which are set using a local cookie and contain no personal data.

\n\n\n\n

“This addition is a testament to the utility that Openverse brings, as well as the ease and extensibility when it comes to using its API,” Long said.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 24 Jul 2023 20:30:07 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:46;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:115:\"Do The Woo Community: A Deep Dive into Sales Tax for Agencies and Freelancers with Kate Bacholzky and Roger Walker\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:28:\"https://dothewoo.io/?p=75724\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:66:\"https://dothewoo.io/deep-dive-into-sales-tax-agencies-freelancers/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:464:\"

Kate Bacholzky from Avalara and Roger Walker from americaneagle.com take you deep into sales tax for yourself and your clients.

\n

>> The post A Deep Dive into Sales Tax for Agencies and Freelancers with Kate Bacholzky and Roger Walker appeared first on Do the Woo - a WooCommerce Builder Community .

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Mon, 24 Jul 2023 09:08:00 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:5:\"BobWP\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:47;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:126:\"Gutenberg Times: All about WordPress 6.3, a breadcrumbs block, design systems and an onboarding wizard – Weekend Edition 262\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://gutenbergtimes.com/?p=24897\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:131:\"https://gutenbergtimes.com/all-about-wordpress-6-3-a-breadcrumbs-block-design-systems-and-an-onboarding-wizard-weekend-edition-262/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:24302:\"

Howdy,

\n\n\n\n

WordPress 6.3 release candidate has been published and with it the Fieldguide with the array of changes for developers is now available. It’s a lot to digest, so we’ll keep this newsletter short. Or rather focused on the upcoming major release. Pick and choose, depending on what’s important to your work with WordPress.

\n\n\n\n

If you have something on your Wishlist for WordPress 6.4, submit a comment: WordPress 6.4: What’s on your wishlist? (until Aug. 15)

\n\n\n\n

Be well and have a fantastic weekend!

\n\n\n\n

Yours, 💕
Birgit

\n\n\n\n\n\n\n\n\n\n

All about WordPress 6.3

\n\n\n\n

This week’s product walk through with Anne McCarthy, Rich Tabor and Nathan Wrigley is now available: WordPress 6.3 Live Product Demo – Highlights & Recording.

\n\n\n\n\n\n\n\n

Jonathan Patani also published the Q & A from the Project Walk through on the Make Core blog: 6.3 Live Product Demo Q&A. You’ll learn that to add a footnote to a paragraph you just place the cursor where the number should go and use the drop-down menu from the block toolbar. Safe yourself the highlight step. Furthermore, “The revisions show changes for all styles, including changes made when viewing the stylebook.” Those are only two of the 14 questions and answers. You can also find a ton of resources that were shared during the walk-through.

\n\n\n\n
\n\n\n\n

Femy Praseeth, release squad member on the docs team, published a Call for volunteers to help with 6.3 end-user documentation. The best advice, I received when starting out in technology was: “If you want to learn anything in technology deeply, you try to explain it to others.” Here is your chance to do both. It’s also a high-impact contribution to the open-source project! As of this writing, there are still 42 tasks in the to-do-column of the project board, waiting for you!

\n\n\n\n
\n\n\n\n

On the WP Briefing Episode 60: Mike Schroder gave a sneak a peek at WordPress 6.3 together with Josepha Haden Chomphosy. All links and transcript are shared on the post.

\n\n\n\n
\n\n\n\n

Carlo Daniele at Kinsta did again a wonderful job reporting on the upcoming major WordPress release. What’s New in WordPress 6.3: A Revamped Site Editor, a New Command Palette, Style Revisions, New Blocks, and Much More!

\n\n\n\n
\n\n\n\n

Doc Pop at Torque Magazine, invited me to speak with him about WordPress 6.3 and what’s coming to WordPress Phase 3 and WordPress 6.4. Torque Social Hour: Understanding WordPress 6.3 with Birgit Pauli-Haack. We discussed and demoed the new footnotes, Details block, Style Variation revisions, Site Editor updates, Stylebook and more.

\n\n\n\n
\n\n\n\n

Anne McCarthy highlights all the accessibility improvements that will come with WordPress 6.3 in this post: WordPress 6.3 Accessibility Improvements,they co-authored with Joe Dolson and Alex Stine, members of the WordPress Accessibility Team

\n\n\n\n
\n\n\n\n

Jamie Marsland explains WordPress 6.3 explained in 240 seconds, He covers the two new blocks, Footnotes and Details, many of the Pattern changes, aspect ratio for image blocks, enhancements to the Site Editor, Style revision and more.

\n\n\n\n
\n\n\n\n

For all the WordPress News outlets, Anne McCarthy provided a Source of Truth for WordPress 6.3 document, actually it’s more like a book with over 8,000 words. In it, they list every single feature and update that went into the WordPress 6.3 release, so journalists and bloggers can dig deeper into things and obtain the history, discussions, and overall genesis of a change. It’s a mammoth of a post.

\n\n\n\n
\n\n\n\n

Dave Smith published a video on the upcoming release: WordPress 6.3 features in 6 mins – the power of the Site Editor is finally unleashed! Smith also shared a ton of links to details for the features, if you’d like to take a deeper dive.

\n\n\n\n
\n\n\n\n

Fieldguide Dev Notes WordPress 6.3

\n\n\n\n

The release doc team assembled a huge Fieldguide with all the Dev Notes covering the big and small changes to WordPress. Here is the list of Block editor related Dev Notes:

\n\n\n\n\n\n\n\n

But wait, there is more, quoted from the Fieldguide.

\n\n\n\n
    \n
  • Anghami has been added as a trusted oEmbed provider. (#49850)
  • \n\n\n\n
  • Support for TikTok creator profiles has been added. (#55784)
  • \n\n\n\n
  • A new source attribute is added to Block patterns allowing them to be filtered by that source. (#58622)
  • \n\n\n\n
  • The Themes REST API can now indicate whether a theme supports the Site Editor by adding an is_block_theme property to each theme in the wp/v2/themes API response. (#58123)
  • \n\n\n\n
  • A revisions endpoint for global styles, /wp/v2/global-styles/revisions, has been added to the REST API. (#58524)
  • \n\n\n\n
  • WP_REST_Templates_Controller has a new modified field for template and template part objects that returns post modified datetime for Templates. (#58540)
  • \n\n\n\n
  • A new public function wp_get_remote_theme_patterns() has been added to query the patterns datum from theme.json and substitutes current usage of private APIs. (#58460)
  • \n
\n\n\n\n

Gutenberg 16.2

\n\n\n\n
\n
\n

🎙️ Latest episode: Gutenberg Changelog #87 – Patterns, Gutenberg 16.3 and WordPress 6.3. with Anne McCarthy as special guest, hosted by Birgit Pauli-Haack

\n
\n
\n\n\n\n

Sarah Gooding wrote about the latest Gutenberg release: Gutenberg 16.2 Brings Improvements to Pattern Management, Introduces Vertical Text Orientation and highlighted, among other things, the vertical text orientation, illustrated by my tweet. To enable the controls in the typography section, you need to turn it on via the theme.json settings.

\n\n\n
\"typography\":{\n      \"dropCap\": false,\n      \"fluid\": true,\n      \"writingMode\":true,\n}\nCode language: JSON / JSON with Comments (json)
\n\n\n
\n\n\n\n

Emily Shiola also checked out the latest Gutenberg version in her article: What’s New in Gutenberg: The Latest Version (July 2023) and updated her collection of highlights from every Gutenberg release back to Gutenberg 7.0. in November 2019. I bookmarked the post for later to walk down memory lane.

\n\n\n\n

Plugins, Themes, and Tools for #nocode site builders and owners

\n\n\n\n

Nick Diego held a workshop on Builder Basics: Goodbye Reusable Blocks—Hello Synced Patterns (and more) and the recording is now available on WordPress.TV. Reusable blocks are a powerful way to save and reuse content across your site. In WordPress 6.3, reusable blocks will be renamed to “synced patterns.” In this online workshop, Diego explored the new functionality for creating custom patterns and managing them in the Site Editor.

\n\n\n\n\n
\n\n \n
\n \n \n
\n \n \n \n \n
\n
\n
Introducing the Breadcrumbs WordPress Block Plugin
In 2009, I announced the release of my first breadcrumbs plugin. It was a one-file PHP script that I’d been using in my themes for around a year, and I… Check it out
\n
\n
\n \n \n \n\n \n \n
\n\n
\n\n\n\n\n

In her article: Ollie Theme Previews New Onboarding Wizard in Development, Sarah Gooding reported on Mike McAlister‘s newest work developing an onboarding experience that aims to drastically reduce the amount of time users spend setting up a new site. “McAlister said the interface is all React with largely native WordPress components and a few custom components sprinkled in to handle some of the more unique aspects of the tool.” she wrote.

\n\n\n\n

Mike McAlister posted about the new onboarding Wizard on hit blog as well: In pursuit of a more intuitive onboarding experience.

\n\n\n\n
\n\n\n\n

With LocalWP it is a straightforward tool to set up a new development site for testing or other purposes on your computer. With blueprints, you and configure a standard set-up with a set of plugins and themes. This week, Brian Gardner Introduced the Frost Blueprint for Local. “A Local Blueprint that draws inspiration from Frost, our open-source WordPress block theme. This Blueprint showcases the power and extensibility of Full Site Editing.” he wrote.

\n\n\n\n

Theme Development for Full Site Editing and Blocks

\n\n\n\n

Justin Tadlock published the first part of his upcoming Beyond Block Styles series: Using the WordPress scripts package with themes. He walks you through the details of setting up your local development space to get ready for block development. “In Part 2, you’ll learn to design a set of custom block styles. Part 3 will bring it all together into a beautiful and functional editor control. From there, well, you’ll be building some amazing features.” Tadlock wrote.

\n\n\n\n
\n\n\n\n

Yesterday’s Live Q & A: Design Systems and theme.json with David Bowman, Alec Geatches and Joni Halabi was recorded and is available on YouTube. Shared resources

\n\n\n\n\n\n\n\n\n\n\n\n
\n\n\n\n\n

 “Keeping up with Gutenberg” 
A chronological list of the WordPress Make Blog posts from various teams involved in Gutenberg development: Design, Theme Review Team, Core Editor, Core JS, Core CSS, Test, and Meta team from Jan. 2023 on. Updated by yours truly. The index 2022 is here

\n\n\n\n\n

Building Blocks and Tools for the Block editor.

\n\n\n\n

In last week’s Twitch stream, Ryan Welcher explored the existing SlotFills for extending WordPress. It’s an longer version of a previous talk at Developer Hours a few weeks ago . He walks you through all the Slotfill existing in the post editor as well as the Site editor. Welcher e also wrote about on the topic on WordPress Developer blog: How to extend WordPress via the SlotFill system and presented at WCUS 2022.

\n\n\n\n\n
\n\n \n
\n \n \n
\n \n \n \n \n
\n
\n
Live Q & A: Leveraging Gutenberg’s architecture to take plugin development to new levels
In this YouTube Live Q & A, participants learned how Gutenberg components and scripts can be used outside the block editor to revamp a plugin’s code base. Jason Adams, Director…
\n
\n
\n \n \n \n\n \n \n
\n\n
\n\n\n\n\n\n

Need a plugin .zip from Gutenberg’s master branch?
Gutenberg Times provides daily build for testing and review.
Have you been using it? Hit reply and let me know.

\n\n\n\n

\"GitHub

\n\n\n\n\n

Questions? Suggestions? Ideas? Don’t hesitate to send them via email or send me a message on WordPress Slack or Twitter @bph.

\n\n\n\n

For questions to be answered on the Gutenberg Changelog, send them to changelog@gutenbergtimes.com

\n\n\n\n
\n\n\n\n\n

Featured Image: Plants growing out of the blocks at the Acropolis by Courtney Robertson found on WordPress Photos

\n\n\n\n
\n\n\n\n

Don’t want to miss the next Weekend Edition?

\n\n\n\n

We hate spam, too and won’t give your email address to anyone except Mailchimp to send out our Weekend Edition

Thanks for subscribing.
\n\n\n\n
\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 22 Jul 2023 08:49:19 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Birgit Pauli-Haack\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:48;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:67:\"WPTavern: Ollie Theme Previews New Onboarding Wizard in Development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:30:\"https://wptavern.com/?p=147007\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:78:\"https://wptavern.com/ollie-theme-previews-new-onboarding-wizard-in-development\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:4051:\"

Unless you are some kind of wizard with the block editor, starting a WordPress website from a blank slate can be overwhelming and ultimately defeating. Mike McAlister, maker of the free Ollie theme, is developing an onboarding experience that aims to drastically reduce the amount of time users spend setting up a new site.

\n\n\n\n

“I suspect we’re cutting out a half hour or more of finagling a new WordPress site,” McAlister said. “No more wrestling with a blank canvas.”

\n\n\n\n

The Ollie Onboarding Wizard creates a guided setup experience that allows users to add basic site settings, select a color palette, input their brand colors, add a logo and site icon, and move on to creating pages. It eliminates the necessity of hunting all these settings down inside blocks and the Site Editor.

\n\n\n\n
\n\n\n\n\n\n\n\n

Instead of having to create pages individually and assign them the correct template or place the right full-page pattern, Ollie onboarding makes it possible for users to simply check which pages they want automatically created.

\n\n\n\n
\n\n\n\n\n\n\n\n

“The goal of this wizard is to help WordPress users zoom through a site setup with the Ollie theme and abstract away those annoying and disconnected setup steps we have to do for every site,” McAlister said.

\n\n\n\n

“The wizard is also a way to educate users along the way. WordPress is going through a much-needed evolution, but as expected, users are having a tough time with the transition. Change is tough, especially when you power half of the internet. Workflows like this can help.”

\n\n\n\n

The onboarding interface leans heavily towards the design of the Site Editor to make it seem naturally at home inside WordPress. It demonstrates just how nice plugins and themes can look in the admin with a more modern interface, which could soon be a reality once the ambitious admin UI revamp plans are complete.

\n\n\n\n

“Months ago, Patrick Posner and I agreed that the future of WordPress is in the new Site Editor view, so that’s where we built this wizard,” McAlister said. “That assumption has since been validated, and because of that, our interface blends in seamlessly with native WordPress.”

\n\n\n\n

“This is just a v1, but we’re already planning on how to seamlessly integrate choosing a vertical with curated plugins (eCommerce, landing page, email marketing, etc.) and surfacing pro features to really bring this experience together. This isn’t just a WordPress theme.”

\n\n\n\n

McAlister said the interface is all React with largely native WordPress components and a few custom components sprinkled in to handle some of the more unique aspects of the tool.

\n\n\n\n

After previewing the onboarding wizard, some people have asked if it will be available as a standalone product. McAlister confirmed that he doesn’t have any plans of productizing it but if there is enough demand he is willing to entertain the idea. Others have asked if there is an API for developers to add their own sections.

\n\n\n\n

“No API yet, although with the announcements of the admin overhaul initiative, perhaps one is coming,” McAlister said. “Right now, this is just a custom React layer that mimics the site editor view. It’s built to be flexible though, so if a core solution opens up, we can migrate to that.”

\n\n\n\n

McAlister previewed the wizard on Twitter and in his newsletter, but it’s still in development and not yet available for testing. He plans to launch the Ollie theme on WordPress.org once the wizard is ready for public use.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Sat, 22 Jul 2023 01:03:26 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:13:\"Sarah Gooding\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}i:49;a:6:{s:4:\"data\";s:13:\"\n \n \n \n \n \n \n\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";s:5:\"child\";a:2:{s:0:\"\";a:5:{s:5:\"title\";a:1:{i:0;a:5:{s:4:\"data\";s:111:\"Gutenberg Times: Live Q & A: Leveraging Gutenberg’s architecture to take plugin development to new levels\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"guid\";a:1:{i:0;a:5:{s:4:\"data\";s:35:\"https://gutenbergtimes.com/?p=24919\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:4:\"link\";a:1:{i:0;a:5:{s:4:\"data\";s:112:\"https://gutenbergtimes.com/live-q-a-leveraging-gutenbergs-architecture-to-take-plugin-development-to-new-levels/\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:11:\"description\";a:1:{i:0;a:5:{s:4:\"data\";s:61388:\"

In this YouTube Live Q & A, participants learned how Gutenberg components and scripts can be used outside the block editor to revamp a plugin’s code base. Jason Adams, Director of Development and Jon Waldstein, Lead Developer from GiveWP walked us through their approach to rebuilding their highly popular Donations plugin using WordPress native interface components and scripts and then also discussed how their code fits into the ecosystem. Lena Morita, a JavaScript developer on the components team.

\n\n\n\n\n\n\n\n

Connect with the Panelists:

\n\n\n\n
\n
\n
\n
\n

Lena Morita

\n\n\n\n\n
\n\n\n\n
\n

Jon Waldstein

\n\n\n\n\n
\n\n\n\n
\n

Jason Adams

\n\n\n\n\n
\n
\n
\n
\n\n\n\n
\n
\n
\n\n\n\n

Resources

\n\n\n\n\n\n\n\n

Transcript:

\n\n\n\n

Birgit Pauli-Haack: So welcome to our 34th Gutenberg Times Live Q&A. My name is Birgit Pauli-Haack, and I’m your host and the publisher of the Gutenberg Times. Thank you all for attending the show and it’s so great to have you. So today as announced, we will discuss how a product company can leverage WordPress built in Gutenberg architecture to take plugin development to new levels.

\n\n\n\n

The team of GiveWP went all in on the approach and discovered new ways to build the new version of GiveWP Plugin. And we have the pleasure to meet two members of the technical team on the show and hear the genesis of the path and you can ask them questions. Before I introduce a panel, a few housekeeping notes. Speaking of questions, for those watching on YouTube, you can use the chat box next to the livestream and pose your questions and also chat with us or include where you’re watching from.

\n\n\n\n

I might not go over that very often, but we’ll definitely will look through the questions. And then here on Zoom, use the Q&A bubble on the bottom of the screen or the jet bubble to share your thoughts and questions. Please be kind even if you disagree. This is a family friendly endeavor. If you might be wondering or your internet connection is not stable or you don’t have the time to sit through all of it, the recording will be available on YouTube later today after it’s fully rendered. Then the summary posts will be shared with the shared resources, will be on the Gutenberg Times within the next couple of weeks.

\n\n\n\n

Introduction

\n\n\n\n

So allow me to introduce our panel for today. Say hello, and let us know where you’re located tonight. I have the feeling that between the panel and the attendees, we span quite a bit of the globe. So I present to you, Jason Adams, director of development of GiveWP.

\n\n\n\n

Jason Adams: Hi, I’m Jason. It’s good to meet y’all. I am from sunny San Diego, California.

\n\n\n\n

Birgit Pauli-Haack: All right. Yeah. I’ll also present to you Jon Waldstein, the lead developer of GiveWP, and it’s all his fault. Oh, sorry. And then last but not least, my co-host, Lena Morita, who is a JavaScript developer and core contributor to the Gutenberg components and sponsored by Automattic. Hi, Lena.

\n\n\n\n

Lena Morita: Hi, I’m Lena. I am based in Tokyo, Japan. It’s 2:00 AM right now.

\n\n\n\n

Birgit Pauli-Haack: All right. So good morning, Lena. Good morning, everybody else? Yeah, Jason and Jon, yeah, are both on the West Coast.

\n\n\n\n

Jon Waldstein: I’m on the East Coast, Rhode Island.

\n\n\n\n

Birgit Pauli-Haack: East Coast, yeah. Rhode Island. Yes, sorry.

\n\n\n\n

Jon Waldstein: Happy to be here.

\n\n\n\n

Birgit Pauli-Haack: Yeah, geography can be always a bit tricky for me. 

\n\n\n\n

Plugin architecture

\n\n\n\n

So let’s start at the beginning. Jason and I met at the post status get together at WordCamp US last year and you just had announced, GiveWP just had announced the start of the revamp of the GiveWP plugin, version 3.0. Widely distributed plugin for nonprofits and others to collect donations on website with various add-ons. Then you mentioned that you are building the new version on top of Gutenberg components and WordPress scripts and I found that fascinating. So before we dive in head first, let’s get everyone on the same plate. In short, Jason, what is GiveWP?

\n\n\n\n

Jason Adams: Yeah, so GiveWP number one donation plugin for WordPress. We have coming up on about 200,000 folks that use GiveWP to connect donations directly from their website, manage their donors and keep their nonprofits, which is largely our audience, running. Doing their day-to-day thing and not having to work too hard to bring in donations on there to keep their work going.

\n\n\n\n

Birgit Pauli-Haack: Awesome. Yeah, GiveWP, I used it quite a bit when I was working for the agency, but what made you rethink the current architecture of your plugin?

\n\n\n\n

Jason Adams: Yeah, so first Give still works very much kind of, you remember the classic editor experience of WordPress where it was it kind of data entry, right? You didn’t design or build your pages, you entered data about your pages, the content and tags and all this other stuff, and then you click publish and then you view on the front end, what did I get? We know that that worked great for decades, but now we’re moving more to a visual era of building things. People want to be able to visualize and have that kind of full more immersed experience. That was our motivator, was wanting to go down that route. We had a lot of ideas for how we wanted to do that, but we had technical debt building as all products do that was making it more and more difficult to go down that path. Yeah, we started to weigh our options of how are we going to go about taking GiveWP to the next level.

\n\n\n\n

Birgit Pauli-Haack: Interesting. Yeah, the drag and drop, the visual editing, I think that’s kind of really where Gutenberg shines and having a plugin follow that path. How did you figure out the path forward? Because a revamp normally is really a big project and it’s a multi-year development project, so how did you go about it?

\n\n\n\n

Jason Adams: Yeah, and we didn’t want to do a start from scratch kind of a thing. We wanted to iteratively build it out. So what’s been nice is that our underlying architecture for donations, donors, none of that’s changing. It’s just our forms. We first explored four years ago just building something proprietary and the reality was, it was not up to the standard that you see in Gutenberg and other sorts of things today. It’s a lot of work. It’s so easy to take for granted just the idea of a block, a thing that you can move up and down. It’s a fluid user interface, inner blocks, blocks inside a block. There’s so many things that are easy to take for granted when you go to set out to build something like this. We were like, “Well, it’s right there in Gutenberg.” And so we started to kind of peel it back and we knew that Gutenberg is not… Gutenberg is in WordPress, WordPress isn’t Gutenberg. You can go to the Gutenberg repository and it’s broken out into tons of packages.

\n\n\n\n

We just started installing stuff and we did what we call spiking, where we’re just trying out an idea for a fixed length of time. I think we gave one of our developers, might have been Jon or our other senior developer on the project, shout out to him, Kyle Johnson, one of them had a week to see what they could do. We were really surprised how much we were able to get up and running. Have the list view of blocks, have the block editor itself, have our own blocks loading, the inspector.

\n\n\n\n

It’s like you have so much that you can get up and running in such a short time that would’ve taken us months to achieve and it’s already so battle tested all of these packages. It’s hard to appreciate how much that’s worth by itself. Of course this is where WordPress is going. We didn’t want to have to reimagine an entirely new user experience and then train our users on how to use that. We wanted somebody to be able to go from working on a page or a post to a form and not have to relearn the whole journey, but to be like, this feels immediately familiar. It’s a little different, but it feels inherently familiar. Reducing that user friction from changing from context to context within WordPress, which I think is really important.

\n\n\n\n

Birgit Pauli-Haack: Yes, it sounds right, a good path, but there are definitely some hurdles. So what were the first wins that you kind of say when your developer kind of set out, get a week, and then what was it exactly that they set out to do, but then found, “Oh, that is going to be fast to develop that in a week.” Normally development takes about four weeks or five weeks or something like that. Yeah. What are your first wins?

\n\n\n\n

Plugin revamp

\n\n\n\n

Jason Adams: Like I said, even the concept of a block, because for us, we have, and I’ll demo this in a moment here, but we have our sections and then our fields go in our sections, like name amount. To just have everything visually there and to have, “I want this field to be down there,” and making that as fluid user experience is not as easy as it sounds. Or we also have sections and fields inside of sections. So this inner block concept and then being able to select which blocks are visible based on what context you’re in. Or I click on a block and that block contextually shows up in the inspector. We achieved all of that within a week and I was like, “We have a lot of work to do.” But just the fact that we could get that far in such a short amount of time, those were the wins that were like, “Well, we don’t want to go reinvent this,” and it already is a familiar user experience, so it would be silly not to do this in short.

\n\n\n\n

Birgit Pauli-Haack: Yeah. So I think that I find it fascinating and when you tried to describe it, I think it would be really helpful for us to have a short demo of the current state of your development so we can actually look at things and then I can see that we might have the first round of audience questions. What will you show us tonight?

\n\n\n\n

Jason Adams: All right, let’s share my screen and show some stuff. All right. Can y’all see my screen?

\n\n\n\n

Birgit Pauli-Haack: Yes, now we can.

\n\n\n\n

Demo

\n\n\n\n

Jason Adams: All right, cool. So this is GiveWP very similar to how it is now, but I have a plugin, what we’re calling our feature plugin right now installed, called NextGen that anybody can actually go test out themselves. We have a landing page for this that we can share the link for that you can just go click spin up a site and it will just spin you up a site and you can be playing with it literally in 15 seconds.

\n\n\n\n

Lena Morita: I tried this and it was really easy.

\n\n\n\n

Jason Adams: Yeah, thank you. So let’s see here. So I’ll add a new V3 form as we’re calling it. I won’t get into why it’s V3, but it is. So here you go. It’s funny, when we first showed this to people, it almost had an anticlimactic effect to it where they were like, “Well, what else would it look like?” Because it just fits right within WordPress. It’s like, “Oh, okay.” So you can see we’ve got the list view like you would normally have. We have our various sections, you can see everything within those sections. We’ve got the form itself. So a lot of this is very similar. Now you don’t have the fluid typing interface where you can just add paragraphs and paragraphs. You can’t just click somewhere and start typing. But that’s really neat is that you’re able to constrain how the block editor works, because for us, we don’t want people just typing in the forms. It doesn’t make sense for a form.

\n\n\n\n

Instead, people want to do something, like add a text field, and so we can just click on a section and we can add a text field, favorite color, we can mark it required. So I mean, as you see, it’s just Gutenberg. It’s the exact experience somebody would normally expect, but it’s tailored to how our forms work. And for us, we also wanted to do things like, if I come down here, I can only add a section. We wanted all fields to be within sections. So that’s a really subtle thing, that’s really powerful actually, because this is root level blocks here, and a root level block can only be a section. But then when I’m in a section and I want to add fields, well now Gutenberg knows what blocks can go in there and that’s not something we had to build. Gutenberg already has a concept of all of that kind of stuff.

\n\n\n\n

So I can come in here, you can click in and you can have that same… Gutenberg comes with a lot of what they call controls out of the box. So things like, I want to have inline text editing or something like that. That’s not something that you have to build. One other thing that I’ll point out here, is that if I go to add our blocks here, you can see that you have only our blocks. So we didn’t want to open up the form to every block that exists in WordPress. We thought about that, but we had very specific reasons why we didn’t. That’s another thing that’s really neat, is you can think of Gutenberg as creating your own sandbox environment for what you want to build. So you don’t have to think to yourselves like, “Oh my goodness, we have to…” So every block is open to this? No, you can make it limited to only your own fixed list of blocks.

\n\n\n\n

The other thing that is really neat that we’re able to do is add an additional tab over here that we call design. So this is breaking out a bit from what Gutenberg natively does. We wanted folks to have the ability to, in this view, we call it the builder view, which is where you’re focusing on the structure of your form. So it’s kind of a very vanilla, very plain looking, it’s just meant to be very clear. You can see with our donation summary here, it’s not really showing you anything real. It’s purely so that you can do things like I just want to position things where I want to have them in my form. So then you can switch over to the design tab and now we can actually view our form and this is the exact form as it’s going to render in the front end, and you can play around with secondary colors.

\n\n\n\n

So my secondary color in this form design is being used here. I can make this a nice little purple color, I can change the header, I can hide it, show it. You can do all sorts of fun things in here. But I mean that was pretty powerful of just the ability to add an entirely new type of experience within Gutenberg and giving people the ability to preview. For us, because Give forms are fairly widgety, right? We’re not trying to preview the entire page, just one thing, it worked out really nicely to be able to do it right within here.

\n\n\n\n

I’m trying to think what else. So the last thing that I’ll point out here, let me publish this. Let’s go to our form. Let’s take a look at it on the front end. Okay, so we’ve got our form here on the front end. I’m going to dive deep into the weeds here, it’s a dev audience, so just track with me. Okay, so typically when you’re working in Gutenberg, the way that we typically think of it saving is it saves as a string version to the post content. So you think of the Gutenberg HTML comments where it includes attributes and stuff about the block. You can load it dynamically and so on and so forth, but it saves to the post content column of the database. Then when you’re rendering the page, you grab that post content and you stick it on your page.

\n\n\n\n

Now for us, we didn’t want to just do that. We had to do a heck of a lot more. So if I fill this out, green for anybody who’s wondering. Then let’s throw on our test card, let’s say for five, donate. So I just made a real donation to my Stripe account. So a lot just happened there. That was obviously a lot more than just, “Oh, it looks like a form.” No, it has to actually work like a form. Forms submit data, forms store data. You can see here it’s referring to my favorite color that was stored in the donation meta. So has a lot that it needs to actually do and validate and all of this different stuff. What we did differently, is that when our forms save, so coming back here, so when I click update, it’s actually saving as JSON.

\n\n\n\n

So before Gutenberg turns into the big string that we know it to be, that saved content, it actually first stores as a JSON object. A bunch of blocks, block attributes, and then child blocks and so on and so forth. It’s a very simple structure actually. We’re doing nothing with the string content, we’re using just that JSON, and we built what we’re calling our field API and we’re converting the JSON structure into the field API. So this email address field, here it’s a block and then it gets converted into an email field on the front end, which is meaningful within GiveWP. So in other words, this is purely presentational so to speak and structural and we can convert it in any context we want. That’s a really powerful thing when you think about it, that you can take something like this, structurally speaking, and just convert it into your own API. So the block JSON, it’s focused on how is this all laid out within Gutenberg.

\n\n\n\n

When we load this page, literally all we’re doing is we’re grabbing that JSON that we save and we’re handing it back to Gutenberg and we say, “Here’s the form,” and that’s it. It just works. Then when we go to save it, we do the conversion and you can actually see that at play. If I just add another text field here, maybe. If I go to design, like that’s showing up here, because just as we’re working within, so even though I didn’t save it, that’s the kind of thing I’m showing there. Even though we didn’t save it, we’re still just grabbing that JSON object and converting it to our field API and rendering it that way.

\n\n\n\n

So I think for a lot of plugin developers and whatnot, I really want them to grasp the concept of Gutenberg is not just a way of being able to lay things out and then you just have to take whatever it gives you and slap it on the page and there you go. It’s like, no, you can use it as a tool for interacting with your user and then you can convert it into whatever context you can imagine. And that’s a pretty powerful thing.

\n\n\n\n

I think that’s it for what I had in mind for demo. Anything that anybody wants me to show a little more or poke into here?

\n\n\n\n

Lena Morita: I have a question. So on the front end, on the actual front end form, how are you adding interactivity? Like the JavaScript parts?

\n\n\n\n

Adding interactivity – how a form works

\n\n\n\n

Jason Adams: Yeah, so the way this works is that, so it takes the Gutenberg JSON, converts it into the field API, and then that is serialized and this is an iframe. Inside the iframe is a React application that’s just running independently. The React application takes in the form and then it connects to things like gateways, other add add-ons, that sort of a thing. But yeah, that’s where it’s coming from. This is just a React application of our own design, built specifically for Give forms.

\n\n\n\n

Lena Morita: So basically field API converts all that JSON data into actual React components and stuff?

\n\n\n\n

Jason Adams: The field API is a PHP layer.

\n\n\n\n

Lena Morita: Oh.

\n\n\n\n

Jason Adams: It’s pure just PHP objects, but it’s focused. Whereas the Gutenberg API is focused on blocks and child blocks, attributes, that sort of thing. Our field API is focused on how does a form work. So for example, is this a field? Is this field required? What are the validation rules for this field? Does it have any sanitization that needs to happen? So things that you would typically think about from a field or field form perspective, that’s what the field API thinks about.

\n\n\n\n

It was also really important to us that developers could programmatically… So if I want to programmatically move a field, add a field, add a section, do anything, you can do it using our field API in PHP. So you can kind of add a middleman layer between Gutenberg, a programmatic layer to be able to make more adjustments to your form. Then that’ll just show up here. For example, when I submitted this form down here, how does it know that this is a required field and what does that even mean, right? Because it has to validate on the other side. So when we submit this form on the server, it’s grabbing the form again in the structure of the field API, it’s finding the favorite color field, and then it’s checking the validation rules such as, “Hey, this is required,” or “It can only be up to 255 characters,” or whatever else. Does that make sense?

\n\n\n\n

Lena Morita: Yeah. So wait, the initial render of this form is not in PHP, I think you said this was initially rendered in React, or is it actually a PHP rendered page?

\n\n\n\n

Rendering

\n\n\n\n

Jason Adams: I know there’s so many layers.

\n\n\n\n

Lena Morita: It’s so interesting.

\n\n\n\n

Jason Adams: It’s no worries. The field API lives in memory and PHP. That can be used both for rendering a form or validating a form or doing any number of things. This form represented in memory and PHP and it knows all the responsibilities of that form. Then we say, “Hey, I want to render that. That’s what I want to do this time.” And so then what it does is it, I think it’ll show you, it serializes everything. I thought it would show here. That’s fine. But anyway, it takes the whole field API structure, the form, all of its internal fields, elements and so on and so forth, serializes that, passes that to the front end, which is received by a React application.

\n\n\n\n

Lena Morita: Oh, that’s how you hydrate it.

\n\n\n\n

Jason Adams: Exactly. Yep. The React application is ready to receive a form in the structure of the field API JSON.

\n\n\n\n

Lena Morita: Yeah, I’m not sure if everybody’s aware, but the interactivity API is kind of an experimental phase in Gutenberg right now. And this is a very hot topic. I feel like it’s on everybody’s minds. How do we hydrate interactive components on the front end? So it’s very intriguing how people have done this before any kind of ready-made abstraction layer.

\n\n\n\n

Jason Adams: Right. There’s also the difference between, for example, I’m making a page, on my page I’m adding a component. This component is an accordion. It’s presentational, but there is a JavaScript element to it of, I want to be able to make interactivity happen on a presentational level versus what I’m describing here. It’s pretty complex, because there’s both a front end validation and server side validation, and we want them to be the same. There’s a lot of complexity around a form and what the form even does. So for us, our forms don’t just save and entry, our forms actually output into a donation and donor. So trying to capture the lightning in a bottle of boiling this down to interactivities, it’s like, well, it’s doing a lot more than just being interactive. It’s also validating and doing a whole bunch of other stuff.

\n\n\n\n

Validation

\n\n\n\n

Actually, one thing I’ll show here if I switch to our multi-step design, so let’s just update this. Okay, we’ve got a completely different experience here. So now in this one, every single step, so when I do that, you notice there it kind of loaded for a moment in between steps? It’s validating with the server. So every single step is now validated against the server to make sure that everything here is in fact correct.

\n\n\n\n

Well, actually I have that differently set. Anyway, so if I were to try to continue, I’m going to get immediate validation feedback from the server. Even if you try to trick the JavaScript and make it not work and validate in the front end, it’s still going to validate on the server. So yeah, it’s a complex piece. So I think the interactivity API and stuff like that is really, really great for a lot of simpler forms of interactivity. But when you’re building what is in effect a small application, I think something like that is still a ways away from covering everything that we need this to do. Does that make sense?

\n\n\n\n

Lena Morita: Yeah, it makes a lot of sense. Thank you.

\n\n\n\n

Birgit Pauli-Haack: Totally sense for me too. Especially the other pieces, not only the validation of the form, but it’s also the connection with the external services like Stripe and the databases and all of that. Those need to be abstracted too and then kind of come back through the server API I would think, to then push it again to the front end in some other places.

\n\n\n\n

Jason Adams: Exactly, because we don’t have a fixed list of gateways here. That’s injected. We also have our own add-ons, like fee recovery, form field manager, those add additional blocks and fields and those are injected at different points. It’s a highly customizable system, so there’s a lot going on.

\n\n\n\n

Birgit Pauli-Haack: Super. Yeah. Well, do you have any other questions, Lena, to get them to show you something or shall we talk a little bit higher level now?

\n\n\n\n

Lena Morita: Yeah, we can go higher level.

\n\n\n\n

Birgit Pauli-Haack: Well, thank you so much, Jason, for the demo. It’s fascinating, especially how the difference between before and now, because I only know the current version or the version three years ago and what you do now. So it’s a total different beast, I would say, as complexity, but also easy to use. 

\n\n\n\n

How it’s built

\n\n\n\n

So just a ballpark, would you say from the code base, how much is actually based on the WordPress components and scripts and how much of that app do you have to rebuild kind of thing? So I would think the field API on PHP, that’s kind of the interface between those two as we saw.

\n\n\n\n

Jason Adams: Yeah.

\n\n\n\n

Birgit Pauli-Haack: Maybe it’s kind of an odd question. Yeah, I get that.

\n\n\n\n

Jason Adams: Twenty-five percent. I mean a lot. Gutenberg definitely attributes to quite a bit.

\n\n\n\n

Jon Waldstein: I could take that one.

\n\n\n\n

Jason Adams: Yeah, go for it, Jon.

\n\n\n\n

Jon Waldstein: We built the donation form, the new one that you were seeing on the front end, completely from scratch. That whole thing with React serializing or hydrating data from the server, we did that from scratch, because our old forms were just using post types. So everything is server rendered, and it’s a little difficult to add that level of interactivity with React using the old system. So we really built it, the front end, from the ground up. The form builder that Jason was demoing is mostly things you can get from the Gutenberg package. We had to customize a couple things that we had to fork and call our own, mainly the sidebar that you saw where we have that design tab, that’s not something that’s available to us. So we had to create that and implement it on our own. But for the most part, what you’re seeing on the form builder can be achieved from Gutenberg packages.

\n\n\n\n

Birgit Pauli-Haack: So the sidebar, when you say that, I saw the controls that were there, they looked like Gutenberg components, the color, bigger, and the different kind of… Yeah. So that definitely might have come through that. Yeah.

\n\n\n\n

Jason Adams: We barely invented anything in the inspector.

\n\n\n\n

Birgit Pauli-Haack: Yeah.

\n\n\n\n

Jon Waldstein: Yeah, and that’s the beautiful thing about using Gutenberg is if you want to create a block in our form builder, there’s nothing different about it than building a WordPress Gutenberg block. And we really wanted to make sure that was the case so that there’s nothing, no crazy documentation that you have to relearn. So we do have a community of developers that interact with GiveWP, external developers, and we want to preserve the customization of the plugin. So if you know how to build a block in WordPress, you’re going to know how to build a block for us as well.

\n\n\n\n

Birgit Pauli-Haack: Oh, that’s awesome. Yeah. Well, this is all talking about the good sides, but were there any surprises or challenges that you encountered while you were building that, or are you still encountering? What are the biggest surprises that you’ve found?

\n\n\n\n

Challenges

\n\n\n\n

Jon Waldstein: Yeah. Well, we mentioned we had to customize some components like the sidebar. But I think the one I want to mention is GiveWP is not just one plugin. We have a lot of add-ons that extend the functionality of GiveWP, whether it be gateways and different ways to customize your form. We have a lot of things that interact with our main plugin. One of the bigger challenges recently was figuring out how to open up our customized Gutenberg form builder with our add-ons. Now, another shout out to Kyle Johnson, who is a developer on our team who built the first iteration of the form builder. To get things up and running we used just React, Create React App, which ends up bundling all the scripts together into one JavaScript file. So when you load the form builder, you’re just loading a page and it’s just loading that one JavaScript file.

\n\n\n\n

What we found out later is that in order to load external blocks from our add-ons and other things that are interacting with the form builder, all of these different things are always reacting with certain dependencies like React. They can’t all load Gutenberg at the same time. It’s just not going to work, which is how the post editor works and why WordPress Scripts package came out is that you can extract all the dependencies from your script and let WordPress load those for you. So that was a big kind of structural change we had to make so that we are now relying on WordPress to provide us with Gutenberg, which is actually something we didn’t want to do. We wanted to have full access to the latest version of Gutenberg, but it wasn’t possible for us, because we have add-ons that also need to interact with Gutenberg and React, and they can’t all just be loading their scripts at the same time. It’s just not going to work.

\n\n\n\n

Like most of us know, wp_enqueue_scripts, you add an array of dependencies that you want your script to use, and WordPress will load those for you. And that’s how we had to go about loading our form builder and then having add-ons come in and give us a block or give us something to customize the form builder and just let WordPress handle loading external scripts. That was the big one.

\n\n\n\n

Jason Adams: I’ll add to that.

\n\n\n\n

Lena Morita: I’m curious.

\n\n\n\n

Incorporating ReactJS

\n\n\n\n

Jason Adams: It’s easy to take for granted that the Gutenberg team had to tackle this issue of we’re creating a single React tree. We don’t want everybody to load their own version of React, and it has to all end up in the same place. So I remember when Gutenberg first came out and there’s the Gutenberg elements, they tucked React inside of Gutenberg, why’d they do that? And why did they come out with WP-Scripts that just swaps out for you’re doing at WordPress/components? What actually that does, is it grab it from WP.components. It’s like why is it doing all this? Well, the reality is, they went through all of the hard work of figuring out how to have everybody using the same version of React and loading everything to the same React tree all at the same time from 1,000 different places.

\n\n\n\n

That’s actually a lot harder than it sounds. Once we ran into that, we were like, “Okay.” We just had to switch everything to using WP-Scripts, because we’re like, “It’s just not worth it for us to try to solve the same problem of extensibility that Gutenberg itself has already solved so well.” It has some trade-offs, but it really, as a whole, it actually works quite well. So huge shout out to the Gutenberg team, because originally we actually had the first version of this loading in GitHub pages. It was literally totally standalone, but then we tried to extend it and we’re like, “This is a lot harder than we thought it would be.” Yeah.

\n\n\n\n

Trade-offs and compatibility

\n\n\n\n

Lena Morita: So speaking of trade-offs, I’m also sympathetic with the major downside of this. As a plug-in developer, you cannot rely on any version being in action at any moment. It’s very hard. Upstream changes can break your app at any moment. You don’t know what versions running. What are some things you’re doing to mitigate this risk I guess?

\n\n\n\n

Jon Waldstein: We have to manually test it now. Before, if we were loading the latest version of Gutenberg, well, there’s only one instance of that. But since we’re loading Gutenberg from WordPress now, we actually had to bump up our minimum version of WordPress to whatever the version of Gutenberg that we support that comes with WordPress. That’s a major change for us, but it’s necessary.

\n\n\n\n

Jason Adams: We previously supported back to WordPress 5.0. So this whole thing actually made us come up with an entirely new policy around which versions of WordPress do we support. Before it was like we would support a version of WordPress until we were like, “I guess there’s something that we really need,” then we would bump it up to… We were talking about bumping it up to 5.5 or something like that, but we saw no reason to cut backwards compatibility until we had a specific reason to do so. This whole thing made us realize like, “Oh, we’re really tightly coupled now.” We’re really on the WordPress bandwagon and it’s really important what versions we support.

\n\n\n\n

We didn’t invent this, other plugins are doing this, but we said, “Okay, we’re only going to officially, moving forward, support the latest released version of WordPress and the previous two.” That’s how we’re going to keep ourselves from getting into compatibility hell as new changes roll in that we have to become compatible for. Then that makes it harder and harder to be compatible with older versions. So we’re having to really kind of tighten in on that window. Fortunately, I will say, according to our telemetry, people are actually pretty darn good at staying within the latest or a few most late recent latest versions of WordPress. We don’t have a lot.

\n\n\n\n

Lena Morita: That’s good to know.

\n\n\n\n

Support team

\n\n\n\n

Birgit Pauli-Haack: Yeah, I was thinking so, what is your customer servicing to that? Yeah, because I can see that there are quite a few nonprofits that have not updated their WordPress for a while. But they could stay on your older version of GiveWP because it’s still supported, and you’re not going to cut it out right there.

\n\n\n\n

Jason Adams: So a good product question there. So our support team is actually very much in support of it. What we’ve found is that typically people fall into one of two camps. One, they’re set it and forget it. They set up their website five years ago, and it works, so don’t touch it, right? And that’s perfectly fine. Or you have people that keep things fairly up to date. You don’t have many people that are in this weird middle space where they update some stuff and not others. And if somebody does reach out to our support team and is having an issue or something, our team is trained. One of the first things they do is they say, “Are you updated?” So it’s not like they’re going to have to suddenly change their tune, because of this new policy. It’s something we’ve already recommended to people for years is, if you’re having a problem, you should start by updating what you have to make sure that… because the problem might be fixed already and you’re just not updated.

\n\n\n\n

So yeah, we’re really not anticipating, and others like the events calendar and others have had this policy for a while, and so I did ask around within the product space, “Hey, was this a pain point for you? Did you notice a decrease in sales or higher churn rate?” The answer was unanimously, “No. No, actually, it’s a very healthy policy to have and it hasn’t caused us problems.”

\n\n\n\n

Birgit Pauli-Haack: Yeah. So we have one more question from Anton, and I think it goes back quite a few minutes, he was asking about the sidebar if that is accomplished through slot fills.

\n\n\n\n

Sidebar customization – isolated Block Editor

\n\n\n\n

Jon Waldstein: That one, no, we actually had to fork that. But I wanted to bring up the isolated block editor, which Lena works on or has worked on, because we’ve been following that project for a little while now. I think at its inception we were also building ours, which our form builder is very similar to how the isolated block editor works. One of the biggest problems was the sidebar customization, which to answer Anton’s previous question, if you were to use isolated block editor now, you can accomplish that with technically a slot fill, because we submitted a feature request to do that, and it was actually added just recently.

\n\n\n\n

It makes it a little bit more feasible to actually switch over to the isolated block editor shortly, because we’re really not doing anything crazy. That was kind of the main thing about using WordPress as dependencies. It’s like we’re really not customizing anything that crazy. We’re just using Gutenberg. We’re not like forking every single thing. We’re loading a bunch of blocks into it and maybe doing some style changes. So it should be pretty reliable. But we are looking at the block editor, the isolated block editor, as a way forward for this. I would suggest it for anyone else looking at this project or looking at something similar to this, because it’s a really easy way to get started.

\n\n\n\n

Lena Morita: Yeah, I agree.

\n\n\n\n

Jason Adams: Played around using it and realize like, oh, it has things like undo, redo. We don’t have that right now, but if you use the isolated block editor, you just have it. So yeah, part of our post 3.0 launch roadmap is to switch the isolated block editor, which will also take a lot of complexity off of our plate.

\n\n\n\n

Birgit Pauli-Haack: Excellent. Excellent. So I have another question. I’m so happy that I’m privileged to run this show so I can ask all the questions that I want.

\n\n\n\n

Jason Adams: Go for it.

\n\n\n\n

Making it easier with documentation and components

\n\n\n\n

Birgit Pauli-Haack: You started kind of three, four years ago thinking about it and maybe a year and a half or two years ago, really doing proof of concepts and all that. So put yourself back into the shoes you would start out now, because that would be something that plugin developers might think about. What is it that you would ask of the Gutenberg team to improve or to build on the components or on the scripts so that work is a little easier? Or much easier, not just a little easier.

\n\n\n\n

Jon Waldstein: Documentation has been a little bit of a struggle for us, especially being like… And we understand we’re no experts at documentation. It’s tough work.

\n\n\n\n

Birgit Pauli-Haack: Can you specify a little bit on the documentation? Which piece?

\n\n\n\n

Jon Waldstein: Well, if you know are going down the path of building your own block editor, there’s very little documentation on there. If there is, it’s a little outdated. We had to do a lot of digging through reading code and finding how to actually pull this thing off that didn’t quite match up with some of the documentation out there. So that was one of the biggest hurdles. Then also some components in Gutenberg are not accessible that we wanted to pull out and use ourselves. So some of those were just not exported. Maybe they’re just internal components. We found ourselves really wanting to, and we did use some of these components, but once we switched over to relying on WordPress to provide us the scripts, we lost some of those, because they’re not available. I would have to come up with a list to give you…

\n\n\n\n

Lena Morita: With the block editor package? In the block editor package, you mean?

\n\n\n\n

Jon Waldstein: Yeah, block editor. Maybe some more. We would have to define the path to the actual build component to grab, and sometimes those were missing from the exports. We would often have to fork the whole file, which causes side effects, because it’s relying on some things. So limiting that was tough at first, but we kind of worked around it. I would’ve to come up with a list to figure out which ones are really important to people like us.

\n\n\n\n

Lena Morita: Yeah, please send me that list. I’m interested. There is something about it.

\n\n\n\n

Jon Waldstein: Yeah. Some of these would be documented like, “Hey, they’re available,” and then you’d go to use them and they’re just not.

\n\n\n\n

Birgit Pauli-Haack: I know that Ryan Welchers is actually on the path to put example code into the read me files and all that, and he found quite a few that if you want to use that code snippet, you couldn’t, because it didn’t export. So he actually goes through it and while he is updating the documentation to also add the export feature to it. So I didn’t find it yet now quickly, that little issue or the tracking issue of that, but I can certainly share that with you and in the show notes and also with you personally, so you can add to the list so you don’t have to start from scratch. Have you, speaking of documentation, there’s also a separate documentation site that’s called The Storybook for the components. How did that help you?

\n\n\n\n

Jon Waldstein: That was helpful. I’m not sure how complete it is or how up to date it actually is.

\n\n\n\n

Lena Morita: It’s getting more complete by the minute.

\n\n\n\n

Jon Waldstein: Yeah, there were some things on there that were very helpful.

\n\n\n\n

Lena Morita: It’s really nice right now. We spent a lot of time on it this past year.

\n\n\n\n

Jon Waldstein: Yeah, I love the idea of that. There’s different documentation sites. We’re not really sure which ones are up-to-date. So maybe add a version to what thing was added, that would be helpful.

\n\n\n\n

Jason Adams: That’s a really important note, I think. If you go to some documentation sites out there, I think React does this or Stripe does this, where the docs themselves are versioned. That’s really helpful, because otherwise that’s been a part of our struggles. We’ll find some piece of documentation on Gutenberg and we’re like, “Is this old? Is this current?” We just don’t know how to trust it. So we always end up going back to the source code anyway to validate the documentation that we found to make sure that it is in fact still recent.

\n\n\n\n

Birgit Pauli-Haack: Yeah, totally get that. Especially because the documentation is actually built on top. The automation of the references is actually built on top of the Gutenberg plugin, but it doesn’t tell you that when you look at it. You are looking for something and you find it and then you try it out on WordPress without the plugin and the feature isn’t there yet, because it’s coming. It’s one of the upcoming kind of things. So I totally get this. Yeah.

\n\n\n\n

Lena Morita: This is on our radar, definitely.

\n\n\n\n

Birgit Pauli-Haack: Yeah, absolutely. Yeah.

\n\n\n\n

Lena Morita: We’ll try to push for this.

\n\n\n\n

Some things are hard-coded

\n\n\n\n

Jason Adams: One other minor thing on the original question I’ll add is, there are still some things in Gutenberg that are hard coded that you can’t really do anything about. One that we’re kind of just hoping nobody notices is if you click on a block and then there’s little header piece of the block there and there’s a contextual menu and options that drops down where you have things like copy styles or paste styles or that sort of a thing, we can’t get rid of that. Copying and pasting styles makes no sense in our context. We looked into it. That’s just hard coded. You can’t get rid of that. It’s just there. I was like, “Oh.” So there are still little pieces like that that you’re just like, “Well, hopefully nobody will notice that.” And then the last thing with Gutenberg that we ran into that is like, “This is interesting,” is well, not the last, another is…

\n\n\n\n

Birgit Pauli-Haack: I’m sure it’s not the last, yeah.

\n\n\n\n

Locked blocks

\n\n\n\n

Jason Adams: … locked blocks. So that’s kind of an interesting concept where, for example, you have to have an amount field for us. You can’t take that out and still have your form work. So you can lock the block, but then they can go unlock the block. So locking something, it’s more like a pinky promise with the user, like please don’t get rid of this. I think it used to be that locking was like it was done. There was no way to unlock something, and then the UI was added in the list view to be able to unlock things. That was kind of an interesting one of like, “Oh, well, how do you actually enforce that something can’t be removed? You should not be able to delete this.”

\n\n\n\n

Then the other thing that we found that was interesting with locked blocks, is that if you have a locked block in one as a child block, so we have our two sections, if I have my amount block up here, when it’s locked, I can’t move it. So you can’t take it out of this section and move it into this section. If you drag and drop, it just will do nothing. So there’s just little itty-bitty things like that that kind of pop up. So the concept of what locked means in Gutenberg is a little bit, you kind of just got to play with it to find out what does lock even mean?

\n\n\n\n

Birgit Pauli-Haack: Yeah, yeah.

\n\n\n\n

Jason Adams: It’s not clear and consistent, I would say.

\n\n\n\n

Filters and blocks

\n\n\n\n

Birgit Pauli-Haack: Yeah. Yeah. So in the last few versions of WordPress, there were server-side filters as well as client-side filters to customize your blocks and to curate the experience and switch off interfaces and all that through PHP filters or server side or JavaScript filters. Have you been able to mitigate some of the problems that you saw before?

\n\n\n\n

Jason Adams: With the locked stuff that we talked about?

\n\n\n\n

Birgit Pauli-Haack: Yeah. So Nick Diego just posted on the developer blog a new… So how to modify theme.json data, which is kind of part of it. Yeah, that’s the style part, but it’s also block styling. Oh, I can share it here. Whoops.

\n\n\n\n

Jon Waldstein: Oh, I’ll mention one. I’ll shout out to one filter that we just found extremely useful is the JavaScript filters for registering a block type, which really was amazing because now we can have core blocks. Let’s take the amount field or something, and we can have an add-on come in and add more settings or attributes to that block using the register block type. There’s a couple other filters for doing that where you can add things to a block that wasn’t there before. That’s new to me that you could do that natively, but for us, that was huge.

\n\n\n\n

Birgit Pauli-Haack: It’s a little late in the game. Yeah. Yeah, I’m sorry, but we are getting to the end of our show. It was only scheduled for an hour. I think we could talk another two hours. I feel that way. And I don’t know, Lena probably has even more questions for you.

\n\n\n\n

Lena Morita: Definitely. So many questions.

\n\n\n\n

Birgit Pauli-Haack: But it was such a great experience to have you on the show and to share some of the secrets that you encountered and how you made it all work for yourself. We will have some resources in the show notes. 

\n\n\n\n

Announcements and contact Info

\n\n\n\n

At this point, I only have two more questions for you all three. So do you have any announcement that you wouldn’t get in before or you want people to keep in mind? We can go around Jason, Jon, and Lena. The second question is, if people want to get in touch with you, what would be the best way? So you can answer one of the questions, both questions or none.

\n\n\n\n

Jason Adams: Yeah, so keep an eye out for Give 3.0 that will be landing at the beginning of Q3 is what we’re aiming for right now. You can go to the landing page, I provided the link for that and go spin it up and test it out yourself. We’re updating that. So as we roll out new internal versions of what we’re calling next gen, which is our 3.0, we’re updating that and we actually have it all set up. So if you do have that installed locally and we roll out a version, you can update it just like you would any other plugin and continue to test out, provide feedback. So we love getting feedback from folks on this. You can also reach out to me personally at jason.adams@givewp.com, or you can find me on Twitter as Jason.Adams.

\n\n\n\n

Birgit Pauli-Haack: Excellent. Yeah. Thank you, Jon?

\n\n\n\n

Jon Waldstein: Yeah, and I’ll mention for any other developers that are interested, what we’ve demoed and what we’re showing is completely public. You could go on GitHub and look at all of this code that we wrote. It took us over a year. I think we’re coming up on a year and a half or something, maybe a little less than that, but a lot of work has gone into it. If you want to see actually what we’re doing, come on to GitHub and if you want to ask some questions, you could start a discussion on GiveWP, or we have a Canny board for additional feedback. If you were to go to the landing page and actually play around with this thing, you can actually provide feedback and we’ll take all the feedback into consideration for the future of GiveWP. And if you want to get in touch with me, I’m on Twitter, Jon Waldstein and jon@givewp.com if you want to send me an email.

\n\n\n\n

Birgit Pauli-Haack: Excellent. And Lena?

\n\n\n\n

Lena Morita: Yeah, I guess for me, I mentioned I work on the work path components package and me and the team that works on it, we really, really are always looking for new contributors. So if anyone’s interested in contributing back, we love working with new contributors. We are highly engaging and we collaborate a lot. So if anybody’s interested, just pick up an issue or I don’t know, ping me and we’ll help you find a fun, good issue to work on. You can find me on Twitter at Mirka, M-I-R-K-A. Same ID on GitHub.

\n\n\n\n

Birgit Pauli-Haack: Excellent. Yeah. And so my link or my answer is that we will do another live Q&A in two weeks actually, but on Friday, on Friday, July 21st. We’ll talk about design systems and theme.json. I know that there are large agencies and large entities like universities, and so they all have a design system. They have corporate design, and they need all the websites kind of to follow that. The WordPress VIPs team built a bridge between Figma and theme.json. I hope I get the people who created that on the show. We will have some demos there, of course. We also will talk with Joni Halabi, who is the web developer at Georgetown University, and she also has, as a university, big design systems and how she works with patterns. So it’s a great show and I hope you will join us again there.

\n\n\n\n

So a big thank you to our viewers and to Anton for the great questions. If you have more questions, you can always send them to me via email. That’s pauli@gutenbergtimes.com. P-A-U-L-I at gutenbergtimes.com. Recording, as I mentioned, will be available in a few minutes on the YouTube channel, and we’ll publish a transcript in a couple of weeks on gutenbergtimes.com. 

\n\n\n\n

Thanks again to Jason, Jon, and Lena for being here. It’s been a privilege to have you on the show, and it was a great joy talking to you. Be well and goodbye and good luck. Take care.

\n\n\n\n

Jason Adams: Thank you.

\n\n\n\n

Lena Morita: Thank you.

\n\n\n\n

Birgit Pauli-Haack: Thank you.

\n\n\n\n

Jon Waldstein: Bye.

\n\n\n\n

Lena Morita: Bye.

\n\n\n\n

Birgit Pauli-Haack: Bye, everyone.

\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}s:7:\"pubDate\";a:1:{i:0;a:5:{s:4:\"data\";s:31:\"Fri, 21 Jul 2023 23:50:52 +0000\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}s:32:\"http://purl.org/dc/elements/1.1/\";a:1:{s:7:\"creator\";a:1:{i:0;a:5:{s:4:\"data\";s:18:\"Birgit Pauli-Haack\";s:7:\"attribs\";a:0:{}s:8:\"xml_base\";s:0:\"\";s:17:\"xml_base_explicit\";b:0;s:8:\"xml_lang\";s:0:\"\";}}}}}}}}}}}}}}}}s:4:\"type\";i:128;s:7:\"headers\";O:48:\"WpOrg\\Requests\\Utility\\CaseInsensitiveDictionary\":1:{s:7:\"\0*\0data\";a:8:{s:6:\"server\";s:5:\"nginx\";s:4:\"date\";s:29:\"Thu, 10 Aug 2023 05:53:16 GMT\";s:12:\"content-type\";s:8:\"text/xml\";s:13:\"last-modified\";s:29:\"Thu, 10 Aug 2023 05:30:30 GMT\";s:4:\"vary\";s:15:\"Accept-Encoding\";s:15:\"x-frame-options\";s:10:\"SAMEORIGIN\";s:16:\"content-encoding\";s:2:\"br\";s:4:\"x-nc\";s:9:\"HIT ord 5\";}}s:5:\"build\";s:14:\"20211220193300\";}','no'), -(150,'_transient_timeout_feed_mod_d117b5738fbd35bd8c0391cda1f2b5d9','1691689997','no'), -(151,'_transient_feed_mod_d117b5738fbd35bd8c0391cda1f2b5d9','1691646797','no'), -(152,'_transient_timeout_dash_v2_88ae138922fe95674369b1cb3d215a2b','1691689997','no'), -(153,'_transient_dash_v2_88ae138922fe95674369b1cb3d215a2b','','no'), -(156,'finished_updating_comment_type','1','yes'); -/*!40000 ALTER TABLE `wp_options` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_postmeta` --- - -DROP TABLE IF EXISTS `wp_postmeta`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_postmeta` ( - `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `post_id` bigint(20) unsigned NOT NULL DEFAULT 0, - `meta_key` varchar(255) DEFAULT NULL, - `meta_value` longtext DEFAULT NULL, - PRIMARY KEY (`meta_id`), - KEY `post_id` (`post_id`), - KEY `meta_key` (`meta_key`(191)) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_postmeta` --- - -LOCK TABLES `wp_postmeta` WRITE; -/*!40000 ALTER TABLE `wp_postmeta` DISABLE KEYS */; -INSERT INTO `wp_postmeta` VALUES -(1,2,'_wp_page_template','default'), -(2,3,'_wp_page_template','default'); -/*!40000 ALTER TABLE `wp_postmeta` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_posts` --- - -DROP TABLE IF EXISTS `wp_posts`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_posts` ( - `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `post_author` bigint(20) unsigned NOT NULL DEFAULT 0, - `post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `post_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `post_content` longtext NOT NULL, - `post_title` text NOT NULL, - `post_excerpt` text NOT NULL, - `post_status` varchar(20) NOT NULL DEFAULT 'publish', - `comment_status` varchar(20) NOT NULL DEFAULT 'open', - `ping_status` varchar(20) NOT NULL DEFAULT 'open', - `post_password` varchar(255) NOT NULL DEFAULT '', - `post_name` varchar(200) NOT NULL DEFAULT '', - `to_ping` text NOT NULL, - `pinged` text NOT NULL, - `post_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `post_modified_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `post_content_filtered` longtext NOT NULL, - `post_parent` bigint(20) unsigned NOT NULL DEFAULT 0, - `guid` varchar(255) NOT NULL DEFAULT '', - `menu_order` int(11) NOT NULL DEFAULT 0, - `post_type` varchar(20) NOT NULL DEFAULT 'post', - `post_mime_type` varchar(100) NOT NULL DEFAULT '', - `comment_count` bigint(20) NOT NULL DEFAULT 0, - PRIMARY KEY (`ID`), - KEY `post_name` (`post_name`(191)), - KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`), - KEY `post_parent` (`post_parent`), - KEY `post_author` (`post_author`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_posts` --- - -LOCK TABLES `wp_posts` WRITE; -/*!40000 ALTER TABLE `wp_posts` DISABLE KEYS */; -INSERT INTO `wp_posts` VALUES -(1,1,'2023-08-10 05:51:52','2023-08-10 05:51:52','\n

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!

\n','Hello world!','','publish','open','open','','hello-world','','','2023-08-10 05:51:52','2023-08-10 05:51:52','',0,'https://djonker.42.fr/?p=1',0,'post','',1), -(2,1,'2023-08-10 05:51:52','2023-08-10 05:51:52','\n

This is an example page. It\'s different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this:

\n\n\n\n

Hi there! I\'m a bike messenger by day, aspiring actor by night, and this is my website. I live in Los Angeles, have a great dog named Jack, and I like piña coladas. (And gettin\' caught in the rain.)

\n\n\n\n

...or something like this:

\n\n\n\n

The XYZ Doohickey Company was founded in 1971, and has been providing quality doohickeys to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community.

\n\n\n\n

As a new WordPress user, you should go to your dashboard to delete this page and create new pages for your content. Have fun!

\n','Sample Page','','publish','closed','open','','sample-page','','','2023-08-10 05:51:52','2023-08-10 05:51:52','',0,'https://djonker.42.fr/?page_id=2',0,'page','',0), -(3,1,'2023-08-10 05:51:52','2023-08-10 05:51:52','

Who we are

Suggested text: Our website address is: https://djonker.42.fr.

Comments

Suggested text: When visitors leave comments on the site we collect the data shown in the comments form, and also the visitor’s IP address and browser user agent string to help spam detection.

An anonymized string created from your email address (also called a hash) may be provided to the Gravatar service to see if you are using it. The Gravatar service privacy policy is available here: https://automattic.com/privacy/. After approval of your comment, your profile picture is visible to the public in the context of your comment.

Media

Suggested text: If you upload images to the website, you should avoid uploading images with embedded location data (EXIF GPS) included. Visitors to the website can download and extract any location data from images on the website.

Cookies

Suggested text: If you leave a comment on our site you may opt-in to saving your name, email address and website in cookies. These are for your convenience so that you do not have to fill in your details again when you leave another comment. These cookies will last for one year.

If you visit our login page, we will set a temporary cookie to determine if your browser accepts cookies. This cookie contains no personal data and is discarded when you close your browser.

When you log in, we will also set up several cookies to save your login information and your screen display choices. Login cookies last for two days, and screen options cookies last for a year. If you select "Remember Me", your login will persist for two weeks. If you log out of your account, the login cookies will be removed.

If you edit or publish an article, an additional cookie will be saved in your browser. This cookie includes no personal data and simply indicates the post ID of the article you just edited. It expires after 1 day.

Embedded content from other websites

Suggested text: Articles on this site may include embedded content (e.g. videos, images, articles, etc.). Embedded content from other websites behaves in the exact same way as if the visitor has visited the other website.

These websites may collect data about you, use cookies, embed additional third-party tracking, and monitor your interaction with that embedded content, including tracking your interaction with the embedded content if you have an account and are logged in to that website.

Who we share your data with

Suggested text: If you request a password reset, your IP address will be included in the reset email.

How long we retain your data

Suggested text: If you leave a comment, the comment and its metadata are retained indefinitely. This is so we can recognize and approve any follow-up comments automatically instead of holding them in a moderation queue.

For users that register on our website (if any), we also store the personal information they provide in their user profile. All users can see, edit, or delete their personal information at any time (except they cannot change their username). Website administrators can also see and edit that information.

What rights you have over your data

Suggested text: If you have an account on this site, or have left comments, you can request to receive an exported file of the personal data we hold about you, including any data you have provided to us. You can also request that we erase any personal data we hold about you. This does not include any data we are obliged to keep for administrative, legal, or security purposes.

Where your data is sent

Suggested text: Visitor comments may be checked through an automated spam detection service.

','Privacy Policy','','draft','closed','open','','privacy-policy','','','2023-08-10 05:51:52','2023-08-10 05:51:52','',0,'https://djonker.42.fr/?page_id=3',0,'page','',0), -(4,0,'2023-08-10 05:51:57','2023-08-10 05:51:57','','Navigation','','publish','closed','closed','','navigation','','','2023-08-10 05:51:57','2023-08-10 05:51:57','',0,'https://djonker.42.fr/?p=4',0,'wp_navigation','',0), -(5,1,'2023-08-10 05:52:59','2023-08-10 05:52:59','{\"version\": 2, \"isGlobalStylesUserThemeJSON\": true }','Custom Styles','','publish','closed','closed','','wp-global-styles-twentytwentythree','','','2023-08-10 05:52:59','2023-08-10 05:52:59','',0,'https://djonker.42.fr/?p=5',0,'wp_global_styles','',0), -(6,1,'2023-08-10 05:53:14','0000-00-00 00:00:00','','Auto Draft','','auto-draft','open','open','','','','','2023-08-10 05:53:14','0000-00-00 00:00:00','',0,'https://djonker.42.fr/?p=6',0,'post','',0); -/*!40000 ALTER TABLE `wp_posts` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_term_relationships` --- - -DROP TABLE IF EXISTS `wp_term_relationships`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_term_relationships` ( - `object_id` bigint(20) unsigned NOT NULL DEFAULT 0, - `term_taxonomy_id` bigint(20) unsigned NOT NULL DEFAULT 0, - `term_order` int(11) NOT NULL DEFAULT 0, - PRIMARY KEY (`object_id`,`term_taxonomy_id`), - KEY `term_taxonomy_id` (`term_taxonomy_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_term_relationships` --- - -LOCK TABLES `wp_term_relationships` WRITE; -/*!40000 ALTER TABLE `wp_term_relationships` DISABLE KEYS */; -INSERT INTO `wp_term_relationships` VALUES -(1,1,0), -(5,2,0); -/*!40000 ALTER TABLE `wp_term_relationships` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_term_taxonomy` --- - -DROP TABLE IF EXISTS `wp_term_taxonomy`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_term_taxonomy` ( - `term_taxonomy_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `term_id` bigint(20) unsigned NOT NULL DEFAULT 0, - `taxonomy` varchar(32) NOT NULL DEFAULT '', - `description` longtext NOT NULL, - `parent` bigint(20) unsigned NOT NULL DEFAULT 0, - `count` bigint(20) NOT NULL DEFAULT 0, - PRIMARY KEY (`term_taxonomy_id`), - UNIQUE KEY `term_id_taxonomy` (`term_id`,`taxonomy`), - KEY `taxonomy` (`taxonomy`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_term_taxonomy` --- - -LOCK TABLES `wp_term_taxonomy` WRITE; -/*!40000 ALTER TABLE `wp_term_taxonomy` DISABLE KEYS */; -INSERT INTO `wp_term_taxonomy` VALUES -(1,1,'category','',0,1), -(2,2,'wp_theme','',0,1); -/*!40000 ALTER TABLE `wp_term_taxonomy` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_termmeta` --- - -DROP TABLE IF EXISTS `wp_termmeta`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_termmeta` ( - `meta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `term_id` bigint(20) unsigned NOT NULL DEFAULT 0, - `meta_key` varchar(255) DEFAULT NULL, - `meta_value` longtext DEFAULT NULL, - PRIMARY KEY (`meta_id`), - KEY `term_id` (`term_id`), - KEY `meta_key` (`meta_key`(191)) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_termmeta` --- - -LOCK TABLES `wp_termmeta` WRITE; -/*!40000 ALTER TABLE `wp_termmeta` DISABLE KEYS */; -/*!40000 ALTER TABLE `wp_termmeta` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_terms` --- - -DROP TABLE IF EXISTS `wp_terms`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_terms` ( - `term_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(200) NOT NULL DEFAULT '', - `slug` varchar(200) NOT NULL DEFAULT '', - `term_group` bigint(10) NOT NULL DEFAULT 0, - PRIMARY KEY (`term_id`), - KEY `slug` (`slug`(191)), - KEY `name` (`name`(191)) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_terms` --- - -LOCK TABLES `wp_terms` WRITE; -/*!40000 ALTER TABLE `wp_terms` DISABLE KEYS */; -INSERT INTO `wp_terms` VALUES -(1,'Uncategorized','uncategorized',0), -(2,'twentytwentythree','twentytwentythree',0); -/*!40000 ALTER TABLE `wp_terms` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_usermeta` --- - -DROP TABLE IF EXISTS `wp_usermeta`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_usermeta` ( - `umeta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `user_id` bigint(20) unsigned NOT NULL DEFAULT 0, - `meta_key` varchar(255) DEFAULT NULL, - `meta_value` longtext DEFAULT NULL, - PRIMARY KEY (`umeta_id`), - KEY `user_id` (`user_id`), - KEY `meta_key` (`meta_key`(191)) -) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_usermeta` --- - -LOCK TABLES `wp_usermeta` WRITE; -/*!40000 ALTER TABLE `wp_usermeta` DISABLE KEYS */; -INSERT INTO `wp_usermeta` VALUES -(1,1,'nickname','Houtworm'), -(2,1,'first_name',''), -(3,1,'last_name',''), -(4,1,'description',''), -(5,1,'rich_editing','true'), -(6,1,'syntax_highlighting','true'), -(7,1,'comment_shortcuts','false'), -(8,1,'admin_color','fresh'), -(9,1,'use_ssl','0'), -(10,1,'show_admin_bar_front','true'), -(11,1,'locale',''), -(12,1,'wp_capabilities','a:1:{s:13:\"administrator\";b:1;}'), -(13,1,'wp_user_level','10'), -(14,1,'dismissed_wp_pointers',''), -(15,1,'show_welcome_panel','1'), -(16,1,'session_tokens','a:1:{s:64:\"1a36fff06b96875fdccdde90185a83c9424726ae3469ea4e58fb63d73a49a4f4\";a:4:{s:10:\"expiration\";i:1691819523;s:2:\"ip\";s:11:\"172.20.30.1\";s:2:\"ua\";s:101:\"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Safari/605.1.15\";s:5:\"login\";i:1691646723;}}'), -(17,1,'wp_dashboard_quick_press_last_post_id','6'), -(18,1,'community-events-location','a:1:{s:2:\"ip\";s:11:\"172.20.30.0\";}'), -(19,2,'nickname','djonker'), -(20,2,'first_name',''), -(21,2,'last_name',''), -(22,2,'description',''), -(23,2,'rich_editing','true'), -(24,2,'syntax_highlighting','true'), -(25,2,'comment_shortcuts','false'), -(26,2,'admin_color','fresh'), -(27,2,'use_ssl','0'), -(28,2,'show_admin_bar_front','true'), -(29,2,'locale',''), -(30,2,'wp_capabilities','a:1:{s:10:\"subscriber\";b:1;}'), -(31,2,'wp_user_level','0'), -(32,2,'dismissed_wp_pointers',''); -/*!40000 ALTER TABLE `wp_usermeta` ENABLE KEYS */; -UNLOCK TABLES; - --- --- Table structure for table `wp_users` --- - -DROP TABLE IF EXISTS `wp_users`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `wp_users` ( - `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `user_login` varchar(60) NOT NULL DEFAULT '', - `user_pass` varchar(255) NOT NULL DEFAULT '', - `user_nicename` varchar(50) NOT NULL DEFAULT '', - `user_email` varchar(100) NOT NULL DEFAULT '', - `user_url` varchar(100) NOT NULL DEFAULT '', - `user_registered` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', - `user_activation_key` varchar(255) NOT NULL DEFAULT '', - `user_status` int(11) NOT NULL DEFAULT 0, - `display_name` varchar(250) NOT NULL DEFAULT '', - PRIMARY KEY (`ID`), - KEY `user_login_key` (`user_login`), - KEY `user_nicename` (`user_nicename`), - KEY `user_email` (`user_email`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Dumping data for table `wp_users` --- - -LOCK TABLES `wp_users` WRITE; -/*!40000 ALTER TABLE `wp_users` DISABLE KEYS */; -INSERT INTO `wp_users` VALUES -(1,'Houtworm','$P$BRWHdJ4bmdTf8.emc5dS1ljogx5NWU/','houtworm','djonker@houtworm.email','https://djonker.42.fr','2023-08-10 05:51:52','',0,'Houtworm'), -(2,'djonker','$P$B6.r7kiepHY5WFCA5UT5MqBflraiPF1','djonker','djonker42@houtworm.email','','2023-08-10 05:55:11','',0,'djonker'); -/*!40000 ALTER TABLE `wp_users` ENABLE KEYS */; -UNLOCK TABLES; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2023-08-10 5:58:44 diff --git a/srcs/requirements/nginx/srcs/start.sh b/srcs/requirements/nginx/srcs/start.sh deleted file mode 100644 index dc23d67..0000000 --- a/srcs/requirements/nginx/srcs/start.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -nginx -g 'daemon off;'