Merge branch '10.2' into 10.3
This commit is contained in:
commit
7fb73ed143
@ -250,6 +250,11 @@ IF(NOT WITH_TSAN)
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
OPTION(WITH_DBUG_TRACE "Enable DBUG_ENTER()/DBUG_EXIT()" ON)
|
||||
IF(WITH_DBUG_TRACE)
|
||||
ADD_DEFINITIONS(-DDBUG_TRACE)
|
||||
ENDIF()
|
||||
|
||||
# Always enable debug sync for debug builds.
|
||||
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DENABLED_DEBUG_SYNC")
|
||||
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DENABLED_DEBUG_SYNC")
|
||||
|
@ -32,7 +32,7 @@
|
||||
** master/autocommit code by Brian Aker <brian@tangent.org>
|
||||
** SSL by
|
||||
** Andrei Errapart <andreie@no.spam.ee>
|
||||
** Tõnu Samuel <tonu@please.do.not.remove.this.spam.ee>
|
||||
** Tõnu Samuel <tonu@please.do.not.remove.this.spam.ee>
|
||||
** XML by Gary Huntress <ghuntress@mediaone.net> 10/10/01, cleaned up
|
||||
** and adapted to mysqldump 05/11/01 by Jani Tolonen
|
||||
** Added --single-transaction option 06/06/2002 by Peter Zaitsev
|
||||
|
@ -4,6 +4,10 @@
|
||||
|
||||
char *push1=0;
|
||||
|
||||
#ifndef DBUG_TRACE
|
||||
#define DBUG_TRACE
|
||||
#endif
|
||||
|
||||
#include <my_global.h> /* This includes dbug.h */
|
||||
#include <my_sys.h>
|
||||
#include <my_pthread.h>
|
||||
|
@ -29,6 +29,13 @@ extern ulong my_time_to_wait_for_lock;
|
||||
|
||||
#if defined(HAVE_ALARM) && !defined(NO_ALARM_LOOP)
|
||||
#include <signal.h>
|
||||
#ifdef HAVE_SIGHANDLER_T
|
||||
#define sig_return sighandler_t
|
||||
#elif defined(SOLARIS) || defined(__sun) || defined(__APPLE__)
|
||||
typedef void (*sig_return)(int); /* Returns type from signal */
|
||||
#else
|
||||
typedef void (*sig_return)(void); /* Returns type from signal */
|
||||
#endif
|
||||
#define ALARM_VARIABLES uint alarm_old=0; \
|
||||
sig_return alarm_signal=0
|
||||
#define ALARM_INIT my_have_got_alarm=0 ; \
|
||||
|
@ -67,6 +67,7 @@ extern void dbug_free_code_state(void **code_state_store);
|
||||
extern const char* _db_get_func_(void);
|
||||
extern int (*dbug_sanity)(void);
|
||||
|
||||
#ifdef DBUG_TRACE
|
||||
#define DBUG_LEAVE do { \
|
||||
_db_stack_frame_.line= __LINE__; \
|
||||
_db_return_ (&_db_stack_frame_); \
|
||||
@ -85,6 +86,13 @@ extern int (*dbug_sanity)(void);
|
||||
#define DBUG_VOID_RETURN do {DBUG_LEAVE; return;} while(0)
|
||||
#endif
|
||||
|
||||
#else
|
||||
#define DBUG_LEAVE
|
||||
#define DBUG_ENTER(a)
|
||||
#define DBUG_RETURN(a1) return(a1)
|
||||
#define DBUG_VOID_RETURN return
|
||||
#endif
|
||||
|
||||
#define DBUG_EXECUTE(keyword,a1) \
|
||||
do {if (_db_keyword_(0, (keyword), 0)) { a1 }} while(0)
|
||||
#define DBUG_EXECUTE_IF(keyword,a1) \
|
||||
|
@ -566,13 +566,6 @@ typedef int my_socket; /* File descriptor for sockets */
|
||||
#endif
|
||||
/* Type for functions that handles signals */
|
||||
#define sig_handler RETSIGTYPE
|
||||
C_MODE_START
|
||||
#ifdef HAVE_SIGHANDLER_T
|
||||
#define sig_return sighandler_t
|
||||
#else
|
||||
typedef void (*sig_return)(void); /* Returns type from signal */
|
||||
#endif
|
||||
C_MODE_END
|
||||
#if defined(__GNUC__) && !defined(_lint)
|
||||
typedef char pchar; /* Mixed prototypes can take char */
|
||||
typedef char puchar; /* Mixed prototypes can take char */
|
||||
|
@ -53,7 +53,7 @@ typedef struct st_queue {
|
||||
#define queue_top(queue) ((queue)->root[1])
|
||||
#define queue_element(queue,index) ((queue)->root[index])
|
||||
#define queue_end(queue) ((queue)->root[(queue)->elements])
|
||||
#define queue_replace_top(queue) _downheap(queue, 1, (queue)->root[1])
|
||||
#define queue_replace_top(queue) _downheap(queue, 1)
|
||||
#define queue_set_cmp_arg(queue, set_arg) (queue)->first_cmp_arg= set_arg
|
||||
#define queue_set_max_at_top(queue, set_arg) \
|
||||
(queue)->max_at_top= set_arg ? -1 : 1
|
||||
@ -61,23 +61,23 @@ typedef struct st_queue {
|
||||
typedef int (*queue_compare)(void *,uchar *, uchar *);
|
||||
|
||||
int init_queue(QUEUE *queue,uint max_elements,uint offset_to_key,
|
||||
pbool max_at_top, queue_compare compare,
|
||||
my_bool max_at_top, queue_compare compare,
|
||||
void *first_cmp_arg, uint offset_to_queue_pos,
|
||||
uint auto_extent);
|
||||
int reinit_queue(QUEUE *queue,uint max_elements,uint offset_to_key,
|
||||
pbool max_at_top, queue_compare compare,
|
||||
my_bool max_at_top, queue_compare compare,
|
||||
void *first_cmp_arg, uint offset_to_queue_pos,
|
||||
uint auto_extent);
|
||||
int resize_queue(QUEUE *queue, uint max_elements);
|
||||
void delete_queue(QUEUE *queue);
|
||||
void queue_insert(QUEUE *queue,uchar *element);
|
||||
void queue_insert(QUEUE *queue, uchar *element);
|
||||
int queue_insert_safe(QUEUE *queue, uchar *element);
|
||||
uchar *queue_remove(QUEUE *queue,uint idx);
|
||||
void queue_replace(QUEUE *queue,uint idx);
|
||||
|
||||
#define queue_remove_all(queue) { (queue)->elements= 0; }
|
||||
#define queue_is_full(queue) (queue->elements == queue->max_elements)
|
||||
void _downheap(QUEUE *queue, uint idx, uchar *element);
|
||||
void _downheap(QUEUE *queue, uint idx);
|
||||
void queue_fix(QUEUE *queue);
|
||||
#define is_queue_inited(queue) ((queue)->root != 0)
|
||||
|
||||
|
@ -149,6 +149,9 @@ typedef my_socket YASSL_SOCKET_T;
|
||||
#define YASSL_SOCKET_T_DEFINED
|
||||
#include <openssl/ssl.h>
|
||||
#include <openssl/err.h>
|
||||
#ifdef DEPRECATED
|
||||
#undef DEPRECATED
|
||||
#endif
|
||||
|
||||
enum enum_ssl_init_error
|
||||
{
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit 1768cb6c322d403c1e372b368cc3c23b660b7930
|
||||
Subproject commit ca8f94f727dba19a6ac43691df53fdc829e2124e
|
@ -206,7 +206,7 @@ int main(int argc, const char** argv )
|
||||
} else {
|
||||
if (strcmp(arg, "--verbose") == 0)
|
||||
verbose++;
|
||||
else if (strncmp(arg, "--parent-pid", 10) == 0)
|
||||
else if (strncmp(arg, "--parent-pid", 12) == 0)
|
||||
{
|
||||
/* Override parent_pid with a value provided by user */
|
||||
const char* start;
|
||||
|
@ -374,6 +374,32 @@ my $opt_stop_keep_alive= $ENV{MTR_STOP_KEEP_ALIVE};
|
||||
select(STDOUT);
|
||||
$| = 1; # Automatically flush STDOUT
|
||||
|
||||
my $set_titlebar;
|
||||
|
||||
|
||||
BEGIN {
|
||||
if (IS_WINDOWS) {
|
||||
my $have_win32_console= 0;
|
||||
eval {
|
||||
require Win32::Console;
|
||||
Win32::Console->import();
|
||||
$have_win32_console = 1;
|
||||
};
|
||||
eval 'sub HAVE_WIN32_CONSOLE { $have_win32_console }';
|
||||
} else {
|
||||
sub HAVE_WIN32_CONSOLE { 0 };
|
||||
}
|
||||
}
|
||||
|
||||
if (-t STDOUT) {
|
||||
if (IS_WINDOWS and HAVE_WIN32_CONSOLE) {
|
||||
$set_titlebar = sub {Win32::Console::Title $_[0];};
|
||||
} elsif (defined $ENV{TERM} and $ENV{TERM} =~ /xterm/) {
|
||||
$set_titlebar = sub { print "\e];$_[0]\a"; };
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
main();
|
||||
|
||||
sub have_wsrep() {
|
||||
@ -1044,7 +1070,7 @@ sub run_test_server ($$$) {
|
||||
delete $next->{reserved};
|
||||
}
|
||||
|
||||
xterm_stat(scalar(@$tests));
|
||||
titlebar_stat(scalar(@$tests)) if $set_titlebar;
|
||||
|
||||
if ($next) {
|
||||
# We don't need this any more
|
||||
@ -6657,19 +6683,16 @@ sub time_format($) {
|
||||
|
||||
our $num_tests;
|
||||
|
||||
sub xterm_stat {
|
||||
if (-t STDOUT and defined $ENV{TERM} and $ENV{TERM} =~ /xterm/) {
|
||||
my ($left) = @_;
|
||||
sub titlebar_stat {
|
||||
my ($left) = @_;
|
||||
|
||||
# 2.5 -> best by test
|
||||
$num_tests = $left + 2.5 unless $num_tests;
|
||||
# 2.5 -> best by test
|
||||
$num_tests = $left + 2.5 unless $num_tests;
|
||||
|
||||
my $done = $num_tests - $left;
|
||||
my $spent = time - $^T;
|
||||
my $done = $num_tests - $left;
|
||||
my $spent = time - $^T;
|
||||
|
||||
syswrite STDOUT, sprintf
|
||||
"\e];mtr: spent %s on %d tests. %s (%d tests) left\a",
|
||||
&$set_titlebar(sprintf "mtr: spent %s on %d tests. %s (%d tests) left",
|
||||
time_format($spent), $done,
|
||||
time_format($spent/$done * $left), $left;
|
||||
}
|
||||
time_format($spent/$done * $left), $left);
|
||||
}
|
||||
|
@ -21,7 +21,6 @@ galera_binlog_stmt_autoinc : MDEV-19959 Galera test failure on galera_binlog_stm
|
||||
galera_gcache_recover_manytrx : MDEV-18834 Galera test failure
|
||||
galera_ist_progress : MDEV-15236 fails when trying to read transfer status
|
||||
galera_load_data : MDEV-19968 galera.galera_load_data
|
||||
galera_parallel_autoinc_largetrx : MDEV-20916 galera.galera_parallel_autoinc_largetrx
|
||||
galera_parallel_simple : MDEV-20318 galera.galera_parallel_simple fails
|
||||
galera_shutdown_nonprim : MDEV-21493 galera.galera_shutdown_nonprim
|
||||
galera_ssl_upgrade : MDEV-19950 Galera test failure on galera_ssl_upgrade
|
||||
|
@ -15,11 +15,11 @@ connection node_1;
|
||||
connection node_1a;
|
||||
connection node_2;
|
||||
disconnect node_1a;
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
SELECT COUNT(*) AS EXPECT_30000 FROM t1;
|
||||
EXPECT_30000
|
||||
30000
|
||||
SELECT COUNT(DISTINCT f1) FROM t1;
|
||||
COUNT(DISTINCT f1)
|
||||
SELECT COUNT(DISTINCT f1) AS EXPECT_30000 FROM t1;
|
||||
EXPECT_30000
|
||||
30000
|
||||
connection default;
|
||||
DROP TABLE t1;
|
||||
|
@ -44,8 +44,12 @@ SET GLOBAL wsrep_slave_threads = 4;
|
||||
--connection node_2
|
||||
--reap
|
||||
--disconnect node_1a
|
||||
SELECT COUNT(*) FROM t1;
|
||||
SELECT COUNT(DISTINCT f1) FROM t1;
|
||||
|
||||
--let $wait_condition = SELECT COUNT(*) = 30000 FROM t1;
|
||||
--source include/wait_condition.inc
|
||||
|
||||
SELECT COUNT(*) AS EXPECT_30000 FROM t1;
|
||||
SELECT COUNT(DISTINCT f1) AS EXPECT_30000 FROM t1;
|
||||
|
||||
--disable_query_log
|
||||
--eval SET GLOBAL wsrep_slave_threads = $wsrep_slave_threads_orig;
|
||||
|
@ -10,5 +10,5 @@ ERROR 42000: Unknown storage engine 'InnoDB'
|
||||
FOUND 1 /InnoDB: Tablespace 4294967280 was not found at .*, but there were no modifications either/ in mysqld.1.err
|
||||
SELECT * FROM t1;
|
||||
ERROR 42000: Unknown storage engine 'InnoDB'
|
||||
FOUND 1 /srv_prepare_to_delete_redo_log_files: ib_log: MLOG_CHECKPOINT.* written/ in mysqld.1.err
|
||||
FOUND 1 /ib_log: MLOG_CHECKPOINT.* written/ in mysqld.1.err
|
||||
DROP TABLE t1;
|
||||
|
@ -39,7 +39,7 @@ SELECT * FROM t1;
|
||||
--source include/restart_mysqld.inc
|
||||
--error ER_UNKNOWN_STORAGE_ENGINE
|
||||
SELECT * FROM t1;
|
||||
--let SEARCH_PATTERN= srv_prepare_to_delete_redo_log_files: ib_log: MLOG_CHECKPOINT.* written
|
||||
--let SEARCH_PATTERN= ib_log: MLOG_CHECKPOINT.* written
|
||||
--source include/search_pattern_in_file.inc
|
||||
|
||||
--let $restart_parameters=
|
||||
|
@ -71,5 +71,22 @@ include/diff_tables.inc [master:t1,slave:t1]
|
||||
connection master;
|
||||
SELECT c1 FROM /*!999999 t1 WHEREN;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '/*!999999 t1 WHEREN' at line 1
|
||||
insert t1 values (/*!50505 1 /* foo */ */ + 2);
|
||||
insert t1 values (/*!999999 10 /* foo */ */ + 20);
|
||||
include/show_binlog_events.inc
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; insert t1 values (/*!50505 1 /* foo */ */ + 2)
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||
master-bin.000001 # Query # # use `test`; insert t1 values (/* 999999 10 (* foo *) */ + 20)
|
||||
master-bin.000001 # Query # # COMMIT
|
||||
connection slave;
|
||||
select * from t1;
|
||||
c1
|
||||
62
|
||||
3
|
||||
20
|
||||
connection master;
|
||||
DROP TABLE t1;
|
||||
include/rpl_end.inc
|
||||
|
19
mysql-test/suite/rpl/r/rpl_fail_register.result
Normal file
19
mysql-test/suite/rpl/r/rpl_fail_register.result
Normal file
@ -0,0 +1,19 @@
|
||||
include/master-slave.inc
|
||||
[connection master]
|
||||
connection slave;
|
||||
set @old_dbug=@@global.debug_dbug;
|
||||
set global debug_dbug='d,fail_com_register_slave';
|
||||
stop slave;
|
||||
reset slave;
|
||||
include/wait_for_slave_to_stop.inc
|
||||
start slave;
|
||||
stop slave;
|
||||
include/wait_for_slave_to_stop.inc
|
||||
set global debug_dbug=@old_dbug;
|
||||
connection master;
|
||||
kill DUMP_THREAD;
|
||||
show slave hosts;
|
||||
Server_id Host Port Master_id
|
||||
connection slave;
|
||||
start slave;
|
||||
include/rpl_end.inc
|
@ -68,7 +68,17 @@ sync_slave_with_master;
|
||||
--echo # comments
|
||||
--connection master
|
||||
--error 1064
|
||||
SELECT c1 FROM /*!999999 t1 WHEREN;
|
||||
SELECT c1 FROM /*!999999 t1 WHEREN; #*/
|
||||
|
||||
#
|
||||
# Bug#28388217 - SERVER CAN FAIL WHILE REPLICATING CONDITIONAL COMMENTS
|
||||
#
|
||||
insert t1 values (/*!50505 1 /* foo */ */ + 2);
|
||||
insert t1 values (/*!999999 10 /* foo */ */ + 20);
|
||||
source include/show_binlog_events.inc;
|
||||
sync_slave_with_master;
|
||||
select * from t1;
|
||||
connection master;
|
||||
|
||||
DROP TABLE t1;
|
||||
--source include/rpl_end.inc
|
||||
|
34
mysql-test/suite/rpl/t/rpl_fail_register.test
Normal file
34
mysql-test/suite/rpl/t/rpl_fail_register.test
Normal file
@ -0,0 +1,34 @@
|
||||
source include/have_debug.inc;
|
||||
source include/have_binlog_format_mixed.inc;
|
||||
source include/master-slave.inc;
|
||||
|
||||
connection slave;
|
||||
|
||||
set @old_dbug=@@global.debug_dbug;
|
||||
set global debug_dbug='d,fail_com_register_slave';
|
||||
|
||||
stop slave;
|
||||
reset slave;
|
||||
source include/wait_for_slave_to_stop.inc;
|
||||
start slave;
|
||||
stop slave;
|
||||
source include/wait_for_slave_to_stop.inc;
|
||||
set global debug_dbug=@old_dbug;
|
||||
|
||||
connection master;
|
||||
|
||||
### Dump thread is hanging despite slave has gracefully exited.
|
||||
let $id=`SELECT id from information_schema.processlist where command='Binlog Dump'`;
|
||||
|
||||
if ($id) {
|
||||
replace_result $id DUMP_THREAD;
|
||||
eval kill $id;
|
||||
let $wait_condition= SELECT count(*)=0 from information_schema.processlist where command='Binlog Dump';
|
||||
source include/wait_condition.inc;
|
||||
}
|
||||
|
||||
show slave hosts;
|
||||
|
||||
connection slave;
|
||||
start slave;
|
||||
source include/rpl_end.inc;
|
169
mysys/queues.c
169
mysys/queues.c
@ -70,10 +70,9 @@
|
||||
*/
|
||||
|
||||
int init_queue(QUEUE *queue, uint max_elements, uint offset_to_key,
|
||||
pbool max_at_top, int (*compare) (void *, uchar *, uchar *),
|
||||
my_bool max_at_top, int (*compare) (void *, uchar *, uchar *),
|
||||
void *first_cmp_arg, uint offset_to_queue_pos,
|
||||
uint auto_extent)
|
||||
|
||||
{
|
||||
DBUG_ENTER("init_queue");
|
||||
if ((queue->root= (uchar **) my_malloc((max_elements + 1) * sizeof(void*),
|
||||
@ -109,7 +108,7 @@ int init_queue(QUEUE *queue, uint max_elements, uint offset_to_key,
|
||||
*/
|
||||
|
||||
int reinit_queue(QUEUE *queue, uint max_elements, uint offset_to_key,
|
||||
pbool max_at_top, int (*compare) (void *, uchar *, uchar *),
|
||||
my_bool max_at_top, int (*compare) (void *, uchar *, uchar *),
|
||||
void *first_cmp_arg, uint offset_to_queue_pos,
|
||||
uint auto_extent)
|
||||
{
|
||||
@ -182,6 +181,28 @@ void delete_queue(QUEUE *queue)
|
||||
}
|
||||
|
||||
|
||||
static void insert_at(QUEUE *queue, uchar *element, uint idx)
|
||||
{
|
||||
uint next_index, offset_to_key= queue->offset_to_key;
|
||||
uint offset_to_queue_pos= queue->offset_to_queue_pos;
|
||||
/* max_at_top swaps the comparison if we want to order by desc */
|
||||
while ((next_index= idx >> 1) > 0 &&
|
||||
queue->compare(queue->first_cmp_arg,
|
||||
element + offset_to_key,
|
||||
queue->root[next_index] + offset_to_key) *
|
||||
queue->max_at_top < 0)
|
||||
{
|
||||
queue->root[idx]= queue->root[next_index];
|
||||
if (offset_to_queue_pos)
|
||||
(*(uint*) (queue->root[idx] + offset_to_queue_pos-1))= idx;
|
||||
idx= next_index;
|
||||
}
|
||||
queue->root[idx]= element;
|
||||
if (offset_to_queue_pos)
|
||||
(*(uint*) (element + offset_to_queue_pos-1))= idx;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Insert element in queue
|
||||
|
||||
@ -191,28 +212,10 @@ void delete_queue(QUEUE *queue)
|
||||
element Element to insert
|
||||
*/
|
||||
|
||||
void queue_insert(register QUEUE *queue, uchar *element)
|
||||
void queue_insert(QUEUE *queue, uchar *element)
|
||||
{
|
||||
reg2 uint idx, next;
|
||||
uint offset_to_queue_pos= queue->offset_to_queue_pos;
|
||||
DBUG_ASSERT(queue->elements < queue->max_elements);
|
||||
|
||||
idx= ++queue->elements;
|
||||
/* max_at_top swaps the comparison if we want to order by desc */
|
||||
while (idx > 1 &&
|
||||
(queue->compare(queue->first_cmp_arg,
|
||||
element + queue->offset_to_key,
|
||||
queue->root[(next= idx >> 1)] +
|
||||
queue->offset_to_key) * queue->max_at_top) < 0)
|
||||
{
|
||||
queue->root[idx]= queue->root[next];
|
||||
if (offset_to_queue_pos)
|
||||
(*(uint*) (queue->root[idx] + offset_to_queue_pos-1))= idx;
|
||||
idx= next;
|
||||
}
|
||||
queue->root[idx]= element;
|
||||
if (offset_to_queue_pos)
|
||||
(*(uint*) (element+ offset_to_queue_pos-1))= idx;
|
||||
insert_at(queue, element, ++queue->elements);
|
||||
}
|
||||
|
||||
|
||||
@ -230,7 +233,7 @@ void queue_insert(register QUEUE *queue, uchar *element)
|
||||
2 auto_extend is 0; No insertion done
|
||||
*/
|
||||
|
||||
int queue_insert_safe(register QUEUE *queue, uchar *element)
|
||||
int queue_insert_safe(QUEUE *queue, uchar *element)
|
||||
{
|
||||
|
||||
if (queue->elements == queue->max_elements)
|
||||
@ -240,7 +243,7 @@ int queue_insert_safe(register QUEUE *queue, uchar *element)
|
||||
if (resize_queue(queue, queue->max_elements + queue->auto_extent))
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
queue_insert(queue, element);
|
||||
return 0;
|
||||
}
|
||||
@ -259,81 +262,55 @@ int queue_insert_safe(register QUEUE *queue, uchar *element)
|
||||
pointer to removed element
|
||||
*/
|
||||
|
||||
uchar *queue_remove(register QUEUE *queue, uint idx)
|
||||
uchar *queue_remove(QUEUE *queue, uint idx)
|
||||
{
|
||||
uchar *element;
|
||||
DBUG_ASSERT(idx >= 1 && idx <= queue->elements);
|
||||
DBUG_ASSERT(idx >= 1);
|
||||
DBUG_ASSERT(idx <= queue->elements);
|
||||
element= queue->root[idx];
|
||||
_downheap(queue, idx, queue->root[queue->elements--]);
|
||||
queue->root[idx]= queue->root[queue->elements--];
|
||||
queue_replace(queue, idx);
|
||||
return element;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Add element to fixed position and update heap
|
||||
Restores the heap property from idx down the heap
|
||||
|
||||
SYNOPSIS
|
||||
_downheap()
|
||||
queue Queue to use
|
||||
idx Index of element to change
|
||||
element Element to store at 'idx'
|
||||
|
||||
NOTE
|
||||
This only works if element is >= all elements <= start_idx
|
||||
*/
|
||||
|
||||
void _downheap(register QUEUE *queue, uint start_idx, uchar *element)
|
||||
void _downheap(QUEUE *queue, uint idx)
|
||||
{
|
||||
uint elements,half_queue,offset_to_key, next_index, offset_to_queue_pos;
|
||||
register uint idx= start_idx;
|
||||
my_bool first= TRUE;
|
||||
|
||||
offset_to_key=queue->offset_to_key;
|
||||
offset_to_queue_pos= queue->offset_to_queue_pos;
|
||||
half_queue= (elements= queue->elements) >> 1;
|
||||
uchar *element= queue->root[idx];
|
||||
uint next_index,
|
||||
elements= queue->elements,
|
||||
half_queue= elements >> 1,
|
||||
offset_to_key= queue->offset_to_key,
|
||||
offset_to_queue_pos= queue->offset_to_queue_pos;
|
||||
|
||||
while (idx <= half_queue)
|
||||
{
|
||||
next_index=idx+idx;
|
||||
next_index= idx+idx;
|
||||
if (next_index < elements &&
|
||||
(queue->compare(queue->first_cmp_arg,
|
||||
queue->root[next_index]+offset_to_key,
|
||||
queue->root[next_index+1]+offset_to_key) *
|
||||
queue->max_at_top) > 0)
|
||||
(queue->compare(queue->first_cmp_arg,
|
||||
queue->root[next_index]+offset_to_key,
|
||||
queue->root[next_index+1]+offset_to_key) *
|
||||
queue->max_at_top) > 0)
|
||||
next_index++;
|
||||
if (first &&
|
||||
(((queue->compare(queue->first_cmp_arg,
|
||||
queue->root[next_index]+offset_to_key,
|
||||
element+offset_to_key) * queue->max_at_top) >= 0)))
|
||||
{
|
||||
queue->root[idx]= element;
|
||||
if (offset_to_queue_pos)
|
||||
(*(uint*) (element + offset_to_queue_pos-1))= idx;
|
||||
return;
|
||||
}
|
||||
first= FALSE;
|
||||
queue->root[idx]= queue->root[next_index];
|
||||
if (offset_to_queue_pos)
|
||||
(*(uint*) (queue->root[idx] + offset_to_queue_pos-1))= idx;
|
||||
idx=next_index;
|
||||
}
|
||||
|
||||
/*
|
||||
Insert the element into the right position. This is the same code
|
||||
as we have in queue_insert()
|
||||
*/
|
||||
while ((next_index= (idx >> 1)) > start_idx &&
|
||||
queue->compare(queue->first_cmp_arg,
|
||||
element+offset_to_key,
|
||||
queue->root[next_index]+offset_to_key)*
|
||||
queue->max_at_top < 0)
|
||||
{
|
||||
if ((queue->compare(queue->first_cmp_arg,
|
||||
queue->root[next_index]+offset_to_key,
|
||||
element+offset_to_key) * queue->max_at_top) >= 0)
|
||||
break;
|
||||
queue->root[idx]= queue->root[next_index];
|
||||
if (offset_to_queue_pos)
|
||||
(*(uint*) (queue->root[idx] + offset_to_queue_pos-1))= idx;
|
||||
idx= next_index;
|
||||
}
|
||||
queue->root[idx]= element;
|
||||
queue->root[idx]=element;
|
||||
if (offset_to_queue_pos)
|
||||
(*(uint*) (element + offset_to_queue_pos-1))= idx;
|
||||
}
|
||||
@ -351,7 +328,7 @@ void queue_fix(QUEUE *queue)
|
||||
{
|
||||
uint i;
|
||||
for (i= queue->elements >> 1; i > 0; i--)
|
||||
_downheap(queue, i, queue_element(queue, i));
|
||||
_downheap(queue, i);
|
||||
}
|
||||
|
||||
|
||||
@ -362,13 +339,47 @@ void queue_fix(QUEUE *queue)
|
||||
queue_replace()
|
||||
queue Queue to use
|
||||
idx Index of element to change
|
||||
element Element to store at 'idx'
|
||||
|
||||
NOTE
|
||||
optimized for the case when the new position is close to the end of the
|
||||
heap (typical for queue_remove() replacements).
|
||||
*/
|
||||
|
||||
void queue_replace(QUEUE *queue, uint idx)
|
||||
{
|
||||
uchar *element= queue->root[idx];
|
||||
DBUG_ASSERT(idx >= 1 && idx <= queue->elements);
|
||||
queue_remove(queue, idx);
|
||||
queue_insert(queue, element);
|
||||
uint next_index,
|
||||
elements= queue->elements,
|
||||
half_queue= elements>>1,
|
||||
offset_to_key= queue->offset_to_key,
|
||||
offset_to_queue_pos= queue->offset_to_queue_pos;
|
||||
my_bool first= TRUE;
|
||||
|
||||
while (idx <= half_queue)
|
||||
{
|
||||
next_index= idx + idx;
|
||||
if (next_index < elements &&
|
||||
queue->compare(queue->first_cmp_arg,
|
||||
queue->root[next_index]+offset_to_key,
|
||||
queue->root[next_index+1]+offset_to_key) *
|
||||
queue->max_at_top > 0)
|
||||
next_index++;
|
||||
if (first &&
|
||||
queue->compare(queue->first_cmp_arg,
|
||||
queue->root[next_index]+offset_to_key,
|
||||
element+offset_to_key) * queue->max_at_top >= 0)
|
||||
{
|
||||
queue->root[idx]= element;
|
||||
if (offset_to_queue_pos)
|
||||
(*(uint*) (element + offset_to_queue_pos-1))= idx;
|
||||
break;
|
||||
}
|
||||
first= FALSE;
|
||||
queue->root[idx]= queue->root[next_index];
|
||||
if (offset_to_queue_pos)
|
||||
(*(uint*) (queue->root[idx] + offset_to_queue_pos-1))= idx;
|
||||
idx=next_index;
|
||||
}
|
||||
|
||||
insert_at(queue, element, idx);
|
||||
}
|
||||
|
@ -8,7 +8,7 @@ Email domain: cam.ac.uk
|
||||
University of Cambridge Computing Service,
|
||||
Cambridge, England.
|
||||
|
||||
Copyright (c) 1997-2019 University of Cambridge
|
||||
Copyright (c) 1997-2020 University of Cambridge
|
||||
All rights reserved
|
||||
|
||||
|
||||
@ -19,7 +19,7 @@ Written by: Zoltan Herczeg
|
||||
Email local part: hzmester
|
||||
Emain domain: freemail.hu
|
||||
|
||||
Copyright(c) 2010-2019 Zoltan Herczeg
|
||||
Copyright(c) 2010-2020 Zoltan Herczeg
|
||||
All rights reserved.
|
||||
|
||||
|
||||
@ -30,7 +30,7 @@ Written by: Zoltan Herczeg
|
||||
Email local part: hzmester
|
||||
Emain domain: freemail.hu
|
||||
|
||||
Copyright(c) 2009-2019 Zoltan Herczeg
|
||||
Copyright(c) 2009-2020 Zoltan Herczeg
|
||||
All rights reserved.
|
||||
|
||||
|
||||
|
@ -5,6 +5,35 @@ Note that the PCRE 8.xx series (PCRE1) is now in a bugfix-only state. All
|
||||
development is happening in the PCRE2 10.xx series.
|
||||
|
||||
|
||||
Version 8.44 12 February-2020
|
||||
-----------------------------
|
||||
|
||||
1. Setting --enable-jit=auto for an out-of-tree build failed because the
|
||||
source directory wasn't in the search path for AC_TRY_COMPILE always. Patch
|
||||
from Ross Burton.
|
||||
|
||||
2. Applied a patch from Michael Shigorin to fix 8.43 build on e2k arch
|
||||
with lcc compiler (EDG frontend based); the problem it fixes is:
|
||||
|
||||
lcc: "pcrecpp.cc", line 74: error: declaration aliased to undefined entity
|
||||
"_ZN7pcrecpp2RE6no_argE" [-Werror]
|
||||
|
||||
3. Change 2 for 8.43 omitted (*LF) from the list of start-of-pattern items. Now
|
||||
added.
|
||||
|
||||
4. Fix ARMv5 JIT improper handling of labels right after a constant pool.
|
||||
|
||||
5. Small patch to pcreposix.c to set the erroroffset field to -1 immediately
|
||||
after a successful compile, instead of at the start of matching to avoid a
|
||||
sanitizer complaint (regexec is supposed to be thread safe).
|
||||
|
||||
6. Check the size of the number after (?C as it is read, in order to avoid
|
||||
integer overflow.
|
||||
|
||||
7. Tidy up left shifts to avoid sanitize warnings; also fix one NULL deference
|
||||
in pcretest.
|
||||
|
||||
|
||||
Version 8.43 23-February-2019
|
||||
-----------------------------
|
||||
|
||||
|
@ -25,7 +25,7 @@ Email domain: cam.ac.uk
|
||||
University of Cambridge Computing Service,
|
||||
Cambridge, England.
|
||||
|
||||
Copyright (c) 1997-2019 University of Cambridge
|
||||
Copyright (c) 1997-2020 University of Cambridge
|
||||
All rights reserved.
|
||||
|
||||
|
||||
@ -36,7 +36,7 @@ Written by: Zoltan Herczeg
|
||||
Email local part: hzmester
|
||||
Email domain: freemail.hu
|
||||
|
||||
Copyright(c) 2010-2019 Zoltan Herczeg
|
||||
Copyright(c) 2010-2020 Zoltan Herczeg
|
||||
All rights reserved.
|
||||
|
||||
|
||||
@ -47,7 +47,7 @@ Written by: Zoltan Herczeg
|
||||
Email local part: hzmester
|
||||
Email domain: freemail.hu
|
||||
|
||||
Copyright(c) 2009-2019 Zoltan Herczeg
|
||||
Copyright(c) 2009-2020 Zoltan Herczeg
|
||||
All rights reserved.
|
||||
|
||||
|
||||
|
@ -5,6 +5,12 @@ Note that this library (now called PCRE1) is now being maintained for bug fixes
|
||||
only. New projects are advised to use the new PCRE2 libraries.
|
||||
|
||||
|
||||
Release 8.44 12-February-2020
|
||||
-----------------------------
|
||||
|
||||
This is a bug-fix release.
|
||||
|
||||
|
||||
Release 8.43 23-February-2019
|
||||
-----------------------------
|
||||
|
||||
|
@ -13,9 +13,10 @@ libraries.
|
||||
The latest release of PCRE1 is always available in three alternative formats
|
||||
from:
|
||||
|
||||
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz
|
||||
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.bz2
|
||||
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.zip
|
||||
https://ftp.pcre.org/pub/pcre/pcre-x.xx.tar.gz
|
||||
https://ftp.pcre.org/pub/pcre/pcre-x.xx.tar.bz2
|
||||
https://ftp.pcre.org/pub/pcre/pcre-x.xx.tar.zip
|
||||
|
||||
|
||||
There is a mailing list for discussion about the development of PCRE at
|
||||
pcre-dev@exim.org. You can access the archives and subscribe or manage your
|
||||
@ -999,4 +1000,4 @@ pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx.
|
||||
Philip Hazel
|
||||
Email local part: ph10
|
||||
Email domain: cam.ac.uk
|
||||
Last updated: 10 February 2015
|
||||
Last updated: 12 February 2020
|
||||
|
@ -9,19 +9,19 @@ dnl The PCRE_PRERELEASE feature is for identifying release candidates. It might
|
||||
dnl be defined as -RC2, for example. For real releases, it should be empty.
|
||||
|
||||
m4_define(pcre_major, [8])
|
||||
m4_define(pcre_minor, [43])
|
||||
m4_define(pcre_minor, [44])
|
||||
m4_define(pcre_prerelease, [])
|
||||
m4_define(pcre_date, [2019-02-23])
|
||||
m4_define(pcre_date, [2020-02-12])
|
||||
|
||||
# NOTE: The CMakeLists.txt file searches for the above variables in the first
|
||||
# 50 lines of this file. Please update that if the variables above are moved.
|
||||
|
||||
# Libtool shared library interface versions (current:revision:age)
|
||||
m4_define(libpcre_version, [3:11:2])
|
||||
m4_define(libpcre16_version, [2:11:2])
|
||||
m4_define(libpcre32_version, [0:11:0])
|
||||
m4_define(libpcreposix_version, [0:6:0])
|
||||
m4_define(libpcrecpp_version, [0:1:0])
|
||||
m4_define(libpcre_version, [3:12:2])
|
||||
m4_define(libpcre16_version, [2:12:2])
|
||||
m4_define(libpcre32_version, [0:12:0])
|
||||
m4_define(libpcreposix_version, [0:7:0])
|
||||
m4_define(libpcrecpp_version, [0:2:0])
|
||||
|
||||
AC_PREREQ(2.57)
|
||||
AC_INIT(PCRE, pcre_major.pcre_minor[]pcre_prerelease, , pcre)
|
||||
@ -159,12 +159,15 @@ AC_ARG_ENABLE(jit,
|
||||
|
||||
if test "$enable_jit" = "auto"; then
|
||||
AC_LANG(C)
|
||||
SAVE_CPPFLAGS=$CPPFLAGS
|
||||
CPPFLAGS=-I$srcdir
|
||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
|
||||
#define SLJIT_CONFIG_AUTO 1
|
||||
#include "sljit/sljitConfigInternal.h"
|
||||
#if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
|
||||
#error unsupported
|
||||
#endif]])], enable_jit=yes, enable_jit=no)
|
||||
CPPFLAGS=$SAVE_CPPFLAGS
|
||||
fi
|
||||
|
||||
# Handle --disable-pcregrep-jit (enabled by default)
|
||||
|
@ -13,9 +13,10 @@ libraries.
|
||||
The latest release of PCRE1 is always available in three alternative formats
|
||||
from:
|
||||
|
||||
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz
|
||||
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.bz2
|
||||
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.zip
|
||||
https://ftp.pcre.org/pub/pcre/pcre-x.xx.tar.gz
|
||||
https://ftp.pcre.org/pub/pcre/pcre-x.xx.tar.bz2
|
||||
https://ftp.pcre.org/pub/pcre/pcre-x.xx.tar.zip
|
||||
|
||||
|
||||
There is a mailing list for discussion about the development of PCRE at
|
||||
pcre-dev@exim.org. You can access the archives and subscribe or manage your
|
||||
@ -999,4 +1000,4 @@ pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx.
|
||||
Philip Hazel
|
||||
Email local part: ph10
|
||||
Email domain: cam.ac.uk
|
||||
Last updated: 10 February 2015
|
||||
Last updated: 12 February 2020
|
||||
|
@ -143,7 +143,7 @@ performance.
|
||||
One way of guarding against this possibility is to use the
|
||||
<b>pcre_fullinfo()</b> function to check the compiled pattern's options for UTF.
|
||||
Alternatively, from release 8.33, you can set the PCRE_NEVER_UTF option at
|
||||
compile time. This causes an compile time error if a pattern contains a
|
||||
compile time. This causes a compile time error if a pattern contains a
|
||||
UTF-setting sequence.
|
||||
</P>
|
||||
<P>
|
||||
|
@ -1246,7 +1246,7 @@ the following negative numbers:
|
||||
PCRE_ERROR_BADOPTION the value of <i>what</i> was invalid
|
||||
PCRE_ERROR_UNSET the requested field is not set
|
||||
</pre>
|
||||
The "magic number" is placed at the start of each compiled pattern as an simple
|
||||
The "magic number" is placed at the start of each compiled pattern as a simple
|
||||
check against passing an arbitrary memory pointer. The endianness error can
|
||||
occur if a compiled pattern is saved and reloaded on a different host. Here is
|
||||
a typical call of <b>pcre_fullinfo()</b>, to obtain the length of the compiled
|
||||
@ -1318,7 +1318,7 @@ returned. For anchored patterns, -2 is returned.
|
||||
</pre>
|
||||
Return the value of the first data unit (non-UTF character) of any matched
|
||||
string in the situation where PCRE_INFO_FIRSTCHARACTERFLAGS returns 1;
|
||||
otherwise return 0. The fourth argument should point to an <b>uint_t</b>
|
||||
otherwise return 0. The fourth argument should point to a <b>uint_t</b>
|
||||
variable.
|
||||
</P>
|
||||
<P>
|
||||
@ -1577,7 +1577,7 @@ returned value 1 (with "z" returned from PCRE_INFO_REQUIREDCHAR), but for
|
||||
</pre>
|
||||
Return the value of the rightmost literal data unit that must exist in any
|
||||
matched string, other than at its start, if such a value has been recorded. The
|
||||
fourth argument should point to an <b>uint32_t</b> variable. If there is no such
|
||||
fourth argument should point to a <b>uint32_t</b> variable. If there is no such
|
||||
value, 0 is returned.
|
||||
</P>
|
||||
<br><a name="SEC16" href="#TOC1">REFERENCE COUNTS</a><br>
|
||||
|
@ -99,23 +99,21 @@ the 16-bit library, or <b>pcre32_xx</b> when using the 32-bit library".
|
||||
<br><a name="SEC4" href="#TOC1">COMMAND LINE OPTIONS</a><br>
|
||||
<P>
|
||||
<b>-8</b>
|
||||
If both the 8-bit library has been built, this option causes the 8-bit library
|
||||
to be used (which is the default); if the 8-bit library has not been built,
|
||||
this option causes an error.
|
||||
If the 8-bit library has been built, this option causes it to be used (this is
|
||||
the default). If the 8-bit library has not been built, this option causes an
|
||||
error.
|
||||
</P>
|
||||
<P>
|
||||
<b>-16</b>
|
||||
If both the 8-bit or the 32-bit, and the 16-bit libraries have been built, this
|
||||
option causes the 16-bit library to be used. If only the 16-bit library has been
|
||||
built, this is the default (so has no effect). If only the 8-bit or the 32-bit
|
||||
library has been built, this option causes an error.
|
||||
If the 16-bit library has been built, this option causes it to be used. If only
|
||||
the 16-bit library has been built, this is the default. If the 16-bit library
|
||||
has not been built, this option causes an error.
|
||||
</P>
|
||||
<P>
|
||||
<b>-32</b>
|
||||
If both the 8-bit or the 16-bit, and the 32-bit libraries have been built, this
|
||||
option causes the 32-bit library to be used. If only the 32-bit library has been
|
||||
built, this is the default (so has no effect). If only the 8-bit or the 16-bit
|
||||
library has been built, this option causes an error.
|
||||
If the 32-bit library has been built, this option causes it to be used. If only
|
||||
the 32-bit library has been built, this is the default. If the 32-bit library
|
||||
has not been built, this option causes an error.
|
||||
</P>
|
||||
<P>
|
||||
<b>-b</b>
|
||||
@ -1154,9 +1152,9 @@ Cambridge CB2 3QH, England.
|
||||
</P>
|
||||
<br><a name="SEC17" href="#TOC1">REVISION</a><br>
|
||||
<P>
|
||||
Last updated: 23 February 2017
|
||||
Last updated: 10 February 2020
|
||||
<br>
|
||||
Copyright © 1997-2017 University of Cambridge.
|
||||
Copyright © 1997-2020 University of Cambridge.
|
||||
<br>
|
||||
<p>
|
||||
Return to the <a href="index.html">PCRE index page</a>.
|
||||
|
@ -16,8 +16,8 @@ DESCRIPTION
|
||||
|
||||
pcre-config returns the configuration of the installed PCRE libraries
|
||||
and the options required to compile a program to use them. Some of the
|
||||
options apply only to the 8-bit, or 16-bit, or 32-bit libraries,
|
||||
respectively, and are not available if only one of those libraries has
|
||||
options apply only to the 8-bit, or 16-bit, or 32-bit libraries, re-
|
||||
spectively, and are not available if only one of those libraries has
|
||||
been built. If an unavailable option is encountered, the "usage" infor-
|
||||
mation is output.
|
||||
|
||||
@ -36,37 +36,37 @@ OPTIONS
|
||||
--version Writes the version number of the installed PCRE libraries to
|
||||
the standard output.
|
||||
|
||||
--libs Writes to the standard output the command line options
|
||||
required to link with the 8-bit PCRE library (-lpcre on many
|
||||
--libs Writes to the standard output the command line options re-
|
||||
quired to link with the 8-bit PCRE library (-lpcre on many
|
||||
systems).
|
||||
|
||||
--libs16 Writes to the standard output the command line options
|
||||
required to link with the 16-bit PCRE library (-lpcre16 on
|
||||
many systems).
|
||||
--libs16 Writes to the standard output the command line options re-
|
||||
quired to link with the 16-bit PCRE library (-lpcre16 on many
|
||||
systems).
|
||||
|
||||
--libs32 Writes to the standard output the command line options
|
||||
required to link with the 32-bit PCRE library (-lpcre32 on
|
||||
many systems).
|
||||
--libs32 Writes to the standard output the command line options re-
|
||||
quired to link with the 32-bit PCRE library (-lpcre32 on many
|
||||
systems).
|
||||
|
||||
--libs-cpp
|
||||
Writes to the standard output the command line options
|
||||
required to link with PCRE's C++ wrapper library (-lpcrecpp
|
||||
Writes to the standard output the command line options re-
|
||||
quired to link with PCRE's C++ wrapper library (-lpcrecpp
|
||||
-lpcre on many systems).
|
||||
|
||||
--libs-posix
|
||||
Writes to the standard output the command line options
|
||||
required to link with PCRE's POSIX API wrapper library
|
||||
Writes to the standard output the command line options re-
|
||||
quired to link with PCRE's POSIX API wrapper library
|
||||
(-lpcreposix -lpcre on many systems).
|
||||
|
||||
--cflags Writes to the standard output the command line options
|
||||
required to compile files that use PCRE (this may include
|
||||
some -I options, but is blank on many systems).
|
||||
--cflags Writes to the standard output the command line options re-
|
||||
quired to compile files that use PCRE (this may include some
|
||||
-I options, but is blank on many systems).
|
||||
|
||||
--cflags-posix
|
||||
Writes to the standard output the command line options
|
||||
required to compile files that use PCRE's POSIX API wrapper
|
||||
library (this may include some -I options, but is blank on
|
||||
many systems).
|
||||
Writes to the standard output the command line options re-
|
||||
quired to compile files that use PCRE's POSIX API wrapper li-
|
||||
brary (this may include some -I options, but is blank on many
|
||||
systems).
|
||||
|
||||
|
||||
SEE ALSO
|
||||
|
@ -146,7 +146,7 @@ performance.
|
||||
One way of guarding against this possibility is to use the
|
||||
\fBpcre_fullinfo()\fP function to check the compiled pattern's options for UTF.
|
||||
Alternatively, from release 8.33, you can set the PCRE_NEVER_UTF option at
|
||||
compile time. This causes an compile time error if a pattern contains a
|
||||
compile time. This causes a compile time error if a pattern contains a
|
||||
UTF-setting sequence.
|
||||
.P
|
||||
If your application is one that supports UTF, be aware that validity checking
|
||||
|
3893
pcre/doc/pcre.txt
3893
pcre/doc/pcre.txt
File diff suppressed because it is too large
Load Diff
@ -1227,7 +1227,7 @@ the following negative numbers:
|
||||
PCRE_ERROR_BADOPTION the value of \fIwhat\fP was invalid
|
||||
PCRE_ERROR_UNSET the requested field is not set
|
||||
.sp
|
||||
The "magic number" is placed at the start of each compiled pattern as an simple
|
||||
The "magic number" is placed at the start of each compiled pattern as a simple
|
||||
check against passing an arbitrary memory pointer. The endianness error can
|
||||
occur if a compiled pattern is saved and reloaded on a different host. Here is
|
||||
a typical call of \fBpcre_fullinfo()\fP, to obtain the length of the compiled
|
||||
@ -1294,7 +1294,7 @@ returned. For anchored patterns, -2 is returned.
|
||||
.sp
|
||||
Return the value of the first data unit (non-UTF character) of any matched
|
||||
string in the situation where PCRE_INFO_FIRSTCHARACTERFLAGS returns 1;
|
||||
otherwise return 0. The fourth argument should point to an \fBuint_t\fP
|
||||
otherwise return 0. The fourth argument should point to a \fBuint_t\fP
|
||||
variable.
|
||||
.P
|
||||
In the 8-bit library, the value is always less than 256. In the 16-bit library
|
||||
@ -1560,7 +1560,7 @@ returned value 1 (with "z" returned from PCRE_INFO_REQUIREDCHAR), but for
|
||||
.sp
|
||||
Return the value of the rightmost literal data unit that must exist in any
|
||||
matched string, other than at its start, if such a value has been recorded. The
|
||||
fourth argument should point to an \fBuint32_t\fP variable. If there is no such
|
||||
fourth argument should point to a \fBuint32_t\fP variable. If there is no such
|
||||
value, 0 is returned.
|
||||
.
|
||||
.
|
||||
|
@ -26,8 +26,8 @@ DESCRIPTION
|
||||
If you attempt to use delimiters (for example, by surrounding a pattern
|
||||
with slashes, as is common in Perl scripts), they are interpreted as
|
||||
part of the pattern. Quotes can of course be used to delimit patterns
|
||||
on the command line because they are interpreted by the shell, and
|
||||
indeed quotes are required if a pattern contains white space or shell
|
||||
on the command line because they are interpreted by the shell, and in-
|
||||
deed quotes are required if a pattern contains white space or shell
|
||||
metacharacters.
|
||||
|
||||
The first argument that follows any option settings is treated as the
|
||||
@ -37,8 +37,8 @@ DESCRIPTION
|
||||
or an argument pattern must be provided.
|
||||
|
||||
If no files are specified, pcregrep reads the standard input. The stan-
|
||||
dard input can also be referenced by a name consisting of a single
|
||||
hyphen. For example:
|
||||
dard input can also be referenced by a name consisting of a single hy-
|
||||
phen. For example:
|
||||
|
||||
pcregrep some-pattern /file1 - /file3
|
||||
|
||||
@ -47,8 +47,8 @@ DESCRIPTION
|
||||
the start of each line, followed by a colon. However, there are options
|
||||
that can change how pcregrep behaves. In particular, the -M option
|
||||
makes it possible to search for patterns that span line boundaries.
|
||||
What defines a line boundary is controlled by the -N (--newline)
|
||||
option.
|
||||
What defines a line boundary is controlled by the -N (--newline) op-
|
||||
tion.
|
||||
|
||||
The amount of memory used for buffering files that are being scanned is
|
||||
controlled by a parameter that can be set by the --buffer-size option.
|
||||
@ -66,12 +66,12 @@ DESCRIPTION
|
||||
By default, as soon as one pattern matches a line, no further patterns
|
||||
are considered. However, if --colour (or --color) is used to colour the
|
||||
matching substrings, or if --only-matching, --file-offsets, or --line-
|
||||
offsets is used to output only the part of the line that matched
|
||||
(either shown literally, or as an offset), scanning resumes immediately
|
||||
offsets is used to output only the part of the line that matched (ei-
|
||||
ther shown literally, or as an offset), scanning resumes immediately
|
||||
following the match, so that further matches on the same line can be
|
||||
found. If there are multiple patterns, they are all tried on the
|
||||
remainder of the line, but patterns that follow the one that matched
|
||||
are not tried on the earlier part of the line.
|
||||
found. If there are multiple patterns, they are all tried on the re-
|
||||
mainder of the line, but patterns that follow the one that matched are
|
||||
not tried on the earlier part of the line.
|
||||
|
||||
This behaviour means that the order in which multiple patterns are
|
||||
specified can affect the output when one of the above options is used.
|
||||
@ -80,11 +80,11 @@ DESCRIPTION
|
||||
overlap).
|
||||
|
||||
Patterns that can match an empty string are accepted, but empty string
|
||||
matches are never recognized. An example is the pattern
|
||||
"(super)?(man)?", in which all components are optional. This pattern
|
||||
finds all occurrences of both "super" and "man"; the output differs
|
||||
from matching with "super|man" when only the matching substrings are
|
||||
being shown.
|
||||
matches are never recognized. An example is the pattern "(su-
|
||||
per)?(man)?", in which all components are optional. This pattern finds
|
||||
all occurrences of both "super" and "man"; the output differs from
|
||||
matching with "super|man" when only the matching substrings are being
|
||||
shown.
|
||||
|
||||
If the LC_ALL or LC_CTYPE environment variable is set, pcregrep uses
|
||||
the value to set a locale when calling the PCRE library. The --locale
|
||||
@ -105,9 +105,9 @@ BINARY FILES
|
||||
|
||||
By default, a file that contains a binary zero byte within the first
|
||||
1024 bytes is identified as a binary file, and is processed specially.
|
||||
(GNU grep also identifies binary files in this manner.) See the
|
||||
--binary-files option for a means of changing the way binary files are
|
||||
handled.
|
||||
(GNU grep also identifies binary files in this manner.) See the --bi-
|
||||
nary-files option for a means of changing the way binary files are han-
|
||||
dled.
|
||||
|
||||
|
||||
OPTIONS
|
||||
@ -151,16 +151,16 @@ OPTIONS
|
||||
|
||||
--binary-files=word
|
||||
Specify how binary files are to be processed. If the word is
|
||||
"binary" (the default), pattern matching is performed on
|
||||
binary files, but the only output is "Binary file <name>
|
||||
"binary" (the default), pattern matching is performed on bi-
|
||||
nary files, but the only output is "Binary file <name>
|
||||
matches" when a match succeeds. If the word is "text", which
|
||||
is equivalent to the -a or --text option, binary files are
|
||||
processed in the same way as any other file. In this case,
|
||||
when a match succeeds, the output may be binary garbage,
|
||||
which can have nasty effects if sent to a terminal. If the
|
||||
word is "without-match", which is equivalent to the -I
|
||||
option, binary files are not processed at all; they are
|
||||
assumed not to be of interest.
|
||||
word is "without-match", which is equivalent to the -I op-
|
||||
tion, binary files are not processed at all; they are assumed
|
||||
not to be of interest.
|
||||
|
||||
--buffer-size=number
|
||||
Set the parameter that controls how much memory is used for
|
||||
@ -201,15 +201,15 @@ OPTIONS
|
||||
ronment variable PCREGREP_COLOUR or PCREGREP_COLOR. The value
|
||||
of this variable should be a string of two numbers, separated
|
||||
by a semicolon. They are copied directly into the control
|
||||
string for setting colour on a terminal, so it is your
|
||||
responsibility to ensure that they make sense. If neither of
|
||||
string for setting colour on a terminal, so it is your re-
|
||||
sponsibility to ensure that they make sense. If neither of
|
||||
the environment variables is set, the default is "1;31",
|
||||
which gives red.
|
||||
|
||||
-D action, --devices=action
|
||||
If an input path is not a regular file or a directory,
|
||||
"action" specifies how it is to be processed. Valid values
|
||||
are "read" (the default) or "skip" (silently skip the path).
|
||||
If an input path is not a regular file or a directory, "ac-
|
||||
tion" specifies how it is to be processed. Valid values are
|
||||
"read" (the default) or "skip" (silently skip the path).
|
||||
|
||||
-d action, --directories=action
|
||||
If an input path is a directory, "action" specifies how it is
|
||||
@ -218,8 +218,8 @@ OPTIONS
|
||||
"recurse" (equivalent to the -r option), or "skip" (silently
|
||||
skip the path, the default in Windows environments). In the
|
||||
"read" case, directories are read as if they were ordinary
|
||||
files. In some operating systems the effect of reading a
|
||||
directory like this is an immediate end-of-file; in others it
|
||||
files. In some operating systems the effect of reading a di-
|
||||
rectory like this is an immediate end-of-file; in others it
|
||||
may provoke an error.
|
||||
|
||||
-e pattern, --regex=pattern, --regexp=pattern
|
||||
@ -249,8 +249,8 @@ OPTIONS
|
||||
whether listed on the command line, obtained from --file-
|
||||
list, or by scanning a directory. The pattern is a PCRE regu-
|
||||
lar expression, and is matched against the final component of
|
||||
the file name, not the entire path. The -F, -w, and -x
|
||||
options do not apply to this pattern. The option may be given
|
||||
the file name, not the entire path. The -F, -w, and -x op-
|
||||
tions do not apply to this pattern. The option may be given
|
||||
any number of times in order to specify multiple patterns. If
|
||||
a file name matches both an --include and an --exclude pat-
|
||||
tern, it is excluded. There is no short form for this option.
|
||||
@ -264,29 +264,29 @@ OPTIONS
|
||||
|
||||
--exclude-dir=pattern
|
||||
Directories whose names match the pattern are skipped without
|
||||
being processed, whatever the setting of the --recursive
|
||||
option. This applies to all directories, whether listed on
|
||||
the command line, obtained from --file-list, or by scanning a
|
||||
being processed, whatever the setting of the --recursive op-
|
||||
tion. This applies to all directories, whether listed on the
|
||||
command line, obtained from --file-list, or by scanning a
|
||||
parent directory. The pattern is a PCRE regular expression,
|
||||
and is matched against the final component of the directory
|
||||
name, not the entire path. The -F, -w, and -x options do not
|
||||
apply to this pattern. The option may be given any number of
|
||||
times in order to specify more than one pattern. If a direc-
|
||||
tory matches both --include-dir and --exclude-dir, it is
|
||||
excluded. There is no short form for this option.
|
||||
tory matches both --include-dir and --exclude-dir, it is ex-
|
||||
cluded. There is no short form for this option.
|
||||
|
||||
-F, --fixed-strings
|
||||
Interpret each data-matching pattern as a list of fixed
|
||||
strings, separated by newlines, instead of as a regular
|
||||
expression. What constitutes a newline for this purpose is
|
||||
controlled by the --newline option. The -w (match as a word)
|
||||
and -x (match whole line) options can be used with -F. They
|
||||
apply to each of the fixed strings. A line is selected if any
|
||||
strings, separated by newlines, instead of as a regular ex-
|
||||
pression. What constitutes a newline for this purpose is con-
|
||||
trolled by the --newline option. The -w (match as a word) and
|
||||
-x (match whole line) options can be used with -F. They ap-
|
||||
ply to each of the fixed strings. A line is selected if any
|
||||
of the fixed strings are found in it (subject to -w or -x, if
|
||||
present). This option applies only to the patterns that are
|
||||
matched against the contents of files; it does not apply to
|
||||
patterns specified by any of the --include or --exclude
|
||||
options.
|
||||
patterns specified by any of the --include or --exclude op-
|
||||
tions.
|
||||
|
||||
-f filename, --file=filename
|
||||
Read patterns from the file, one per line, and match them
|
||||
@ -358,16 +358,16 @@ OPTIONS
|
||||
--include=pattern
|
||||
If any --include patterns are specified, the only files that
|
||||
are processed are those that match one of the patterns (and
|
||||
do not match an --exclude pattern). This option does not
|
||||
affect directories, but it applies to all files, whether
|
||||
listed on the command line, obtained from --file-list, or by
|
||||
scanning a directory. The pattern is a PCRE regular expres-
|
||||
sion, and is matched against the final component of the file
|
||||
name, not the entire path. The -F, -w, and -x options do not
|
||||
apply to this pattern. The option may be given any number of
|
||||
times. If a file name matches both an --include and an
|
||||
--exclude pattern, it is excluded. There is no short form
|
||||
for this option.
|
||||
do not match an --exclude pattern). This option does not af-
|
||||
fect directories, but it applies to all files, whether listed
|
||||
on the command line, obtained from --file-list, or by scan-
|
||||
ning a directory. The pattern is a PCRE regular expression,
|
||||
and is matched against the final component of the file name,
|
||||
not the entire path. The -F, -w, and -x options do not apply
|
||||
to this pattern. The option may be given any number of times.
|
||||
If a file name matches both an --include and an --exclude
|
||||
pattern, it is excluded. There is no short form for this op-
|
||||
tion.
|
||||
|
||||
--include-from=filename
|
||||
Treat each non-empty line of the file as the data for an
|
||||
@ -381,8 +381,8 @@ OPTIONS
|
||||
tories that are processed are those that match one of the
|
||||
patterns (and do not match an --exclude-dir pattern). This
|
||||
applies to all directories, whether listed on the command
|
||||
line, obtained from --file-list, or by scanning a parent
|
||||
directory. The pattern is a PCRE regular expression, and is
|
||||
line, obtained from --file-list, or by scanning a parent di-
|
||||
rectory. The pattern is a PCRE regular expression, and is
|
||||
matched against the final component of the directory name,
|
||||
not the entire path. The -F, -w, and -x options do not apply
|
||||
to this pattern. The option may be given any number of times.
|
||||
@ -413,9 +413,9 @@ OPTIONS
|
||||
|
||||
--line-buffered
|
||||
When this option is given, input is read and processed line
|
||||
by line, and the output is flushed after each write. By
|
||||
default, input is read in large chunks, unless pcregrep can
|
||||
determine that it is reading from a terminal (which is cur-
|
||||
by line, and the output is flushed after each write. By de-
|
||||
fault, input is read in large chunks, unless pcregrep can de-
|
||||
termine that it is reading from a terminal (which is cur-
|
||||
rently possible only in Unix-like environments). Output to
|
||||
terminal is normally automatically flushed by the operating
|
||||
system. This option can be useful when the input or output is
|
||||
@ -437,9 +437,9 @@ OPTIONS
|
||||
--locale=locale-name
|
||||
This option specifies a locale to be used for pattern match-
|
||||
ing. It overrides the value in the LC_ALL or LC_CTYPE envi-
|
||||
ronment variables. If no locale is specified, the PCRE
|
||||
library's default (usually the "C" locale) is used. There is
|
||||
no short form for this option.
|
||||
ronment variables. If no locale is specified, the PCRE li-
|
||||
brary's default (usually the "C" locale) is used. There is no
|
||||
short form for this option.
|
||||
|
||||
--match-limit=number
|
||||
Processing some regular expression patterns can require a
|
||||
@ -447,26 +447,26 @@ OPTIONS
|
||||
gram crash if not enough is available. Other patterns may
|
||||
take a very long time to search for all possible matching
|
||||
strings. The pcre_exec() function that is called by pcregrep
|
||||
to do the matching has two parameters that can limit the
|
||||
resources that it uses.
|
||||
to do the matching has two parameters that can limit the re-
|
||||
sources that it uses.
|
||||
|
||||
The --match-limit option provides a means of limiting
|
||||
resource usage when processing patterns that are not going to
|
||||
The --match-limit option provides a means of limiting re-
|
||||
source usage when processing patterns that are not going to
|
||||
match, but which have a very large number of possibilities in
|
||||
their search trees. The classic example is a pattern that
|
||||
uses nested unlimited repeats. Internally, PCRE uses a func-
|
||||
tion called match() which it calls repeatedly (sometimes
|
||||
recursively). The limit set by --match-limit is imposed on
|
||||
the number of times this function is called during a match,
|
||||
which has the effect of limiting the amount of backtracking
|
||||
that can take place.
|
||||
tion called match() which it calls repeatedly (sometimes re-
|
||||
cursively). The limit set by --match-limit is imposed on the
|
||||
number of times this function is called during a match, which
|
||||
has the effect of limiting the amount of backtracking that
|
||||
can take place.
|
||||
|
||||
The --recursion-limit option is similar to --match-limit, but
|
||||
instead of limiting the total number of times that match() is
|
||||
called, it limits the depth of recursive calls, which in turn
|
||||
limits the amount of memory that can be used. The recursion
|
||||
depth is a smaller number than the total number of calls,
|
||||
because not all calls to match() are recursive. This limit is
|
||||
depth is a smaller number than the total number of calls, be-
|
||||
cause not all calls to match() are recursive. This limit is
|
||||
of use only if it is set smaller than --match-limit.
|
||||
|
||||
There are no short forms for these options. The default set-
|
||||
@ -494,30 +494,30 @@ OPTIONS
|
||||
is read line by line (see --line-buffered.)
|
||||
|
||||
-N newline-type, --newline=newline-type
|
||||
The PCRE library supports five different conventions for
|
||||
indicating the ends of lines. They are the single-character
|
||||
sequences CR (carriage return) and LF (linefeed), the two-
|
||||
character sequence CRLF, an "anycrlf" convention, which rec-
|
||||
ognizes any of the preceding three types, and an "any" con-
|
||||
vention, in which any Unicode line ending sequence is assumed
|
||||
to end a line. The Unicode sequences are the three just men-
|
||||
The PCRE library supports five different conventions for in-
|
||||
dicating the ends of lines. They are the single-character se-
|
||||
quences CR (carriage return) and LF (linefeed), the two-char-
|
||||
acter sequence CRLF, an "anycrlf" convention, which recog-
|
||||
nizes any of the preceding three types, and an "any" conven-
|
||||
tion, in which any Unicode line ending sequence is assumed to
|
||||
end a line. The Unicode sequences are the three just men-
|
||||
tioned, plus VT (vertical tab, U+000B), FF (form feed,
|
||||
U+000C), NEL (next line, U+0085), LS (line separator,
|
||||
U+2028), and PS (paragraph separator, U+2029).
|
||||
|
||||
When the PCRE library is built, a default line-ending
|
||||
sequence is specified. This is normally the standard
|
||||
sequence for the operating system. Unless otherwise specified
|
||||
by this option, pcregrep uses the library's default. The
|
||||
possible values for this option are CR, LF, CRLF, ANYCRLF, or
|
||||
ANY. This makes it possible to use pcregrep to scan files
|
||||
that have come from other environments without having to mod-
|
||||
ify their line endings. If the data that is being scanned
|
||||
does not agree with the convention set by this option, pcre-
|
||||
grep may behave in strange ways. Note that this option does
|
||||
not apply to files specified by the -f, --exclude-from, or
|
||||
--include-from options, which are expected to use the operat-
|
||||
ing system's standard newline sequence.
|
||||
When the PCRE library is built, a default line-ending se-
|
||||
quence is specified. This is normally the standard sequence
|
||||
for the operating system. Unless otherwise specified by this
|
||||
option, pcregrep uses the library's default. The possible
|
||||
values for this option are CR, LF, CRLF, ANYCRLF, or ANY.
|
||||
This makes it possible to use pcregrep to scan files that
|
||||
have come from other environments without having to modify
|
||||
their line endings. If the data that is being scanned does
|
||||
not agree with the convention set by this option, pcregrep
|
||||
may behave in strange ways. Note that this option does not
|
||||
apply to files specified by the -f, --exclude-from, or --in-
|
||||
clude-from options, which are expected to use the operating
|
||||
system's standard newline sequence.
|
||||
|
||||
-n, --line-number
|
||||
Precede each output line by its line number in the file, fol-
|
||||
@ -538,12 +538,12 @@ OPTIONS
|
||||
is, the -A, -B, and -C options are ignored. If there is more
|
||||
than one match in a line, each of them is shown separately.
|
||||
If -o is combined with -v (invert the sense of the match to
|
||||
find non-matching lines), no output is generated, but the
|
||||
return code is set appropriately. If the matched portion of
|
||||
the line is empty, nothing is output unless the file name or
|
||||
line number are being printed, in which case they are shown
|
||||
on an otherwise empty line. This option is mutually exclusive
|
||||
with --file-offsets and --line-offsets.
|
||||
find non-matching lines), no output is generated, but the re-
|
||||
turn code is set appropriately. If the matched portion of the
|
||||
line is empty, nothing is output unless the file name or line
|
||||
number are being printed, in which case they are shown on an
|
||||
otherwise empty line. This option is mutually exclusive with
|
||||
--file-offsets and --line-offsets.
|
||||
|
||||
-onumber, --only-matching=number
|
||||
Show only the part of the line that matched the capturing
|
||||
@ -579,8 +579,8 @@ OPTIONS
|
||||
it contains, taking note of any --include and --exclude set-
|
||||
tings. By default, a directory is read as a normal file; in
|
||||
some operating systems this gives an immediate end-of-file.
|
||||
This option is a shorthand for setting the -d option to
|
||||
"recurse".
|
||||
This option is a shorthand for setting the -d option to "re-
|
||||
curse".
|
||||
|
||||
--recursion-limit=number
|
||||
See --match-limit above.
|
||||
@ -626,10 +626,10 @@ OPTIONS
|
||||
|
||||
ENVIRONMENT VARIABLES
|
||||
|
||||
The environment variables LC_ALL and LC_CTYPE are examined, in that
|
||||
order, for a locale. The first one that is set is used. This can be
|
||||
overridden by the --locale option. If no locale is set, the PCRE
|
||||
library's default (usually the "C" locale) is used.
|
||||
The environment variables LC_ALL and LC_CTYPE are examined, in that or-
|
||||
der, for a locale. The first one that is set is used. This can be over-
|
||||
ridden by the --locale option. If no locale is set, the PCRE library's
|
||||
default (usually the "C" locale) is used.
|
||||
|
||||
|
||||
NEWLINES
|
||||
@ -640,8 +640,8 @@ NEWLINES
|
||||
ever newline sequences they have in the input. However, the setting of
|
||||
this option does not affect the interpretation of files specified by
|
||||
the -f, --exclude-from, or --include-from options, which are assumed to
|
||||
use the operating system's standard newline sequence, nor does it
|
||||
affect the way in which pcregrep writes informational messages to the
|
||||
use the operating system's standard newline sequence, nor does it af-
|
||||
fect the way in which pcregrep writes informational messages to the
|
||||
standard error and output streams. For these it uses the string "\n" to
|
||||
indicate newlines, relying on the C I/O library to convert this to an
|
||||
appropriate sequence.
|
||||
@ -687,13 +687,13 @@ OPTIONS WITH DATA
|
||||
--file /some/file
|
||||
|
||||
Note, however, that if you want to supply a file name beginning with ~
|
||||
as data in a shell command, and have the shell expand ~ to a home
|
||||
directory, you must separate the file name from the option, because the
|
||||
as data in a shell command, and have the shell expand ~ to a home di-
|
||||
rectory, you must separate the file name from the option, because the
|
||||
shell does not treat ~ specially unless it is at the start of an item.
|
||||
|
||||
The exceptions to the above are the --colour (or --color) and --only-
|
||||
matching options, for which the data is optional. If one of these
|
||||
options does have data, it must be given in the first form, using an
|
||||
matching options, for which the data is optional. If one of these op-
|
||||
tions does have data, it must be given in the first form, using an
|
||||
equals character. Otherwise pcregrep will assume that it has no data.
|
||||
|
||||
|
||||
@ -702,14 +702,14 @@ MATCHING ERRORS
|
||||
It is possible to supply a regular expression that takes a very long
|
||||
time to fail to match certain lines. Such patterns normally involve
|
||||
nested indefinite repeats, for example: (a+)*\d when matched against a
|
||||
line of a's with no final digit. The PCRE matching function has a
|
||||
resource limit that causes it to abort in these circumstances. If this
|
||||
line of a's with no final digit. The PCRE matching function has a re-
|
||||
source limit that causes it to abort in these circumstances. If this
|
||||
happens, pcregrep outputs an error message and the line that caused the
|
||||
problem to the standard error stream. If there are more than 20 such
|
||||
errors, pcregrep gives up.
|
||||
|
||||
The --match-limit option of pcregrep can be used to set the overall
|
||||
resource limit; there is a second option called --recursion-limit that
|
||||
The --match-limit option of pcregrep can be used to set the overall re-
|
||||
source limit; there is a second option called --recursion-limit that
|
||||
sets a limit on the amount of memory (usually stack) that is used (see
|
||||
the discussion of these options above).
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
.TH PCRETEST 1 "23 February 2017" "PCRE 8.41"
|
||||
.TH PCRETEST 1 "10 February 2020" "PCRE 8.44"
|
||||
.SH NAME
|
||||
pcretest - a program for testing Perl-compatible regular expressions.
|
||||
.SH SYNOPSIS
|
||||
@ -78,21 +78,19 @@ the 16-bit library, or \fBpcre32_xx\fP when using the 32-bit library".
|
||||
.rs
|
||||
.TP 10
|
||||
\fB-8\fP
|
||||
If both the 8-bit library has been built, this option causes the 8-bit library
|
||||
to be used (which is the default); if the 8-bit library has not been built,
|
||||
this option causes an error.
|
||||
If the 8-bit library has been built, this option causes it to be used (this is
|
||||
the default). If the 8-bit library has not been built, this option causes an
|
||||
error.
|
||||
.TP 10
|
||||
\fB-16\fP
|
||||
If both the 8-bit or the 32-bit, and the 16-bit libraries have been built, this
|
||||
option causes the 16-bit library to be used. If only the 16-bit library has been
|
||||
built, this is the default (so has no effect). If only the 8-bit or the 32-bit
|
||||
library has been built, this option causes an error.
|
||||
If the 16-bit library has been built, this option causes it to be used. If only
|
||||
the 16-bit library has been built, this is the default. If the 16-bit library
|
||||
has not been built, this option causes an error.
|
||||
.TP 10
|
||||
\fB-32\fP
|
||||
If both the 8-bit or the 16-bit, and the 32-bit libraries have been built, this
|
||||
option causes the 32-bit library to be used. If only the 32-bit library has been
|
||||
built, this is the default (so has no effect). If only the 8-bit or the 16-bit
|
||||
library has been built, this option causes an error.
|
||||
If the 32-bit library has been built, this option causes it to be used. If only
|
||||
the 32-bit library has been built, this is the default. If the 32-bit library
|
||||
has not been built, this option causes an error.
|
||||
.TP 10
|
||||
\fB-b\fP
|
||||
Behave as if each pattern has the \fB/B\fP (show byte code) modifier; the
|
||||
@ -1155,6 +1153,6 @@ Cambridge CB2 3QH, England.
|
||||
.rs
|
||||
.sp
|
||||
.nf
|
||||
Last updated: 23 February 2017
|
||||
Copyright (c) 1997-2017 University of Cambridge.
|
||||
Last updated: 10 February 2020
|
||||
Copyright (c) 1997-2020 University of Cambridge.
|
||||
.fi
|
||||
|
@ -47,15 +47,15 @@ INPUT DATA FORMAT
|
||||
PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES
|
||||
|
||||
From release 8.30, two separate PCRE libraries can be built. The origi-
|
||||
nal one supports 8-bit character strings, whereas the newer 16-bit
|
||||
library supports character strings encoded in 16-bit units. From
|
||||
release 8.32, a third library can be built, supporting character
|
||||
strings encoded in 32-bit units. The pcretest program can be used to
|
||||
test all three libraries. However, it is itself still an 8-bit program,
|
||||
reading 8-bit input and writing 8-bit output. When testing the 16-bit
|
||||
or 32-bit library, the patterns and data strings are converted to 16-
|
||||
or 32-bit format before being passed to the PCRE library functions.
|
||||
Results are converted to 8-bit for output.
|
||||
nal one supports 8-bit character strings, whereas the newer 16-bit li-
|
||||
brary supports character strings encoded in 16-bit units. From release
|
||||
8.32, a third library can be built, supporting character strings en-
|
||||
coded in 32-bit units. The pcretest program can be used to test all
|
||||
three libraries. However, it is itself still an 8-bit program, reading
|
||||
8-bit input and writing 8-bit output. When testing the 16-bit or
|
||||
32-bit library, the patterns and data strings are converted to 16- or
|
||||
32-bit format before being passed to the PCRE library functions. Re-
|
||||
sults are converted to 8-bit for output.
|
||||
|
||||
References to functions and structures of the form pcre[16|32]_xx below
|
||||
mean "pcre_xx when using the 8-bit library, pcre16_xx when using the
|
||||
@ -64,34 +64,31 @@ PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES
|
||||
|
||||
COMMAND LINE OPTIONS
|
||||
|
||||
-8 If both the 8-bit library has been built, this option causes
|
||||
the 8-bit library to be used (which is the default); if the
|
||||
8-bit library has not been built, this option causes an
|
||||
error.
|
||||
-8 If the 8-bit library has been built, this option causes it to
|
||||
be used (this is the default). If the 8-bit library has not
|
||||
been built, this option causes an error.
|
||||
|
||||
-16 If both the 8-bit or the 32-bit, and the 16-bit libraries
|
||||
have been built, this option causes the 16-bit library to be
|
||||
used. If only the 16-bit library has been built, this is the
|
||||
default (so has no effect). If only the 8-bit or the 32-bit
|
||||
library has been built, this option causes an error.
|
||||
-16 If the 16-bit library has been built, this option causes it
|
||||
to be used. If only the 16-bit library has been built, this
|
||||
is the default. If the 16-bit library has not been built,
|
||||
this option causes an error.
|
||||
|
||||
-32 If both the 8-bit or the 16-bit, and the 32-bit libraries
|
||||
have been built, this option causes the 32-bit library to be
|
||||
used. If only the 32-bit library has been built, this is the
|
||||
default (so has no effect). If only the 8-bit or the 16-bit
|
||||
library has been built, this option causes an error.
|
||||
-32 If the 32-bit library has been built, this option causes it
|
||||
to be used. If only the 32-bit library has been built, this
|
||||
is the default. If the 32-bit library has not been built,
|
||||
this option causes an error.
|
||||
|
||||
-b Behave as if each pattern has the /B (show byte code) modi-
|
||||
-b Behave as if each pattern has the /B (show byte code) modi-
|
||||
fier; the internal form is output after compilation.
|
||||
|
||||
-C Output the version number of the PCRE library, and all avail-
|
||||
able information about the optional features that are
|
||||
included, and then exit with zero exit code. All other
|
||||
options are ignored.
|
||||
able information about the optional features that are in-
|
||||
cluded, and then exit with zero exit code. All other options
|
||||
are ignored.
|
||||
|
||||
-C option Output information about a specific build-time option, then
|
||||
exit. This functionality is intended for use in scripts such
|
||||
as RunTest. The following options output the value and set
|
||||
-C option Output information about a specific build-time option, then
|
||||
exit. This functionality is intended for use in scripts such
|
||||
as RunTest. The following options output the value and set
|
||||
the exit code as indicated:
|
||||
|
||||
ebcdic-nl the code for LF (= NL) in an EBCDIC environment:
|
||||
@ -107,7 +104,7 @@ COMMAND LINE OPTIONS
|
||||
ANYCRLF or ANY
|
||||
exit code is always 0
|
||||
|
||||
The following options output 1 for true or 0 for false, and
|
||||
The following options output 1 for true or 0 for false, and
|
||||
set the exit code to the same value:
|
||||
|
||||
ebcdic compiled for an EBCDIC environment
|
||||
@ -119,61 +116,61 @@ COMMAND LINE OPTIONS
|
||||
utf UTF-8 and/or UTF-16 and/or UTF-32 support
|
||||
is available
|
||||
|
||||
If an unknown option is given, an error message is output;
|
||||
If an unknown option is given, an error message is output;
|
||||
the exit code is 0.
|
||||
|
||||
-d Behave as if each pattern has the /D (debug) modifier; the
|
||||
internal form and information about the compiled pattern is
|
||||
-d Behave as if each pattern has the /D (debug) modifier; the
|
||||
internal form and information about the compiled pattern is
|
||||
output after compilation; -d is equivalent to -b -i.
|
||||
|
||||
-dfa Behave as if each data line contains the \D escape sequence;
|
||||
-dfa Behave as if each data line contains the \D escape sequence;
|
||||
this causes the alternative matching function,
|
||||
pcre[16|32]_dfa_exec(), to be used instead of the standard
|
||||
pcre[16|32]_dfa_exec(), to be used instead of the standard
|
||||
pcre[16|32]_exec() function (more detail is given below).
|
||||
|
||||
-help Output a brief summary these options and then exit.
|
||||
|
||||
-i Behave as if each pattern has the /I modifier; information
|
||||
-i Behave as if each pattern has the /I modifier; information
|
||||
about the compiled pattern is given after compilation.
|
||||
|
||||
-M Behave as if each data line contains the \M escape sequence;
|
||||
this causes PCRE to discover the minimum MATCH_LIMIT and
|
||||
MATCH_LIMIT_RECURSION settings by calling pcre[16|32]_exec()
|
||||
-M Behave as if each data line contains the \M escape sequence;
|
||||
this causes PCRE to discover the minimum MATCH_LIMIT and
|
||||
MATCH_LIMIT_RECURSION settings by calling pcre[16|32]_exec()
|
||||
repeatedly with different limits.
|
||||
|
||||
-m Output the size of each compiled pattern after it has been
|
||||
compiled. This is equivalent to adding /M to each regular
|
||||
expression. The size is given in bytes for both libraries.
|
||||
-m Output the size of each compiled pattern after it has been
|
||||
compiled. This is equivalent to adding /M to each regular ex-
|
||||
pression. The size is given in bytes for both libraries.
|
||||
|
||||
-O Behave as if each pattern has the /O modifier, that is dis-
|
||||
-O Behave as if each pattern has the /O modifier, that is dis-
|
||||
able auto-possessification for all patterns.
|
||||
|
||||
-o osize Set the number of elements in the output vector that is used
|
||||
when calling pcre[16|32]_exec() or pcre[16|32]_dfa_exec() to
|
||||
be osize. The default value is 45, which is enough for 14
|
||||
-o osize Set the number of elements in the output vector that is used
|
||||
when calling pcre[16|32]_exec() or pcre[16|32]_dfa_exec() to
|
||||
be osize. The default value is 45, which is enough for 14
|
||||
capturing subexpressions for pcre[16|32]_exec() or 22 differ-
|
||||
ent matches for pcre[16|32]_dfa_exec(). The vector size can
|
||||
be changed for individual matching calls by including \O in
|
||||
ent matches for pcre[16|32]_dfa_exec(). The vector size can
|
||||
be changed for individual matching calls by including \O in
|
||||
the data line (see below).
|
||||
|
||||
-p Behave as if each pattern has the /P modifier; the POSIX
|
||||
wrapper API is used to call PCRE. None of the other options
|
||||
has any effect when -p is set. This option can be used only
|
||||
-p Behave as if each pattern has the /P modifier; the POSIX
|
||||
wrapper API is used to call PCRE. None of the other options
|
||||
has any effect when -p is set. This option can be used only
|
||||
with the 8-bit library.
|
||||
|
||||
-q Do not output the version number of pcretest at the start of
|
||||
-q Do not output the version number of pcretest at the start of
|
||||
execution.
|
||||
|
||||
-S size On Unix-like systems, set the size of the run-time stack to
|
||||
-S size On Unix-like systems, set the size of the run-time stack to
|
||||
size megabytes.
|
||||
|
||||
-s or -s+ Behave as if each pattern has the /S modifier; in other
|
||||
words, force each pattern to be studied. If -s+ is used, all
|
||||
the JIT compile options are passed to pcre[16|32]_study(),
|
||||
causing just-in-time optimization to be set up if it is
|
||||
available, for both full and partial matching. Specific JIT
|
||||
-s or -s+ Behave as if each pattern has the /S modifier; in other
|
||||
words, force each pattern to be studied. If -s+ is used, all
|
||||
the JIT compile options are passed to pcre[16|32]_study(),
|
||||
causing just-in-time optimization to be set up if it is
|
||||
available, for both full and partial matching. Specific JIT
|
||||
compile options can be selected by following -s+ with a digit
|
||||
in the range 1 to 7, which selects the JIT compile modes as
|
||||
in the range 1 to 7, which selects the JIT compile modes as
|
||||
follows:
|
||||
|
||||
1 normal match only
|
||||
@ -183,119 +180,119 @@ COMMAND LINE OPTIONS
|
||||
6 soft and hard partial match
|
||||
7 all three modes (default)
|
||||
|
||||
If -s++ is used instead of -s+ (with or without a following
|
||||
digit), the text "(JIT)" is added to the first output line
|
||||
If -s++ is used instead of -s+ (with or without a following
|
||||
digit), the text "(JIT)" is added to the first output line
|
||||
after a match or no match when JIT-compiled code was actually
|
||||
used.
|
||||
|
||||
Note that there are pattern options that can override -s,
|
||||
either specifying no studying at all, or suppressing JIT com-
|
||||
pilation.
|
||||
Note that there are pattern options that can override -s, ei-
|
||||
ther specifying no studying at all, or suppressing JIT compi-
|
||||
lation.
|
||||
|
||||
If the /I or /D option is present on a pattern (requesting
|
||||
output about the compiled pattern), information about the
|
||||
result of studying is not included when studying is caused
|
||||
only by -s and neither -i nor -d is present on the command
|
||||
line. This behaviour means that the output from tests that
|
||||
are run with and without -s should be identical, except when
|
||||
options that output information about the actual running of a
|
||||
match are set.
|
||||
If the /I or /D option is present on a pattern (requesting
|
||||
output about the compiled pattern), information about the re-
|
||||
sult of studying is not included when studying is caused only
|
||||
by -s and neither -i nor -d is present on the command line.
|
||||
This behaviour means that the output from tests that are run
|
||||
with and without -s should be identical, except when options
|
||||
that output information about the actual running of a match
|
||||
are set.
|
||||
|
||||
The -M, -t, and -tm options, which give information about
|
||||
resources used, are likely to produce different output with
|
||||
and without -s. Output may also differ if the /C option is
|
||||
The -M, -t, and -tm options, which give information about re-
|
||||
sources used, are likely to produce different output with and
|
||||
without -s. Output may also differ if the /C option is
|
||||
present on an individual pattern. This uses callouts to trace
|
||||
the the matching process, and this may be different between
|
||||
studied and non-studied patterns. If the pattern contains
|
||||
(*MARK) items there may also be differences, for the same
|
||||
the the matching process, and this may be different between
|
||||
studied and non-studied patterns. If the pattern contains
|
||||
(*MARK) items there may also be differences, for the same
|
||||
reason. The -s command line option can be overridden for spe-
|
||||
cific patterns that should never be studied (see the /S pat-
|
||||
cific patterns that should never be studied (see the /S pat-
|
||||
tern modifier below).
|
||||
|
||||
-t Run each compile, study, and match many times with a timer,
|
||||
and output the resulting times per compile, study, or match
|
||||
(in milliseconds). Do not set -m with -t, because you will
|
||||
-t Run each compile, study, and match many times with a timer,
|
||||
and output the resulting times per compile, study, or match
|
||||
(in milliseconds). Do not set -m with -t, because you will
|
||||
then get the size output a zillion times, and the timing will
|
||||
be distorted. You can control the number of iterations that
|
||||
be distorted. You can control the number of iterations that
|
||||
are used for timing by following -t with a number (as a sepa-
|
||||
rate item on the command line). For example, "-t 1000" iter-
|
||||
rate item on the command line). For example, "-t 1000" iter-
|
||||
ates 1000 times. The default is to iterate 500000 times.
|
||||
|
||||
-tm This is like -t except that it times only the matching phase,
|
||||
not the compile or study phases.
|
||||
|
||||
-T -TM These behave like -t and -tm, but in addition, at the end of
|
||||
-T -TM These behave like -t and -tm, but in addition, at the end of
|
||||
a run, the total times for all compiles, studies, and matches
|
||||
are output.
|
||||
|
||||
|
||||
DESCRIPTION
|
||||
|
||||
If pcretest is given two filename arguments, it reads from the first
|
||||
If pcretest is given two filename arguments, it reads from the first
|
||||
and writes to the second. If it is given only one filename argument, it
|
||||
reads from that file and writes to stdout. Otherwise, it reads from
|
||||
stdin and writes to stdout, and prompts for each line of input, using
|
||||
reads from that file and writes to stdout. Otherwise, it reads from
|
||||
stdin and writes to stdout, and prompts for each line of input, using
|
||||
"re>" to prompt for regular expressions, and "data>" to prompt for data
|
||||
lines.
|
||||
|
||||
When pcretest is built, a configuration option can specify that it
|
||||
should be linked with the libreadline library. When this is done, if
|
||||
When pcretest is built, a configuration option can specify that it
|
||||
should be linked with the libreadline library. When this is done, if
|
||||
the input is from a terminal, it is read using the readline() function.
|
||||
This provides line-editing and history facilities. The output from the
|
||||
This provides line-editing and history facilities. The output from the
|
||||
-help option states whether or not readline() will be used.
|
||||
|
||||
The program handles any number of sets of input on a single input file.
|
||||
Each set starts with a regular expression, and continues with any num-
|
||||
Each set starts with a regular expression, and continues with any num-
|
||||
ber of data lines to be matched against that pattern.
|
||||
|
||||
Each data line is matched separately and independently. If you want to
|
||||
Each data line is matched separately and independently. If you want to
|
||||
do multi-line matches, you have to use the \n escape sequence (or \r or
|
||||
\r\n, etc., depending on the newline setting) in a single line of input
|
||||
to encode the newline sequences. There is no limit on the length of
|
||||
data lines; the input buffer is automatically extended if it is too
|
||||
to encode the newline sequences. There is no limit on the length of
|
||||
data lines; the input buffer is automatically extended if it is too
|
||||
small.
|
||||
|
||||
An empty line signals the end of the data lines, at which point a new
|
||||
regular expression is read. The regular expressions are given enclosed
|
||||
An empty line signals the end of the data lines, at which point a new
|
||||
regular expression is read. The regular expressions are given enclosed
|
||||
in any non-alphanumeric delimiters other than backslash, for example:
|
||||
|
||||
/(a|bc)x+yz/
|
||||
|
||||
White space before the initial delimiter is ignored. A regular expres-
|
||||
sion may be continued over several input lines, in which case the new-
|
||||
line characters are included within it. It is possible to include the
|
||||
White space before the initial delimiter is ignored. A regular expres-
|
||||
sion may be continued over several input lines, in which case the new-
|
||||
line characters are included within it. It is possible to include the
|
||||
delimiter within the pattern by escaping it, for example
|
||||
|
||||
/abc\/def/
|
||||
|
||||
If you do so, the escape and the delimiter form part of the pattern,
|
||||
but since delimiters are always non-alphanumeric, this does not affect
|
||||
its interpretation. If the terminating delimiter is immediately fol-
|
||||
If you do so, the escape and the delimiter form part of the pattern,
|
||||
but since delimiters are always non-alphanumeric, this does not affect
|
||||
its interpretation. If the terminating delimiter is immediately fol-
|
||||
lowed by a backslash, for example,
|
||||
|
||||
/abc/\
|
||||
|
||||
then a backslash is added to the end of the pattern. This is done to
|
||||
provide a way of testing the error condition that arises if a pattern
|
||||
then a backslash is added to the end of the pattern. This is done to
|
||||
provide a way of testing the error condition that arises if a pattern
|
||||
finishes with a backslash, because
|
||||
|
||||
/abc\/
|
||||
|
||||
is interpreted as the first line of a pattern that starts with "abc/",
|
||||
is interpreted as the first line of a pattern that starts with "abc/",
|
||||
causing pcretest to read the next line as a continuation of the regular
|
||||
expression.
|
||||
|
||||
|
||||
PATTERN MODIFIERS
|
||||
|
||||
A pattern may be followed by any number of modifiers, which are mostly
|
||||
single characters, though some of these can be qualified by further
|
||||
characters. Following Perl usage, these are referred to below as, for
|
||||
example, "the /i modifier", even though the delimiter of the pattern
|
||||
need not always be a slash, and no slash is used when writing modi-
|
||||
fiers. White space may appear between the final pattern delimiter and
|
||||
the first modifier, and between the modifiers themselves. For refer-
|
||||
ence, here is a complete list of modifiers. They fall into several
|
||||
A pattern may be followed by any number of modifiers, which are mostly
|
||||
single characters, though some of these can be qualified by further
|
||||
characters. Following Perl usage, these are referred to below as, for
|
||||
example, "the /i modifier", even though the delimiter of the pattern
|
||||
need not always be a slash, and no slash is used when writing modi-
|
||||
fiers. White space may appear between the final pattern delimiter and
|
||||
the first modifier, and between the modifiers themselves. For refer-
|
||||
ence, here is a complete list of modifiers. They fall into several
|
||||
groups that are described in detail in the following sections.
|
||||
|
||||
/8 set UTF mode
|
||||
@ -347,8 +344,8 @@ PATTERN MODIFIERS
|
||||
Perl-compatible modifiers
|
||||
|
||||
The /i, /m, /s, and /x modifiers set the PCRE_CASELESS, PCRE_MULTILINE,
|
||||
PCRE_DOTALL, or PCRE_EXTENDED options, respectively, when
|
||||
pcre[16|32]_compile() is called. These four modifier letters have the
|
||||
PCRE_DOTALL, or PCRE_EXTENDED options, respectively, when
|
||||
pcre[16|32]_compile() is called. These four modifier letters have the
|
||||
same effect as they do in Perl. For example:
|
||||
|
||||
/caseless/i
|
||||
@ -356,7 +353,7 @@ PATTERN MODIFIERS
|
||||
|
||||
Modifiers for other PCRE options
|
||||
|
||||
The following table shows additional modifiers for setting PCRE com-
|
||||
The following table shows additional modifiers for setting PCRE com-
|
||||
pile-time options that do not correspond to anything in Perl:
|
||||
|
||||
/8 PCRE_UTF8 ) when using the 8-bit
|
||||
@ -389,145 +386,145 @@ PATTERN MODIFIERS
|
||||
/<bsr_unicode> PCRE_BSR_UNICODE
|
||||
/<JS> PCRE_JAVASCRIPT_COMPAT
|
||||
|
||||
The modifiers that are enclosed in angle brackets are literal strings
|
||||
as shown, including the angle brackets, but the letters within can be
|
||||
in either case. This example sets multiline matching with CRLF as the
|
||||
The modifiers that are enclosed in angle brackets are literal strings
|
||||
as shown, including the angle brackets, but the letters within can be
|
||||
in either case. This example sets multiline matching with CRLF as the
|
||||
line ending sequence:
|
||||
|
||||
/^abc/m<CRLF>
|
||||
|
||||
As well as turning on the PCRE_UTF8/16/32 option, the /8 modifier
|
||||
causes all non-printing characters in output strings to be printed
|
||||
using the \x{hh...} notation. Otherwise, those less than 0x100 are out-
|
||||
put in hex without the curly brackets.
|
||||
As well as turning on the PCRE_UTF8/16/32 option, the /8 modifier
|
||||
causes all non-printing characters in output strings to be printed us-
|
||||
ing the \x{hh...} notation. Otherwise, those less than 0x100 are output
|
||||
in hex without the curly brackets.
|
||||
|
||||
Full details of the PCRE options are given in the pcreapi documenta-
|
||||
Full details of the PCRE options are given in the pcreapi documenta-
|
||||
tion.
|
||||
|
||||
Finding all matches in a string
|
||||
|
||||
Searching for all possible matches within each subject string can be
|
||||
requested by the /g or /G modifier. After finding a match, PCRE is
|
||||
Searching for all possible matches within each subject string can be
|
||||
requested by the /g or /G modifier. After finding a match, PCRE is
|
||||
called again to search the remainder of the subject string. The differ-
|
||||
ence between /g and /G is that the former uses the startoffset argument
|
||||
to pcre[16|32]_exec() to start searching at a new point within the
|
||||
entire string (which is in effect what Perl does), whereas the latter
|
||||
passes over a shortened substring. This makes a difference to the
|
||||
matching process if the pattern begins with a lookbehind assertion
|
||||
(including \b or \B).
|
||||
to pcre[16|32]_exec() to start searching at a new point within the en-
|
||||
tire string (which is in effect what Perl does), whereas the latter
|
||||
passes over a shortened substring. This makes a difference to the
|
||||
matching process if the pattern begins with a lookbehind assertion (in-
|
||||
cluding \b or \B).
|
||||
|
||||
If any call to pcre[16|32]_exec() in a /g or /G sequence matches an
|
||||
empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART and
|
||||
PCRE_ANCHORED flags set in order to search for another, non-empty,
|
||||
match at the same point. If this second match fails, the start offset
|
||||
is advanced, and the normal match is retried. This imitates the way
|
||||
If any call to pcre[16|32]_exec() in a /g or /G sequence matches an
|
||||
empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART and
|
||||
PCRE_ANCHORED flags set in order to search for another, non-empty,
|
||||
match at the same point. If this second match fails, the start offset
|
||||
is advanced, and the normal match is retried. This imitates the way
|
||||
Perl handles such cases when using the /g modifier or the split() func-
|
||||
tion. Normally, the start offset is advanced by one character, but if
|
||||
the newline convention recognizes CRLF as a newline, and the current
|
||||
tion. Normally, the start offset is advanced by one character, but if
|
||||
the newline convention recognizes CRLF as a newline, and the current
|
||||
character is CR followed by LF, an advance of two is used.
|
||||
|
||||
Other modifiers
|
||||
|
||||
There are yet more modifiers for controlling the way pcretest operates.
|
||||
|
||||
The /+ modifier requests that as well as outputting the substring that
|
||||
matched the entire pattern, pcretest should in addition output the
|
||||
remainder of the subject string. This is useful for tests where the
|
||||
subject contains multiple copies of the same substring. If the + modi-
|
||||
fier appears twice, the same action is taken for captured substrings.
|
||||
In each case the remainder is output on the following line with a plus
|
||||
character following the capture number. Note that this modifier must
|
||||
not immediately follow the /S modifier because /S+ and /S++ have other
|
||||
The /+ modifier requests that as well as outputting the substring that
|
||||
matched the entire pattern, pcretest should in addition output the re-
|
||||
mainder of the subject string. This is useful for tests where the sub-
|
||||
ject contains multiple copies of the same substring. If the + modifier
|
||||
appears twice, the same action is taken for captured substrings. In
|
||||
each case the remainder is output on the following line with a plus
|
||||
character following the capture number. Note that this modifier must
|
||||
not immediately follow the /S modifier because /S+ and /S++ have other
|
||||
meanings.
|
||||
|
||||
The /= modifier requests that the values of all potential captured
|
||||
parentheses be output after a match. By default, only those up to the
|
||||
The /= modifier requests that the values of all potential captured
|
||||
parentheses be output after a match. By default, only those up to the
|
||||
highest one actually used in the match are output (corresponding to the
|
||||
return code from pcre[16|32]_exec()). Values in the offsets vector cor-
|
||||
responding to higher numbers should be set to -1, and these are output
|
||||
as "<unset>". This modifier gives a way of checking that this is hap-
|
||||
responding to higher numbers should be set to -1, and these are output
|
||||
as "<unset>". This modifier gives a way of checking that this is hap-
|
||||
pening.
|
||||
|
||||
The /B modifier is a debugging feature. It requests that pcretest out-
|
||||
put a representation of the compiled code after compilation. Normally
|
||||
this information contains length and offset values; however, if /Z is
|
||||
also present, this data is replaced by spaces. This is a special fea-
|
||||
ture for use in the automatic test scripts; it ensures that the same
|
||||
The /B modifier is a debugging feature. It requests that pcretest out-
|
||||
put a representation of the compiled code after compilation. Normally
|
||||
this information contains length and offset values; however, if /Z is
|
||||
also present, this data is replaced by spaces. This is a special fea-
|
||||
ture for use in the automatic test scripts; it ensures that the same
|
||||
output is generated for different internal link sizes.
|
||||
|
||||
The /D modifier is a PCRE debugging feature, and is equivalent to /BI,
|
||||
The /D modifier is a PCRE debugging feature, and is equivalent to /BI,
|
||||
that is, both the /B and the /I modifiers.
|
||||
|
||||
The /F modifier causes pcretest to flip the byte order of the 2-byte
|
||||
The /F modifier causes pcretest to flip the byte order of the 2-byte
|
||||
and 4-byte fields in the compiled pattern. This facility is for testing
|
||||
the feature in PCRE that allows it to execute patterns that were com-
|
||||
the feature in PCRE that allows it to execute patterns that were com-
|
||||
piled on a host with a different endianness. This feature is not avail-
|
||||
able when the POSIX interface to PCRE is being used, that is, when the
|
||||
able when the POSIX interface to PCRE is being used, that is, when the
|
||||
/P pattern modifier is specified. See also the section about saving and
|
||||
reloading compiled patterns below.
|
||||
|
||||
The /I modifier requests that pcretest output information about the
|
||||
compiled pattern (whether it is anchored, has a fixed first character,
|
||||
and so on). It does this by calling pcre[16|32]_fullinfo() after com-
|
||||
piling a pattern. If the pattern is studied, the results of that are
|
||||
The /I modifier requests that pcretest output information about the
|
||||
compiled pattern (whether it is anchored, has a fixed first character,
|
||||
and so on). It does this by calling pcre[16|32]_fullinfo() after com-
|
||||
piling a pattern. If the pattern is studied, the results of that are
|
||||
also output. In this output, the word "char" means a non-UTF character,
|
||||
that is, the value of a single data item (8-bit, 16-bit, or 32-bit,
|
||||
depending on the library that is being tested).
|
||||
that is, the value of a single data item (8-bit, 16-bit, or 32-bit, de-
|
||||
pending on the library that is being tested).
|
||||
|
||||
The /K modifier requests pcretest to show names from backtracking con-
|
||||
trol verbs that are returned from calls to pcre[16|32]_exec(). It
|
||||
causes pcretest to create a pcre[16|32]_extra block if one has not
|
||||
already been created by a call to pcre[16|32]_study(), and to set the
|
||||
PCRE_EXTRA_MARK flag and the mark field within it, every time that
|
||||
pcre[16|32]_exec() is called. If the variable that the mark field
|
||||
points to is non-NULL for a match, non-match, or partial match,
|
||||
pcretest prints the string to which it points. For a match, this is
|
||||
shown on a line by itself, tagged with "MK:". For a non-match it is
|
||||
The /K modifier requests pcretest to show names from backtracking con-
|
||||
trol verbs that are returned from calls to pcre[16|32]_exec(). It
|
||||
causes pcretest to create a pcre[16|32]_extra block if one has not al-
|
||||
ready been created by a call to pcre[16|32]_study(), and to set the
|
||||
PCRE_EXTRA_MARK flag and the mark field within it, every time that
|
||||
pcre[16|32]_exec() is called. If the variable that the mark field
|
||||
points to is non-NULL for a match, non-match, or partial match,
|
||||
pcretest prints the string to which it points. For a match, this is
|
||||
shown on a line by itself, tagged with "MK:". For a non-match it is
|
||||
added to the message.
|
||||
|
||||
The /L modifier must be followed directly by the name of a locale, for
|
||||
The /L modifier must be followed directly by the name of a locale, for
|
||||
example,
|
||||
|
||||
/pattern/Lfr_FR
|
||||
|
||||
For this reason, it must be the last modifier. The given locale is set,
|
||||
pcre[16|32]_maketables() is called to build a set of character tables
|
||||
for the locale, and this is then passed to pcre[16|32]_compile() when
|
||||
compiling the regular expression. Without an /L (or /T) modifier, NULL
|
||||
is passed as the tables pointer; that is, /L applies only to the
|
||||
expression on which it appears.
|
||||
pcre[16|32]_maketables() is called to build a set of character tables
|
||||
for the locale, and this is then passed to pcre[16|32]_compile() when
|
||||
compiling the regular expression. Without an /L (or /T) modifier, NULL
|
||||
is passed as the tables pointer; that is, /L applies only to the ex-
|
||||
pression on which it appears.
|
||||
|
||||
The /M modifier causes the size in bytes of the memory block used to
|
||||
hold the compiled pattern to be output. This does not include the size
|
||||
of the pcre[16|32] block; it is just the actual compiled data. If the
|
||||
The /M modifier causes the size in bytes of the memory block used to
|
||||
hold the compiled pattern to be output. This does not include the size
|
||||
of the pcre[16|32] block; it is just the actual compiled data. If the
|
||||
pattern is successfully studied with the PCRE_STUDY_JIT_COMPILE option,
|
||||
the size of the JIT compiled code is also output.
|
||||
|
||||
The /Q modifier is used to test the use of pcre_stack_guard. It must be
|
||||
followed by '0' or '1', specifying the return code to be given from an
|
||||
external function that is passed to PCRE and used for stack checking
|
||||
followed by '0' or '1', specifying the return code to be given from an
|
||||
external function that is passed to PCRE and used for stack checking
|
||||
during compilation (see the pcreapi documentation for details).
|
||||
|
||||
The /S modifier causes pcre[16|32]_study() to be called after the
|
||||
expression has been compiled, and the results used when the expression
|
||||
is matched. There are a number of qualifying characters that may follow
|
||||
The /S modifier causes pcre[16|32]_study() to be called after the ex-
|
||||
pression has been compiled, and the results used when the expression is
|
||||
matched. There are a number of qualifying characters that may follow
|
||||
/S. They may appear in any order.
|
||||
|
||||
If /S is followed by an exclamation mark, pcre[16|32]_study() is called
|
||||
with the PCRE_STUDY_EXTRA_NEEDED option, causing it always to return a
|
||||
with the PCRE_STUDY_EXTRA_NEEDED option, causing it always to return a
|
||||
pcre_extra block, even when studying discovers no useful information.
|
||||
|
||||
If /S is followed by a second S character, it suppresses studying, even
|
||||
if it was requested externally by the -s command line option. This
|
||||
makes it possible to specify that certain patterns are always studied,
|
||||
if it was requested externally by the -s command line option. This
|
||||
makes it possible to specify that certain patterns are always studied,
|
||||
and others are never studied, independently of -s. This feature is used
|
||||
in the test files in a few cases where the output is different when the
|
||||
pattern is studied.
|
||||
|
||||
If the /S modifier is followed by a + character, the call to
|
||||
pcre[16|32]_study() is made with all the JIT study options, requesting
|
||||
just-in-time optimization support if it is available, for both normal
|
||||
and partial matching. If you want to restrict the JIT compiling modes,
|
||||
If the /S modifier is followed by a + character, the call to
|
||||
pcre[16|32]_study() is made with all the JIT study options, requesting
|
||||
just-in-time optimization support if it is available, for both normal
|
||||
and partial matching. If you want to restrict the JIT compiling modes,
|
||||
you can follow /S+ with a digit in the range 1 to 7:
|
||||
|
||||
1 normal match only
|
||||
@ -538,40 +535,40 @@ PATTERN MODIFIERS
|
||||
7 all three modes (default)
|
||||
|
||||
If /S++ is used instead of /S+ (with or without a following digit), the
|
||||
text "(JIT)" is added to the first output line after a match or no
|
||||
text "(JIT)" is added to the first output line after a match or no
|
||||
match when JIT-compiled code was actually used.
|
||||
|
||||
Note that there is also an independent /+ modifier; it must not be
|
||||
Note that there is also an independent /+ modifier; it must not be
|
||||
given immediately after /S or /S+ because this will be misinterpreted.
|
||||
|
||||
If JIT studying is successful, the compiled JIT code will automatically
|
||||
be used when pcre[16|32]_exec() is run, except when incompatible run-
|
||||
time options are specified. For more details, see the pcrejit documen-
|
||||
tation. See also the \J escape sequence below for a way of setting the
|
||||
be used when pcre[16|32]_exec() is run, except when incompatible run-
|
||||
time options are specified. For more details, see the pcrejit documen-
|
||||
tation. See also the \J escape sequence below for a way of setting the
|
||||
size of the JIT stack.
|
||||
|
||||
Finally, if /S is followed by a minus character, JIT compilation is
|
||||
suppressed, even if it was requested externally by the -s command line
|
||||
option. This makes it possible to specify that JIT is never to be used
|
||||
Finally, if /S is followed by a minus character, JIT compilation is
|
||||
suppressed, even if it was requested externally by the -s command line
|
||||
option. This makes it possible to specify that JIT is never to be used
|
||||
for certain patterns.
|
||||
|
||||
The /T modifier must be followed by a single digit. It causes a spe-
|
||||
The /T modifier must be followed by a single digit. It causes a spe-
|
||||
cific set of built-in character tables to be passed to pcre[16|32]_com-
|
||||
pile(). It is used in the standard PCRE tests to check behaviour with
|
||||
pile(). It is used in the standard PCRE tests to check behaviour with
|
||||
different character tables. The digit specifies the tables as follows:
|
||||
|
||||
0 the default ASCII tables, as distributed in
|
||||
pcre_chartables.c.dist
|
||||
1 a set of tables defining ISO 8859 characters
|
||||
|
||||
In table 1, some characters whose codes are greater than 128 are iden-
|
||||
In table 1, some characters whose codes are greater than 128 are iden-
|
||||
tified as letters, digits, spaces, etc.
|
||||
|
||||
Using the POSIX wrapper API
|
||||
|
||||
The /P modifier causes pcretest to call PCRE via the POSIX wrapper API
|
||||
rather than its native API. This supports only the 8-bit library. When
|
||||
/P is set, the following modifiers set options for the regcomp() func-
|
||||
The /P modifier causes pcretest to call PCRE via the POSIX wrapper API
|
||||
rather than its native API. This supports only the 8-bit library. When
|
||||
/P is set, the following modifiers set options for the regcomp() func-
|
||||
tion:
|
||||
|
||||
/i REG_ICASE
|
||||
@ -582,48 +579,48 @@ PATTERN MODIFIERS
|
||||
/W REG_UCP ) the POSIX standard
|
||||
/8 REG_UTF8 )
|
||||
|
||||
The /+ modifier works as described above. All other modifiers are
|
||||
ignored.
|
||||
The /+ modifier works as described above. All other modifiers are ig-
|
||||
nored.
|
||||
|
||||
Locking out certain modifiers
|
||||
|
||||
PCRE can be compiled with or without support for certain features such
|
||||
as UTF-8/16/32 or Unicode properties. Accordingly, the standard tests
|
||||
are split up into a number of different files that are selected for
|
||||
running depending on which features are available. When updating the
|
||||
PCRE can be compiled with or without support for certain features such
|
||||
as UTF-8/16/32 or Unicode properties. Accordingly, the standard tests
|
||||
are split up into a number of different files that are selected for
|
||||
running depending on which features are available. When updating the
|
||||
tests, it is all too easy to put a new test into the wrong file by mis-
|
||||
take; for example, to put a test that requires UTF support into a file
|
||||
that is used when it is not available. To help detect such mistakes as
|
||||
early as possible, there is a facility for locking out specific modi-
|
||||
take; for example, to put a test that requires UTF support into a file
|
||||
that is used when it is not available. To help detect such mistakes as
|
||||
early as possible, there is a facility for locking out specific modi-
|
||||
fiers. If an input line for pcretest starts with the string "< forbid "
|
||||
the following sequence of characters is taken as a list of forbidden
|
||||
the following sequence of characters is taken as a list of forbidden
|
||||
modifiers. For example, in the test files that must not use UTF or Uni-
|
||||
code property support, this line appears:
|
||||
|
||||
< forbid 8W
|
||||
|
||||
This locks out the /8 and /W modifiers. An immediate error is given if
|
||||
they are subsequently encountered. If the character string contains <
|
||||
but not >, all the multi-character modifiers that begin with < are
|
||||
locked out. Otherwise, such modifiers must be explicitly listed, for
|
||||
This locks out the /8 and /W modifiers. An immediate error is given if
|
||||
they are subsequently encountered. If the character string contains <
|
||||
but not >, all the multi-character modifiers that begin with < are
|
||||
locked out. Otherwise, such modifiers must be explicitly listed, for
|
||||
example:
|
||||
|
||||
< forbid <JS><cr>
|
||||
|
||||
There must be a single space between < and "forbid" for this feature to
|
||||
be recognised. If there is not, the line is interpreted either as a
|
||||
request to re-load a pre-compiled pattern (see "SAVING AND RELOADING
|
||||
COMPILED PATTERNS" below) or, if there is a another < character, as a
|
||||
pattern that uses < as its delimiter.
|
||||
be recognised. If there is not, the line is interpreted either as a re-
|
||||
quest to re-load a pre-compiled pattern (see "SAVING AND RELOADING COM-
|
||||
PILED PATTERNS" below) or, if there is a another < character, as a pat-
|
||||
tern that uses < as its delimiter.
|
||||
|
||||
|
||||
DATA LINES
|
||||
|
||||
Before each data line is passed to pcre[16|32]_exec(), leading and
|
||||
trailing white space is removed, and it is then scanned for \ escapes.
|
||||
Some of these are pretty esoteric features, intended for checking out
|
||||
some of the more complicated features of PCRE. If you are just testing
|
||||
"ordinary" regular expressions, you probably don't need any of these.
|
||||
Before each data line is passed to pcre[16|32]_exec(), leading and
|
||||
trailing white space is removed, and it is then scanned for \ escapes.
|
||||
Some of these are pretty esoteric features, intended for checking out
|
||||
some of the more complicated features of PCRE. If you are just testing
|
||||
"ordinary" regular expressions, you probably don't need any of these.
|
||||
The following escapes are recognized:
|
||||
|
||||
\a alarm (BEL, \x07)
|
||||
@ -684,7 +681,7 @@ DATA LINES
|
||||
(any number of digits)
|
||||
\R pass the PCRE_DFA_RESTART option to pcre[16|32]_dfa_exec()
|
||||
\S output details of memory get/free calls during matching
|
||||
\Y pass the PCRE_NO_START_OPTIMIZE option to
|
||||
\Y pass the PCRE_NO_START_OPTIMIZE option to
|
||||
pcre[16|32]_exec()
|
||||
or pcre[16|32]_dfa_exec()
|
||||
\Z pass the PCRE_NOTEOL option to pcre[16|32]_exec()
|
||||
@ -693,7 +690,7 @@ DATA LINES
|
||||
pcre[16|32]_exec() or pcre[16|32]_dfa_exec()
|
||||
\>dd start the match at offset dd (optional "-"; then
|
||||
any number of digits); this sets the startoffset
|
||||
argument for pcre[16|32]_exec() or
|
||||
argument for pcre[16|32]_exec() or
|
||||
pcre[16|32]_dfa_exec()
|
||||
\<cr> pass the PCRE_NEWLINE_CR option to pcre[16|32]_exec()
|
||||
or pcre[16|32]_dfa_exec()
|
||||
@ -706,103 +703,102 @@ DATA LINES
|
||||
\<any> pass the PCRE_NEWLINE_ANY option to pcre[16|32]_exec()
|
||||
or pcre[16|32]_dfa_exec()
|
||||
|
||||
The use of \x{hh...} is not dependent on the use of the /8 modifier on
|
||||
the pattern. It is recognized always. There may be any number of hexa-
|
||||
decimal digits inside the braces; invalid values provoke error mes-
|
||||
The use of \x{hh...} is not dependent on the use of the /8 modifier on
|
||||
the pattern. It is recognized always. There may be any number of hexa-
|
||||
decimal digits inside the braces; invalid values provoke error mes-
|
||||
sages.
|
||||
|
||||
Note that \xhh specifies one byte rather than one character in UTF-8
|
||||
mode; this makes it possible to construct invalid UTF-8 sequences for
|
||||
testing purposes. On the other hand, \x{hh} is interpreted as a UTF-8
|
||||
character in UTF-8 mode, generating more than one byte if the value is
|
||||
greater than 127. When testing the 8-bit library not in UTF-8 mode,
|
||||
Note that \xhh specifies one byte rather than one character in UTF-8
|
||||
mode; this makes it possible to construct invalid UTF-8 sequences for
|
||||
testing purposes. On the other hand, \x{hh} is interpreted as a UTF-8
|
||||
character in UTF-8 mode, generating more than one byte if the value is
|
||||
greater than 127. When testing the 8-bit library not in UTF-8 mode,
|
||||
\x{hh} generates one byte for values less than 256, and causes an error
|
||||
for greater values.
|
||||
|
||||
In UTF-16 mode, all 4-digit \x{hhhh} values are accepted. This makes it
|
||||
possible to construct invalid UTF-16 sequences for testing purposes.
|
||||
|
||||
In UTF-32 mode, all 4- to 8-digit \x{...} values are accepted. This
|
||||
makes it possible to construct invalid UTF-32 sequences for testing
|
||||
In UTF-32 mode, all 4- to 8-digit \x{...} values are accepted. This
|
||||
makes it possible to construct invalid UTF-32 sequences for testing
|
||||
purposes.
|
||||
|
||||
The escapes that specify line ending sequences are literal strings,
|
||||
exactly as shown. No more than one newline setting should be present in
|
||||
The escapes that specify line ending sequences are literal strings, ex-
|
||||
actly as shown. No more than one newline setting should be present in
|
||||
any data line.
|
||||
|
||||
A backslash followed by anything else just escapes the anything else.
|
||||
If the very last character is a backslash, it is ignored. This gives a
|
||||
way of passing an empty line as data, since a real empty line termi-
|
||||
A backslash followed by anything else just escapes the anything else.
|
||||
If the very last character is a backslash, it is ignored. This gives a
|
||||
way of passing an empty line as data, since a real empty line termi-
|
||||
nates the data input.
|
||||
|
||||
The \J escape provides a way of setting the maximum stack size that is
|
||||
used by the just-in-time optimization code. It is ignored if JIT opti-
|
||||
mization is not being used. Providing a stack that is larger than the
|
||||
The \J escape provides a way of setting the maximum stack size that is
|
||||
used by the just-in-time optimization code. It is ignored if JIT opti-
|
||||
mization is not being used. Providing a stack that is larger than the
|
||||
default 32K is necessary only for very complicated patterns.
|
||||
|
||||
If \M is present, pcretest calls pcre[16|32]_exec() several times, with
|
||||
different values in the match_limit and match_limit_recursion fields of
|
||||
the pcre[16|32]_extra data structure, until it finds the minimum num-
|
||||
the pcre[16|32]_extra data structure, until it finds the minimum num-
|
||||
bers for each parameter that allow pcre[16|32]_exec() to complete with-
|
||||
out error. Because this is testing a specific feature of the normal
|
||||
interpretive pcre[16|32]_exec() execution, the use of any JIT optimiza-
|
||||
tion that might have been set up by the /S+ qualifier of -s+ option is
|
||||
out error. Because this is testing a specific feature of the normal in-
|
||||
terpretive pcre[16|32]_exec() execution, the use of any JIT optimiza-
|
||||
tion that might have been set up by the /S+ qualifier of -s+ option is
|
||||
disabled.
|
||||
|
||||
The match_limit number is a measure of the amount of backtracking that
|
||||
takes place, and checking it out can be instructive. For most simple
|
||||
matches, the number is quite small, but for patterns with very large
|
||||
numbers of matching possibilities, it can become large very quickly
|
||||
with increasing length of subject string. The match_limit_recursion
|
||||
number is a measure of how much stack (or, if PCRE is compiled with
|
||||
NO_RECURSE, how much heap) memory is needed to complete the match
|
||||
attempt.
|
||||
The match_limit number is a measure of the amount of backtracking that
|
||||
takes place, and checking it out can be instructive. For most simple
|
||||
matches, the number is quite small, but for patterns with very large
|
||||
numbers of matching possibilities, it can become large very quickly
|
||||
with increasing length of subject string. The match_limit_recursion
|
||||
number is a measure of how much stack (or, if PCRE is compiled with
|
||||
NO_RECURSE, how much heap) memory is needed to complete the match at-
|
||||
tempt.
|
||||
|
||||
When \O is used, the value specified may be higher or lower than the
|
||||
When \O is used, the value specified may be higher or lower than the
|
||||
size set by the -O command line option (or defaulted to 45); \O applies
|
||||
only to the call of pcre[16|32]_exec() for the line in which it
|
||||
appears.
|
||||
only to the call of pcre[16|32]_exec() for the line in which it ap-
|
||||
pears.
|
||||
|
||||
If the /P modifier was present on the pattern, causing the POSIX wrap-
|
||||
per API to be used, the only option-setting sequences that have any
|
||||
effect are \B, \N, and \Z, causing REG_NOTBOL, REG_NOTEMPTY, and
|
||||
REG_NOTEOL, respectively, to be passed to regexec().
|
||||
If the /P modifier was present on the pattern, causing the POSIX wrap-
|
||||
per API to be used, the only option-setting sequences that have any ef-
|
||||
fect are \B, \N, and \Z, causing REG_NOTBOL, REG_NOTEMPTY, and REG_NO-
|
||||
TEOL, respectively, to be passed to regexec().
|
||||
|
||||
|
||||
THE ALTERNATIVE MATCHING FUNCTION
|
||||
|
||||
By default, pcretest uses the standard PCRE matching function,
|
||||
pcre[16|32]_exec() to match each data line. PCRE also supports an
|
||||
alternative matching function, pcre[16|32]_dfa_test(), which operates
|
||||
in a different way, and has some restrictions. The differences between
|
||||
the two functions are described in the pcrematching documentation.
|
||||
By default, pcretest uses the standard PCRE matching function,
|
||||
pcre[16|32]_exec() to match each data line. PCRE also supports an al-
|
||||
ternative matching function, pcre[16|32]_dfa_test(), which operates in
|
||||
a different way, and has some restrictions. The differences between the
|
||||
two functions are described in the pcrematching documentation.
|
||||
|
||||
If a data line contains the \D escape sequence, or if the command line
|
||||
contains the -dfa option, the alternative matching function is used.
|
||||
If a data line contains the \D escape sequence, or if the command line
|
||||
contains the -dfa option, the alternative matching function is used.
|
||||
This function finds all possible matches at a given point. If, however,
|
||||
the \F escape sequence is present in the data line, it stops after the
|
||||
the \F escape sequence is present in the data line, it stops after the
|
||||
first match is found. This is always the shortest possible match.
|
||||
|
||||
|
||||
DEFAULT OUTPUT FROM PCRETEST
|
||||
|
||||
This section describes the output when the normal matching function,
|
||||
This section describes the output when the normal matching function,
|
||||
pcre[16|32]_exec(), is being used.
|
||||
|
||||
When a match succeeds, pcretest outputs the list of captured substrings
|
||||
that pcre[16|32]_exec() returns, starting with number 0 for the string
|
||||
that matched the whole pattern. Otherwise, it outputs "No match" when
|
||||
the return is PCRE_ERROR_NOMATCH, and "Partial match:" followed by the
|
||||
partially matching substring when pcre[16|32]_exec() returns
|
||||
PCRE_ERROR_PARTIAL. (Note that this is the entire substring that was
|
||||
inspected during the partial match; it may include characters before
|
||||
the actual match start if a lookbehind assertion, \K, \b, or \B was
|
||||
involved.) For any other return, pcretest outputs the PCRE negative
|
||||
error number and a short descriptive phrase. If the error is a failed
|
||||
UTF string check, the offset of the start of the failing character and
|
||||
the reason code are also output, provided that the size of the output
|
||||
vector is at least two. Here is an example of an interactive pcretest
|
||||
run.
|
||||
that pcre[16|32]_exec() returns, starting with number 0 for the string
|
||||
that matched the whole pattern. Otherwise, it outputs "No match" when
|
||||
the return is PCRE_ERROR_NOMATCH, and "Partial match:" followed by the
|
||||
partially matching substring when pcre[16|32]_exec() returns PCRE_ER-
|
||||
ROR_PARTIAL. (Note that this is the entire substring that was inspected
|
||||
during the partial match; it may include characters before the actual
|
||||
match start if a lookbehind assertion, \K, \b, or \B was involved.) For
|
||||
any other return, pcretest outputs the PCRE negative error number and a
|
||||
short descriptive phrase. If the error is a failed UTF string check,
|
||||
the offset of the start of the failing character and the reason code
|
||||
are also output, provided that the size of the output vector is at
|
||||
least two. Here is an example of an interactive pcretest run.
|
||||
|
||||
$ pcretest
|
||||
PCRE version 8.13 2011-04-30
|
||||
@ -892,9 +888,9 @@ OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION
|
||||
(Using the normal matching function on this data finds only "tang".)
|
||||
The longest matching string is always given first (and numbered zero).
|
||||
After a PCRE_ERROR_PARTIAL return, the output is "Partial match:", fol-
|
||||
lowed by the partially matching substring. (Note that this is the
|
||||
entire substring that was inspected during the partial match; it may
|
||||
include characters before the actual match start if a lookbehind asser-
|
||||
lowed by the partially matching substring. (Note that this is the en-
|
||||
tire substring that was inspected during the partial match; it may in-
|
||||
clude characters before the actual match start if a lookbehind asser-
|
||||
tion, \K, \b, or \B was involved.)
|
||||
|
||||
If /g is present on the pattern, the search for further matches resumes
|
||||
@ -909,9 +905,9 @@ OUTPUT FROM THE ALTERNATIVE MATCHING FUNCTION
|
||||
1: tan
|
||||
0: tan
|
||||
|
||||
Since the matching function does not support substring capture, the
|
||||
escape sequences that are concerned with captured substrings are not
|
||||
relevant.
|
||||
Since the matching function does not support substring capture, the es-
|
||||
cape sequences that are concerned with captured substrings are not rel-
|
||||
evant.
|
||||
|
||||
|
||||
RESTARTING AFTER A PARTIAL MATCH
|
||||
@ -942,9 +938,9 @@ CALLOUTS
|
||||
--->pqrabcdef
|
||||
0 ^ ^ \d
|
||||
|
||||
This output indicates that callout number 0 occurred for a match
|
||||
attempt starting at the fourth character of the subject string, when
|
||||
the pointer was at the seventh character of the data, and when the next
|
||||
This output indicates that callout number 0 occurred for a match at-
|
||||
tempt starting at the fourth character of the subject string, when the
|
||||
pointer was at the seventh character of the data, and when the next
|
||||
pattern item was \d. Just one circumflex is output if the start and
|
||||
current positions are the same.
|
||||
|
||||
@ -963,8 +959,8 @@ CALLOUTS
|
||||
0: E*
|
||||
|
||||
If a pattern contains (*MARK) items, an additional line is output when-
|
||||
ever a change of latest mark is passed to the callout function. For
|
||||
example:
|
||||
ever a change of latest mark is passed to the callout function. For ex-
|
||||
ample:
|
||||
|
||||
re> /a(*MARK:X)bc/C
|
||||
data> abc
|
||||
@ -999,8 +995,8 @@ NON-PRINTING CHARACTERS
|
||||
|
||||
When pcretest is outputting text that is a matched part of a subject
|
||||
string, it behaves in the same way, unless a different locale has been
|
||||
set for the pattern (using the /L modifier). In this case, the
|
||||
isprint() function to distinguish printing and non-printing characters.
|
||||
set for the pattern (using the /L modifier). In this case, the is-
|
||||
print() function to distinguish printing and non-printing characters.
|
||||
|
||||
|
||||
SAVING AND RELOADING COMPILED PATTERNS
|
||||
@ -1020,14 +1016,14 @@ SAVING AND RELOADING COMPILED PATTERNS
|
||||
studied with JIT optimization, the JIT data cannot be saved.
|
||||
|
||||
The data that is written is binary. The first eight bytes are the
|
||||
length of the compiled pattern data followed by the length of the
|
||||
optional study data, each written as four bytes in big-endian order
|
||||
(most significant byte first). If there is no study data (either the
|
||||
pattern was not studied, or studying did not return any data), the sec-
|
||||
ond length is zero. The lengths are followed by an exact copy of the
|
||||
compiled pattern. If there is additional study data, this (excluding
|
||||
any JIT data) follows immediately after the compiled pattern. After
|
||||
writing the file, pcretest expects to read a new pattern.
|
||||
length of the compiled pattern data followed by the length of the op-
|
||||
tional study data, each written as four bytes in big-endian order (most
|
||||
significant byte first). If there is no study data (either the pattern
|
||||
was not studied, or studying did not return any data), the second
|
||||
length is zero. The lengths are followed by an exact copy of the com-
|
||||
piled pattern. If there is additional study data, this (excluding any
|
||||
JIT data) follows immediately after the compiled pattern. After writing
|
||||
the file, pcretest expects to read a new pattern.
|
||||
|
||||
A saved pattern can be reloaded into pcretest by specifying < and a
|
||||
file name instead of a pattern. There must be no space between < and
|
||||
@ -1066,10 +1062,10 @@ SAVING AND RELOADING COMPILED PATTERNS
|
||||
ing and experimentation. It is not intended for production use because
|
||||
only a single pattern can be written to a file. Furthermore, there is
|
||||
no facility for supplying custom character tables for use with a
|
||||
reloaded pattern. If the original pattern was compiled with custom
|
||||
tables, an attempt to match a subject string using a reloaded pattern
|
||||
is likely to cause pcretest to crash. Finally, if you attempt to load
|
||||
a file that is not in the correct format, the result is undefined.
|
||||
reloaded pattern. If the original pattern was compiled with custom ta-
|
||||
bles, an attempt to match a subject string using a reloaded pattern is
|
||||
likely to cause pcretest to crash. Finally, if you attempt to load a
|
||||
file that is not in the correct format, the result is undefined.
|
||||
|
||||
|
||||
SEE ALSO
|
||||
@ -1087,5 +1083,5 @@ AUTHOR
|
||||
|
||||
REVISION
|
||||
|
||||
Last updated: 23 February 2017
|
||||
Copyright (c) 1997-2017 University of Cambridge.
|
||||
Last updated: 10 February 2020
|
||||
Copyright (c) 1997-2020 University of Cambridge.
|
||||
|
@ -6,7 +6,7 @@
|
||||
and semantics are as close as possible to those of the Perl 5 language.
|
||||
|
||||
Written by Philip Hazel
|
||||
Copyright (c) 1997-2018 University of Cambridge
|
||||
Copyright (c) 1997-2020 University of Cambridge
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@ -68,7 +68,7 @@ COMPILE_PCREx macro will already be appropriately set. */
|
||||
|
||||
/* Macro for setting individual bits in class bitmaps. */
|
||||
|
||||
#define SETBIT(a,b) a[(b)/8] |= (1 << ((b)&7))
|
||||
#define SETBIT(a,b) a[(b)/8] |= (1U << ((b)&7))
|
||||
|
||||
/* Maximum length value to check against when making sure that the integer that
|
||||
holds the compiled pattern length does not overflow. We make it a bit less than
|
||||
@ -129,8 +129,8 @@ overrun before it actually does run off the end of the data block. */
|
||||
|
||||
/* Private flags added to firstchar and reqchar. */
|
||||
|
||||
#define REQ_CASELESS (1 << 0) /* Indicates caselessness */
|
||||
#define REQ_VARY (1 << 1) /* Reqchar followed non-literal item */
|
||||
#define REQ_CASELESS (1U << 0) /* Indicates caselessness */
|
||||
#define REQ_VARY (1U << 1) /* Reqchar followed non-literal item */
|
||||
/* Negative values for the firstchar and reqchar flags */
|
||||
#define REQ_UNSET (-2)
|
||||
#define REQ_NONE (-1)
|
||||
@ -3612,7 +3612,7 @@ for(;;)
|
||||
if (chr > 255) break;
|
||||
class_bitset = (pcre_uint8 *)
|
||||
((list_ptr == list ? code : base_end) - list_ptr[2]);
|
||||
if ((class_bitset[chr >> 3] & (1 << (chr & 7))) != 0) return FALSE;
|
||||
if ((class_bitset[chr >> 3] & (1U << (chr & 7))) != 0) return FALSE;
|
||||
break;
|
||||
|
||||
#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
|
||||
@ -7133,17 +7133,19 @@ for (;; ptr++)
|
||||
int n = 0;
|
||||
ptr++;
|
||||
while(IS_DIGIT(*ptr))
|
||||
{
|
||||
n = n * 10 + *ptr++ - CHAR_0;
|
||||
if (n > 255)
|
||||
{
|
||||
*errorcodeptr = ERR38;
|
||||
goto FAILED;
|
||||
}
|
||||
}
|
||||
if (*ptr != CHAR_RIGHT_PARENTHESIS)
|
||||
{
|
||||
*errorcodeptr = ERR39;
|
||||
goto FAILED;
|
||||
}
|
||||
if (n > 255)
|
||||
{
|
||||
*errorcodeptr = ERR38;
|
||||
goto FAILED;
|
||||
}
|
||||
*code++ = n;
|
||||
PUT(code, 0, (int)(ptr - cd->start_pattern + 1)); /* Pattern offset */
|
||||
PUT(code, LINK_SIZE, 0); /* Default length */
|
||||
@ -7459,7 +7461,7 @@ for (;; ptr++)
|
||||
{
|
||||
open_capitem *oc;
|
||||
recno = GET2(slot, 0);
|
||||
cd->backref_map |= (recno < 32)? (1 << recno) : 1;
|
||||
cd->backref_map |= (recno < 32)? (1U << recno) : 1;
|
||||
if (recno > cd->top_backref) cd->top_backref = recno;
|
||||
|
||||
/* Check to see if this back reference is recursive, that it, it
|
||||
@ -8070,7 +8072,7 @@ for (;; ptr++)
|
||||
item_hwm_offset = cd->hwm - cd->start_workspace;
|
||||
*code++ = ((options & PCRE_CASELESS) != 0)? OP_REFI : OP_REF;
|
||||
PUT2INC(code, 0, recno);
|
||||
cd->backref_map |= (recno < 32)? (1 << recno) : 1;
|
||||
cd->backref_map |= (recno < 32)? (1U << recno) : 1;
|
||||
if (recno > cd->top_backref) cd->top_backref = recno;
|
||||
|
||||
/* Check to see if this back reference is recursive, that it, it
|
||||
@ -8683,7 +8685,7 @@ do {
|
||||
op == OP_SCBRA || op == OP_SCBRAPOS)
|
||||
{
|
||||
int n = GET2(scode, 1+LINK_SIZE);
|
||||
int new_map = bracket_map | ((n < 32)? (1 << n) : 1);
|
||||
int new_map = bracket_map | ((n < 32)? (1U << n) : 1);
|
||||
if (!is_anchored(scode, new_map, cd, atomcount)) return FALSE;
|
||||
}
|
||||
|
||||
@ -8811,7 +8813,7 @@ do {
|
||||
op == OP_SCBRA || op == OP_SCBRAPOS)
|
||||
{
|
||||
int n = GET2(scode, 1+LINK_SIZE);
|
||||
int new_map = bracket_map | ((n < 32)? (1 << n) : 1);
|
||||
int new_map = bracket_map | ((n < 32)? (1U << n) : 1);
|
||||
if (!is_startline(scode, new_map, cd, atomcount, inassert)) return FALSE;
|
||||
}
|
||||
|
||||
|
@ -3938,10 +3938,10 @@ static sljit_s32 character_to_int32(pcre_uchar chr)
|
||||
sljit_s32 value = (sljit_s32)chr;
|
||||
#if defined COMPILE_PCRE8
|
||||
#define SSE2_COMPARE_TYPE_INDEX 0
|
||||
return (value << 24) | (value << 16) | (value << 8) | value;
|
||||
return ((unsigned int)value << 24) | ((unsigned int)value << 16) | ((unsigned int)value << 8) | (unsigned int)value;
|
||||
#elif defined COMPILE_PCRE16
|
||||
#define SSE2_COMPARE_TYPE_INDEX 1
|
||||
return (value << 16) | value;
|
||||
return ((unsigned int)value << 16) | value;
|
||||
#elif defined COMPILE_PCRE32
|
||||
#define SSE2_COMPARE_TYPE_INDEX 2
|
||||
return value;
|
||||
@ -8507,7 +8507,7 @@ if (opcode == OP_ONCE)
|
||||
/* We temporarily encode the needs_control_head in the lowest bit.
|
||||
Note: on the target architectures of SLJIT the ((x << 1) >> 1) returns
|
||||
the same value for small signed numbers (including negative numbers). */
|
||||
BACKTRACK_AS(bracket_backtrack)->u.framesize = (BACKTRACK_AS(bracket_backtrack)->u.framesize << 1) | (needs_control_head ? 1 : 0);
|
||||
BACKTRACK_AS(bracket_backtrack)->u.framesize = ((unsigned int)BACKTRACK_AS(bracket_backtrack)->u.framesize << 1) | (needs_control_head ? 1 : 0);
|
||||
}
|
||||
return cc + repeat_length;
|
||||
}
|
||||
|
@ -66,7 +66,8 @@ Arg RE::no_arg((void*)NULL);
|
||||
// inclusive test if we ever needed it. (Note that not only the
|
||||
// __attribute__ syntax, but also __USER_LABEL_PREFIX__, are
|
||||
// gnu-specific.)
|
||||
#if defined(__GNUC__) && __GNUC__ >= 3 && defined(__ELF__) && !defined(__INTEL_COMPILER)
|
||||
#if defined(__GNUC__) && __GNUC__ >= 3 && defined(__ELF__) \
|
||||
&& !defined(__INTEL_COMPILER) && !defined(__LCC__)
|
||||
# define ULP_AS_STRING(x) ULP_AS_STRING_INTERNAL(x)
|
||||
# define ULP_AS_STRING_INTERNAL(x) #x
|
||||
# define USER_LABEL_PREFIX_STR ULP_AS_STRING(__USER_LABEL_PREFIX__)
|
||||
@ -91,6 +92,7 @@ static const char *start_options[] = {
|
||||
"(*LIMIT_RECURSION=",
|
||||
"(*LIMIT_MATCH=",
|
||||
"(*CRLF)",
|
||||
"(*LF)",
|
||||
"(*CR)",
|
||||
"(*BSR_UNICODE)",
|
||||
"(*BSR_ANYCRLF)",
|
||||
|
@ -6,7 +6,7 @@
|
||||
and semantics are as close as possible to those of the Perl 5 language.
|
||||
|
||||
Written by Philip Hazel
|
||||
Copyright (c) 1997-2018 University of Cambridge
|
||||
Copyright (c) 1997-2020 University of Cambridge
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@ -298,6 +298,7 @@ if (preg->re_pcre == NULL)
|
||||
(void)pcre_fullinfo((const pcre *)preg->re_pcre, NULL, PCRE_INFO_CAPTURECOUNT,
|
||||
&re_nsub);
|
||||
preg->re_nsub = (size_t)re_nsub;
|
||||
preg->re_erroffset = (size_t)(-1); /* No meaning after successful compile */
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -335,8 +336,6 @@ if ((eflags & REG_NOTBOL) != 0) options |= PCRE_NOTBOL;
|
||||
if ((eflags & REG_NOTEOL) != 0) options |= PCRE_NOTEOL;
|
||||
if ((eflags & REG_NOTEMPTY) != 0) options |= PCRE_NOTEMPTY;
|
||||
|
||||
((regex_t *)preg)->re_erroffset = (size_t)(-1); /* Only has meaning after compile */
|
||||
|
||||
/* When no string data is being returned, or no vector has been passed in which
|
||||
to put it, ensure that nmatch is zero. Otherwise, ensure the vector for holding
|
||||
the return data is large enough. */
|
||||
|
@ -500,7 +500,7 @@ enum {
|
||||
#if (defined (SUPPORT_PCRE8) + defined (SUPPORT_PCRE16) + \
|
||||
defined (SUPPORT_PCRE32)) >= 2
|
||||
|
||||
#define CHAR_SIZE (1 << pcre_mode)
|
||||
#define CHAR_SIZE (1U << pcre_mode)
|
||||
|
||||
/* There doesn't seem to be an easy way of writing these macros that can cope
|
||||
with the 3 pairs of bit sizes plus all three bit sizes. So just handle all the
|
||||
@ -4444,7 +4444,7 @@ while (!done)
|
||||
|
||||
/* If there is study data, write it. */
|
||||
|
||||
if (extra != NULL)
|
||||
if (extra != NULL && (extra->flags & PCRE_EXTRA_STUDY_DATA) != 0)
|
||||
{
|
||||
if (fwrite(extra->study_data, 1, true_study_size, f) <
|
||||
true_study_size)
|
||||
@ -4736,7 +4736,7 @@ while (!done)
|
||||
if (isdigit(*p)) /* Set copy string */
|
||||
{
|
||||
while(isdigit(*p)) n = n * 10 + *p++ - '0';
|
||||
copystrings |= 1 << n;
|
||||
copystrings |= 1U << n;
|
||||
}
|
||||
else if (isalnum(*p))
|
||||
{
|
||||
@ -4799,7 +4799,7 @@ while (!done)
|
||||
if (isdigit(*p))
|
||||
{
|
||||
while(isdigit(*p)) n = n * 10 + *p++ - '0';
|
||||
getstrings |= 1 << n;
|
||||
getstrings |= 1U << n;
|
||||
}
|
||||
else if (isalnum(*p))
|
||||
{
|
||||
@ -5336,7 +5336,7 @@ while (!done)
|
||||
|
||||
for (i = 0; i < 32; i++)
|
||||
{
|
||||
if ((copystrings & (1 << i)) != 0)
|
||||
if ((copystrings & (1U << i)) != 0)
|
||||
{
|
||||
int rc;
|
||||
char copybuffer[256];
|
||||
@ -5401,7 +5401,7 @@ while (!done)
|
||||
|
||||
for (i = 0; i < 32; i++)
|
||||
{
|
||||
if ((getstrings & (1 << i)) != 0)
|
||||
if ((getstrings & (1U << i)) != 0)
|
||||
{
|
||||
int rc;
|
||||
const char *substring;
|
||||
|
2
pcre/testdata/testinput2
vendored
2
pcre/testdata/testinput2
vendored
@ -1380,7 +1380,7 @@
|
||||
1X
|
||||
123456\P
|
||||
|
||||
//KF>testsavedregex
|
||||
//S-KF>testsavedregex
|
||||
|
||||
/abc/IS>testsavedregex
|
||||
<testsavedregex
|
||||
|
3
pcre/testdata/testoutput2
vendored
3
pcre/testdata/testoutput2
vendored
@ -5614,9 +5614,8 @@ No match
|
||||
123456\P
|
||||
No match
|
||||
|
||||
//KF>testsavedregex
|
||||
//S-KF>testsavedregex
|
||||
Compiled pattern written to testsavedregex
|
||||
Study data written to testsavedregex
|
||||
|
||||
/abc/IS>testsavedregex
|
||||
Capturing subpattern count = 0
|
||||
|
@ -26,7 +26,11 @@ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#if defined(__FreeBSD__) || defined(SOLARIS) || defined(__sun)
|
||||
#include <gssapi/gssapi.h>
|
||||
#else
|
||||
#include <gssapi.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
|
||||
void gssapi_errmsg(OM_uint32 major, OM_uint32 minor, char *buf, size_t size)
|
||||
|
@ -2202,6 +2202,7 @@ static void auditing_v8(MYSQL_THD thd, struct mysql_event_general_v8 *ev_v8)
|
||||
#endif /*x86_64*/
|
||||
#endif /*DBUG_OFF*/
|
||||
#endif /* __linux__ */
|
||||
|
||||
struct mysql_event_general event;
|
||||
|
||||
if (ev_v8->event_class != MYSQL_AUDIT_GENERAL_CLASS)
|
||||
@ -2262,6 +2263,7 @@ static void auditing_v13(MYSQL_THD thd, unsigned int *ev_v0)
|
||||
|
||||
int get_db_mysql57(MYSQL_THD thd, char **name, size_t *len)
|
||||
{
|
||||
#ifdef __linux__
|
||||
int db_off;
|
||||
int db_len_off;
|
||||
if (debug_server_started)
|
||||
@ -2285,7 +2287,6 @@ int get_db_mysql57(MYSQL_THD thd, char **name, size_t *len)
|
||||
#endif /*x86_64*/
|
||||
}
|
||||
|
||||
#ifdef __linux__
|
||||
*name= *(char **) (((char *) thd) + db_off);
|
||||
*len= *((size_t *) (((char*) thd) + db_len_off));
|
||||
if (*name && (*name)[*len] != 0)
|
||||
|
@ -1398,9 +1398,23 @@ unpack_fields(MYSQL *mysql, MYSQL_DATA *data,MEM_ROOT *alloc,uint fields,
|
||||
{
|
||||
if (field >= result + fields)
|
||||
goto err;
|
||||
|
||||
/*
|
||||
If any of the row->data[] below is NULL, it can result in a
|
||||
crash. Error out early as it indicates a malformed packet.
|
||||
For data[0], data[1] and data[5], strmake_root will handle
|
||||
NULL values.
|
||||
*/
|
||||
if (!row->data[2] || !row->data[3] || !row->data[4])
|
||||
{
|
||||
free_rows(data);
|
||||
set_mysql_error(mysql, CR_MALFORMED_PACKET, unknown_sqlstate);
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
cli_fetch_lengths(&lengths[0], row->data, default_value ? 6 : 5);
|
||||
field->org_table= field->table= strdup_root(alloc,(char*) row->data[0]);
|
||||
field->name= strdup_root(alloc,(char*) row->data[1]);
|
||||
field->org_table= field->table= strmake_root(alloc,(char*) row->data[0], lengths[0]);
|
||||
field->name= strmake_root(alloc,(char*) row->data[1], lengths[1]);
|
||||
field->length= (uint) uint3korr(row->data[2]);
|
||||
field->type= (enum enum_field_types) (uchar) row->data[3][0];
|
||||
|
||||
@ -1425,7 +1439,7 @@ unpack_fields(MYSQL *mysql, MYSQL_DATA *data,MEM_ROOT *alloc,uint fields,
|
||||
field->flags|= NUM_FLAG;
|
||||
if (default_value && row->data[5])
|
||||
{
|
||||
field->def=strdup_root(alloc,(char*) row->data[5]);
|
||||
field->def= strmake_root(alloc,(char*) row->data[5], lengths[5]);
|
||||
field->def_length= lengths[5];
|
||||
}
|
||||
else
|
||||
|
@ -1,4 +1,5 @@
|
||||
/* Copyright (c) 2006, 2013, Oracle and/or its affiliates.
|
||||
/* Copyright (c) 2006, 2019, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2020, MariaDB Corporation
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -495,6 +496,7 @@ Event_scheduler::run(THD *thd)
|
||||
DBUG_PRINT("info", ("job_data is NULL, the thread was killed"));
|
||||
}
|
||||
DBUG_PRINT("info", ("state=%s", scheduler_states_names[state].str));
|
||||
free_root(thd->mem_root, MYF(0));
|
||||
}
|
||||
|
||||
LOCK_DATA();
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
write-output "/* This file was generated using gen_win_tzname_data.ps1 */"
|
||||
$xdoc = new-object System.Xml.XmlDocument
|
||||
$xdoc.load("https://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml")
|
||||
$xdoc.load("https://raw.githubusercontent.com/unicode-org/cldr/master/common/supplemental/windowsZones.xml")
|
||||
$nodes = $xdoc.SelectNodes("//mapZone[@territory='001']") # use default territory (001)
|
||||
foreach ($node in $nodes) {
|
||||
write-output ('{L"'+ $node.other + '","'+ $node.type+'"},')
|
||||
|
@ -357,9 +357,8 @@ QUICK_RANGE_SELECT *get_quick_select(PARAM *param,uint index,
|
||||
uint mrr_buf_size, MEM_ROOT *alloc);
|
||||
static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree,
|
||||
bool index_read_must_be_used,
|
||||
bool update_tbl_stats,
|
||||
double read_time,
|
||||
bool ror_scans_required);
|
||||
bool for_range_access,
|
||||
double read_time);
|
||||
static
|
||||
TRP_INDEX_INTERSECT *get_best_index_intersect(PARAM *param, SEL_TREE *tree,
|
||||
double read_time);
|
||||
@ -2607,7 +2606,7 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
|
||||
|
||||
/* Get best 'range' plan and prepare data for making other plans */
|
||||
if ((range_trp= get_key_scans_params(¶m, tree, FALSE, TRUE,
|
||||
best_read_time, FALSE)))
|
||||
best_read_time)))
|
||||
{
|
||||
best_trp= range_trp;
|
||||
best_read_time= best_trp->read_cost;
|
||||
@ -4696,7 +4695,6 @@ TABLE_READ_PLAN *get_best_disjunct_quick(PARAM *param, SEL_IMERGE *imerge,
|
||||
double roru_index_costs;
|
||||
ha_rows roru_total_records;
|
||||
double roru_intersect_part= 1.0;
|
||||
bool only_ror_scans_required= FALSE;
|
||||
size_t n_child_scans;
|
||||
DBUG_ENTER("get_best_disjunct_quick");
|
||||
DBUG_PRINT("info", ("Full table scan cost: %g", read_time));
|
||||
@ -4724,8 +4722,6 @@ TABLE_READ_PLAN *get_best_disjunct_quick(PARAM *param, SEL_IMERGE *imerge,
|
||||
n_child_scans)))
|
||||
DBUG_RETURN(NULL);
|
||||
|
||||
only_ror_scans_required= !optimizer_flag(param->thd,
|
||||
OPTIMIZER_SWITCH_INDEX_MERGE_SORT_UNION);
|
||||
/*
|
||||
Collect best 'range' scan for each of disjuncts, and, while doing so,
|
||||
analyze possibility of ROR scans. Also calculate some values needed by
|
||||
@ -4738,8 +4734,7 @@ TABLE_READ_PLAN *get_best_disjunct_quick(PARAM *param, SEL_IMERGE *imerge,
|
||||
DBUG_EXECUTE("info", print_sel_tree(param, *ptree, &(*ptree)->keys_map,
|
||||
"tree in SEL_IMERGE"););
|
||||
if (!(*cur_child= get_key_scans_params(param, *ptree, TRUE, FALSE,
|
||||
read_time,
|
||||
only_ror_scans_required)))
|
||||
read_time)))
|
||||
{
|
||||
/*
|
||||
One of index scans in this index_merge is more expensive than entire
|
||||
@ -5059,9 +5054,12 @@ TABLE_READ_PLAN *merge_same_index_scans(PARAM *param, SEL_IMERGE *imerge,
|
||||
a random order
|
||||
2. the functions that estimate the cost of a range scan and an
|
||||
index merge retrievals are not well calibrated
|
||||
|
||||
As the best range access has been already chosen it does not
|
||||
make sense to evaluate the one obtained from a degenerated
|
||||
index merge.
|
||||
*/
|
||||
trp= get_key_scans_params(param, *imerge->trees, FALSE, TRUE,
|
||||
read_time, FALSE);
|
||||
trp= 0;
|
||||
}
|
||||
|
||||
DBUG_RETURN(trp);
|
||||
@ -6788,9 +6786,9 @@ TRP_ROR_INTERSECT *get_best_covering_ror_intersect(PARAM *param,
|
||||
tree make range select for this SEL_TREE
|
||||
index_read_must_be_used if TRUE, assume 'index only' option will be set
|
||||
(except for clustered PK indexes)
|
||||
for_range_access if TRUE the function is called to get the best range
|
||||
plan for range access, not for index merge access
|
||||
read_time don't create read plans with cost > read_time.
|
||||
only_ror_scans_required set to TRUE when we are only interested
|
||||
in ROR scan
|
||||
RETURN
|
||||
Best range read plan
|
||||
NULL if no plan found or error occurred
|
||||
@ -6798,9 +6796,8 @@ TRP_ROR_INTERSECT *get_best_covering_ror_intersect(PARAM *param,
|
||||
|
||||
static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree,
|
||||
bool index_read_must_be_used,
|
||||
bool update_tbl_stats,
|
||||
double read_time,
|
||||
bool only_ror_scans_required)
|
||||
bool for_range_access,
|
||||
double read_time)
|
||||
{
|
||||
uint idx, UNINIT_VAR(best_idx);
|
||||
SEL_ARG *key_to_read= NULL;
|
||||
@ -6845,10 +6842,11 @@ static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree,
|
||||
(bool) param->table->covering_keys.is_set(keynr);
|
||||
|
||||
found_records= check_quick_select(param, idx, read_index_only, key,
|
||||
update_tbl_stats, &mrr_flags,
|
||||
for_range_access, &mrr_flags,
|
||||
&buf_size, &cost);
|
||||
|
||||
if (only_ror_scans_required && !param->is_ror_scan)
|
||||
if (!for_range_access && !param->is_ror_scan &&
|
||||
!optimizer_flag(param->thd,OPTIMIZER_SWITCH_INDEX_MERGE_SORT_UNION))
|
||||
{
|
||||
/* The scan is not a ROR-scan, just skip it */
|
||||
continue;
|
||||
|
@ -1221,7 +1221,7 @@ void Session_tracker::store(THD *thd, String *buf)
|
||||
}
|
||||
|
||||
size_t length= buf->length() - start;
|
||||
uchar *data= (uchar *)(buf->ptr() + start);
|
||||
uchar *data;
|
||||
uint size;
|
||||
|
||||
if ((size= net_length_size(length)) != 1)
|
||||
@ -1231,8 +1231,16 @@ void Session_tracker::store(THD *thd, String *buf)
|
||||
buf->length(start); // it is safer to have 0-length block in case of error
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
The 'buf->reserve()' can change the buf->ptr() so we cannot
|
||||
calculate the 'data' earlier.
|
||||
*/
|
||||
data= (uchar *)(buf->ptr() + start);
|
||||
memmove(data + (size - 1), data, length);
|
||||
}
|
||||
else
|
||||
data= (uchar *)(buf->ptr() + start);
|
||||
|
||||
net_store_length(data - 1, length);
|
||||
}
|
||||
|
@ -4806,6 +4806,7 @@ connected:
|
||||
goto err;
|
||||
goto connected;
|
||||
}
|
||||
DBUG_EXECUTE_IF("fail_com_register_slave", goto err;);
|
||||
}
|
||||
|
||||
DBUG_PRINT("info",("Starting reading binary log from master"));
|
||||
|
@ -73,6 +73,7 @@
|
||||
#ifdef HAVE_SYS_SYSCALL_H
|
||||
#include <sys/syscall.h>
|
||||
#endif
|
||||
#include "repl_failsafe.h"
|
||||
|
||||
/*
|
||||
The following is used to initialise Table_ident with a internal
|
||||
@ -1523,6 +1524,10 @@ void THD::cleanup(void)
|
||||
DBUG_ASSERT(!mdl_context.has_locks());
|
||||
|
||||
apc_target.destroy();
|
||||
#ifdef HAVE_REPLICATION
|
||||
unregister_slave(this, true, true);
|
||||
#endif
|
||||
|
||||
cleanup_done=1;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2000, 2014, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2019, MariaDB Corporation
|
||||
/* Copyright (c) 2000, 2019, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2020, MariaDB Corporation
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -1241,17 +1241,27 @@ static inline uint int_token(const char *str,uint length)
|
||||
*/
|
||||
bool Lex_input_stream::consume_comment(int remaining_recursions_permitted)
|
||||
{
|
||||
// only one level of nested comments are allowed
|
||||
DBUG_ASSERT(remaining_recursions_permitted == 0 ||
|
||||
remaining_recursions_permitted == 1);
|
||||
uchar c;
|
||||
while (!eof())
|
||||
{
|
||||
c= yyGet();
|
||||
|
||||
if (remaining_recursions_permitted > 0)
|
||||
if (remaining_recursions_permitted == 1)
|
||||
{
|
||||
if ((c == '/') && (yyPeek() == '*'))
|
||||
{
|
||||
yySkip(); // Eat asterisk
|
||||
consume_comment(remaining_recursions_permitted - 1);
|
||||
yyUnput('('); // Replace nested "/*..." with "(*..."
|
||||
yySkip(); // and skip "("
|
||||
|
||||
yySkip(); /* Eat asterisk */
|
||||
if (consume_comment(0))
|
||||
return true;
|
||||
|
||||
yyUnput(')'); // Replace "...*/" with "...*)"
|
||||
yySkip(); // and skip ")"
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
@ -2105,7 +2105,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
||||
general_log_print(thd, command, "Log: '%s' Pos: %lu", name, pos);
|
||||
if (nlen < FN_REFLEN)
|
||||
mysql_binlog_send(thd, thd->strmake(name, nlen), (my_off_t)pos, flags);
|
||||
unregister_slave(thd,1,1);
|
||||
unregister_slave(thd, true, true); // todo: can be extraneous
|
||||
/* fake COM_QUIT -- if we get here, the thread needs to terminate */
|
||||
error = TRUE;
|
||||
break;
|
||||
|
@ -23,13 +23,13 @@
|
||||
{L"Haiti Standard Time","America/Port-au-Prince"},
|
||||
{L"Cuba Standard Time","America/Havana"},
|
||||
{L"US Eastern Standard Time","America/Indianapolis"},
|
||||
{L"Turks And Caicos Standard Time","America/Grand_Turk"},
|
||||
{L"Paraguay Standard Time","America/Asuncion"},
|
||||
{L"Atlantic Standard Time","America/Halifax"},
|
||||
{L"Venezuela Standard Time","America/Caracas"},
|
||||
{L"Central Brazilian Standard Time","America/Cuiaba"},
|
||||
{L"SA Western Standard Time","America/La_Paz"},
|
||||
{L"Pacific SA Standard Time","America/Santiago"},
|
||||
{L"Turks And Caicos Standard Time","America/Grand_Turk"},
|
||||
{L"Newfoundland Standard Time","America/St_Johns"},
|
||||
{L"Tocantins Standard Time","America/Araguaina"},
|
||||
{L"E. South America Standard Time","America/Sao_Paulo"},
|
||||
@ -46,11 +46,11 @@
|
||||
{L"UTC","Etc/GMT"},
|
||||
{L"GMT Standard Time","Europe/London"},
|
||||
{L"Greenwich Standard Time","Atlantic/Reykjavik"},
|
||||
{L"Sao Tome Standard Time","Africa/Sao_Tome"},
|
||||
{L"Morocco Standard Time","Africa/Casablanca"},
|
||||
{L"W. Europe Standard Time","Europe/Berlin"},
|
||||
{L"Central Europe Standard Time","Europe/Budapest"},
|
||||
{L"Romance Standard Time","Europe/Paris"},
|
||||
{L"Morocco Standard Time","Africa/Casablanca"},
|
||||
{L"Sao Tome Standard Time","Africa/Sao_Tome"},
|
||||
{L"Central European Standard Time","Europe/Warsaw"},
|
||||
{L"W. Central Africa Standard Time","Africa/Lagos"},
|
||||
{L"Jordan Standard Time","Asia/Amman"},
|
||||
@ -81,11 +81,13 @@
|
||||
{L"Mauritius Standard Time","Indian/Mauritius"},
|
||||
{L"Saratov Standard Time","Europe/Saratov"},
|
||||
{L"Georgian Standard Time","Asia/Tbilisi"},
|
||||
{L"Volgograd Standard Time","Europe/Volgograd"},
|
||||
{L"Caucasus Standard Time","Asia/Yerevan"},
|
||||
{L"Afghanistan Standard Time","Asia/Kabul"},
|
||||
{L"West Asia Standard Time","Asia/Tashkent"},
|
||||
{L"Ekaterinburg Standard Time","Asia/Yekaterinburg"},
|
||||
{L"Pakistan Standard Time","Asia/Karachi"},
|
||||
{L"Qyzylorda Standard Time","Asia/Qyzylorda"},
|
||||
{L"India Standard Time","Asia/Calcutta"},
|
||||
{L"Sri Lanka Standard Time","Asia/Colombo"},
|
||||
{L"Nepal Standard Time","Asia/Katmandu"},
|
||||
|
@ -813,12 +813,15 @@ bool TDBXML::Initialize(PGLOBAL g)
|
||||
if (Void)
|
||||
return false;
|
||||
|
||||
if (Columns && !Bufdone) {
|
||||
if (Columns) {
|
||||
// Allocate the buffers that will contain node values
|
||||
for (colp = (PXMLCOL)Columns; colp; colp = (PXMLCOL)colp->GetNext())
|
||||
if (!colp->IsSpecial()) // Not a pseudo column
|
||||
if (colp->AllocBuf(g, Mode == MODE_INSERT))
|
||||
return true;
|
||||
if (!colp->IsSpecial()) { // Not a pseudo column
|
||||
if (!Bufdone && colp->AllocBuf(g, Mode == MODE_INSERT))
|
||||
return true;
|
||||
|
||||
colp->Nx = colp->Sx = -1;
|
||||
} // endif Special
|
||||
|
||||
Bufdone = true;
|
||||
} // endif Bufdone
|
||||
|
@ -157,6 +157,7 @@ class DllExport TDBXML : public TDBASE {
|
||||
/* Class XMLCOL: XDB table access method column descriptor. */
|
||||
/***********************************************************************/
|
||||
class XMLCOL : public COLBLK {
|
||||
friend class TDBXML;
|
||||
public:
|
||||
// Constructors
|
||||
XMLCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "XML");
|
||||
|
@ -775,7 +775,7 @@ btr_node_ptr_set_child_page_no(
|
||||
rec_t* rec, /*!< in: node pointer record */
|
||||
page_zip_des_t* page_zip,/*!< in/out: compressed page whose uncompressed
|
||||
part will be updated, or NULL */
|
||||
const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
ulint page_no,/*!< in: child node address */
|
||||
mtr_t* mtr) /*!< in: mtr */
|
||||
{
|
||||
@ -810,7 +810,7 @@ btr_node_ptr_get_child(
|
||||
/*===================*/
|
||||
const rec_t* node_ptr,/*!< in: node pointer */
|
||||
dict_index_t* index, /*!< in: index */
|
||||
const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
mtr_t* mtr) /*!< in: mtr */
|
||||
{
|
||||
ut_ad(rec_offs_validate(node_ptr, index, offsets));
|
||||
@ -829,10 +829,10 @@ Returns the upper level node pointer to a page. It is assumed that mtr holds
|
||||
an sx-latch on the tree.
|
||||
@return rec_get_offsets() of the node pointer record */
|
||||
static
|
||||
offset_t*
|
||||
rec_offs*
|
||||
btr_page_get_father_node_ptr_func(
|
||||
/*==============================*/
|
||||
offset_t* offsets,/*!< in: work area for the return value */
|
||||
rec_offs* offsets,/*!< in: work area for the return value */
|
||||
mem_heap_t* heap, /*!< in: memory heap to use */
|
||||
btr_cur_t* cursor, /*!< in: cursor pointing to user record,
|
||||
out: cursor on node pointer record,
|
||||
@ -936,10 +936,10 @@ Returns the upper level node pointer to a page. It is assumed that mtr holds
|
||||
an x-latch on the tree.
|
||||
@return rec_get_offsets() of the node pointer record */
|
||||
static
|
||||
offset_t*
|
||||
rec_offs*
|
||||
btr_page_get_father_block(
|
||||
/*======================*/
|
||||
offset_t* offsets,/*!< in: work area for the return value */
|
||||
rec_offs* offsets,/*!< in: work area for the return value */
|
||||
mem_heap_t* heap, /*!< in: memory heap to use */
|
||||
dict_index_t* index, /*!< in: b-tree index */
|
||||
buf_block_t* block, /*!< in: child page in the index */
|
||||
@ -1823,7 +1823,7 @@ btr_root_raise_and_insert(
|
||||
on the root page; when the function returns,
|
||||
the cursor is positioned on the predecessor
|
||||
of the inserted record */
|
||||
offset_t** offsets,/*!< out: offsets on inserted record */
|
||||
rec_offs** offsets,/*!< out: offsets on inserted record */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */
|
||||
const dtuple_t* tuple, /*!< in: tuple to insert */
|
||||
ulint n_ext, /*!< in: number of externally stored columns */
|
||||
@ -2156,7 +2156,7 @@ btr_page_get_split_rec(
|
||||
rec_t* next_rec;
|
||||
ulint n;
|
||||
mem_heap_t* heap;
|
||||
offset_t* offsets;
|
||||
rec_offs* offsets;
|
||||
|
||||
page = btr_cur_get_page(cursor);
|
||||
|
||||
@ -2262,7 +2262,7 @@ btr_page_insert_fits(
|
||||
const rec_t* split_rec,/*!< in: suggestion for first record
|
||||
on upper half-page, or NULL if
|
||||
tuple to be inserted should be first */
|
||||
offset_t** offsets,/*!< in: rec_get_offsets(
|
||||
rec_offs** offsets,/*!< in: rec_get_offsets(
|
||||
split_rec, cursor->index); out: garbage */
|
||||
const dtuple_t* tuple, /*!< in: tuple to insert */
|
||||
ulint n_ext, /*!< in: number of externally stored columns */
|
||||
@ -2362,8 +2362,8 @@ btr_insert_on_non_leaf_level_func(
|
||||
dberr_t err;
|
||||
rec_t* rec;
|
||||
mem_heap_t* heap = NULL;
|
||||
offset_t offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets = offsets_;
|
||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets = offsets_;
|
||||
rec_offs_init(offsets_);
|
||||
rtr_info_t rtr_info;
|
||||
|
||||
@ -2471,7 +2471,7 @@ btr_attach_half_pages(
|
||||
if (direction == FSP_DOWN) {
|
||||
|
||||
btr_cur_t cursor;
|
||||
offset_t* offsets;
|
||||
rec_offs* offsets;
|
||||
|
||||
lower_page = buf_block_get_frame(new_block);
|
||||
lower_page_no = new_block->page.id.page_no();
|
||||
@ -2593,7 +2593,7 @@ btr_page_tuple_smaller(
|
||||
/*===================*/
|
||||
btr_cur_t* cursor, /*!< in: b-tree cursor */
|
||||
const dtuple_t* tuple, /*!< in: tuple to consider */
|
||||
offset_t** offsets,/*!< in/out: temporary storage */
|
||||
rec_offs** offsets,/*!< in/out: temporary storage */
|
||||
ulint n_uniq, /*!< in: number of unique fields
|
||||
in the index page records */
|
||||
mem_heap_t** heap) /*!< in/out: heap for offsets */
|
||||
@ -2633,7 +2633,7 @@ rec_t*
|
||||
btr_insert_into_right_sibling(
|
||||
ulint flags,
|
||||
btr_cur_t* cursor,
|
||||
offset_t** offsets,
|
||||
rec_offs** offsets,
|
||||
mem_heap_t* heap,
|
||||
const dtuple_t* tuple,
|
||||
ulint n_ext,
|
||||
@ -2769,7 +2769,7 @@ btr_page_split_and_insert(
|
||||
btr_cur_t* cursor, /*!< in: cursor at which to insert; when the
|
||||
function returns, the cursor is positioned
|
||||
on the predecessor of the inserted record */
|
||||
offset_t** offsets,/*!< out: offsets on inserted record */
|
||||
rec_offs** offsets,/*!< out: offsets on inserted record */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */
|
||||
const dtuple_t* tuple, /*!< in: tuple to insert */
|
||||
ulint n_ext, /*!< in: number of externally stored columns */
|
||||
@ -3321,7 +3321,7 @@ btr_lift_page_up(
|
||||
|
||||
{
|
||||
btr_cur_t cursor;
|
||||
offset_t* offsets = NULL;
|
||||
rec_offs* offsets = NULL;
|
||||
mem_heap_t* heap = mem_heap_create(
|
||||
sizeof(*offsets)
|
||||
* (REC_OFFS_HEADER_SIZE + 1 + 1
|
||||
@ -3518,7 +3518,7 @@ btr_compress(
|
||||
page_t* page;
|
||||
btr_cur_t father_cursor;
|
||||
mem_heap_t* heap;
|
||||
offset_t* offsets;
|
||||
rec_offs* offsets;
|
||||
ulint nth_rec = 0; /* remove bogus warning */
|
||||
bool mbr_changed = false;
|
||||
#ifdef UNIV_DEBUG
|
||||
@ -3661,7 +3661,7 @@ retry:
|
||||
if (is_left) {
|
||||
btr_cur_t cursor2;
|
||||
rtr_mbr_t new_mbr;
|
||||
offset_t* offsets2 = NULL;
|
||||
rec_offs* offsets2 = NULL;
|
||||
|
||||
/* For rtree, we need to update father's mbr. */
|
||||
if (dict_index_is_spatial(index)) {
|
||||
@ -3857,7 +3857,7 @@ retry:
|
||||
|
||||
/* For rtree, we need to update father's mbr. */
|
||||
if (dict_index_is_spatial(index)) {
|
||||
offset_t* offsets2;
|
||||
rec_offs* offsets2;
|
||||
ulint rec_info;
|
||||
|
||||
offsets2 = rec_get_offsets(
|
||||
@ -4304,7 +4304,7 @@ btr_print_recursive(
|
||||
ulint width, /*!< in: print this many entries from start
|
||||
and end */
|
||||
mem_heap_t** heap, /*!< in/out: heap for rec_get_offsets() */
|
||||
offset_t** offsets,/*!< in/out: buffer for rec_get_offsets() */
|
||||
rec_offs** offsets,/*!< in/out: buffer for rec_get_offsets() */
|
||||
mtr_t* mtr) /*!< in: mtr */
|
||||
{
|
||||
const page_t* page = buf_block_get_frame(block);
|
||||
@ -4368,8 +4368,8 @@ btr_print_index(
|
||||
mtr_t mtr;
|
||||
buf_block_t* root;
|
||||
mem_heap_t* heap = NULL;
|
||||
offset_t offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets = offsets_;
|
||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets = offsets_;
|
||||
rec_offs_init(offsets_);
|
||||
|
||||
fputs("--------------------------\n"
|
||||
@ -4403,7 +4403,7 @@ btr_check_node_ptr(
|
||||
{
|
||||
mem_heap_t* heap;
|
||||
dtuple_t* tuple;
|
||||
offset_t* offsets;
|
||||
rec_offs* offsets;
|
||||
btr_cur_t cursor;
|
||||
page_t* page = buf_block_get_frame(block);
|
||||
|
||||
@ -4483,8 +4483,8 @@ btr_index_rec_validate(
|
||||
ulint len;
|
||||
const page_t* page;
|
||||
mem_heap_t* heap = NULL;
|
||||
offset_t offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets = offsets_;
|
||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets = offsets_;
|
||||
rec_offs_init(offsets_);
|
||||
|
||||
page = page_align(rec);
|
||||
@ -4716,8 +4716,8 @@ btr_validate_level(
|
||||
bool ret = true;
|
||||
mtr_t mtr;
|
||||
mem_heap_t* heap = mem_heap_create(256);
|
||||
offset_t* offsets = NULL;
|
||||
offset_t* offsets2= NULL;
|
||||
rec_offs* offsets = NULL;
|
||||
rec_offs* offsets2= NULL;
|
||||
#ifdef UNIV_ZIP_DEBUG
|
||||
page_zip_des_t* page_zip;
|
||||
#endif /* UNIV_ZIP_DEBUG */
|
||||
|
@ -175,7 +175,7 @@ PageBulk::init()
|
||||
void
|
||||
PageBulk::insert(
|
||||
const rec_t* rec,
|
||||
offset_t* offsets)
|
||||
rec_offs* offsets)
|
||||
{
|
||||
ulint rec_size;
|
||||
|
||||
@ -188,7 +188,7 @@ PageBulk::insert(
|
||||
/* Check whether records are in order. */
|
||||
if (!page_rec_is_infimum(m_cur_rec)) {
|
||||
rec_t* old_rec = m_cur_rec;
|
||||
offset_t* old_offsets = rec_get_offsets(
|
||||
rec_offs* old_offsets = rec_get_offsets(
|
||||
old_rec, m_index, NULL, is_leaf,
|
||||
ULINT_UNDEFINED, &m_heap);
|
||||
|
||||
@ -401,7 +401,7 @@ rec_t*
|
||||
PageBulk::getSplitRec()
|
||||
{
|
||||
rec_t* rec;
|
||||
offset_t* offsets;
|
||||
rec_offs* offsets;
|
||||
ulint total_used_size;
|
||||
ulint total_recs_size;
|
||||
ulint n_recs;
|
||||
@ -447,7 +447,7 @@ PageBulk::copyIn(
|
||||
{
|
||||
|
||||
rec_t* rec = split_rec;
|
||||
offset_t* offsets = NULL;
|
||||
rec_offs* offsets = NULL;
|
||||
|
||||
ut_ad(m_rec_no == 0);
|
||||
ut_ad(page_rec_is_user_rec(rec));
|
||||
@ -493,7 +493,7 @@ PageBulk::copyOut(
|
||||
ut_ad(n > 0);
|
||||
|
||||
/* Set last record's next in page */
|
||||
offset_t* offsets = NULL;
|
||||
rec_offs* offsets = NULL;
|
||||
rec = page_rec_get_prev(split_rec);
|
||||
offsets = rec_get_offsets(rec, m_index, offsets,
|
||||
page_rec_is_leaf(split_rec),
|
||||
@ -602,7 +602,7 @@ the blob data is logged first, then the record is logged in bulk mode.
|
||||
dberr_t
|
||||
PageBulk::storeExt(
|
||||
const big_rec_t* big_rec,
|
||||
offset_t* offsets)
|
||||
rec_offs* offsets)
|
||||
{
|
||||
/* Note: not all fileds are initialized in btr_pcur. */
|
||||
btr_pcur_t btr_pcur;
|
||||
@ -862,7 +862,7 @@ BtrBulk::insert(
|
||||
ulint rec_size = rec_get_converted_size(m_index, tuple, n_ext);
|
||||
big_rec_t* big_rec = NULL;
|
||||
rec_t* rec = NULL;
|
||||
offset_t* offsets = NULL;
|
||||
rec_offs* offsets = NULL;
|
||||
|
||||
if (page_bulk->needExt(tuple, rec_size)) {
|
||||
/* The record is so big that we have to store some fields
|
||||
|
@ -158,7 +158,7 @@ btr_cur_unmark_extern_fields(
|
||||
part will be updated, or NULL */
|
||||
rec_t* rec, /*!< in/out: record in a clustered index */
|
||||
dict_index_t* index, /*!< in: index of the page */
|
||||
const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
mtr_t* mtr); /*!< in: mtr, or NULL if not logged */
|
||||
/*******************************************************************//**
|
||||
Adds path information to the cursor for the current page, for which
|
||||
@ -183,7 +183,7 @@ btr_rec_free_updated_extern_fields(
|
||||
rec_t* rec, /*!< in: record */
|
||||
page_zip_des_t* page_zip,/*!< in: compressed page whose uncompressed
|
||||
part will be updated, or NULL */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
const upd_t* update, /*!< in: update vector */
|
||||
bool rollback,/*!< in: performing rollback? */
|
||||
mtr_t* mtr); /*!< in: mini-transaction handle which contains
|
||||
@ -197,7 +197,7 @@ btr_rec_free_externally_stored_fields(
|
||||
dict_index_t* index, /*!< in: index of the data, the index
|
||||
tree MUST be X-latched */
|
||||
rec_t* rec, /*!< in: record */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
page_zip_des_t* page_zip,/*!< in: compressed page whose uncompressed
|
||||
part will be updated, or NULL */
|
||||
bool rollback,/*!< in: performing rollback? */
|
||||
@ -476,7 +476,7 @@ incompatible:
|
||||
from the cache. */
|
||||
|
||||
mem_heap_t* heap = NULL;
|
||||
offset_t* offsets = rec_get_offsets(rec, index, NULL, true,
|
||||
rec_offs* offsets = rec_get_offsets(rec, index, NULL, true,
|
||||
ULINT_UNDEFINED, &heap);
|
||||
if (rec_offs_any_default(offsets)) {
|
||||
inconsistent:
|
||||
@ -1162,10 +1162,10 @@ btr_cur_search_to_nth_level_func(
|
||||
btr_search_t* info;
|
||||
#endif /* BTR_CUR_ADAPT */
|
||||
mem_heap_t* heap = NULL;
|
||||
offset_t offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets = offsets_;
|
||||
offset_t offsets2_[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets2 = offsets2_;
|
||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets = offsets_;
|
||||
rec_offs offsets2_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets2 = offsets2_;
|
||||
rec_offs_init(offsets_);
|
||||
rec_offs_init(offsets2_);
|
||||
/* Currently, PAGE_CUR_LE is the only search mode used for searches
|
||||
@ -2426,8 +2426,8 @@ btr_cur_open_at_index_side_func(
|
||||
ulint n_blocks = 0;
|
||||
ulint n_releases = 0;
|
||||
mem_heap_t* heap = NULL;
|
||||
offset_t offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets = offsets_;
|
||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets = offsets_;
|
||||
dberr_t err = DB_SUCCESS;
|
||||
|
||||
rec_offs_init(offsets_);
|
||||
@ -2795,8 +2795,8 @@ btr_cur_open_at_rnd_pos_func(
|
||||
ulint n_blocks = 0;
|
||||
ulint n_releases = 0;
|
||||
mem_heap_t* heap = NULL;
|
||||
offset_t offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets = offsets_;
|
||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets = offsets_;
|
||||
rec_offs_init(offsets_);
|
||||
|
||||
ut_ad(!index->is_spatial());
|
||||
@ -3085,7 +3085,7 @@ btr_cur_insert_if_possible(
|
||||
cursor stays valid */
|
||||
const dtuple_t* tuple, /*!< in: tuple to insert; the size info need not
|
||||
have been stored to tuple */
|
||||
offset_t** offsets,/*!< out: offsets on *rec */
|
||||
rec_offs** offsets,/*!< out: offsets on *rec */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */
|
||||
ulint n_ext, /*!< in: number of externally stored columns */
|
||||
mtr_t* mtr) /*!< in/out: mini-transaction */
|
||||
@ -3248,7 +3248,7 @@ btr_cur_optimistic_insert(
|
||||
specified */
|
||||
btr_cur_t* cursor, /*!< in: cursor on page after which to insert;
|
||||
cursor stays valid */
|
||||
offset_t** offsets,/*!< out: offsets on *rec */
|
||||
rec_offs** offsets,/*!< out: offsets on *rec */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap */
|
||||
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||
rec_t** rec, /*!< out: pointer to inserted record if
|
||||
@ -3548,7 +3548,7 @@ btr_cur_pessimistic_insert(
|
||||
insertion will certainly succeed */
|
||||
btr_cur_t* cursor, /*!< in: cursor after which to insert;
|
||||
cursor stays valid */
|
||||
offset_t** offsets,/*!< out: offsets on *rec */
|
||||
rec_offs** offsets,/*!< out: offsets on *rec */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap
|
||||
that can be emptied */
|
||||
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||
@ -3716,7 +3716,7 @@ btr_cur_upd_lock_and_undo(
|
||||
/*======================*/
|
||||
ulint flags, /*!< in: undo logging and locking flags */
|
||||
btr_cur_t* cursor, /*!< in: cursor on record to update */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets() on cursor */
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets() on cursor */
|
||||
const upd_t* update, /*!< in: update vector */
|
||||
ulint cmpl_info,/*!< in: compiler info on secondary index
|
||||
updates */
|
||||
@ -3847,7 +3847,7 @@ btr_cur_parse_update_in_place(
|
||||
roll_ptr_t roll_ptr;
|
||||
ulint rec_offset;
|
||||
mem_heap_t* heap;
|
||||
offset_t* offsets;
|
||||
rec_offs* offsets;
|
||||
|
||||
if (end_ptr < ptr + 1) {
|
||||
|
||||
@ -3932,7 +3932,7 @@ btr_cur_update_alloc_zip_func(
|
||||
page_cur_t* cursor, /*!< in/out: B-tree page cursor */
|
||||
dict_index_t* index, /*!< in: the index corresponding to cursor */
|
||||
#ifdef UNIV_DEBUG
|
||||
offset_t* offsets,/*!< in/out: offsets of the cursor record */
|
||||
rec_offs* offsets,/*!< in/out: offsets of the cursor record */
|
||||
#endif /* UNIV_DEBUG */
|
||||
ulint length, /*!< in: size needed */
|
||||
bool create, /*!< in: true=delete-and-insert,
|
||||
@ -4014,7 +4014,7 @@ btr_cur_update_in_place(
|
||||
btr_cur_t* cursor, /*!< in: cursor on the record to update;
|
||||
cursor stays valid and positioned on the
|
||||
same record */
|
||||
offset_t* offsets,/*!< in/out: offsets on cursor->page_cur.rec */
|
||||
rec_offs* offsets,/*!< in/out: offsets on cursor->page_cur.rec */
|
||||
const upd_t* update, /*!< in: update vector */
|
||||
ulint cmpl_info,/*!< in: compiler info on secondary index
|
||||
updates */
|
||||
@ -4235,7 +4235,7 @@ btr_cur_optimistic_update(
|
||||
btr_cur_t* cursor, /*!< in: cursor on the record to update;
|
||||
cursor stays valid and positioned on the
|
||||
same record */
|
||||
offset_t** offsets,/*!< out: offsets on cursor->page_cur.rec */
|
||||
rec_offs** offsets,/*!< out: offsets on cursor->page_cur.rec */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to NULL or memory heap */
|
||||
const upd_t* update, /*!< in: update vector; this must also
|
||||
contain trx id and roll ptr fields */
|
||||
@ -4570,7 +4570,7 @@ btr_cur_pessimistic_update(
|
||||
btr_cur_t* cursor, /*!< in/out: cursor on the record to update;
|
||||
cursor may become invalid if *big_rec == NULL
|
||||
|| !(flags & BTR_KEEP_POS_FLAG) */
|
||||
offset_t** offsets,/*!< out: offsets on cursor->page_cur.rec */
|
||||
rec_offs** offsets,/*!< out: offsets on cursor->page_cur.rec */
|
||||
mem_heap_t** offsets_heap,
|
||||
/*!< in/out: pointer to memory heap
|
||||
that can be emptied */
|
||||
@ -5115,7 +5115,7 @@ btr_cur_parse_del_mark_set_clust_rec(
|
||||
clustered index fields. */
|
||||
ut_ad(pos <= MAX_REF_PARTS);
|
||||
|
||||
offset_t offsets[REC_OFFS_HEADER_SIZE + MAX_REF_PARTS + 2];
|
||||
rec_offs offsets[REC_OFFS_HEADER_SIZE + MAX_REF_PARTS + 2];
|
||||
rec_offs_init(offsets);
|
||||
mem_heap_t* heap = NULL;
|
||||
|
||||
@ -5158,7 +5158,7 @@ btr_cur_del_mark_set_clust_rec(
|
||||
buf_block_t* block, /*!< in/out: buffer block of the record */
|
||||
rec_t* rec, /*!< in/out: record */
|
||||
dict_index_t* index, /*!< in: clustered index of the record */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(rec) */
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(rec) */
|
||||
que_thr_t* thr, /*!< in: query thread */
|
||||
const dtuple_t* entry, /*!< in: dtuple for the deleting record, also
|
||||
contains the virtual cols if there are any */
|
||||
@ -5444,8 +5444,8 @@ btr_cur_optimistic_delete_func(
|
||||
buf_block_t* block;
|
||||
rec_t* rec;
|
||||
mem_heap_t* heap = NULL;
|
||||
offset_t offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets = offsets_;
|
||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets = offsets_;
|
||||
ibool no_compress_needed;
|
||||
rec_offs_init(offsets_);
|
||||
|
||||
@ -5628,7 +5628,7 @@ btr_cur_pessimistic_delete(
|
||||
bool success;
|
||||
ibool ret = FALSE;
|
||||
mem_heap_t* heap;
|
||||
offset_t* offsets;
|
||||
rec_offs* offsets;
|
||||
#ifdef UNIV_DEBUG
|
||||
bool parent_latched = false;
|
||||
#endif /* UNIV_DEBUG */
|
||||
@ -5776,7 +5776,7 @@ discard_page:
|
||||
rtr_mbr_t father_mbr;
|
||||
rec_t* father_rec;
|
||||
btr_cur_t father_cursor;
|
||||
offset_t* offsets;
|
||||
rec_offs* offsets;
|
||||
bool upd_ret;
|
||||
ulint len;
|
||||
|
||||
@ -6522,7 +6522,7 @@ btr_record_not_null_field_in_rec(
|
||||
ulint n_unique, /*!< in: dict_index_get_n_unique(index),
|
||||
number of columns uniquely determine
|
||||
an index entry */
|
||||
const offset_t* offsets, /*!< in: rec_get_offsets(rec, index),
|
||||
const rec_offs* offsets, /*!< in: rec_get_offsets(rec, index),
|
||||
its size could be for all fields or
|
||||
that of "n_unique" */
|
||||
ib_uint64_t* n_not_null) /*!< in/out: array to record number of
|
||||
@ -6576,8 +6576,8 @@ btr_estimate_number_of_different_key_vals(
|
||||
uintmax_t add_on;
|
||||
mtr_t mtr;
|
||||
mem_heap_t* heap = NULL;
|
||||
offset_t* offsets_rec = NULL;
|
||||
offset_t* offsets_next_rec = NULL;
|
||||
rec_offs* offsets_rec = NULL;
|
||||
rec_offs* offsets_next_rec = NULL;
|
||||
|
||||
/* For spatial index, there is no such stats can be
|
||||
fetched. */
|
||||
@ -6765,7 +6765,7 @@ btr_estimate_number_of_different_key_vals(
|
||||
and assign the old offsets_rec buffer to
|
||||
offsets_next_rec. */
|
||||
{
|
||||
offset_t* offsets_tmp = offsets_rec;
|
||||
rec_offs* offsets_tmp = offsets_rec;
|
||||
offsets_rec = offsets_next_rec;
|
||||
offsets_next_rec = offsets_tmp;
|
||||
}
|
||||
@ -6850,7 +6850,7 @@ static
|
||||
ulint
|
||||
btr_rec_get_field_ref_offs(
|
||||
/*=======================*/
|
||||
const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
ulint n) /*!< in: index of the external field */
|
||||
{
|
||||
ulint field_ref_offs;
|
||||
@ -6879,7 +6879,7 @@ btr_rec_get_field_ref_offs(
|
||||
ulint
|
||||
btr_rec_get_externally_stored_len(
|
||||
const rec_t* rec,
|
||||
const offset_t* offsets)
|
||||
const rec_offs* offsets)
|
||||
{
|
||||
ulint n_fields;
|
||||
ulint total_extern_len = 0;
|
||||
@ -6918,7 +6918,7 @@ btr_cur_set_ownership_of_extern_field(
|
||||
part will be updated, or NULL */
|
||||
rec_t* rec, /*!< in/out: clustered index record */
|
||||
dict_index_t* index, /*!< in: index of the page */
|
||||
const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
ulint i, /*!< in: field number */
|
||||
ibool val, /*!< in: value to set */
|
||||
mtr_t* mtr) /*!< in: mtr, or NULL if not logged */
|
||||
@ -6968,7 +6968,7 @@ btr_cur_disown_inherited_fields(
|
||||
part will be updated, or NULL */
|
||||
rec_t* rec, /*!< in/out: record in a clustered index */
|
||||
dict_index_t* index, /*!< in: index of the page */
|
||||
const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
const upd_t* update, /*!< in: update vector */
|
||||
mtr_t* mtr) /*!< in/out: mini-transaction */
|
||||
{
|
||||
@ -6999,7 +6999,7 @@ btr_cur_unmark_extern_fields(
|
||||
part will be updated, or NULL */
|
||||
rec_t* rec, /*!< in/out: record in a clustered index */
|
||||
dict_index_t* index, /*!< in: index of the page */
|
||||
const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
mtr_t* mtr) /*!< in: mtr, or NULL if not logged */
|
||||
{
|
||||
ulint n;
|
||||
@ -7094,7 +7094,7 @@ struct btr_blob_log_check_t {
|
||||
/** Mini transaction holding the latches for m_pcur */
|
||||
mtr_t* m_mtr;
|
||||
/** rec_get_offsets(rec, index); offset of clust_rec */
|
||||
const offset_t* m_offsets;
|
||||
const rec_offs* m_offsets;
|
||||
/** The block containing clustered record */
|
||||
buf_block_t** m_block;
|
||||
/** The clustered record pointer */
|
||||
@ -7114,7 +7114,7 @@ struct btr_blob_log_check_t {
|
||||
btr_blob_log_check_t(
|
||||
btr_pcur_t* pcur,
|
||||
mtr_t* mtr,
|
||||
const offset_t* offsets,
|
||||
const rec_offs* offsets,
|
||||
buf_block_t** block,
|
||||
rec_t** rec,
|
||||
enum blob_op op)
|
||||
@ -7185,7 +7185,7 @@ struct btr_blob_log_check_t {
|
||||
*m_rec = btr_pcur_get_rec(m_pcur);
|
||||
|
||||
rec_offs_make_valid(*m_rec, index, true,
|
||||
const_cast<offset_t*>(m_offsets));
|
||||
const_cast<rec_offs*>(m_offsets));
|
||||
|
||||
ut_ad(m_mtr->memo_contains_page_flagged(
|
||||
*m_rec,
|
||||
@ -7216,7 +7216,7 @@ btr_store_big_rec_extern_fields(
|
||||
btr_pcur_t* pcur, /*!< in/out: a persistent cursor. if
|
||||
btr_mtr is restarted, then this can
|
||||
be repositioned. */
|
||||
offset_t* offsets, /*!< in/out: rec_get_offsets() on
|
||||
rec_offs* offsets, /*!< in/out: rec_get_offsets() on
|
||||
pcur. the "external storage" flags
|
||||
in offsets will correctly correspond
|
||||
to rec when this function returns */
|
||||
@ -7701,7 +7701,7 @@ btr_free_externally_stored_field(
|
||||
byte* field_ref, /*!< in/out: field reference */
|
||||
const rec_t* rec, /*!< in: record containing field_ref, for
|
||||
page_zip_write_blob_ptr(), or NULL */
|
||||
const offset_t* offsets, /*!< in: rec_get_offsets(rec, index),
|
||||
const rec_offs* offsets, /*!< in: rec_get_offsets(rec, index),
|
||||
or NULL */
|
||||
page_zip_des_t* page_zip, /*!< in: compressed page corresponding
|
||||
to rec, or NULL if rec == NULL */
|
||||
@ -7875,7 +7875,7 @@ btr_rec_free_externally_stored_fields(
|
||||
dict_index_t* index, /*!< in: index of the data, the index
|
||||
tree MUST be X-latched */
|
||||
rec_t* rec, /*!< in/out: record */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
page_zip_des_t* page_zip,/*!< in: compressed page whose uncompressed
|
||||
part will be updated, or NULL */
|
||||
bool rollback,/*!< in: performing rollback? */
|
||||
@ -7916,7 +7916,7 @@ btr_rec_free_updated_extern_fields(
|
||||
rec_t* rec, /*!< in/out: record */
|
||||
page_zip_des_t* page_zip,/*!< in: compressed page whose uncompressed
|
||||
part will be updated, or NULL */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
const upd_t* update, /*!< in: update vector */
|
||||
bool rollback,/*!< in: performing rollback? */
|
||||
mtr_t* mtr) /*!< in: mini-transaction handle which contains
|
||||
@ -8314,7 +8314,7 @@ protected by a lock or a page latch
|
||||
byte*
|
||||
btr_rec_copy_externally_stored_field(
|
||||
const rec_t* rec,
|
||||
const offset_t* offsets,
|
||||
const rec_offs* offsets,
|
||||
const page_size_t& page_size,
|
||||
ulint no,
|
||||
ulint* len,
|
||||
|
@ -338,8 +338,8 @@ btr_defragment_calc_n_recs_for_size(
|
||||
{
|
||||
page_t* page = buf_block_get_frame(block);
|
||||
ulint n_recs = 0;
|
||||
offset_t offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets = offsets_;
|
||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets = offsets_;
|
||||
rec_offs_init(offsets_);
|
||||
mem_heap_t* heap = NULL;
|
||||
ulint size = 0;
|
||||
|
@ -302,10 +302,10 @@ btr_pcur_restore_position_func(
|
||||
if (cursor->rel_pos == BTR_PCUR_ON) {
|
||||
#ifdef UNIV_DEBUG
|
||||
const rec_t* rec;
|
||||
offset_t offsets1_[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t offsets2_[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets1 = offsets1_;
|
||||
offset_t* offsets2 = offsets2_;
|
||||
rec_offs offsets1_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs offsets2_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets1 = offsets1_;
|
||||
rec_offs* offsets2 = offsets2_;
|
||||
rec = btr_pcur_get_rec(cursor);
|
||||
|
||||
rec_offs_init(offsets1_);
|
||||
@ -375,7 +375,7 @@ btr_pcur_restore_position_func(
|
||||
ut_ad(cursor->rel_pos == BTR_PCUR_ON
|
||||
|| cursor->rel_pos == BTR_PCUR_BEFORE
|
||||
|| cursor->rel_pos == BTR_PCUR_AFTER);
|
||||
offset_t offsets[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs offsets[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs_init(offsets);
|
||||
if (cursor->rel_pos == BTR_PCUR_ON
|
||||
&& btr_pcur_is_on_user_rec(cursor)
|
||||
|
@ -478,7 +478,7 @@ btr_pessimistic_scrub(
|
||||
/* arguments to btr_page_split_and_insert */
|
||||
mem_heap_t* heap = NULL;
|
||||
dtuple_t* entry = NULL;
|
||||
offset_t* offsets = NULL;
|
||||
rec_offs* offsets = NULL;
|
||||
ulint n_ext = 0;
|
||||
ulint flags = BTR_MODIFY_TREE;
|
||||
|
||||
|
@ -97,7 +97,7 @@ static inline
|
||||
ulint
|
||||
rec_fold(
|
||||
const rec_t* rec,
|
||||
const offset_t* offsets,
|
||||
const rec_offs* offsets,
|
||||
ulint n_fields,
|
||||
ulint n_bytes,
|
||||
index_id_t tree_id)
|
||||
@ -669,7 +669,7 @@ btr_search_update_hash_ref(
|
||||
&& (block->curr_n_bytes == info->n_bytes)
|
||||
&& (block->curr_left_side == info->left_side)) {
|
||||
mem_heap_t* heap = NULL;
|
||||
offset_t offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs_init(offsets_);
|
||||
|
||||
rec = btr_cur_get_rec(cursor);
|
||||
@ -722,8 +722,8 @@ btr_search_check_guess(
|
||||
ulint match;
|
||||
int cmp;
|
||||
mem_heap_t* heap = NULL;
|
||||
offset_t offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets = offsets_;
|
||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets = offsets_;
|
||||
ibool success = FALSE;
|
||||
rec_offs_init(offsets_);
|
||||
|
||||
@ -1082,7 +1082,7 @@ void btr_search_drop_page_hash_index(buf_block_t* block)
|
||||
ulint i;
|
||||
mem_heap_t* heap;
|
||||
const dict_index_t* index;
|
||||
offset_t* offsets;
|
||||
rec_offs* offsets;
|
||||
rw_lock_t* latch;
|
||||
btr_search_t* info;
|
||||
|
||||
@ -1337,8 +1337,8 @@ btr_search_build_page_hash_index(
|
||||
const rec_t** recs;
|
||||
ulint i;
|
||||
mem_heap_t* heap = NULL;
|
||||
offset_t offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets = offsets_;
|
||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets = offsets_;
|
||||
|
||||
#ifdef MYSQL_INDEX_DISABLE_AHI
|
||||
if (index->disable_ahi) return;
|
||||
@ -1642,7 +1642,7 @@ void btr_search_update_hash_on_delete(btr_cur_t* cursor)
|
||||
const rec_t* rec;
|
||||
ulint fold;
|
||||
dict_index_t* index;
|
||||
offset_t offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
mem_heap_t* heap = NULL;
|
||||
rec_offs_init(offsets_);
|
||||
|
||||
@ -1797,8 +1797,8 @@ btr_search_update_hash_on_insert(btr_cur_t* cursor, rw_lock_t* ahi_latch)
|
||||
ibool left_side;
|
||||
bool locked = false;
|
||||
mem_heap_t* heap = NULL;
|
||||
offset_t offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets = offsets_;
|
||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets = offsets_;
|
||||
rec_offs_init(offsets_);
|
||||
|
||||
ut_ad(ahi_latch == btr_get_search_latch(cursor->index));
|
||||
@ -1955,8 +1955,8 @@ btr_search_hash_table_validate(ulint hash_table_id)
|
||||
ulint i;
|
||||
ulint cell_count;
|
||||
mem_heap_t* heap = NULL;
|
||||
offset_t offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets = offsets_;
|
||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets = offsets_;
|
||||
|
||||
if (!btr_search_enabled) {
|
||||
return(TRUE);
|
||||
|
@ -1454,7 +1454,7 @@ void dict_table_t::rollback_instant(unsigned n)
|
||||
bool
|
||||
dict_index_t::vers_history_row(
|
||||
const rec_t* rec,
|
||||
const offset_t* offsets)
|
||||
const rec_offs* offsets)
|
||||
{
|
||||
ut_ad(is_primary());
|
||||
|
||||
@ -1485,8 +1485,8 @@ dict_index_t::vers_history_row(
|
||||
bool error = false;
|
||||
mem_heap_t* heap = NULL;
|
||||
dict_index_t* clust_index = NULL;
|
||||
offset_t offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets = offsets_;
|
||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets = offsets_;
|
||||
rec_offs_init(offsets_);
|
||||
|
||||
mtr_t mtr;
|
||||
|
@ -1014,8 +1014,8 @@ dict_stats_analyze_index_level(
|
||||
bool prev_rec_is_copied;
|
||||
byte* prev_rec_buf = NULL;
|
||||
ulint prev_rec_buf_size = 0;
|
||||
offset_t* rec_offsets;
|
||||
offset_t* prev_rec_offsets;
|
||||
rec_offs* rec_offsets;
|
||||
rec_offs* prev_rec_offsets;
|
||||
ulint i;
|
||||
|
||||
DEBUG_PRINTF(" %s(table=%s, index=%s, level=" ULINTPF ")\n",
|
||||
@ -1036,9 +1036,9 @@ dict_stats_analyze_index_level(
|
||||
i = (REC_OFFS_HEADER_SIZE + 1 + 1) + n_uniq;
|
||||
|
||||
heap = mem_heap_create((2 * sizeof *rec_offsets) * i);
|
||||
rec_offsets = static_cast<offset_t*>(
|
||||
rec_offsets = static_cast<rec_offs*>(
|
||||
mem_heap_alloc(heap, i * sizeof *rec_offsets));
|
||||
prev_rec_offsets = static_cast<offset_t*>(
|
||||
prev_rec_offsets = static_cast<rec_offs*>(
|
||||
mem_heap_alloc(heap, i * sizeof *prev_rec_offsets));
|
||||
rec_offs_set_n_alloc(rec_offsets, i);
|
||||
rec_offs_set_n_alloc(prev_rec_offsets, i);
|
||||
@ -1327,11 +1327,11 @@ to the number of externally stored pages which were encountered
|
||||
@return offsets1 or offsets2 (the offsets of *out_rec),
|
||||
or NULL if the page is empty and does not contain user records. */
|
||||
UNIV_INLINE
|
||||
offset_t*
|
||||
rec_offs*
|
||||
dict_stats_scan_page(
|
||||
const rec_t** out_rec,
|
||||
offset_t* offsets1,
|
||||
offset_t* offsets2,
|
||||
rec_offs* offsets1,
|
||||
rec_offs* offsets2,
|
||||
const dict_index_t* index,
|
||||
const page_t* page,
|
||||
ulint n_prefix,
|
||||
@ -1339,8 +1339,8 @@ dict_stats_scan_page(
|
||||
ib_uint64_t* n_diff,
|
||||
ib_uint64_t* n_external_pages)
|
||||
{
|
||||
offset_t* offsets_rec = offsets1;
|
||||
offset_t* offsets_next_rec = offsets2;
|
||||
rec_offs* offsets_rec = offsets1;
|
||||
rec_offs* offsets_next_rec = offsets2;
|
||||
const rec_t* rec;
|
||||
const rec_t* next_rec;
|
||||
/* A dummy heap, to be passed to rec_get_offsets().
|
||||
@ -1453,9 +1453,9 @@ dict_stats_analyze_index_below_cur(
|
||||
const page_t* page;
|
||||
mem_heap_t* heap;
|
||||
const rec_t* rec;
|
||||
offset_t* offsets1;
|
||||
offset_t* offsets2;
|
||||
offset_t* offsets_rec;
|
||||
rec_offs* offsets1;
|
||||
rec_offs* offsets2;
|
||||
rec_offs* offsets_rec;
|
||||
ulint size;
|
||||
mtr_t mtr;
|
||||
|
||||
@ -1473,10 +1473,10 @@ dict_stats_analyze_index_below_cur(
|
||||
|
||||
heap = mem_heap_create(size * (sizeof *offsets1 + sizeof *offsets2));
|
||||
|
||||
offsets1 = static_cast<offset_t*>(mem_heap_alloc(
|
||||
offsets1 = static_cast<rec_offs*>(mem_heap_alloc(
|
||||
heap, size * sizeof *offsets1));
|
||||
|
||||
offsets2 = static_cast<offset_t*>(mem_heap_alloc(
|
||||
offsets2 = static_cast<rec_offs*>(mem_heap_alloc(
|
||||
heap, size * sizeof *offsets2));
|
||||
|
||||
rec_offs_set_n_alloc(offsets1, size);
|
||||
|
@ -3195,7 +3195,7 @@ fts_fetch_doc_from_rec(
|
||||
dict_index_t* clust_index, /*!< in: cluster index */
|
||||
btr_pcur_t* pcur, /*!< in: cursor whose position
|
||||
has been stored */
|
||||
offset_t* offsets, /*!< in: offsets */
|
||||
rec_offs* offsets, /*!< in: offsets */
|
||||
fts_doc_t* doc) /*!< out: fts doc to hold parsed
|
||||
documents */
|
||||
{
|
||||
@ -3479,7 +3479,7 @@ fts_add_doc_by_id(
|
||||
btr_pcur_t* doc_pcur;
|
||||
const rec_t* clust_rec;
|
||||
btr_pcur_t clust_pcur;
|
||||
offset_t* offsets = NULL;
|
||||
rec_offs* offsets = NULL;
|
||||
ulint num_idx = ib_vector_size(cache->get_docs);
|
||||
|
||||
rec = btr_pcur_get_rec(&pcur);
|
||||
@ -3670,8 +3670,8 @@ fts_get_max_doc_id(
|
||||
|
||||
if (!page_is_empty(btr_pcur_get_page(&pcur))) {
|
||||
const rec_t* rec = NULL;
|
||||
offset_t offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets = offsets_;
|
||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets = offsets_;
|
||||
mem_heap_t* heap = NULL;
|
||||
ulint len;
|
||||
const void* data;
|
||||
@ -5179,8 +5179,8 @@ fts_get_doc_id_from_rec(
|
||||
const byte* data;
|
||||
ulint col_no;
|
||||
doc_id_t doc_id = 0;
|
||||
offset_t offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets = offsets_;
|
||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets = offsets_;
|
||||
mem_heap_t* my_heap = heap;
|
||||
|
||||
ut_a(table->fts->doc_col != ULINT_UNDEFINED);
|
||||
|
@ -51,7 +51,7 @@ rtr_page_split_initialize_nodes(
|
||||
btr_cur_t* cursor, /*!< in: cursor at which to insert; when the
|
||||
function returns, the cursor is positioned
|
||||
on the predecessor of the inserted record */
|
||||
offset_t** offsets,/*!< in: offsets on inserted record */
|
||||
rec_offs** offsets,/*!< in: offsets on inserted record */
|
||||
const dtuple_t* tuple, /*!< in: tuple to insert */
|
||||
double** buf_pos)/*!< in/out: current buffer position */
|
||||
{
|
||||
@ -192,7 +192,7 @@ rtr_update_mbr_field_in_place(
|
||||
/*==========================*/
|
||||
dict_index_t* index, /*!< in: spatial index. */
|
||||
rec_t* rec, /*!< in/out: rec to be modified.*/
|
||||
offset_t* offsets, /*!< in/out: offsets on rec. */
|
||||
rec_offs* offsets, /*!< in/out: offsets on rec. */
|
||||
rtr_mbr_t* mbr, /*!< in: the new mbr. */
|
||||
mtr_t* mtr) /*!< in: mtr */
|
||||
{
|
||||
@ -266,7 +266,7 @@ bool
|
||||
rtr_update_mbr_field(
|
||||
/*=================*/
|
||||
btr_cur_t* cursor, /*!< in/out: cursor pointed to rec.*/
|
||||
offset_t* offsets, /*!< in/out: offsets on rec. */
|
||||
rec_offs* offsets, /*!< in/out: offsets on rec. */
|
||||
btr_cur_t* cursor2, /*!< in/out: cursor pointed to rec
|
||||
that should be deleted.
|
||||
this cursor is for btr_compress to
|
||||
@ -295,7 +295,7 @@ rtr_update_mbr_field(
|
||||
bool ins_suc = true;
|
||||
ulint cur2_pos = 0;
|
||||
ulint del_page_no = 0;
|
||||
offset_t* offsets2;
|
||||
rec_offs* offsets2;
|
||||
|
||||
rec = btr_cur_get_rec(cursor);
|
||||
page = page_align(rec);
|
||||
@ -382,7 +382,7 @@ rtr_update_mbr_field(
|
||||
}
|
||||
|
||||
if (cursor2) {
|
||||
offset_t* offsets2;
|
||||
rec_offs* offsets2;
|
||||
|
||||
if (page_zip) {
|
||||
cursor2->page_cur.rec
|
||||
@ -404,7 +404,7 @@ rtr_update_mbr_field(
|
||||
|
||||
page_cur_t page_cur;
|
||||
rec_t* insert_rec;
|
||||
offset_t* insert_offsets = NULL;
|
||||
rec_offs* insert_offsets = NULL;
|
||||
ulint old_pos;
|
||||
rec_t* old_rec;
|
||||
|
||||
@ -436,7 +436,7 @@ update_mbr:
|
||||
/* When there're not only 1 rec in the page, we do delete/insert
|
||||
to avoid page split. */
|
||||
rec_t* insert_rec;
|
||||
offset_t* insert_offsets = NULL;
|
||||
rec_offs* insert_offsets = NULL;
|
||||
rec_t* next_rec;
|
||||
|
||||
/* Delete the rec which cursor point to. */
|
||||
@ -636,7 +636,7 @@ rtr_adjust_upper_level(
|
||||
page_zip_des_t* new_page_zip;
|
||||
dict_index_t* index = sea_cur->index;
|
||||
btr_cur_t cursor;
|
||||
offset_t* offsets;
|
||||
rec_offs* offsets;
|
||||
mem_heap_t* heap;
|
||||
ulint level;
|
||||
dtuple_t* node_ptr_upper;
|
||||
@ -799,8 +799,8 @@ rtr_split_page_move_rec_list(
|
||||
page_cur_t new_page_cursor;
|
||||
page_t* page;
|
||||
page_t* new_page;
|
||||
offset_t offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets = offsets_;
|
||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets = offsets_;
|
||||
page_zip_des_t* new_page_zip
|
||||
= buf_block_get_page_zip(new_block);
|
||||
rec_t* rec;
|
||||
@ -960,7 +960,7 @@ rtr_page_split_and_insert(
|
||||
btr_cur_t* cursor, /*!< in/out: cursor at which to insert; when the
|
||||
function returns, the cursor is positioned
|
||||
on the predecessor of the inserted record */
|
||||
offset_t** offsets,/*!< out: offsets on inserted record */
|
||||
rec_offs** offsets,/*!< out: offsets on inserted record */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */
|
||||
const dtuple_t* tuple, /*!< in: tuple to insert */
|
||||
ulint n_ext, /*!< in: number of externally stored columns */
|
||||
@ -1309,7 +1309,7 @@ rtr_ins_enlarge_mbr(
|
||||
mem_heap_t* heap;
|
||||
dict_index_t* index = btr_cur->index;
|
||||
page_cur_t* page_cursor;
|
||||
offset_t* offsets;
|
||||
rec_offs* offsets;
|
||||
node_visit_t* node_visit;
|
||||
btr_cur_t cursor;
|
||||
page_t* page;
|
||||
@ -1393,10 +1393,10 @@ rtr_page_copy_rec_list_end_no_locks(
|
||||
page_cur_t page_cur;
|
||||
page_cur_t cur1;
|
||||
rec_t* cur_rec;
|
||||
offset_t offsets_1[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets1 = offsets_1;
|
||||
offset_t offsets_2[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets2 = offsets_2;
|
||||
rec_offs offsets_1[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets1 = offsets_1;
|
||||
rec_offs offsets_2[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets2 = offsets_2;
|
||||
ulint moved = 0;
|
||||
bool is_leaf = page_is_leaf(new_page);
|
||||
|
||||
@ -1519,10 +1519,10 @@ rtr_page_copy_rec_list_start_no_locks(
|
||||
{
|
||||
page_cur_t cur1;
|
||||
rec_t* cur_rec;
|
||||
offset_t offsets_1[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets1 = offsets_1;
|
||||
offset_t offsets_2[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets2 = offsets_2;
|
||||
rec_offs offsets_1[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets1 = offsets_1;
|
||||
rec_offs offsets_2[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets2 = offsets_2;
|
||||
page_cur_t page_cur;
|
||||
ulint moved = 0;
|
||||
bool is_leaf = page_is_leaf(buf_block_get_frame(block));
|
||||
@ -1629,8 +1629,8 @@ rtr_merge_mbr_changed(
|
||||
/*==================*/
|
||||
btr_cur_t* cursor, /*!< in/out: cursor */
|
||||
btr_cur_t* cursor2, /*!< in: the other cursor */
|
||||
offset_t* offsets, /*!< in: rec offsets */
|
||||
offset_t* offsets2, /*!< in: rec offsets */
|
||||
rec_offs* offsets, /*!< in: rec offsets */
|
||||
rec_offs* offsets2, /*!< in: rec offsets */
|
||||
rtr_mbr_t* new_mbr) /*!< out: MBR to update */
|
||||
{
|
||||
double* mbr;
|
||||
@ -1673,8 +1673,8 @@ rtr_merge_and_update_mbr(
|
||||
/*=====================*/
|
||||
btr_cur_t* cursor, /*!< in/out: cursor */
|
||||
btr_cur_t* cursor2, /*!< in: the other cursor */
|
||||
offset_t* offsets, /*!< in: rec offsets */
|
||||
offset_t* offsets2, /*!< in: rec offsets */
|
||||
rec_offs* offsets, /*!< in: rec offsets */
|
||||
rec_offs* offsets2, /*!< in: rec offsets */
|
||||
page_t* child_page, /*!< in: the page. */
|
||||
mtr_t* mtr) /*!< in: mtr */
|
||||
{
|
||||
@ -1737,7 +1737,7 @@ rtr_check_same_block(
|
||||
|
||||
{
|
||||
ulint page_no = childb->page.id.page_no();
|
||||
offset_t* offsets;
|
||||
rec_offs* offsets;
|
||||
rec_t* rec = page_rec_get_next(page_get_infimum_rec(
|
||||
buf_block_get_frame(parentb)));
|
||||
|
||||
@ -1768,7 +1768,7 @@ rtr_rec_cal_increase(
|
||||
dtuple in some of the common fields, or which
|
||||
has an equal number or more fields than
|
||||
dtuple */
|
||||
const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
double* area) /*!< out: increased area */
|
||||
{
|
||||
const dfield_t* dtuple_field;
|
||||
|
@ -526,7 +526,7 @@ rtr_compare_cursor_rec(
|
||||
mem_heap_t** heap) /*!< in: memory heap */
|
||||
{
|
||||
const rec_t* rec;
|
||||
offset_t* offsets;
|
||||
rec_offs* offsets;
|
||||
|
||||
rec = btr_cur_get_rec(cursor);
|
||||
|
||||
@ -668,7 +668,7 @@ rtr_page_get_father(
|
||||
{
|
||||
mem_heap_t* heap = mem_heap_create(100);
|
||||
#ifdef UNIV_DEBUG
|
||||
offset_t* offsets;
|
||||
rec_offs* offsets;
|
||||
|
||||
offsets = rtr_page_get_father_block(
|
||||
NULL, heap, index, block, mtr, sea_cur, cursor);
|
||||
@ -804,9 +804,9 @@ func_exit:
|
||||
that mtr holds an SX-latch or X-latch on the tree.
|
||||
@return rec_get_offsets() of the node pointer record */
|
||||
static
|
||||
offset_t*
|
||||
rec_offs*
|
||||
rtr_page_get_father_node_ptr(
|
||||
offset_t* offsets,/*!< in: work area for the return value */
|
||||
rec_offs* offsets,/*!< in: work area for the return value */
|
||||
mem_heap_t* heap, /*!< in: memory heap to use */
|
||||
btr_cur_t* sea_cur,/*!< in: search cursor */
|
||||
btr_cur_t* cursor, /*!< in: cursor pointing to user record,
|
||||
@ -899,10 +899,10 @@ rtr_page_get_father_node_ptr(
|
||||
Returns the father block to a page. It is assumed that mtr holds
|
||||
an X or SX latch on the tree.
|
||||
@return rec_get_offsets() of the node pointer record */
|
||||
offset_t*
|
||||
rec_offs*
|
||||
rtr_page_get_father_block(
|
||||
/*======================*/
|
||||
offset_t* offsets,/*!< in: work area for the return value */
|
||||
rec_offs* offsets,/*!< in: work area for the return value */
|
||||
mem_heap_t* heap, /*!< in: memory heap to use */
|
||||
dict_index_t* index, /*!< in: b-tree index */
|
||||
buf_block_t* block, /*!< in: child page in the index */
|
||||
@ -1300,8 +1300,8 @@ rtr_cur_restore_position(
|
||||
#ifdef UNIV_DEBUG
|
||||
do {
|
||||
const rec_t* rec;
|
||||
const offset_t* offsets1;
|
||||
const offset_t* offsets2;
|
||||
const rec_offs* offsets1;
|
||||
const rec_offs* offsets2;
|
||||
ulint comp;
|
||||
|
||||
rec = btr_pcur_get_rec(r_cursor);
|
||||
@ -1373,8 +1373,8 @@ search_again:
|
||||
|
||||
if (low_match == r_cursor->old_n_fields) {
|
||||
const rec_t* rec;
|
||||
const offset_t* offsets1;
|
||||
const offset_t* offsets2;
|
||||
const rec_offs* offsets1;
|
||||
const rec_offs* offsets2;
|
||||
ulint comp;
|
||||
|
||||
rec = btr_pcur_get_rec(r_cursor);
|
||||
@ -1420,7 +1420,7 @@ rtr_leaf_push_match_rec(
|
||||
/*====================*/
|
||||
const rec_t* rec, /*!< in: record to copy */
|
||||
rtr_info_t* rtr_info, /*!< in/out: search stack */
|
||||
offset_t* offsets, /*!< in: offsets */
|
||||
rec_offs* offsets, /*!< in: offsets */
|
||||
bool is_comp) /*!< in: is compact format */
|
||||
{
|
||||
byte* buf;
|
||||
@ -1606,7 +1606,7 @@ void
|
||||
rtr_get_mbr_from_rec(
|
||||
/*=================*/
|
||||
const rec_t* rec, /*!< in: data tuple */
|
||||
const offset_t* offsets,/*!< in: offsets array */
|
||||
const rec_offs* offsets,/*!< in: offsets array */
|
||||
rtr_mbr_t* mbr) /*!< out MBR */
|
||||
{
|
||||
ulint rec_f_len;
|
||||
@ -1653,8 +1653,8 @@ rtr_cur_search_with_match(
|
||||
const page_t* page;
|
||||
const rec_t* rec;
|
||||
const rec_t* last_rec;
|
||||
offset_t offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets = offsets_;
|
||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets = offsets_;
|
||||
mem_heap_t* heap = NULL;
|
||||
int cmp = 1;
|
||||
double least_inc = DBL_MAX;
|
||||
@ -1937,8 +1937,8 @@ rtr_cur_search_with_match(
|
||||
|
||||
test_rec = match_rec->matched_recs->back();
|
||||
#ifdef UNIV_DEBUG
|
||||
offset_t offsets_2[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets2 = offsets_2;
|
||||
rec_offs offsets_2[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets2 = offsets_2;
|
||||
rec_offs_init(offsets_2);
|
||||
|
||||
ut_ad(found);
|
||||
|
@ -2258,7 +2258,7 @@ innobase_rec_to_mysql(
|
||||
struct TABLE* table, /*!< in/out: MySQL table */
|
||||
const rec_t* rec, /*!< in: record */
|
||||
const dict_index_t* index, /*!< in: index */
|
||||
const offset_t* offsets)/*!< in: rec_get_offsets(
|
||||
const rec_offs* offsets)/*!< in: rec_get_offsets(
|
||||
rec, index, ...) */
|
||||
{
|
||||
uint n_fields = table->s->fields;
|
||||
@ -4504,7 +4504,7 @@ innobase_add_instant_try(
|
||||
uf->field_no = f;
|
||||
uf->new_val = entry->fields[f];
|
||||
}
|
||||
offset_t* offsets = NULL;
|
||||
rec_offs* offsets = NULL;
|
||||
mem_heap_t* offsets_heap = NULL;
|
||||
big_rec_t* big_rec;
|
||||
err = btr_cur_pessimistic_update(
|
||||
|
@ -3312,7 +3312,7 @@ ibuf_insert_low(
|
||||
dtuple_t* ibuf_entry;
|
||||
mem_heap_t* offsets_heap = NULL;
|
||||
mem_heap_t* heap;
|
||||
offset_t* offsets = NULL;
|
||||
rec_offs* offsets = NULL;
|
||||
ulint buffered;
|
||||
lint min_n_recs;
|
||||
rec_t* ins_rec;
|
||||
@ -3772,7 +3772,7 @@ ibuf_insert_to_index_page_low(
|
||||
buf_block_t* block, /*!< in/out: index page where the buffered
|
||||
entry should be placed */
|
||||
dict_index_t* index, /*!< in: record descriptor */
|
||||
offset_t** offsets,/*!< out: offsets on *rec */
|
||||
rec_offs** offsets,/*!< out: offsets on *rec */
|
||||
mem_heap_t* heap, /*!< in/out: memory heap */
|
||||
mtr_t* mtr, /*!< in/out: mtr */
|
||||
page_cur_t* page_cur)/*!< in/out: cursor positioned on the record
|
||||
@ -3852,7 +3852,7 @@ ibuf_insert_to_index_page(
|
||||
ulint low_match;
|
||||
page_t* page = buf_block_get_frame(block);
|
||||
rec_t* rec;
|
||||
offset_t* offsets;
|
||||
rec_offs* offsets;
|
||||
mem_heap_t* heap;
|
||||
|
||||
DBUG_ENTER("ibuf_insert_to_index_page");
|
||||
@ -4109,8 +4109,8 @@ ibuf_delete(
|
||||
/* TODO: the below should probably be a separate function,
|
||||
it's a bastardized version of btr_cur_optimistic_delete. */
|
||||
|
||||
offset_t offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
offset_t* offsets = offsets_;
|
||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||
rec_offs* offsets = offsets_;
|
||||
mem_heap_t* heap = NULL;
|
||||
ulint max_ins_size = 0;
|
||||
|
||||
|
@ -320,7 +320,7 @@ ulint
|
||||
btr_node_ptr_get_child_page_no(
|
||||
/*===========================*/
|
||||
const rec_t* rec, /*!< in: node pointer record */
|
||||
const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
MY_ATTRIBUTE((warn_unused_result));
|
||||
|
||||
/** Create the root node for a new index tree.
|
||||
@ -405,7 +405,7 @@ btr_root_raise_and_insert(
|
||||
on the root page; when the function returns,
|
||||
the cursor is positioned on the predecessor
|
||||
of the inserted record */
|
||||
offset_t** offsets,/*!< out: offsets on inserted record */
|
||||
rec_offs** offsets,/*!< out: offsets on inserted record */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap
|
||||
that can be emptied, or NULL */
|
||||
const dtuple_t* tuple, /*!< in: tuple to insert */
|
||||
@ -488,7 +488,7 @@ btr_page_split_and_insert(
|
||||
btr_cur_t* cursor, /*!< in: cursor at which to insert; when the
|
||||
function returns, the cursor is positioned
|
||||
on the predecessor of the inserted record */
|
||||
offset_t** offsets,/*!< out: offsets on inserted record */
|
||||
rec_offs** offsets,/*!< out: offsets on inserted record */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap
|
||||
that can be emptied, or NULL */
|
||||
const dtuple_t* tuple, /*!< in: tuple to insert */
|
||||
|
@ -192,7 +192,7 @@ ulint
|
||||
btr_node_ptr_get_child_page_no(
|
||||
/*===========================*/
|
||||
const rec_t* rec, /*!< in: node pointer record */
|
||||
const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
{
|
||||
const byte* field;
|
||||
ulint len;
|
||||
|
@ -104,7 +104,7 @@ public:
|
||||
/** Insert a record in the page.
|
||||
@param[in] rec record
|
||||
@param[in] offsets record offsets */
|
||||
void insert(const rec_t* rec, offset_t* offsets);
|
||||
void insert(const rec_t* rec, rec_offs* offsets);
|
||||
|
||||
/** Mark end of insertion to the page. Scan all records to set page
|
||||
dirs, and set page header members. */
|
||||
@ -128,7 +128,7 @@ public:
|
||||
@param[in] big_rec external recrod
|
||||
@param[in] offsets record offsets
|
||||
@return error code */
|
||||
dberr_t storeExt(const big_rec_t* big_rec, offset_t* offsets);
|
||||
dberr_t storeExt(const big_rec_t* big_rec, rec_offs* offsets);
|
||||
|
||||
/** Get node pointer
|
||||
@return node pointer */
|
||||
|
@ -272,7 +272,7 @@ btr_cur_optimistic_insert(
|
||||
specified */
|
||||
btr_cur_t* cursor, /*!< in: cursor on page after which to insert;
|
||||
cursor stays valid */
|
||||
offset_t** offsets,/*!< out: offsets on *rec */
|
||||
rec_offs** offsets,/*!< out: offsets on *rec */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap */
|
||||
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||
rec_t** rec, /*!< out: pointer to inserted record if
|
||||
@ -308,7 +308,7 @@ btr_cur_pessimistic_insert(
|
||||
insertion will certainly succeed */
|
||||
btr_cur_t* cursor, /*!< in: cursor after which to insert;
|
||||
cursor stays valid */
|
||||
offset_t** offsets,/*!< out: offsets on *rec */
|
||||
rec_offs** offsets,/*!< out: offsets on *rec */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap
|
||||
that can be emptied */
|
||||
dtuple_t* entry, /*!< in/out: entry to insert */
|
||||
@ -342,7 +342,7 @@ btr_cur_update_alloc_zip_func(
|
||||
page_cur_t* cursor, /*!< in/out: B-tree page cursor */
|
||||
dict_index_t* index, /*!< in: the index corresponding to cursor */
|
||||
#ifdef UNIV_DEBUG
|
||||
offset_t* offsets,/*!< in/out: offsets of the cursor record */
|
||||
rec_offs* offsets,/*!< in/out: offsets of the cursor record */
|
||||
#endif /* UNIV_DEBUG */
|
||||
ulint length, /*!< in: size needed */
|
||||
bool create, /*!< in: true=delete-and-insert,
|
||||
@ -369,7 +369,7 @@ btr_cur_update_in_place(
|
||||
btr_cur_t* cursor, /*!< in: cursor on the record to update;
|
||||
cursor stays valid and positioned on the
|
||||
same record */
|
||||
offset_t* offsets,/*!< in/out: offsets on cursor->page_cur.rec */
|
||||
rec_offs* offsets,/*!< in/out: offsets on cursor->page_cur.rec */
|
||||
const upd_t* update, /*!< in: update vector */
|
||||
ulint cmpl_info,/*!< in: compiler info on secondary index
|
||||
updates */
|
||||
@ -411,7 +411,7 @@ btr_cur_optimistic_update(
|
||||
btr_cur_t* cursor, /*!< in: cursor on the record to update;
|
||||
cursor stays valid and positioned on the
|
||||
same record */
|
||||
offset_t** offsets,/*!< out: offsets on cursor->page_cur.rec */
|
||||
rec_offs** offsets,/*!< out: offsets on cursor->page_cur.rec */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to NULL or memory heap */
|
||||
const upd_t* update, /*!< in: update vector; this must also
|
||||
contain trx id and roll ptr fields */
|
||||
@ -438,7 +438,7 @@ btr_cur_pessimistic_update(
|
||||
btr_cur_t* cursor, /*!< in/out: cursor on the record to update;
|
||||
cursor may become invalid if *big_rec == NULL
|
||||
|| !(flags & BTR_KEEP_POS_FLAG) */
|
||||
offset_t** offsets,/*!< out: offsets on cursor->page_cur.rec */
|
||||
rec_offs** offsets,/*!< out: offsets on cursor->page_cur.rec */
|
||||
mem_heap_t** offsets_heap,
|
||||
/*!< in/out: pointer to memory heap
|
||||
that can be emptied */
|
||||
@ -470,7 +470,7 @@ btr_cur_del_mark_set_clust_rec(
|
||||
buf_block_t* block, /*!< in/out: buffer block of the record */
|
||||
rec_t* rec, /*!< in/out: record */
|
||||
dict_index_t* index, /*!< in: clustered index of the record */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(rec) */
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(rec) */
|
||||
que_thr_t* thr, /*!< in: query thread */
|
||||
const dtuple_t* entry, /*!< in: dtuple for the deleting record */
|
||||
mtr_t* mtr) /*!< in/out: mini-transaction */
|
||||
@ -637,7 +637,7 @@ btr_estimate_number_of_different_key_vals(
|
||||
ulint
|
||||
btr_rec_get_externally_stored_len(
|
||||
const rec_t* rec,
|
||||
const offset_t* offsets);
|
||||
const rec_offs* offsets);
|
||||
|
||||
/*******************************************************************//**
|
||||
Marks non-updated off-page fields as disowned by this record. The ownership
|
||||
@ -651,7 +651,7 @@ btr_cur_disown_inherited_fields(
|
||||
part will be updated, or NULL */
|
||||
rec_t* rec, /*!< in/out: record in a clustered index */
|
||||
dict_index_t* index, /*!< in: index of the page */
|
||||
const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
const upd_t* update, /*!< in: update vector */
|
||||
mtr_t* mtr) /*!< in/out: mini-transaction */
|
||||
MY_ATTRIBUTE((nonnull(2,3,4,5,6)));
|
||||
@ -690,7 +690,7 @@ btr_store_big_rec_extern_fields(
|
||||
btr_pcur_t* pcur, /*!< in/out: a persistent cursor. if
|
||||
btr_mtr is restarted, then this can
|
||||
be repositioned. */
|
||||
offset_t* offsets, /*!< in/out: rec_get_offsets() on
|
||||
rec_offs* offsets, /*!< in/out: rec_get_offsets() on
|
||||
pcur. the "external storage" flags
|
||||
in offsets will correctly correspond
|
||||
to rec when this function returns */
|
||||
@ -721,7 +721,7 @@ btr_free_externally_stored_field(
|
||||
byte* field_ref, /*!< in/out: field reference */
|
||||
const rec_t* rec, /*!< in: record containing field_ref, for
|
||||
page_zip_write_blob_ptr(), or NULL */
|
||||
const offset_t* offsets, /*!< in: rec_get_offsets(rec, index),
|
||||
const rec_offs* offsets, /*!< in: rec_get_offsets(rec, index),
|
||||
or NULL */
|
||||
page_zip_des_t* page_zip, /*!< in: compressed page corresponding
|
||||
to rec, or NULL if rec == NULL */
|
||||
@ -778,7 +778,7 @@ protected by a lock or a page latch
|
||||
byte*
|
||||
btr_rec_copy_externally_stored_field(
|
||||
const rec_t* rec,
|
||||
const offset_t* offsets,
|
||||
const rec_offs* offsets,
|
||||
const page_size_t& page_size,
|
||||
ulint no,
|
||||
ulint* len,
|
||||
|
@ -1108,7 +1108,7 @@ struct dict_index_t{
|
||||
@param[in] offsets offsets
|
||||
@return true if row is historical */
|
||||
bool
|
||||
vers_history_row(const rec_t* rec, const offset_t* offsets);
|
||||
vers_history_row(const rec_t* rec, const rec_offs* offsets);
|
||||
|
||||
/** Check if record in secondary index is historical row.
|
||||
@param[in] rec record in a secondary index
|
||||
|
@ -89,7 +89,7 @@ rtr_page_split_and_insert(
|
||||
btr_cur_t* cursor, /*!< in/out: cursor at which to insert; when the
|
||||
function returns, the cursor is positioned
|
||||
on the predecessor of the inserted record */
|
||||
offset_t** offsets,/*!< out: offsets on inserted record */
|
||||
rec_offs** offsets,/*!< out: offsets on inserted record */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */
|
||||
const dtuple_t* tuple, /*!< in: tuple to insert */
|
||||
ulint n_ext, /*!< in: number of externally stored columns */
|
||||
@ -151,7 +151,7 @@ rtr_rec_cal_increase(
|
||||
dtuple in some of the common fields, or which
|
||||
has an equal number or more fields than
|
||||
dtuple */
|
||||
const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
double* area); /*!< out: increased area */
|
||||
|
||||
/****************************************************************//**
|
||||
@ -258,7 +258,7 @@ void
|
||||
rtr_get_mbr_from_rec(
|
||||
/*=================*/
|
||||
const rec_t* rec, /*!< in: data tuple */
|
||||
const offset_t* offsets,/*!< in: offsets array */
|
||||
const rec_offs* offsets,/*!< in: offsets array */
|
||||
rtr_mbr_t* mbr); /*!< out MBR */
|
||||
|
||||
/****************************************************************//**
|
||||
@ -290,10 +290,10 @@ rtr_page_get_father(
|
||||
Returns the father block to a page. It is assumed that mtr holds
|
||||
an X or SX latch on the tree.
|
||||
@return rec_get_offsets() of the node pointer record */
|
||||
offset_t*
|
||||
rec_offs*
|
||||
rtr_page_get_father_block(
|
||||
/*======================*/
|
||||
offset_t* offsets,/*!< in: work area for the return value */
|
||||
rec_offs* offsets,/*!< in: work area for the return value */
|
||||
mem_heap_t* heap, /*!< in: memory heap to use */
|
||||
dict_index_t* index, /*!< in: b-tree index */
|
||||
buf_block_t* block, /*!< in: child page in the index */
|
||||
@ -400,8 +400,8 @@ rtr_merge_and_update_mbr(
|
||||
/*=====================*/
|
||||
btr_cur_t* cursor, /*!< in/out: cursor */
|
||||
btr_cur_t* cursor2, /*!< in: the other cursor */
|
||||
offset_t* offsets, /*!< in: rec offsets */
|
||||
offset_t* offsets2, /*!< in: rec offsets */
|
||||
rec_offs* offsets, /*!< in: rec offsets */
|
||||
rec_offs* offsets2, /*!< in: rec offsets */
|
||||
page_t* child_page, /*!< in: the child page. */
|
||||
mtr_t* mtr); /*!< in: mtr */
|
||||
|
||||
@ -421,8 +421,8 @@ rtr_merge_mbr_changed(
|
||||
/*==================*/
|
||||
btr_cur_t* cursor, /*!< in: cursor */
|
||||
btr_cur_t* cursor2, /*!< in: the other cursor */
|
||||
offset_t* offsets, /*!< in: rec offsets */
|
||||
offset_t* offsets2, /*!< in: rec offsets */
|
||||
rec_offs* offsets, /*!< in: rec offsets */
|
||||
rec_offs* offsets2, /*!< in: rec offsets */
|
||||
rtr_mbr_t* new_mbr); /*!< out: MBR to update */
|
||||
|
||||
|
||||
@ -433,7 +433,7 @@ bool
|
||||
rtr_update_mbr_field(
|
||||
/*=================*/
|
||||
btr_cur_t* cursor, /*!< in: cursor pointed to rec.*/
|
||||
offset_t* offsets, /*!< in: offsets on rec. */
|
||||
rec_offs* offsets, /*!< in: offsets on rec. */
|
||||
btr_cur_t* cursor2, /*!< in/out: cursor pointed to rec
|
||||
that should be deleted.
|
||||
this cursor is for btr_compress to
|
||||
|
@ -40,7 +40,7 @@ rtr_page_cal_mbr(
|
||||
rec_t* rec;
|
||||
const byte* field;
|
||||
ulint len;
|
||||
offset_t* offsets = NULL;
|
||||
rec_offs* offsets = NULL;
|
||||
double bmin, bmax;
|
||||
double* amin;
|
||||
double* amax;
|
||||
|
@ -32,7 +32,7 @@ innobase_rec_to_mysql(
|
||||
struct TABLE* table, /*!< in/out: MySQL table */
|
||||
const rec_t* rec, /*!< in: record */
|
||||
const dict_index_t* index, /*!< in: index */
|
||||
const offset_t* offsets)/*!< in: rec_get_offsets(
|
||||
const rec_offs* offsets)/*!< in: rec_get_offsets(
|
||||
rec, index, ...) */
|
||||
MY_ATTRIBUTE((nonnull));
|
||||
|
||||
|
@ -300,7 +300,7 @@ lock_clust_rec_modify_check_and_lock(
|
||||
const rec_t* rec, /*!< in: record which should be
|
||||
modified */
|
||||
dict_index_t* index, /*!< in: clustered index */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
que_thr_t* thr) /*!< in: query thread */
|
||||
MY_ATTRIBUTE((warn_unused_result));
|
||||
/*********************************************************************//**
|
||||
@ -338,7 +338,7 @@ lock_sec_rec_read_check_and_lock(
|
||||
be read or passed over by a
|
||||
read cursor */
|
||||
dict_index_t* index, /*!< in: secondary index */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
lock_mode mode, /*!< in: mode of the lock which
|
||||
the read cursor should set on
|
||||
records: LOCK_S or LOCK_X; the
|
||||
@ -366,7 +366,7 @@ lock_clust_rec_read_check_and_lock(
|
||||
be read or passed over by a
|
||||
read cursor */
|
||||
dict_index_t* index, /*!< in: clustered index */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
lock_mode mode, /*!< in: mode of the lock which
|
||||
the read cursor should set on
|
||||
records: LOCK_S or LOCK_X; the
|
||||
@ -415,7 +415,7 @@ lock_clust_rec_cons_read_sees(
|
||||
const rec_t* rec, /*!< in: user record which should be read or
|
||||
passed over by a read cursor */
|
||||
dict_index_t* index, /*!< in: clustered index */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
ReadView* view); /*!< in: consistent read view */
|
||||
/*********************************************************************//**
|
||||
Checks that a non-clustered index record is seen in a consistent read.
|
||||
@ -547,7 +547,7 @@ lock_report_trx_id_insanity(
|
||||
trx_id_t trx_id, /*!< in: trx id */
|
||||
const rec_t* rec, /*!< in: user record */
|
||||
dict_index_t* index, /*!< in: index */
|
||||
const offset_t* offsets, /*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets, /*!< in: rec_get_offsets(rec, index) */
|
||||
trx_id_t max_trx_id); /*!< in: trx_sys.get_max_trx_id() */
|
||||
/*********************************************************************//**
|
||||
Prints info of locks for all transactions.
|
||||
@ -772,7 +772,7 @@ lock_check_trx_id_sanity(
|
||||
trx_id_t trx_id, /*!< in: trx id */
|
||||
const rec_t* rec, /*!< in: user record */
|
||||
dict_index_t* index, /*!< in: index */
|
||||
const offset_t* offsets); /*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets); /*!< in: rec_get_offsets(rec, index) */
|
||||
#ifdef UNIV_DEBUG
|
||||
/*******************************************************************//**
|
||||
Check if the transaction holds any locks on the sys tables
|
||||
|
@ -469,7 +469,7 @@ lock_clust_rec_some_has_impl(
|
||||
/*=========================*/
|
||||
const rec_t* rec, /*!< in: user record */
|
||||
const dict_index_t* index, /*!< in: clustered index */
|
||||
const offset_t* offsets)/*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets)/*!< in: rec_get_offsets(rec, index) */
|
||||
MY_ATTRIBUTE((warn_unused_result));
|
||||
|
||||
/*********************************************************************//**
|
||||
|
@ -59,7 +59,7 @@ lock_clust_rec_some_has_impl(
|
||||
/*=========================*/
|
||||
const rec_t* rec, /*!< in: user record */
|
||||
const dict_index_t* index, /*!< in: clustered index */
|
||||
const offset_t* offsets)/*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets)/*!< in: rec_get_offsets(rec, index) */
|
||||
{
|
||||
ut_ad(dict_index_is_clust(index));
|
||||
ut_ad(page_rec_is_user_rec(rec));
|
||||
|
@ -152,7 +152,7 @@ page_cur_tuple_insert(
|
||||
page_cur_t* cursor, /*!< in/out: a page cursor */
|
||||
const dtuple_t* tuple, /*!< in: pointer to a data tuple */
|
||||
dict_index_t* index, /*!< in: record descriptor */
|
||||
offset_t** offsets,/*!< out: offsets on *rec */
|
||||
rec_offs** offsets,/*!< out: offsets on *rec */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */
|
||||
ulint n_ext, /*!< in: number of externally stored columns */
|
||||
mtr_t* mtr) /*!< in: mini-transaction handle, or NULL */
|
||||
@ -176,7 +176,7 @@ page_cur_rec_insert(
|
||||
page_cur_t* cursor, /*!< in/out: a page cursor */
|
||||
const rec_t* rec, /*!< in: record to insert */
|
||||
dict_index_t* index, /*!< in: record descriptor */
|
||||
offset_t* offsets,/*!< in/out: rec_get_offsets(rec, index) */
|
||||
rec_offs* offsets,/*!< in/out: rec_get_offsets(rec, index) */
|
||||
mtr_t* mtr); /*!< in: mini-transaction handle, or NULL */
|
||||
/***********************************************************//**
|
||||
Inserts a record next to page cursor on an uncompressed page.
|
||||
@ -190,7 +190,7 @@ page_cur_insert_rec_low(
|
||||
which the new record is inserted */
|
||||
dict_index_t* index, /*!< in: record descriptor */
|
||||
const rec_t* rec, /*!< in: pointer to a physical record */
|
||||
offset_t* offsets,/*!< in/out: rec_get_offsets(rec, index) */
|
||||
rec_offs* offsets,/*!< in/out: rec_get_offsets(rec, index) */
|
||||
mtr_t* mtr) /*!< in: mini-transaction handle, or NULL */
|
||||
MY_ATTRIBUTE((nonnull(1,2,3,4), warn_unused_result));
|
||||
|
||||
@ -212,7 +212,7 @@ page_cur_insert_rec_zip(
|
||||
page_cur_t* cursor, /*!< in/out: page cursor */
|
||||
dict_index_t* index, /*!< in: record descriptor */
|
||||
const rec_t* rec, /*!< in: pointer to a physical record */
|
||||
offset_t* offsets,/*!< in/out: rec_get_offsets(rec, index) */
|
||||
rec_offs* offsets,/*!< in/out: rec_get_offsets(rec, index) */
|
||||
mtr_t* mtr) /*!< in: mini-transaction handle, or NULL */
|
||||
MY_ATTRIBUTE((nonnull(1,2,3,4), warn_unused_result));
|
||||
/*************************************************************//**
|
||||
@ -238,7 +238,7 @@ page_cur_delete_rec(
|
||||
/*================*/
|
||||
page_cur_t* cursor, /*!< in/out: a page cursor */
|
||||
const dict_index_t* index, /*!< in: record descriptor */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(
|
||||
cursor->rec, index) */
|
||||
mtr_t* mtr); /*!< in: mini-transaction handle */
|
||||
|
||||
@ -386,14 +386,14 @@ page_delete_rec(
|
||||
page_cur_t* pcur, /*!< in/out: page cursor on record
|
||||
to delete */
|
||||
page_zip_des_t* page_zip,/*!< in: compressed page descriptor */
|
||||
const offset_t* offsets);/*!< in: offsets for record */
|
||||
const rec_offs* offsets);/*!< in: offsets for record */
|
||||
|
||||
/** Index page cursor */
|
||||
|
||||
struct page_cur_t{
|
||||
const dict_index_t* index;
|
||||
rec_t* rec; /*!< pointer to a record on page */
|
||||
offset_t* offsets;
|
||||
rec_offs* offsets;
|
||||
buf_block_t* block; /*!< pointer to the block containing rec */
|
||||
};
|
||||
|
||||
|
@ -259,7 +259,7 @@ page_cur_tuple_insert(
|
||||
page_cur_t* cursor, /*!< in/out: a page cursor */
|
||||
const dtuple_t* tuple, /*!< in: pointer to a data tuple */
|
||||
dict_index_t* index, /*!< in: record descriptor */
|
||||
offset_t** offsets,/*!< out: offsets on *rec */
|
||||
rec_offs** offsets,/*!< out: offsets on *rec */
|
||||
mem_heap_t** heap, /*!< in/out: pointer to memory heap, or NULL */
|
||||
ulint n_ext, /*!< in: number of externally stored columns */
|
||||
mtr_t* mtr) /*!< in: mini-transaction handle, or NULL */
|
||||
@ -312,7 +312,7 @@ page_cur_rec_insert(
|
||||
page_cur_t* cursor, /*!< in/out: a page cursor */
|
||||
const rec_t* rec, /*!< in: record to insert */
|
||||
dict_index_t* index, /*!< in: record descriptor */
|
||||
offset_t* offsets,/*!< in/out: rec_get_offsets(rec, index) */
|
||||
rec_offs* offsets,/*!< in/out: rec_get_offsets(rec, index) */
|
||||
mtr_t* mtr) /*!< in: mini-transaction handle, or NULL */
|
||||
{
|
||||
if (buf_block_get_page_zip(cursor->block)) {
|
||||
|
@ -980,7 +980,7 @@ page_mem_free(
|
||||
rec_t* rec, /*!< in: pointer to the (origin of)
|
||||
record */
|
||||
const dict_index_t* index, /*!< in: index of rec */
|
||||
const offset_t* offsets);/*!< in: array returned by
|
||||
const rec_offs* offsets);/*!< in: array returned by
|
||||
rec_get_offsets() */
|
||||
|
||||
/** Read the PAGE_DIRECTION field from a byte.
|
||||
@ -1240,7 +1240,7 @@ void
|
||||
page_rec_print(
|
||||
/*===========*/
|
||||
const rec_t* rec, /*!< in: physical record */
|
||||
const offset_t* offsets);/*!< in: record descriptor */
|
||||
const rec_offs* offsets);/*!< in: record descriptor */
|
||||
# ifdef UNIV_BTR_PRINT
|
||||
/***************************************************************//**
|
||||
This is used to print the contents of the directory for
|
||||
@ -1287,7 +1287,7 @@ ibool
|
||||
page_rec_validate(
|
||||
/*==============*/
|
||||
const rec_t* rec, /*!< in: physical record */
|
||||
const offset_t* offsets);/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets);/*!< in: array returned by rec_get_offsets() */
|
||||
#ifdef UNIV_DEBUG
|
||||
/***************************************************************//**
|
||||
Checks that the first directory slot points to the infimum record and
|
||||
|
@ -1025,7 +1025,7 @@ page_mem_free(
|
||||
rec_t* rec, /*!< in: pointer to the
|
||||
(origin of) record */
|
||||
const dict_index_t* index, /*!< in: index of rec */
|
||||
const offset_t* offsets) /*!< in: array returned by
|
||||
const rec_offs* offsets) /*!< in: array returned by
|
||||
rec_get_offsets() */
|
||||
{
|
||||
rec_t* free;
|
||||
|
@ -185,7 +185,7 @@ page_zip_dir_delete(
|
||||
page_zip_des_t* page_zip,/*!< in/out: compressed page */
|
||||
byte* rec, /*!< in: deleted record */
|
||||
dict_index_t* index, /*!< in: index of rec */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(rec) */
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(rec) */
|
||||
const byte* free) /*!< in: previous start of the free list */
|
||||
MY_ATTRIBUTE((nonnull(1,2,3,4)));
|
||||
|
||||
|
@ -288,7 +288,7 @@ page_zip_write_rec(
|
||||
page_zip_des_t* page_zip,/*!< in/out: compressed page */
|
||||
const byte* rec, /*!< in: record being written */
|
||||
dict_index_t* index, /*!< in: the index the record belongs to */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
ulint create) /*!< in: nonzero=insert, zero=update */
|
||||
MY_ATTRIBUTE((nonnull));
|
||||
|
||||
@ -313,7 +313,7 @@ page_zip_write_blob_ptr(
|
||||
const byte* rec, /*!< in/out: record whose data is being
|
||||
written */
|
||||
dict_index_t* index, /*!< in: index of the page */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
ulint n, /*!< in: column index */
|
||||
mtr_t* mtr); /*!< in: mini-transaction handle,
|
||||
or NULL if no logging is needed */
|
||||
@ -352,7 +352,7 @@ void
|
||||
page_zip_write_trx_id_and_roll_ptr(
|
||||
page_zip_des_t* page_zip,
|
||||
byte* rec,
|
||||
const offset_t* offsets,
|
||||
const rec_offs* offsets,
|
||||
ulint trx_id_col,
|
||||
trx_id_t trx_id,
|
||||
roll_ptr_t roll_ptr,
|
||||
@ -373,7 +373,6 @@ page_zip_parse_write_trx_id(
|
||||
page_t* page,
|
||||
page_zip_des_t* page_zip)
|
||||
MY_ATTRIBUTE((nonnull(1,2), warn_unused_result));
|
||||
|
||||
/**********************************************************************//**
|
||||
Write the "deleted" flag of a record on a compressed page. The flag must
|
||||
already have been written on the uncompressed page. */
|
||||
@ -416,7 +415,7 @@ page_zip_dir_delete(
|
||||
page_zip_des_t* page_zip, /*!< in/out: compressed page */
|
||||
byte* rec, /*!< in: deleted record */
|
||||
const dict_index_t* index, /*!< in: index of rec */
|
||||
const offset_t* offsets, /*!< in: rec_get_offsets(rec) */
|
||||
const rec_offs* offsets, /*!< in: rec_get_offsets(rec) */
|
||||
const byte* free) /*!< in: previous start of
|
||||
the free list */
|
||||
MY_ATTRIBUTE((nonnull(1,2,3,4)));
|
||||
|
@ -89,7 +89,7 @@ cmp_dtuple_rec_with_gis(
|
||||
/*====================*/
|
||||
const dtuple_t* dtuple,
|
||||
const rec_t* rec,
|
||||
const offset_t* offsets,
|
||||
const rec_offs* offsets,
|
||||
page_cur_mode_t mode)
|
||||
MY_ATTRIBUTE((nonnull));
|
||||
|
||||
@ -105,7 +105,7 @@ int
|
||||
cmp_dtuple_rec_with_gis_internal(
|
||||
const dtuple_t* dtuple,
|
||||
const rec_t* rec,
|
||||
const offset_t* offsets);
|
||||
const rec_offs* offsets);
|
||||
|
||||
/** Compare a data tuple to a physical record.
|
||||
@param[in] dtuple data tuple
|
||||
@ -121,7 +121,7 @@ int
|
||||
cmp_dtuple_rec_with_match_low(
|
||||
const dtuple_t* dtuple,
|
||||
const rec_t* rec,
|
||||
const offset_t* offsets,
|
||||
const rec_offs* offsets,
|
||||
ulint n_cmp,
|
||||
ulint* matched_fields)
|
||||
MY_ATTRIBUTE((nonnull));
|
||||
@ -145,7 +145,7 @@ cmp_dtuple_rec_with_match_bytes(
|
||||
const dtuple_t* dtuple,
|
||||
const rec_t* rec,
|
||||
const dict_index_t* index,
|
||||
const offset_t* offsets,
|
||||
const rec_offs* offsets,
|
||||
ulint* matched_fields,
|
||||
ulint* matched_bytes)
|
||||
MY_ATTRIBUTE((warn_unused_result));
|
||||
@ -162,7 +162,7 @@ int
|
||||
cmp_dtuple_rec(
|
||||
const dtuple_t* dtuple,
|
||||
const rec_t* rec,
|
||||
const offset_t* offsets);
|
||||
const rec_offs* offsets);
|
||||
/**************************************************************//**
|
||||
Checks if a dtuple is a prefix of a record. The last field in dtuple
|
||||
is allowed to be a prefix of the corresponding field in the record.
|
||||
@ -172,7 +172,7 @@ cmp_dtuple_is_prefix_of_rec(
|
||||
/*========================*/
|
||||
const dtuple_t* dtuple, /*!< in: data tuple */
|
||||
const rec_t* rec, /*!< in: physical record */
|
||||
const offset_t* offsets);/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets);/*!< in: array returned by rec_get_offsets() */
|
||||
/** Compare two physical records that contain the same number of columns,
|
||||
none of which are stored externally.
|
||||
@retval positive if rec1 (including non-ordering columns) is greater than rec2
|
||||
@ -183,8 +183,8 @@ cmp_rec_rec_simple(
|
||||
/*===============*/
|
||||
const rec_t* rec1, /*!< in: physical record */
|
||||
const rec_t* rec2, /*!< in: physical record */
|
||||
const offset_t* offsets1,/*!< in: rec_get_offsets(rec1, ...) */
|
||||
const offset_t* offsets2,/*!< in: rec_get_offsets(rec2, ...) */
|
||||
const rec_offs* offsets1,/*!< in: rec_get_offsets(rec1, ...) */
|
||||
const rec_offs* offsets2,/*!< in: rec_get_offsets(rec2, ...) */
|
||||
const dict_index_t* index, /*!< in: data dictionary index */
|
||||
struct TABLE* table) /*!< in: MySQL table, for reporting
|
||||
duplicate key value if applicable,
|
||||
@ -211,8 +211,8 @@ int
|
||||
cmp_rec_rec(
|
||||
const rec_t* rec1,
|
||||
const rec_t* rec2,
|
||||
const offset_t* offsets1,
|
||||
const offset_t* offsets2,
|
||||
const rec_offs* offsets1,
|
||||
const rec_offs* offsets2,
|
||||
const dict_index_t* index,
|
||||
bool nulls_unequal = false,
|
||||
ulint* matched_fields = NULL)
|
||||
|
@ -92,25 +92,25 @@ The status is stored in the low-order bits. */
|
||||
|
||||
#ifndef UNIV_INNOCHECKSUM
|
||||
/** SQL null flag in a 1-byte offset of ROW_FORMAT=REDUNDANT records */
|
||||
static const offset_t REC_1BYTE_SQL_NULL_MASK= 0x80;
|
||||
static const rec_offs REC_1BYTE_SQL_NULL_MASK= 0x80;
|
||||
/** SQL null flag in a 2-byte offset of ROW_FORMAT=REDUNDANT records */
|
||||
static const offset_t REC_2BYTE_SQL_NULL_MASK= 0x8000;
|
||||
static const rec_offs REC_2BYTE_SQL_NULL_MASK= 0x8000;
|
||||
|
||||
/** In a 2-byte offset of ROW_FORMAT=REDUNDANT records, the second most
|
||||
significant bit denotes that the tail of a field is stored off-page. */
|
||||
static const offset_t REC_2BYTE_EXTERN_MASK= 0x4000;
|
||||
static const rec_offs REC_2BYTE_EXTERN_MASK= 0x4000;
|
||||
|
||||
static const size_t RECORD_OFFSET= 2;
|
||||
static const size_t INDEX_OFFSET=
|
||||
RECORD_OFFSET + sizeof(rec_t *) / sizeof(offset_t);
|
||||
RECORD_OFFSET + sizeof(rec_t *) / sizeof(rec_offs);
|
||||
#endif /* UNIV_INNOCHECKSUM */
|
||||
|
||||
/* Length of the rec_get_offsets() header */
|
||||
static const size_t REC_OFFS_HEADER_SIZE=
|
||||
#ifdef UNIV_DEBUG
|
||||
#ifndef UNIV_INNOCHECKSUM
|
||||
sizeof(rec_t *) / sizeof(offset_t) +
|
||||
sizeof(dict_index_t *) / sizeof(offset_t) +
|
||||
sizeof(rec_t *) / sizeof(rec_offs) +
|
||||
sizeof(dict_index_t *) / sizeof(rec_offs) +
|
||||
#endif /* UNIV_INNOCHECKSUM */
|
||||
#endif /* UNIV_DEBUG */
|
||||
2;
|
||||
@ -146,30 +146,30 @@ enum field_type_t
|
||||
};
|
||||
|
||||
/** without 2 upper bits */
|
||||
static const offset_t DATA_MASK= 0x3fff;
|
||||
static const rec_offs DATA_MASK= 0x3fff;
|
||||
/** 2 upper bits */
|
||||
static const offset_t TYPE_MASK= ~DATA_MASK;
|
||||
inline field_type_t get_type(offset_t n)
|
||||
static const rec_offs TYPE_MASK= ~DATA_MASK;
|
||||
inline field_type_t get_type(rec_offs n)
|
||||
{
|
||||
return static_cast<field_type_t>(n & TYPE_MASK);
|
||||
}
|
||||
inline void set_type(offset_t &n, field_type_t type)
|
||||
inline void set_type(rec_offs &n, field_type_t type)
|
||||
{
|
||||
n= (n & DATA_MASK) | static_cast<offset_t>(type);
|
||||
n= (n & DATA_MASK) | static_cast<rec_offs>(type);
|
||||
}
|
||||
inline offset_t get_value(offset_t n) { return n & DATA_MASK; }
|
||||
inline offset_t combine(offset_t value, field_type_t type)
|
||||
inline rec_offs get_value(rec_offs n) { return n & DATA_MASK; }
|
||||
inline rec_offs combine(rec_offs value, field_type_t type)
|
||||
{
|
||||
return get_value(value) | static_cast<offset_t>(type);
|
||||
return get_value(value) | static_cast<rec_offs>(type);
|
||||
}
|
||||
|
||||
/** Compact flag ORed to the extra size returned by rec_get_offsets() */
|
||||
const offset_t REC_OFFS_COMPACT= ~(offset_t(~0) >> 1);
|
||||
const rec_offs REC_OFFS_COMPACT= ~(rec_offs(~0) >> 1);
|
||||
/** External flag in offsets returned by rec_get_offsets() */
|
||||
const offset_t REC_OFFS_EXTERNAL= REC_OFFS_COMPACT >> 1;
|
||||
const rec_offs REC_OFFS_EXTERNAL= REC_OFFS_COMPACT >> 1;
|
||||
/** Default value flag in offsets returned by rec_get_offsets() */
|
||||
const offset_t REC_OFFS_DEFAULT= REC_OFFS_COMPACT >> 2;
|
||||
const offset_t REC_OFFS_MASK= REC_OFFS_DEFAULT - 1;
|
||||
const rec_offs REC_OFFS_DEFAULT= REC_OFFS_COMPACT >> 2;
|
||||
const rec_offs REC_OFFS_MASK= REC_OFFS_DEFAULT - 1;
|
||||
/******************************************************//**
|
||||
The following function is used to get the pointer of the next chained record
|
||||
on the same page.
|
||||
@ -559,11 +559,11 @@ rec_get_n_extern_new(
|
||||
(ULINT_UNDEFINED to compute all offsets)
|
||||
@param[in,out] heap memory heap
|
||||
@return the new offsets */
|
||||
offset_t*
|
||||
rec_offs*
|
||||
rec_get_offsets_func(
|
||||
const rec_t* rec,
|
||||
const dict_index_t* index,
|
||||
offset_t* offsets,
|
||||
rec_offs* offsets,
|
||||
bool leaf,
|
||||
ulint n_fields,
|
||||
#ifdef UNIV_DEBUG
|
||||
@ -598,7 +598,7 @@ rec_get_offsets_reverse(
|
||||
const dict_index_t* index, /*!< in: record descriptor */
|
||||
ulint node_ptr,/*!< in: nonzero=node pointer,
|
||||
0=leaf node */
|
||||
offset_t* offsets)/*!< in/out: array consisting of
|
||||
rec_offs* offsets)/*!< in/out: array consisting of
|
||||
offsets[0] allocated elements */
|
||||
MY_ATTRIBUTE((nonnull));
|
||||
#ifdef UNIV_DEBUG
|
||||
@ -611,7 +611,7 @@ bool
|
||||
rec_offs_validate(
|
||||
const rec_t* rec,
|
||||
const dict_index_t* index,
|
||||
const offset_t* offsets)
|
||||
const rec_offs* offsets)
|
||||
MY_ATTRIBUTE((nonnull(3), warn_unused_result));
|
||||
/** Update debug data in offsets, in order to tame rec_offs_validate().
|
||||
@param[in] rec record
|
||||
@ -623,7 +623,7 @@ rec_offs_make_valid(
|
||||
const rec_t* rec,
|
||||
const dict_index_t* index,
|
||||
bool leaf,
|
||||
offset_t* offsets)
|
||||
rec_offs* offsets)
|
||||
MY_ATTRIBUTE((nonnull));
|
||||
#else
|
||||
# define rec_offs_make_valid(rec, index, leaf, offsets)
|
||||
@ -660,10 +660,10 @@ The following function is used to get an offset to the nth
|
||||
data field in a record.
|
||||
@return offset from the origin of rec */
|
||||
UNIV_INLINE
|
||||
offset_t
|
||||
rec_offs
|
||||
rec_get_nth_field_offs(
|
||||
/*===================*/
|
||||
const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
ulint n, /*!< in: index of the field */
|
||||
ulint* len) /*!< out: length of the field; UNIV_SQL_NULL
|
||||
if SQL null */
|
||||
@ -678,7 +678,7 @@ const byte*
|
||||
rec_offs_any_null_extern(
|
||||
/*=====================*/
|
||||
const rec_t* rec, /*!< in: record */
|
||||
const offset_t* offsets) /*!< in: rec_get_offsets(rec) */
|
||||
const rec_offs* offsets) /*!< in: rec_get_offsets(rec) */
|
||||
MY_ATTRIBUTE((warn_unused_result));
|
||||
|
||||
/** Mark the nth field as externally stored.
|
||||
@ -686,7 +686,7 @@ rec_offs_any_null_extern(
|
||||
@param[in] n nth field */
|
||||
void
|
||||
rec_offs_make_nth_extern(
|
||||
offset_t* offsets,
|
||||
rec_offs* offsets,
|
||||
const ulint n);
|
||||
|
||||
/** Determine the number of allocated elements for an array of offsets.
|
||||
@ -694,7 +694,7 @@ rec_offs_make_nth_extern(
|
||||
@return number of elements */
|
||||
inline
|
||||
ulint
|
||||
rec_offs_get_n_alloc(const offset_t* offsets)
|
||||
rec_offs_get_n_alloc(const rec_offs* offsets)
|
||||
{
|
||||
ulint n_alloc;
|
||||
ut_ad(offsets);
|
||||
@ -709,7 +709,7 @@ rec_offs_get_n_alloc(const offset_t* offsets)
|
||||
@return number of fields */
|
||||
inline
|
||||
ulint
|
||||
rec_offs_n_fields(const offset_t* offsets)
|
||||
rec_offs_n_fields(const rec_offs* offsets)
|
||||
{
|
||||
ulint n_fields;
|
||||
ut_ad(offsets);
|
||||
@ -726,7 +726,7 @@ rec_offs_n_fields(const offset_t* offsets)
|
||||
@param[in] n nth field
|
||||
@param[in] flag flag to extract
|
||||
@return type of the record field */
|
||||
inline field_type_t rec_offs_nth_type(const offset_t *offsets, ulint n)
|
||||
inline field_type_t rec_offs_nth_type(const rec_offs *offsets, ulint n)
|
||||
{
|
||||
ut_ad(rec_offs_validate(NULL, NULL, offsets));
|
||||
ut_ad(n < rec_offs_n_fields(offsets));
|
||||
@ -738,7 +738,7 @@ inline field_type_t rec_offs_nth_type(const offset_t *offsets, ulint n)
|
||||
@param[in] offsets rec_get_offsets()
|
||||
@param[in] n nth field
|
||||
@return nonzero if default bit is set */
|
||||
inline ulint rec_offs_nth_default(const offset_t *offsets, ulint n)
|
||||
inline ulint rec_offs_nth_default(const rec_offs *offsets, ulint n)
|
||||
{
|
||||
return rec_offs_nth_type(offsets, n) == DEFAULT;
|
||||
}
|
||||
@ -748,7 +748,7 @@ inline ulint rec_offs_nth_default(const offset_t *offsets, ulint n)
|
||||
@param[in] offsets rec_get_offsets()
|
||||
@param[in] n nth field
|
||||
@return nonzero if SQL NULL set */
|
||||
inline ulint rec_offs_nth_sql_null(const offset_t *offsets, ulint n)
|
||||
inline ulint rec_offs_nth_sql_null(const rec_offs *offsets, ulint n)
|
||||
{
|
||||
return rec_offs_nth_type(offsets, n) == SQL_NULL;
|
||||
}
|
||||
@ -758,7 +758,7 @@ inline ulint rec_offs_nth_sql_null(const offset_t *offsets, ulint n)
|
||||
@param[in] n nth field
|
||||
Returns nonzero if the extern bit is set in nth field of rec.
|
||||
@return nonzero if externally stored */
|
||||
inline ulint rec_offs_nth_extern(const offset_t *offsets, ulint n)
|
||||
inline ulint rec_offs_nth_extern(const rec_offs *offsets, ulint n)
|
||||
{
|
||||
return rec_offs_nth_type(offsets, n) == STORED_OFFPAGE;
|
||||
}
|
||||
@ -767,7 +767,7 @@ inline ulint rec_offs_nth_extern(const offset_t *offsets, ulint n)
|
||||
@param[in] offsets rec_get_offsets()
|
||||
@param[in] flag flag to extract
|
||||
@return the flag of the record field */
|
||||
inline ulint rec_offs_any_flag(const offset_t *offsets, ulint flag)
|
||||
inline ulint rec_offs_any_flag(const rec_offs *offsets, ulint flag)
|
||||
{
|
||||
ut_ad(rec_offs_validate(NULL, NULL, offsets));
|
||||
return *rec_offs_base(offsets) & flag;
|
||||
@ -776,7 +776,7 @@ inline ulint rec_offs_any_flag(const offset_t *offsets, ulint flag)
|
||||
/** Determine if the offsets are for a record containing off-page columns.
|
||||
@param[in] offsets rec_get_offsets()
|
||||
@return nonzero if any off-page columns exist */
|
||||
inline bool rec_offs_any_extern(const offset_t *offsets)
|
||||
inline bool rec_offs_any_extern(const rec_offs *offsets)
|
||||
{
|
||||
return rec_offs_any_flag(offsets, REC_OFFS_EXTERNAL);
|
||||
}
|
||||
@ -785,7 +785,7 @@ inline bool rec_offs_any_extern(const offset_t *offsets)
|
||||
@param[in] offsets rec_get_offsets()
|
||||
@return nonzero if any fields need to be replaced with
|
||||
dict_index_t::instant_field_value() */
|
||||
inline ulint rec_offs_any_default(const offset_t *offsets)
|
||||
inline ulint rec_offs_any_default(const rec_offs *offsets)
|
||||
{
|
||||
return rec_offs_any_flag(offsets, REC_OFFS_DEFAULT);
|
||||
}
|
||||
@ -794,7 +794,7 @@ inline ulint rec_offs_any_default(const offset_t *offsets)
|
||||
@param[in] offsets rec_get_offsets()
|
||||
@return nonzero if ROW_FORMAT is COMPACT,DYNAMIC or COMPRESSED
|
||||
@retval 0 if ROW_FORMAT=REDUNDANT */
|
||||
inline ulint rec_offs_comp(const offset_t *offsets)
|
||||
inline ulint rec_offs_comp(const rec_offs *offsets)
|
||||
{
|
||||
ut_ad(rec_offs_validate(NULL, NULL, offsets));
|
||||
return (*rec_offs_base(offsets) & REC_OFFS_COMPACT);
|
||||
@ -827,7 +827,7 @@ const byte*
|
||||
rec_get_nth_cfield(
|
||||
const rec_t* rec,
|
||||
const dict_index_t* index,
|
||||
const offset_t* offsets,
|
||||
const rec_offs* offsets,
|
||||
ulint n,
|
||||
ulint* len)
|
||||
{
|
||||
@ -845,7 +845,7 @@ UNIV_INLINE
|
||||
ulint
|
||||
rec_offs_nth_size(
|
||||
/*==============*/
|
||||
const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
ulint n) /*!< in: nth field */
|
||||
MY_ATTRIBUTE((warn_unused_result));
|
||||
|
||||
@ -856,7 +856,7 @@ UNIV_INLINE
|
||||
ulint
|
||||
rec_offs_n_extern(
|
||||
/*==============*/
|
||||
const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
MY_ATTRIBUTE((warn_unused_result));
|
||||
/***********************************************************//**
|
||||
This is used to modify the value of an already existing field in a record.
|
||||
@ -869,7 +869,7 @@ void
|
||||
rec_set_nth_field(
|
||||
/*==============*/
|
||||
rec_t* rec, /*!< in: record */
|
||||
const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
ulint n, /*!< in: index number of the field */
|
||||
const void* data, /*!< in: pointer to the data if not SQL null */
|
||||
ulint len) /*!< in: length of the data or UNIV_SQL_NULL.
|
||||
@ -897,7 +897,7 @@ UNIV_INLINE
|
||||
void
|
||||
rec_offs_set_n_alloc(
|
||||
/*=================*/
|
||||
offset_t*offsets, /*!< out: array for rec_get_offsets(),
|
||||
rec_offs*offsets, /*!< out: array for rec_get_offsets(),
|
||||
must be allocated */
|
||||
ulint n_alloc) /*!< in: number of elements */
|
||||
MY_ATTRIBUTE((nonnull));
|
||||
@ -913,7 +913,7 @@ UNIV_INLINE
|
||||
ulint
|
||||
rec_offs_data_size(
|
||||
/*===============*/
|
||||
const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
MY_ATTRIBUTE((warn_unused_result));
|
||||
/**********************************************************//**
|
||||
Returns the total size of record minus data size of record.
|
||||
@ -924,7 +924,7 @@ UNIV_INLINE
|
||||
ulint
|
||||
rec_offs_extra_size(
|
||||
/*================*/
|
||||
const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
MY_ATTRIBUTE((warn_unused_result));
|
||||
/**********************************************************//**
|
||||
Returns the total size of a physical record.
|
||||
@ -933,7 +933,7 @@ UNIV_INLINE
|
||||
ulint
|
||||
rec_offs_size(
|
||||
/*==========*/
|
||||
const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
MY_ATTRIBUTE((warn_unused_result));
|
||||
#ifdef UNIV_DEBUG
|
||||
/**********************************************************//**
|
||||
@ -944,7 +944,7 @@ byte*
|
||||
rec_get_start(
|
||||
/*==========*/
|
||||
const rec_t* rec, /*!< in: pointer to record */
|
||||
const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
MY_ATTRIBUTE((warn_unused_result));
|
||||
/**********************************************************//**
|
||||
Returns a pointer to the end of the record.
|
||||
@ -954,7 +954,7 @@ byte*
|
||||
rec_get_end(
|
||||
/*========*/
|
||||
const rec_t* rec, /*!< in: pointer to record */
|
||||
const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
MY_ATTRIBUTE((warn_unused_result));
|
||||
#else /* UNIV_DEBUG */
|
||||
# define rec_get_start(rec, offsets) ((rec) - rec_offs_extra_size(offsets))
|
||||
@ -971,7 +971,7 @@ rec_t*
|
||||
rec_copy(
|
||||
void* buf,
|
||||
const rec_t* rec,
|
||||
const offset_t* offsets);
|
||||
const rec_offs* offsets);
|
||||
|
||||
/** Determine the size of a data tuple prefix in a temporary file.
|
||||
@param[in] index clustered or secondary index
|
||||
@ -1000,7 +1000,7 @@ void
|
||||
rec_init_offsets_temp(
|
||||
const rec_t* rec,
|
||||
const dict_index_t* index,
|
||||
offset_t* offsets,
|
||||
rec_offs* offsets,
|
||||
ulint n_core,
|
||||
const dict_col_t::def_t*def_val,
|
||||
rec_comp_status_t status = REC_STATUS_ORDINARY)
|
||||
@ -1014,7 +1014,7 @@ void
|
||||
rec_init_offsets_temp(
|
||||
const rec_t* rec,
|
||||
const dict_index_t* index,
|
||||
offset_t* offsets)
|
||||
rec_offs* offsets)
|
||||
MY_ATTRIBUTE((nonnull));
|
||||
|
||||
/** Convert a data tuple prefix to the temporary file format.
|
||||
@ -1136,7 +1136,7 @@ ibool
|
||||
rec_validate(
|
||||
/*=========*/
|
||||
const rec_t* rec, /*!< in: physical record */
|
||||
const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
MY_ATTRIBUTE((nonnull));
|
||||
/***************************************************************//**
|
||||
Prints an old-style physical record. */
|
||||
@ -1153,7 +1153,7 @@ rec_print_mbr_rec(
|
||||
/*==========*/
|
||||
FILE* file, /*!< in: file where to print */
|
||||
const rec_t* rec, /*!< in: physical record */
|
||||
const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
MY_ATTRIBUTE((nonnull));
|
||||
/***************************************************************//**
|
||||
Prints a physical record. */
|
||||
@ -1162,7 +1162,7 @@ rec_print_new(
|
||||
/*==========*/
|
||||
FILE* file, /*!< in: file where to print */
|
||||
const rec_t* rec, /*!< in: physical record */
|
||||
const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
MY_ATTRIBUTE((nonnull));
|
||||
/***************************************************************//**
|
||||
Prints a physical record. */
|
||||
@ -1184,7 +1184,7 @@ rec_print(
|
||||
std::ostream& o,
|
||||
const rec_t* rec,
|
||||
ulint info,
|
||||
const offset_t* offsets);
|
||||
const rec_offs* offsets);
|
||||
|
||||
/** Wrapper for pretty-printing a record */
|
||||
struct rec_index_print
|
||||
@ -1211,14 +1211,14 @@ operator<<(std::ostream& o, const rec_index_print& r);
|
||||
struct rec_offsets_print
|
||||
{
|
||||
/** Constructor */
|
||||
rec_offsets_print(const rec_t* rec, const offset_t* offsets) :
|
||||
rec_offsets_print(const rec_t* rec, const rec_offs* offsets) :
|
||||
m_rec(rec), m_offsets(offsets)
|
||||
{}
|
||||
|
||||
/** Record */
|
||||
const rec_t* m_rec;
|
||||
/** Offsets to each field */
|
||||
const offset_t* m_offsets;
|
||||
const rec_offs* m_offsets;
|
||||
};
|
||||
|
||||
/** Display a record.
|
||||
@ -1235,7 +1235,7 @@ public:
|
||||
/** Construct a pretty-printed record.
|
||||
@param rec record with header
|
||||
@param offsets rec_get_offsets(rec, ...) */
|
||||
rec_printer(const rec_t* rec, const offset_t* offsets)
|
||||
rec_printer(const rec_t* rec, const rec_offs* offsets)
|
||||
:
|
||||
std::ostringstream ()
|
||||
{
|
||||
@ -1248,7 +1248,7 @@ public:
|
||||
@param rec record, possibly lacking header
|
||||
@param info rec_get_info_bits(rec)
|
||||
@param offsets rec_get_offsets(rec, ...) */
|
||||
rec_printer(const rec_t* rec, ulint info, const offset_t* offsets)
|
||||
rec_printer(const rec_t* rec, ulint info, const rec_offs* offsets)
|
||||
:
|
||||
std::ostringstream ()
|
||||
{
|
||||
|
@ -868,13 +868,13 @@ UNIV_INLINE
|
||||
void
|
||||
rec_offs_set_n_alloc(
|
||||
/*=================*/
|
||||
offset_t*offsets, /*!< out: array for rec_get_offsets(),
|
||||
rec_offs*offsets, /*!< out: array for rec_get_offsets(),
|
||||
must be allocated */
|
||||
ulint n_alloc) /*!< in: number of elements */
|
||||
{
|
||||
ut_ad(n_alloc > REC_OFFS_HEADER_SIZE);
|
||||
UNIV_MEM_ALLOC(offsets, n_alloc * sizeof *offsets);
|
||||
offsets[0] = static_cast<offset_t>(n_alloc);
|
||||
offsets[0] = static_cast<rec_offs>(n_alloc);
|
||||
}
|
||||
|
||||
/************************************************************//**
|
||||
@ -882,18 +882,18 @@ The following function is used to get an offset to the nth
|
||||
data field in a record.
|
||||
@return offset from the origin of rec */
|
||||
UNIV_INLINE
|
||||
offset_t
|
||||
rec_offs
|
||||
rec_get_nth_field_offs(
|
||||
/*===================*/
|
||||
const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
ulint n, /*!< in: index of the field */
|
||||
ulint* len) /*!< out: length of the field; UNIV_SQL_NULL
|
||||
if SQL null; UNIV_SQL_DEFAULT is default value */
|
||||
{
|
||||
ut_ad(n < rec_offs_n_fields(offsets));
|
||||
|
||||
offset_t offs = n == 0 ? 0 : get_value(rec_offs_base(offsets)[n]);
|
||||
offset_t next_offs = rec_offs_base(offsets)[1 + n];
|
||||
rec_offs offs = n == 0 ? 0 : get_value(rec_offs_base(offsets)[n]);
|
||||
rec_offs next_offs = rec_offs_base(offsets)[1 + n];
|
||||
|
||||
if (get_type(next_offs) == SQL_NULL) {
|
||||
*len = UNIV_SQL_NULL;
|
||||
@ -914,7 +914,7 @@ const byte*
|
||||
rec_offs_any_null_extern(
|
||||
/*=====================*/
|
||||
const rec_t* rec, /*!< in: record */
|
||||
const offset_t* offsets) /*!< in: rec_get_offsets(rec) */
|
||||
const rec_offs* offsets) /*!< in: rec_get_offsets(rec) */
|
||||
{
|
||||
ulint i;
|
||||
ut_ad(rec_offs_validate(rec, NULL, offsets));
|
||||
@ -949,7 +949,7 @@ UNIV_INLINE
|
||||
ulint
|
||||
rec_offs_nth_size(
|
||||
/*==============*/
|
||||
const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
ulint n) /*!< in: nth field */
|
||||
{
|
||||
ut_ad(rec_offs_validate(NULL, NULL, offsets));
|
||||
@ -968,7 +968,7 @@ UNIV_INLINE
|
||||
ulint
|
||||
rec_offs_n_extern(
|
||||
/*==============*/
|
||||
const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
{
|
||||
ulint n = 0;
|
||||
|
||||
@ -1166,7 +1166,7 @@ void
|
||||
rec_set_nth_field(
|
||||
/*==============*/
|
||||
rec_t* rec, /*!< in: record */
|
||||
const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
ulint n, /*!< in: index number of the field */
|
||||
const void* data, /*!< in: pointer to the data
|
||||
if not SQL null */
|
||||
@ -1222,7 +1222,7 @@ UNIV_INLINE
|
||||
void
|
||||
rec_offs_set_n_fields(
|
||||
/*==================*/
|
||||
offset_t* offsets, /*!< in/out: array returned by
|
||||
rec_offs* offsets, /*!< in/out: array returned by
|
||||
rec_get_offsets() */
|
||||
ulint n_fields) /*!< in: number of fields */
|
||||
{
|
||||
@ -1231,7 +1231,7 @@ rec_offs_set_n_fields(
|
||||
ut_ad(n_fields <= REC_MAX_N_FIELDS);
|
||||
ut_ad(n_fields + REC_OFFS_HEADER_SIZE
|
||||
<= rec_offs_get_n_alloc(offsets));
|
||||
offsets[1] = static_cast<offset_t>(n_fields);
|
||||
offsets[1] = static_cast<rec_offs>(n_fields);
|
||||
}
|
||||
|
||||
/**********************************************************//**
|
||||
@ -1244,7 +1244,7 @@ UNIV_INLINE
|
||||
ulint
|
||||
rec_offs_data_size(
|
||||
/*===============*/
|
||||
const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
{
|
||||
ulint size;
|
||||
|
||||
@ -1263,7 +1263,7 @@ UNIV_INLINE
|
||||
ulint
|
||||
rec_offs_extra_size(
|
||||
/*================*/
|
||||
const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
{
|
||||
ulint size;
|
||||
ut_ad(rec_offs_validate(NULL, NULL, offsets));
|
||||
@ -1279,7 +1279,7 @@ UNIV_INLINE
|
||||
ulint
|
||||
rec_offs_size(
|
||||
/*==========*/
|
||||
const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
{
|
||||
return(rec_offs_data_size(offsets) + rec_offs_extra_size(offsets));
|
||||
}
|
||||
@ -1293,7 +1293,7 @@ byte*
|
||||
rec_get_end(
|
||||
/*========*/
|
||||
const rec_t* rec, /*!< in: pointer to record */
|
||||
const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
{
|
||||
ut_ad(rec_offs_validate(rec, NULL, offsets));
|
||||
return(const_cast<rec_t*>(rec + rec_offs_data_size(offsets)));
|
||||
@ -1307,7 +1307,7 @@ byte*
|
||||
rec_get_start(
|
||||
/*==========*/
|
||||
const rec_t* rec, /*!< in: pointer to record */
|
||||
const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
{
|
||||
ut_ad(rec_offs_validate(rec, NULL, offsets));
|
||||
return(const_cast<rec_t*>(rec - rec_offs_extra_size(offsets)));
|
||||
@ -1324,7 +1324,7 @@ rec_t*
|
||||
rec_copy(
|
||||
void* buf,
|
||||
const rec_t* rec,
|
||||
const offset_t* offsets)
|
||||
const rec_offs* offsets)
|
||||
{
|
||||
ulint extra_len;
|
||||
ulint data_len;
|
||||
|
@ -31,7 +31,7 @@ Created 5/30/1994 Heikki Tuuri
|
||||
typedef byte rec_t;
|
||||
|
||||
/** This type represents a field offset in a rec_t* */
|
||||
typedef unsigned short int offset_t;
|
||||
typedef unsigned short int rec_offs;
|
||||
|
||||
/* Maximum values for various fields (for non-blob tuples) */
|
||||
#define REC_MAX_N_FIELDS (1024 - 1)
|
||||
|
@ -251,7 +251,7 @@ row_merge_fts_sel_propagate(
|
||||
int* sel_tree, /*<! in: selection tree */
|
||||
ulint level, /*<! in: selection tree level */
|
||||
const mrec_t** mrec, /*<! in: sort record */
|
||||
offset_t** offsets, /*<! in: record offsets */
|
||||
rec_offs** offsets, /*<! in: record offsets */
|
||||
dict_index_t* index); /*<! in: FTS index */
|
||||
/********************************************************************//**
|
||||
Read sorted file containing index data tuples and insert these data
|
||||
|
@ -136,7 +136,7 @@ row_log_table_delete(
|
||||
page X-latched */
|
||||
dict_index_t* index, /*!< in/out: clustered index, S-latched
|
||||
or X-latched */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(rec,index) */
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(rec,index) */
|
||||
const byte* sys) /*!< in: DB_TRX_ID,DB_ROLL_PTR that should
|
||||
be logged, or NULL to use those in rec */
|
||||
ATTRIBUTE_COLD __attribute__((nonnull(1,2,3)));
|
||||
@ -151,7 +151,7 @@ row_log_table_update(
|
||||
page X-latched */
|
||||
dict_index_t* index, /*!< in/out: clustered index, S-latched
|
||||
or X-latched */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(rec,index) */
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(rec,index) */
|
||||
const dtuple_t* old_pk);/*!< in: row_log_table_get_pk()
|
||||
before the update */
|
||||
|
||||
@ -167,7 +167,7 @@ row_log_table_get_pk(
|
||||
page X-latched */
|
||||
dict_index_t* index, /*!< in/out: clustered index, S-latched
|
||||
or X-latched */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(rec,index),
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(rec,index),
|
||||
or NULL */
|
||||
byte* sys, /*!< out: DB_TRX_ID,DB_ROLL_PTR for
|
||||
row_log_table_delete(), or NULL */
|
||||
@ -184,7 +184,7 @@ row_log_table_insert(
|
||||
page X-latched */
|
||||
dict_index_t* index, /*!< in/out: clustered index, S-latched
|
||||
or X-latched */
|
||||
const offset_t* offsets);/*!< in: rec_get_offsets(rec,index) */
|
||||
const rec_offs* offsets);/*!< in: rec_get_offsets(rec,index) */
|
||||
/******************************************************//**
|
||||
Notes that a BLOB is being freed during online ALTER TABLE. */
|
||||
void
|
||||
|
@ -477,7 +477,7 @@ row_merge_read_rec(
|
||||
const mrec_t** mrec, /*!< out: pointer to merge record,
|
||||
or NULL on end of list
|
||||
(non-NULL on I/O error) */
|
||||
offset_t* offsets,/*!< out: offsets of mrec */
|
||||
rec_offs* offsets,/*!< out: offsets of mrec */
|
||||
row_merge_block_t* crypt_block, /*!< in: crypt buf or NULL */
|
||||
ulint space) /*!< in: space id */
|
||||
MY_ATTRIBUTE((warn_unused_result));
|
||||
|
@ -44,7 +44,7 @@ ulint
|
||||
row_get_trx_id_offset(
|
||||
/*==================*/
|
||||
const dict_index_t* index, /*!< in: clustered index */
|
||||
const offset_t* offsets)/*!< in: record offsets */
|
||||
const rec_offs* offsets)/*!< in: record offsets */
|
||||
MY_ATTRIBUTE((nonnull, warn_unused_result));
|
||||
/*********************************************************************//**
|
||||
Reads the trx id field from a clustered index record.
|
||||
@ -55,7 +55,7 @@ row_get_rec_trx_id(
|
||||
/*===============*/
|
||||
const rec_t* rec, /*!< in: record */
|
||||
const dict_index_t* index, /*!< in: clustered index */
|
||||
const offset_t* offsets)/*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets)/*!< in: rec_get_offsets(rec, index) */
|
||||
MY_ATTRIBUTE((nonnull, warn_unused_result));
|
||||
/*********************************************************************//**
|
||||
Reads the roll pointer field from a clustered index record.
|
||||
@ -66,7 +66,7 @@ row_get_rec_roll_ptr(
|
||||
/*=================*/
|
||||
const rec_t* rec, /*!< in: record */
|
||||
const dict_index_t* index, /*!< in: clustered index */
|
||||
const offset_t* offsets)/*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets)/*!< in: rec_get_offsets(rec, index) */
|
||||
MY_ATTRIBUTE((nonnull, warn_unused_result));
|
||||
|
||||
/* Flags for row build type. */
|
||||
@ -138,7 +138,7 @@ row_build(
|
||||
this record must be at least
|
||||
s-latched and the latch held
|
||||
as long as the row dtuple is used! */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(rec,index)
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(rec,index)
|
||||
or NULL, in which case this function
|
||||
will invoke rec_get_offsets() */
|
||||
const dict_table_t* col_table,
|
||||
@ -189,7 +189,7 @@ row_build_w_add_vcol(
|
||||
ulint type,
|
||||
const dict_index_t* index,
|
||||
const rec_t* rec,
|
||||
const offset_t* offsets,
|
||||
const rec_offs* offsets,
|
||||
const dict_table_t* col_table,
|
||||
const dtuple_t* defaults,
|
||||
const dict_add_v_col_t* add_v,
|
||||
@ -206,7 +206,7 @@ row_rec_to_index_entry_low(
|
||||
/*=======================*/
|
||||
const rec_t* rec, /*!< in: record in the index */
|
||||
const dict_index_t* index, /*!< in: index */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
mem_heap_t* heap) /*!< in: memory heap from which
|
||||
the memory needed is allocated */
|
||||
MY_ATTRIBUTE((warn_unused_result));
|
||||
@ -219,7 +219,7 @@ row_rec_to_index_entry(
|
||||
/*===================*/
|
||||
const rec_t* rec, /*!< in: record in the index */
|
||||
const dict_index_t* index, /*!< in: index */
|
||||
const offset_t* offsets,/*!< in/out: rec_get_offsets(rec) */
|
||||
const rec_offs* offsets,/*!< in/out: rec_get_offsets(rec) */
|
||||
mem_heap_t* heap) /*!< in: memory heap from which
|
||||
the memory needed is allocated */
|
||||
MY_ATTRIBUTE((warn_unused_result));
|
||||
@ -262,7 +262,7 @@ row_build_row_ref_in_tuple(
|
||||
held as long as the row
|
||||
reference is used! */
|
||||
const dict_index_t* index, /*!< in: secondary index */
|
||||
offset_t* offsets)/*!< in: rec_get_offsets(rec, index)
|
||||
rec_offs* offsets)/*!< in: rec_get_offsets(rec, index)
|
||||
or NULL */
|
||||
MY_ATTRIBUTE((nonnull(1,2,3)));
|
||||
/*******************************************************************//**
|
||||
@ -280,7 +280,7 @@ row_build_row_ref_fast(
|
||||
const rec_t* rec, /*!< in: secondary index record;
|
||||
must be preserved while ref is used, as we do
|
||||
not copy field values to heap */
|
||||
const offset_t* offsets);/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets);/*!< in: array returned by rec_get_offsets() */
|
||||
/***************************************************************//**
|
||||
Searches the clustered index record for a row, if we have the row
|
||||
reference.
|
||||
|
@ -37,7 +37,7 @@ ulint
|
||||
row_get_trx_id_offset(
|
||||
/*==================*/
|
||||
const dict_index_t* index, /*!< in: clustered index */
|
||||
const offset_t* offsets)/*!< in: record offsets */
|
||||
const rec_offs* offsets)/*!< in: record offsets */
|
||||
{
|
||||
ulint pos;
|
||||
ulint offset;
|
||||
@ -64,7 +64,7 @@ row_get_rec_trx_id(
|
||||
/*===============*/
|
||||
const rec_t* rec, /*!< in: record */
|
||||
const dict_index_t* index, /*!< in: clustered index */
|
||||
const offset_t* offsets)/*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets)/*!< in: rec_get_offsets(rec, index) */
|
||||
{
|
||||
ulint offset;
|
||||
|
||||
@ -89,7 +89,7 @@ row_get_rec_roll_ptr(
|
||||
/*=================*/
|
||||
const rec_t* rec, /*!< in: record */
|
||||
const dict_index_t* index, /*!< in: clustered index */
|
||||
const offset_t* offsets)/*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets)/*!< in: rec_get_offsets(rec, index) */
|
||||
{
|
||||
ulint offset;
|
||||
|
||||
@ -148,7 +148,7 @@ row_build_row_ref_fast(
|
||||
const rec_t* rec, /*!< in: secondary index record;
|
||||
must be preserved while ref is used, as we do
|
||||
not copy field values to heap */
|
||||
const offset_t* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets)/*!< in: array returned by rec_get_offsets() */
|
||||
{
|
||||
dfield_t* dfield;
|
||||
const byte* field;
|
||||
|
@ -124,7 +124,7 @@ row_upd_rec_sys_fields(
|
||||
page_zip_des_t* page_zip,/*!< in/out: compressed page whose
|
||||
uncompressed part will be updated, or NULL */
|
||||
dict_index_t* index, /*!< in: clustered index */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
const trx_t* trx, /*!< in: transaction */
|
||||
roll_ptr_t roll_ptr);/*!< in: DB_ROLL_PTR to the undo log */
|
||||
/*********************************************************************//**
|
||||
@ -166,7 +166,7 @@ ibool
|
||||
row_upd_changes_field_size_or_external(
|
||||
/*===================================*/
|
||||
dict_index_t* index, /*!< in: index */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
const upd_t* update);/*!< in: update vector */
|
||||
/***********************************************************//**
|
||||
Returns true if row update contains disowned external fields.
|
||||
@ -187,7 +187,7 @@ row_upd_rec_in_place(
|
||||
/*=================*/
|
||||
rec_t* rec, /*!< in/out: record where replaced */
|
||||
dict_index_t* index, /*!< in: the index the record belongs to */
|
||||
const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
const upd_t* update, /*!< in: update vector */
|
||||
page_zip_des_t* page_zip);/*!< in: compressed page with enough space
|
||||
available, or NULL */
|
||||
@ -202,7 +202,7 @@ row_upd_build_sec_rec_difference_binary(
|
||||
/*====================================*/
|
||||
const rec_t* rec, /*!< in: secondary index record */
|
||||
dict_index_t* index, /*!< in: index */
|
||||
const offset_t* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
const rec_offs* offsets,/*!< in: rec_get_offsets(rec, index) */
|
||||
const dtuple_t* entry, /*!< in: entry to insert */
|
||||
mem_heap_t* heap) /*!< in: memory heap from which allocated */
|
||||
MY_ATTRIBUTE((warn_unused_result, nonnull));
|
||||
@ -228,7 +228,7 @@ row_upd_build_difference_binary(
|
||||
dict_index_t* index,
|
||||
const dtuple_t* entry,
|
||||
const rec_t* rec,
|
||||
const offset_t* offsets,
|
||||
const rec_offs* offsets,
|
||||
bool no_sys,
|
||||
trx_t* trx,
|
||||
mem_heap_t* heap,
|
||||
@ -390,7 +390,7 @@ row_upd_rec_sys_fields_in_recovery(
|
||||
/*===============================*/
|
||||
rec_t* rec, /*!< in/out: record */
|
||||
page_zip_des_t* page_zip,/*!< in/out: compressed page, or NULL */
|
||||
const offset_t* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
const rec_offs* offsets,/*!< in: array returned by rec_get_offsets() */
|
||||
ulint pos, /*!< in: TRX_ID position in rec */
|
||||
trx_id_t trx_id, /*!< in: transaction id */
|
||||
roll_ptr_t roll_ptr);/*!< in: roll ptr of the undo log record */
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user