". {@see select} for details. * @param-taint $tables exec_sql * @param string|array $var The field name to select. This must be a valid SQL fragment: do not * use unvalidated user input. Can be an array, but must contain exactly 1 element then. * {@see select} for details. * @param-taint $var exec_sql * @phpcs:ignore Generic.Files.LineLength * @param string|IExpression|array|RawSQLValue>|array $cond * The condition array. {@see select} for details. * @param-taint $cond exec_sql_numkey * @param string $fname The function name of the caller. @phan-mandatory-param * @param-taint $fname exec_sql * @param string|array $options The query options. {@see select} for details. * @param-taint $options none This is special-cased in MediaWikiSecurityCheckPlugin * @param string|array $join_conds The query join conditions. {@see select} for details. * @param-taint $join_conds none This is special-cased in MediaWikiSecurityCheckPlugin * @return mixed|false The value from the field, or false if nothing was found * @return-taint tainted * @throws DBError If an error occurs, {@see query} */ public function selectField( $tables, $var, $cond = '', $fname = __METHOD__, $options = [], $join_conds = [] ); /** * A SELECT wrapper which returns a list of single field values from result rows * * If no result rows are returned from the query, an empty array is returned. * * New callers should use {@link newSelectQueryBuilder} with {@link SelectQueryBuilder::fetchFieldValues} * instead, which is more readable and less error-prone. * * @internal callers outside of rdbms library should use SelectQueryBuilder instead. * * @param string|array $tables Table reference(s), using the unqualified name of tables * or of the form "information_schema.". {@see select} for details. * @param-taint $tables exec_sql * @param string $var The field name to select. This must be a valid SQL * fragment: do not use unvalidated user input. * @param-taint $var exec_sql * @phpcs:ignore Generic.Files.LineLength * @param string|IExpression|array|RawSQLValue>|array $cond * The condition array. {@see select} for details. * @param-taint $cond exec_sql_numkey * @param string $fname The function name of the caller. @phan-mandatory-param * @param-taint $fname exec_sql * @param string|array $options The query options. {@see select} for details. * @param-taint $options none This is special-cased in MediaWikiSecurityCheckPlugin * @param string|array $join_conds The query join conditions. {@see select} for details. * @param-taint $join_conds none This is special-cased in MediaWikiSecurityCheckPlugin * * @return array The values from the field in the order they were returned from the DB * @return-taint tainted * @throws DBError If an error occurs, {@see query} * @since 1.25 */ public function selectFieldValues( $tables, $var, $cond = '', $fname = __METHOD__, $options = [], $join_conds = [] ): array; /** * Execute a SELECT query constructed using the various parameters provided * * New callers should use {@link newSelectQueryBuilder} with {@link SelectQueryBuilder::fetchResultSet} * instead, which is more readable and less error-prone. * * @param string|array $tables Table reference(s), using the unqualified name of tables * or of the form "information_schema.". * @param-taint $tables exec_sql * * Each table reference assigns a table name to a specified collection of rows * for the context of the query (e.g. field expressions, WHERE clause, GROUP BY * clause, HAVING clause, ect...). Use of multiple table references implies a JOIN. * * If a string is given, it must hold the name of the table having the specified * collection of rows. If an array is given, each entry must be one of the following: * - A string holding the name of the existing table which has the collection * of rows. If keyed by a string, the key will be the assigned table name. * - A Subquery instance which specifies the collection of rows derived from * a subquery. If keyed by a string, the key will be the assigned table name. * Otherwise, the SQL text of the subquery will be the assigned table name. * - An array specifying the collection of rows derived from a parenthesized * JOIN. It must be keyed by a string, which will be used as the assigned * table name. * * String keys allow table aliases to be specified, for example: * * [ 'a' => 'user' ] * * This includes the user table in the query, with the alias "a" available * for use in field names (e.g. a.user_name). * * A derived table, defined by the result of selectSQLText(), requires an alias * key and a Subquery instance value which wraps the SQL query, for example: * * [ 'c' => new Subquery( 'SELECT ...' ) ] * * Joins using parentheses for grouping (since MediaWiki 1.31) may be * constructed using nested arrays. For example, * * [ 'tableA', 'nestedB' => [ 'tableB', 'b2' => 'tableB2' ] ] * * along with `$join_conds` like * * [ 'b2' => [ 'JOIN', 'b_id = b2_id' ], 'nestedB' => [ 'LEFT JOIN', 'b_a = a_id' ] ] * * will produce SQL something like * * FROM tableA LEFT JOIN (tableB JOIN tableB2 AS b2 ON (b_id = b2_id)) ON (b_a = a_id) * * All of the table names given here are automatically run through * Database::tableName(), which causes the table prefix (if any) to be * added, and various other table name mappings to be performed. * * Do not use untrusted user input as a table name. Alias names should * not have characters outside of the Basic multilingual plane. * * @param string|array $vars Field name(s) * @param-taint $vars exec_sql * * May be either a field name or an array of field names. The field names * can be complete fragments of SQL, for direct inclusion into the SELECT * query. If an array is given, field aliases can be specified, for example: * * [ 'maxrev' => 'MAX(rev_id)' ] * * This includes an expression with the alias "maxrev" in the query. * * If an expression is given, care must be taken to ensure that it is * DBMS-independent. * * Untrusted user input must not be passed to this parameter. * * @phpcs:ignore Generic.Files.LineLength * @param string|IExpression|array|RawSQLValue>|array $conds * @param-taint $conds exec_sql_numkey * * May be either a string containing a single condition, or an array of * conditions. If an array is given, the conditions constructed from each * element are combined with AND. * * Array elements may take one of two forms: * * - Elements with a numeric key are interpreted as raw SQL fragments. * - Elements with a string key are interpreted as equality conditions, * where the key is the field name. * - If the value of such an array element is a scalar (such as a * string), it will be treated as data and thus quoted appropriately. * If it is null, an IS NULL clause will be added. * - If the value is an array, an IN (...) clause will be constructed * from its non-null elements, and an IS NULL clause will be added * if null is present, such that the field may match any of the * elements in the array. The non-null elements will be quoted. * * Note that expressions are often DBMS-dependent in their syntax. * DBMS-independent wrappers are provided for constructing several types of * expression commonly used in condition queries. See: * - IDatabase::buildLike() * - IDatabase::conditional() * * Untrusted user input is safe in the values of string keys, however untrusted * input must not be used in the array key names or in the values of numeric keys. * Escaping of untrusted input used in values of numeric keys should be done via * IDatabase::addQuotes() * * Use an empty array, string, or IDatabase::ALL_ROWS to select all rows. * * You *can* put simple join conditions here, but this is strongly discouraged. * Instead of * * // $conds... * 'rev_actor = actor_id', * * use (see below for $join_conds): * * // $join_conds... * 'actor' => [ 'JOIN', 'rev_actor = actor_id' ], * * @param string $fname Caller function name @phan-mandatory-param * @param-taint $fname exec_sql * * @param string|array $options Query options * @param-taint $options none This is special-cased in MediaWikiSecurityCheckPlugin * * Optional: Array of query options. Boolean options are specified by * including them in the array as a string value with a numeric key, for * example: * * [ 'FOR UPDATE' ] * * The supported options are: * * - OFFSET: Skip this many rows at the start of the result set. OFFSET * with LIMIT can theoretically be used for paging through a result set, * but this is discouraged for performance reasons. * * - LIMIT: Integer: return at most this many rows. The rows are sorted * and then the first rows are taken until the limit is reached. LIMIT * is applied to a result set after OFFSET. * * - LOCK IN SHARE MODE: Boolean: lock the returned rows so that they can't be * changed until the next COMMIT. Cannot be used with aggregate functions * (COUNT, MAX, etc., but also DISTINCT). * * - FOR UPDATE: Boolean: lock the returned rows so that they can't be * changed nor read with LOCK IN SHARE MODE until the next COMMIT. * Cannot be used with aggregate functions (COUNT, MAX, etc., but also DISTINCT). * * - DISTINCT: Boolean: return only unique result rows. * * - GROUP BY: May be either an SQL fragment string naming a field or * expression to group by, or an array of such SQL fragments. * * - HAVING: May be either a string containing a HAVING clause or an array of * conditions building the HAVING clause. If an array is given, the conditions * constructed from each element are combined with AND. * * - ORDER BY: May be either an SQL fragment giving a field name or * expression to order by, or an array of such SQL fragments. * * - USE INDEX: This may be either a string giving the index name to use * for the query, or an array. If it is an associative array, each key * gives the table name (or alias), each value gives the index name to * use for that table. All strings are SQL fragments and so should be * validated by the caller. * * - IGNORE INDEX: This may be either be a string giving an index name to * ignore for the query, or an array. If it is an associative array, * each key gives the table name (or alias), each value gives the index * name to ignore for that table. All strings are SQL fragments and so * should be validated by the caller. * * - EXPLAIN: In MySQL, this causes an EXPLAIN SELECT query to be run, * instead of SELECT. * * - MAX_EXECUTION_TIME: (only in MySQL/MariaDB) maximum allowed time to * run the query in milliseconds (if database supports it). * * And also the following boolean MySQL extensions, see the MySQL manual * for documentation: * * - STRAIGHT_JOIN * - SQL_BIG_RESULT * - SQL_BUFFER_RESULT * - SQL_SMALL_RESULT * - SQL_CALC_FOUND_ROWS * * @param string|array $join_conds Join conditions * @param-taint $join_conds none This is special-cased in MediaWikiSecurityCheckPlugin * * Optional associative array of table-specific join conditions. * Simple conditions can also be specified in the regular $conds, * but this is strongly discouraged in favor of the more explicit syntax here. * * The key of the array contains the table name or alias. The value is an * array with two elements, numbered 0 and 1. The first gives the type of * join, the second is the same as the $conds parameter. Thus it can be * an SQL fragment, or an array where the string keys are equality and the * numeric keys are SQL fragments all AND'd together. For example: * * [ 'page' => [ 'LEFT JOIN', 'page_latest=rev_id' ] ] * * @internal * @return IResultWrapper Resulting rows * @return-taint tainted * @throws DBError If an error occurs, {@see query} */ public function select( $tables, $vars, $conds = '', $fname = __METHOD__, $options = [], $join_conds = [] ); /** * Wrapper to IDatabase::select() that only fetches one row (via LIMIT) * * If the query returns no rows, false is returned. * * This method is convenient for fetching a row based on a unique key condition. * * New callers should use {@link newSelectQueryBuilder} with {@link SelectQueryBuilder::fetchRow} * instead, which is more readable and less error-prone. * * @internal * @param string|array $tables Table reference(s), using the unqualified name of tables * or of the form "information_schema.". {@see select} for details. * @param-taint $tables exec_sql * @param string|array $vars Field names * @param-taint $vars exec_sql * @phpcs:ignore Generic.Files.LineLength * @param string|IExpression|array|RawSQLValue>|array $conds * Conditions * @param-taint $conds exec_sql_numkey * @param string $fname Caller function name @phan-mandatory-param * @param-taint $fname exec_sql * @param string|array $options Query options * @param-taint $options none This is special-cased in MediaWikiSecurityCheckPlugin * @param array|string $join_conds Join conditions * @param-taint $join_conds none This is special-cased in MediaWikiSecurityCheckPlugin * @return stdClass|false * @return-taint tainted * @throws DBError If an error occurs, {@see query} */ public function selectRow( $tables, $vars, $conds, $fname = __METHOD__, $options = [], $join_conds = [] ); /** * Estimate the number of rows in dataset * * MySQL allows you to estimate the number of rows that would be returned * by a SELECT query, using EXPLAIN SELECT. The estimate is provided using * index cardinality statistics, and is notoriously inaccurate, especially * when large numbers of rows have recently been added or deleted. * * For DBMSs that don't support fast result size estimation, this function * will actually perform the SELECT COUNT(*). * * Takes the same arguments as IDatabase::select(). * * New callers should use {@link newSelectQueryBuilder} with {@link SelectQueryBuilder::estimateRowCount} * instead, which is more readable and less error-prone. * * @internal * @param string|string[] $tables Table reference(s), using the unqualified name of tables * or of the form "information_schema.". {@see select} for details. * @param string $var Column for which NULL values are not counted [default "*"] * @phpcs:ignore Generic.Files.LineLength * @param string|IExpression|array|RawSQLValue>|array $conds * Filters on the table * @param string $fname Function name for profiling @phan-mandatory-param * @param array $options Options for select * @param array|string $join_conds Join conditions * @return int Row count * @throws DBError If an error occurs, {@see query} */ public function estimateRowCount( $tables, $var = '*', $conds = '', $fname = __METHOD__, $options = [], $join_conds = [] ): int; /** * Get the number of rows in dataset * * This is useful when trying to do COUNT(*) but with a LIMIT for performance. * * Takes the same arguments as IDatabase::select(). * * New callers should use {@link newSelectQueryBuilder} with {@link SelectQueryBuilder::fetchRowCount} * instead, which is more readable and less error-prone. * * @since 1.27 Added $join_conds parameter * * @internal * @param string|string[] $tables Table reference(s), using the unqualified name of tables * or of the form "information_schema.". {@see select} for details. * @param-taint $tables exec_sql * @param string $var Column for which NULL values are not counted [default "*"] * @param-taint $var exec_sql * @phpcs:ignore Generic.Files.LineLength * @param string|IExpression|array|RawSQLValue>|array $conds * Filters on the table * @param-taint $conds exec_sql_numkey * @param string $fname Function name for profiling @phan-mandatory-param * @param-taint $fname exec_sql * @param array $options Options for select * @param-taint $options none This is special-cased in MediaWikiSecurityCheckPlugin * @param array $join_conds Join conditions (since 1.27) * @param-taint $join_conds none This is special-cased in MediaWikiSecurityCheckPlugin * @return int Row count * @return-taint none * @throws DBError If an error occurs, {@see query} */ public function selectRowCount( $tables, $var = '*', $conds = '', $fname = __METHOD__, $options = [], $join_conds = [] ): int; /** * Returns true if DBs are assumed to be on potentially different servers * * In systems like mysql/mariadb, different databases can easily be referenced on a single * connection merely by name, even in a single query via JOIN. On the other hand, Postgres * treats databases as logically separate, with different database users, requiring special * mechanisms like postgres_fdw to "mount" foreign DBs. This is true even among DBs on the * same server. Changing the selected database via selectDomain() requires a new connection. * * @return bool * @since 1.29 */ public function databasesAreIndependent(); /** * Set the current domain (database, schema, and table prefix) * * This will throw an error for some database types if the database is unspecified * * This should only be called by a load balancer or if the handle is not attached to one * * @param string|DatabaseDomain $domain * @throws DBConnectionError If databasesAreIndependent() is true and connection change fails * @throws DBError On query error, if domain changes are disallowed, or the domain is invalid * @since 1.32 */ public function selectDomain( $domain ); /** * Get the current database name; null if there isn't one * * @return string|null */ public function getDBname(); /** * Get the hostname or IP address of the server * * @return string|null */ public function getServer(); /** * Get the readable name for the server * * @return string Readable server name, falling back to the hostname or IP address * @since 1.36 */ public function getServerName(); /** * Ping the server and try to reconnect if it there is no connection * * @return bool Success or failure */ public function ping(); /** * Get the seconds of replication lag on this database server * * Callers should avoid using this method while a transaction is active * * @return float|int|false Database replication lag in seconds or false on error * @throws DBError If an error occurs, {@see query} */ public function getLag(); /** * Get a cached estimate of the seconds of replication lag on this database server, * using the estimate obtained at the start of the current transaction if one is active * * This is useful when transactions might use snapshot isolation (e.g. REPEATABLE-READ in * innodb), so the "real" lag of that data is this lag plus transaction duration. If they * don't, it is still safe to be pessimistic. In AUTOCOMMIT mode, this still gives an * indication of the staleness of subsequent reads. * * @return array ('lag': seconds or false on error, 'since': UNIX timestamp of BEGIN) * @throws DBError If an error occurs, {@see query} * @since 1.27 */ public function getSessionLagStatus(); /** * Some DBMSs have a special format for inserting into blob fields, they * don't allow simple quoted strings to be inserted. To insert into such * a field, pass the data through this function before passing it to * IDatabase::insert(). * * @param string $b * @return string|Blob * @throws DBError */ public function encodeBlob( $b ); /** * Some DBMSs return a special placeholder object representing blob fields * in result objects. Pass the object through this function to return the * original string. * * @param string|Blob $b * @return string * @throws DBError */ public function decodeBlob( $b ); /** * See Expression::__construct() * * @since 1.42 * @param string $field * @param-taint $field exec_sql * @param string $op One of '>', '<', '!=', '=', '>=', '<=', IExpression::LIKE, IExpression::NOT_LIKE * @phan-param '\x3E'|'\x3C'|'!='|'='|'\x3E='|'\x3C='|'LIKE'|'NOT LIKE' $op * @param-taint $op exec_sql * @param ?scalar|RawSQLValue|Blob|LikeValue|non-empty-list $value * @param-taint $value escapes_sql * @return Expression * @phan-side-effect-free */ public function expr( string $field, string $op, $value ): Expression; /** * See Expression::__construct() * * @since 1.43 * @phpcs:ignore Generic.Files.LineLength * @param non-empty-array>|non-empty-array $conds * @param-taint $conds exec_sql_numkey * @return AndExpressionGroup * @phan-side-effect-free */ public function andExpr( array $conds ): AndExpressionGroup; /** * See Expression::__construct() * * @since 1.43 * @phpcs:ignore Generic.Files.LineLength * @param non-empty-array>|non-empty-array $conds * @param-taint $conds exec_sql_numkey * @return OrExpressionGroup * @phan-side-effect-free */ public function orExpr( array $conds ): OrExpressionGroup; /** * Get a debugging string that mentions the database type, the ID of this instance, * and the ID of any underlying connection resource or driver object if one is present * * @return string " object #" or " object # (resource/handle id #)" * @since 1.34 */ public function __toString(); }