Merge branch '10.1' into 10.2
This commit is contained in:
commit
ca091e6372
@ -32,7 +32,7 @@
|
|||||||
** master/autocommit code by Brian Aker <brian@tangent.org>
|
** master/autocommit code by Brian Aker <brian@tangent.org>
|
||||||
** SSL by
|
** SSL by
|
||||||
** Andrei Errapart <andreie@no.spam.ee>
|
** 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
|
** XML by Gary Huntress <ghuntress@mediaone.net> 10/10/01, cleaned up
|
||||||
** and adapted to mysqldump 05/11/01 by Jani Tolonen
|
** and adapted to mysqldump 05/11/01 by Jani Tolonen
|
||||||
** Added --single-transaction option 06/06/2002 by Peter Zaitsev
|
** Added --single-transaction option 06/06/2002 by Peter Zaitsev
|
||||||
|
@ -55,7 +55,7 @@ typedef struct st_queue {
|
|||||||
#define queue_top(queue) ((queue)->root[1])
|
#define queue_top(queue) ((queue)->root[1])
|
||||||
#define queue_element(queue,index) ((queue)->root[index])
|
#define queue_element(queue,index) ((queue)->root[index])
|
||||||
#define queue_end(queue) ((queue)->root[(queue)->elements])
|
#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_cmp_arg(queue, set_arg) (queue)->first_cmp_arg= set_arg
|
||||||
#define queue_set_max_at_top(queue, set_arg) \
|
#define queue_set_max_at_top(queue, set_arg) \
|
||||||
(queue)->max_at_top= set_arg ? -1 : 1
|
(queue)->max_at_top= set_arg ? -1 : 1
|
||||||
@ -63,23 +63,23 @@ typedef struct st_queue {
|
|||||||
typedef int (*queue_compare)(void *,uchar *, uchar *);
|
typedef int (*queue_compare)(void *,uchar *, uchar *);
|
||||||
|
|
||||||
int init_queue(QUEUE *queue,uint max_elements,uint offset_to_key,
|
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,
|
void *first_cmp_arg, uint offset_to_queue_pos,
|
||||||
uint auto_extent);
|
uint auto_extent);
|
||||||
int reinit_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, queue_compare compare,
|
my_bool max_at_top, queue_compare compare,
|
||||||
void *first_cmp_arg, uint offset_to_queue_pos,
|
void *first_cmp_arg, uint offset_to_queue_pos,
|
||||||
uint auto_extent);
|
uint auto_extent);
|
||||||
int resize_queue(QUEUE *queue, uint max_elements);
|
int resize_queue(QUEUE *queue, uint max_elements);
|
||||||
void delete_queue(QUEUE *queue);
|
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);
|
int queue_insert_safe(QUEUE *queue, uchar *element);
|
||||||
uchar *queue_remove(QUEUE *queue,uint idx);
|
uchar *queue_remove(QUEUE *queue,uint idx);
|
||||||
void queue_replace(QUEUE *queue,uint idx);
|
void queue_replace(QUEUE *queue,uint idx);
|
||||||
|
|
||||||
#define queue_remove_all(queue) { (queue)->elements= 0; }
|
#define queue_remove_all(queue) { (queue)->elements= 0; }
|
||||||
#define queue_is_full(queue) (queue->elements == queue->max_elements)
|
#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);
|
void queue_fix(QUEUE *queue);
|
||||||
#define is_queue_inited(queue) ((queue)->root != 0)
|
#define is_queue_inited(queue) ((queue)->root != 0)
|
||||||
|
|
||||||
|
@ -206,7 +206,7 @@ int main(int argc, const char** argv )
|
|||||||
} else {
|
} else {
|
||||||
if (strcmp(arg, "--verbose") == 0)
|
if (strcmp(arg, "--verbose") == 0)
|
||||||
verbose++;
|
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 */
|
/* Override parent_pid with a value provided by user */
|
||||||
const char* start;
|
const char* start;
|
||||||
|
@ -369,6 +369,32 @@ my $opt_stop_keep_alive= $ENV{MTR_STOP_KEEP_ALIVE};
|
|||||||
select(STDOUT);
|
select(STDOUT);
|
||||||
$| = 1; # Automatically flush 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();
|
main();
|
||||||
|
|
||||||
sub have_wsrep() {
|
sub have_wsrep() {
|
||||||
@ -1039,7 +1065,7 @@ sub run_test_server ($$$) {
|
|||||||
delete $next->{reserved};
|
delete $next->{reserved};
|
||||||
}
|
}
|
||||||
|
|
||||||
xterm_stat(scalar(@$tests));
|
titlebar_stat(scalar(@$tests)) if $set_titlebar;
|
||||||
|
|
||||||
if ($next) {
|
if ($next) {
|
||||||
# We don't need this any more
|
# We don't need this any more
|
||||||
@ -6639,8 +6665,7 @@ sub time_format($) {
|
|||||||
|
|
||||||
our $num_tests;
|
our $num_tests;
|
||||||
|
|
||||||
sub xterm_stat {
|
sub titlebar_stat {
|
||||||
if (-t STDOUT and defined $ENV{TERM} and $ENV{TERM} =~ /xterm/) {
|
|
||||||
my ($left) = @_;
|
my ($left) = @_;
|
||||||
|
|
||||||
# 2.5 -> best by test
|
# 2.5 -> best by test
|
||||||
@ -6649,9 +6674,7 @@ sub xterm_stat {
|
|||||||
my $done = $num_tests - $left;
|
my $done = $num_tests - $left;
|
||||||
my $spent = time - $^T;
|
my $spent = time - $^T;
|
||||||
|
|
||||||
syswrite STDOUT, sprintf
|
&$set_titlebar(sprintf "mtr: spent %s on %d tests. %s (%d tests) left",
|
||||||
"\e];mtr: spent %s on %d tests. %s (%d tests) left\a",
|
|
||||||
time_format($spent), $done,
|
time_format($spent), $done,
|
||||||
time_format($spent/$done * $left), $left;
|
time_format($spent/$done * $left), $left);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -71,5 +71,22 @@ include/diff_tables.inc [master:t1,slave:t1]
|
|||||||
connection master;
|
connection master;
|
||||||
SELECT c1 FROM /*!999999 t1 WHEREN;
|
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
|
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;
|
DROP TABLE t1;
|
||||||
include/rpl_end.inc
|
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
|
--echo # comments
|
||||||
--connection master
|
--connection master
|
||||||
--error 1064
|
--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;
|
DROP TABLE t1;
|
||||||
--source include/rpl_end.inc
|
--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;
|
155
mysys/queues.c
155
mysys/queues.c
@ -70,10 +70,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
int init_queue(QUEUE *queue, uint max_elements, uint offset_to_key,
|
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,
|
void *first_cmp_arg, uint offset_to_queue_pos,
|
||||||
uint auto_extent)
|
uint auto_extent)
|
||||||
|
|
||||||
{
|
{
|
||||||
DBUG_ENTER("init_queue");
|
DBUG_ENTER("init_queue");
|
||||||
if ((queue->root= (uchar **) my_malloc((max_elements + 1) * sizeof(void*),
|
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,
|
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,
|
void *first_cmp_arg, uint offset_to_queue_pos,
|
||||||
uint auto_extent)
|
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
|
Insert element in queue
|
||||||
|
|
||||||
@ -191,28 +212,10 @@ void delete_queue(QUEUE *queue)
|
|||||||
element Element to insert
|
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);
|
DBUG_ASSERT(queue->elements < queue->max_elements);
|
||||||
|
insert_at(queue, element, ++queue->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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -230,7 +233,7 @@ void queue_insert(register QUEUE *queue, uchar *element)
|
|||||||
2 auto_extend is 0; No insertion done
|
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)
|
if (queue->elements == queue->max_elements)
|
||||||
@ -259,81 +262,55 @@ int queue_insert_safe(register QUEUE *queue, uchar *element)
|
|||||||
pointer to removed element
|
pointer to removed element
|
||||||
*/
|
*/
|
||||||
|
|
||||||
uchar *queue_remove(register QUEUE *queue, uint idx)
|
uchar *queue_remove(QUEUE *queue, uint idx)
|
||||||
{
|
{
|
||||||
uchar *element;
|
uchar *element;
|
||||||
DBUG_ASSERT(idx >= 1 && idx <= queue->elements);
|
DBUG_ASSERT(idx >= 1);
|
||||||
|
DBUG_ASSERT(idx <= queue->elements);
|
||||||
element= queue->root[idx];
|
element= queue->root[idx];
|
||||||
_downheap(queue, idx, queue->root[queue->elements--]);
|
queue->root[idx]= queue->root[queue->elements--];
|
||||||
|
queue_replace(queue, idx);
|
||||||
return element;
|
return element;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Add element to fixed position and update heap
|
Restores the heap property from idx down the heap
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
_downheap()
|
_downheap()
|
||||||
queue Queue to use
|
queue Queue to use
|
||||||
idx Index of element to change
|
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;
|
uchar *element= queue->root[idx];
|
||||||
register uint idx= start_idx;
|
uint next_index,
|
||||||
my_bool first= TRUE;
|
elements= queue->elements,
|
||||||
|
half_queue= elements >> 1,
|
||||||
offset_to_key=queue->offset_to_key;
|
offset_to_key= queue->offset_to_key,
|
||||||
offset_to_queue_pos= queue->offset_to_queue_pos;
|
offset_to_queue_pos= queue->offset_to_queue_pos;
|
||||||
half_queue= (elements= queue->elements) >> 1;
|
|
||||||
|
|
||||||
while (idx <= half_queue)
|
while (idx <= half_queue)
|
||||||
{
|
{
|
||||||
next_index=idx+idx;
|
next_index= idx+idx;
|
||||||
if (next_index < elements &&
|
if (next_index < elements &&
|
||||||
(queue->compare(queue->first_cmp_arg,
|
(queue->compare(queue->first_cmp_arg,
|
||||||
queue->root[next_index]+offset_to_key,
|
queue->root[next_index]+offset_to_key,
|
||||||
queue->root[next_index+1]+offset_to_key) *
|
queue->root[next_index+1]+offset_to_key) *
|
||||||
queue->max_at_top) > 0)
|
queue->max_at_top) > 0)
|
||||||
next_index++;
|
next_index++;
|
||||||
if (first &&
|
if ((queue->compare(queue->first_cmp_arg,
|
||||||
(((queue->compare(queue->first_cmp_arg,
|
|
||||||
queue->root[next_index]+offset_to_key,
|
queue->root[next_index]+offset_to_key,
|
||||||
element+offset_to_key) * queue->max_at_top) >= 0)))
|
element+offset_to_key) * queue->max_at_top) >= 0)
|
||||||
{
|
break;
|
||||||
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)
|
|
||||||
{
|
|
||||||
queue->root[idx]= queue->root[next_index];
|
queue->root[idx]= queue->root[next_index];
|
||||||
if (offset_to_queue_pos)
|
if (offset_to_queue_pos)
|
||||||
(*(uint*) (queue->root[idx] + offset_to_queue_pos-1))= idx;
|
(*(uint*) (queue->root[idx] + offset_to_queue_pos-1))= idx;
|
||||||
idx= next_index;
|
idx= next_index;
|
||||||
}
|
}
|
||||||
queue->root[idx]= element;
|
queue->root[idx]=element;
|
||||||
if (offset_to_queue_pos)
|
if (offset_to_queue_pos)
|
||||||
(*(uint*) (element + offset_to_queue_pos-1))= idx;
|
(*(uint*) (element + offset_to_queue_pos-1))= idx;
|
||||||
}
|
}
|
||||||
@ -351,7 +328,7 @@ void queue_fix(QUEUE *queue)
|
|||||||
{
|
{
|
||||||
uint i;
|
uint i;
|
||||||
for (i= queue->elements >> 1; i > 0; 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_replace()
|
||||||
queue Queue to use
|
queue Queue to use
|
||||||
idx Index of element to change
|
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)
|
void queue_replace(QUEUE *queue, uint idx)
|
||||||
{
|
{
|
||||||
uchar *element= queue->root[idx];
|
uchar *element= queue->root[idx];
|
||||||
DBUG_ASSERT(idx >= 1 && idx <= queue->elements);
|
uint next_index,
|
||||||
queue_remove(queue, idx);
|
elements= queue->elements,
|
||||||
queue_insert(queue, element);
|
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,
|
University of Cambridge Computing Service,
|
||||||
Cambridge, England.
|
Cambridge, England.
|
||||||
|
|
||||||
Copyright (c) 1997-2019 University of Cambridge
|
Copyright (c) 1997-2020 University of Cambridge
|
||||||
All rights reserved
|
All rights reserved
|
||||||
|
|
||||||
|
|
||||||
@ -19,7 +19,7 @@ Written by: Zoltan Herczeg
|
|||||||
Email local part: hzmester
|
Email local part: hzmester
|
||||||
Emain domain: freemail.hu
|
Emain domain: freemail.hu
|
||||||
|
|
||||||
Copyright(c) 2010-2019 Zoltan Herczeg
|
Copyright(c) 2010-2020 Zoltan Herczeg
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
|
|
||||||
@ -30,7 +30,7 @@ Written by: Zoltan Herczeg
|
|||||||
Email local part: hzmester
|
Email local part: hzmester
|
||||||
Emain domain: freemail.hu
|
Emain domain: freemail.hu
|
||||||
|
|
||||||
Copyright(c) 2009-2019 Zoltan Herczeg
|
Copyright(c) 2009-2020 Zoltan Herczeg
|
||||||
All rights reserved.
|
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.
|
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
|
Version 8.43 23-February-2019
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ Email domain: cam.ac.uk
|
|||||||
University of Cambridge Computing Service,
|
University of Cambridge Computing Service,
|
||||||
Cambridge, England.
|
Cambridge, England.
|
||||||
|
|
||||||
Copyright (c) 1997-2019 University of Cambridge
|
Copyright (c) 1997-2020 University of Cambridge
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ Written by: Zoltan Herczeg
|
|||||||
Email local part: hzmester
|
Email local part: hzmester
|
||||||
Email domain: freemail.hu
|
Email domain: freemail.hu
|
||||||
|
|
||||||
Copyright(c) 2010-2019 Zoltan Herczeg
|
Copyright(c) 2010-2020 Zoltan Herczeg
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
|
|
||||||
@ -47,7 +47,7 @@ Written by: Zoltan Herczeg
|
|||||||
Email local part: hzmester
|
Email local part: hzmester
|
||||||
Email domain: freemail.hu
|
Email domain: freemail.hu
|
||||||
|
|
||||||
Copyright(c) 2009-2019 Zoltan Herczeg
|
Copyright(c) 2009-2020 Zoltan Herczeg
|
||||||
All rights reserved.
|
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.
|
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
|
Release 8.43 23-February-2019
|
||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
|
@ -13,9 +13,10 @@ libraries.
|
|||||||
The latest release of PCRE1 is always available in three alternative formats
|
The latest release of PCRE1 is always available in three alternative formats
|
||||||
from:
|
from:
|
||||||
|
|
||||||
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz
|
https://ftp.pcre.org/pub/pcre/pcre-x.xx.tar.gz
|
||||||
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.bz2
|
https://ftp.pcre.org/pub/pcre/pcre-x.xx.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.zip
|
||||||
|
|
||||||
|
|
||||||
There is a mailing list for discussion about the development of PCRE at
|
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
|
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
|
Philip Hazel
|
||||||
Email local part: ph10
|
Email local part: ph10
|
||||||
Email domain: cam.ac.uk
|
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.
|
dnl be defined as -RC2, for example. For real releases, it should be empty.
|
||||||
|
|
||||||
m4_define(pcre_major, [8])
|
m4_define(pcre_major, [8])
|
||||||
m4_define(pcre_minor, [43])
|
m4_define(pcre_minor, [44])
|
||||||
m4_define(pcre_prerelease, [])
|
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
|
# 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.
|
# 50 lines of this file. Please update that if the variables above are moved.
|
||||||
|
|
||||||
# Libtool shared library interface versions (current:revision:age)
|
# Libtool shared library interface versions (current:revision:age)
|
||||||
m4_define(libpcre_version, [3:11:2])
|
m4_define(libpcre_version, [3:12:2])
|
||||||
m4_define(libpcre16_version, [2:11:2])
|
m4_define(libpcre16_version, [2:12:2])
|
||||||
m4_define(libpcre32_version, [0:11:0])
|
m4_define(libpcre32_version, [0:12:0])
|
||||||
m4_define(libpcreposix_version, [0:6:0])
|
m4_define(libpcreposix_version, [0:7:0])
|
||||||
m4_define(libpcrecpp_version, [0:1:0])
|
m4_define(libpcrecpp_version, [0:2:0])
|
||||||
|
|
||||||
AC_PREREQ(2.57)
|
AC_PREREQ(2.57)
|
||||||
AC_INIT(PCRE, pcre_major.pcre_minor[]pcre_prerelease, , pcre)
|
AC_INIT(PCRE, pcre_major.pcre_minor[]pcre_prerelease, , pcre)
|
||||||
@ -159,12 +159,15 @@ AC_ARG_ENABLE(jit,
|
|||||||
|
|
||||||
if test "$enable_jit" = "auto"; then
|
if test "$enable_jit" = "auto"; then
|
||||||
AC_LANG(C)
|
AC_LANG(C)
|
||||||
|
SAVE_CPPFLAGS=$CPPFLAGS
|
||||||
|
CPPFLAGS=-I$srcdir
|
||||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
|
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
|
||||||
#define SLJIT_CONFIG_AUTO 1
|
#define SLJIT_CONFIG_AUTO 1
|
||||||
#include "sljit/sljitConfigInternal.h"
|
#include "sljit/sljitConfigInternal.h"
|
||||||
#if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
|
#if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
|
||||||
#error unsupported
|
#error unsupported
|
||||||
#endif]])], enable_jit=yes, enable_jit=no)
|
#endif]])], enable_jit=yes, enable_jit=no)
|
||||||
|
CPPFLAGS=$SAVE_CPPFLAGS
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Handle --disable-pcregrep-jit (enabled by default)
|
# Handle --disable-pcregrep-jit (enabled by default)
|
||||||
|
@ -13,9 +13,10 @@ libraries.
|
|||||||
The latest release of PCRE1 is always available in three alternative formats
|
The latest release of PCRE1 is always available in three alternative formats
|
||||||
from:
|
from:
|
||||||
|
|
||||||
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz
|
https://ftp.pcre.org/pub/pcre/pcre-x.xx.tar.gz
|
||||||
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.bz2
|
https://ftp.pcre.org/pub/pcre/pcre-x.xx.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.zip
|
||||||
|
|
||||||
|
|
||||||
There is a mailing list for discussion about the development of PCRE at
|
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
|
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
|
Philip Hazel
|
||||||
Email local part: ph10
|
Email local part: ph10
|
||||||
Email domain: cam.ac.uk
|
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
|
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.
|
<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
|
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.
|
UTF-setting sequence.
|
||||||
</P>
|
</P>
|
||||||
<P>
|
<P>
|
||||||
|
@ -1246,7 +1246,7 @@ the following negative numbers:
|
|||||||
PCRE_ERROR_BADOPTION the value of <i>what</i> was invalid
|
PCRE_ERROR_BADOPTION the value of <i>what</i> was invalid
|
||||||
PCRE_ERROR_UNSET the requested field is not set
|
PCRE_ERROR_UNSET the requested field is not set
|
||||||
</pre>
|
</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
|
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
|
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
|
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>
|
</pre>
|
||||||
Return the value of the first data unit (non-UTF character) of any matched
|
Return the value of the first data unit (non-UTF character) of any matched
|
||||||
string in the situation where PCRE_INFO_FIRSTCHARACTERFLAGS returns 1;
|
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.
|
variable.
|
||||||
</P>
|
</P>
|
||||||
<P>
|
<P>
|
||||||
@ -1577,7 +1577,7 @@ returned value 1 (with "z" returned from PCRE_INFO_REQUIREDCHAR), but for
|
|||||||
</pre>
|
</pre>
|
||||||
Return the value of the rightmost literal data unit that must exist in any
|
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
|
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.
|
value, 0 is returned.
|
||||||
</P>
|
</P>
|
||||||
<br><a name="SEC16" href="#TOC1">REFERENCE COUNTS</a><br>
|
<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>
|
<br><a name="SEC4" href="#TOC1">COMMAND LINE OPTIONS</a><br>
|
||||||
<P>
|
<P>
|
||||||
<b>-8</b>
|
<b>-8</b>
|
||||||
If both the 8-bit library has been built, this option causes the 8-bit library
|
If the 8-bit library has been built, this option causes it to be used (this is
|
||||||
to be used (which is the default); if the 8-bit library has not been built,
|
the default). If the 8-bit library has not been built, this option causes an
|
||||||
this option causes an error.
|
error.
|
||||||
</P>
|
</P>
|
||||||
<P>
|
<P>
|
||||||
<b>-16</b>
|
<b>-16</b>
|
||||||
If both the 8-bit or the 32-bit, and the 16-bit libraries have been built, this
|
If the 16-bit library has been built, this option causes it to be used. If only
|
||||||
option causes the 16-bit library to be used. If only the 16-bit library has been
|
the 16-bit library has been built, this is the default. If the 16-bit library
|
||||||
built, this is the default (so has no effect). If only the 8-bit or the 32-bit
|
has not been built, this option causes an error.
|
||||||
library has been built, this option causes an error.
|
|
||||||
</P>
|
</P>
|
||||||
<P>
|
<P>
|
||||||
<b>-32</b>
|
<b>-32</b>
|
||||||
If both the 8-bit or the 16-bit, and the 32-bit libraries have been built, this
|
If the 32-bit library has been built, this option causes it to be used. If only
|
||||||
option causes the 32-bit library to be used. If only the 32-bit library has been
|
the 32-bit library has been built, this is the default. If the 32-bit library
|
||||||
built, this is the default (so has no effect). If only the 8-bit or the 16-bit
|
has not been built, this option causes an error.
|
||||||
library has been built, this option causes an error.
|
|
||||||
</P>
|
</P>
|
||||||
<P>
|
<P>
|
||||||
<b>-b</b>
|
<b>-b</b>
|
||||||
@ -1154,9 +1152,9 @@ Cambridge CB2 3QH, England.
|
|||||||
</P>
|
</P>
|
||||||
<br><a name="SEC17" href="#TOC1">REVISION</a><br>
|
<br><a name="SEC17" href="#TOC1">REVISION</a><br>
|
||||||
<P>
|
<P>
|
||||||
Last updated: 23 February 2017
|
Last updated: 10 February 2020
|
||||||
<br>
|
<br>
|
||||||
Copyright © 1997-2017 University of Cambridge.
|
Copyright © 1997-2020 University of Cambridge.
|
||||||
<br>
|
<br>
|
||||||
<p>
|
<p>
|
||||||
Return to the <a href="index.html">PCRE index page</a>.
|
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
|
pcre-config returns the configuration of the installed PCRE libraries
|
||||||
and the options required to compile a program to use them. Some of the
|
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,
|
options apply only to the 8-bit, or 16-bit, or 32-bit libraries, re-
|
||||||
respectively, and are not available if only one of those libraries has
|
spectively, and are not available if only one of those libraries has
|
||||||
been built. If an unavailable option is encountered, the "usage" infor-
|
been built. If an unavailable option is encountered, the "usage" infor-
|
||||||
mation is output.
|
mation is output.
|
||||||
|
|
||||||
@ -36,37 +36,37 @@ OPTIONS
|
|||||||
--version Writes the version number of the installed PCRE libraries to
|
--version Writes the version number of the installed PCRE libraries to
|
||||||
the standard output.
|
the standard output.
|
||||||
|
|
||||||
--libs Writes to the standard output the command line options
|
--libs Writes to the standard output the command line options re-
|
||||||
required to link with the 8-bit PCRE library (-lpcre on many
|
quired to link with the 8-bit PCRE library (-lpcre on many
|
||||||
systems).
|
systems).
|
||||||
|
|
||||||
--libs16 Writes to the standard output the command line options
|
--libs16 Writes to the standard output the command line options re-
|
||||||
required to link with the 16-bit PCRE library (-lpcre16 on
|
quired to link with the 16-bit PCRE library (-lpcre16 on many
|
||||||
many systems).
|
systems).
|
||||||
|
|
||||||
--libs32 Writes to the standard output the command line options
|
--libs32 Writes to the standard output the command line options re-
|
||||||
required to link with the 32-bit PCRE library (-lpcre32 on
|
quired to link with the 32-bit PCRE library (-lpcre32 on many
|
||||||
many systems).
|
systems).
|
||||||
|
|
||||||
--libs-cpp
|
--libs-cpp
|
||||||
Writes to the standard output the command line options
|
Writes to the standard output the command line options re-
|
||||||
required to link with PCRE's C++ wrapper library (-lpcrecpp
|
quired to link with PCRE's C++ wrapper library (-lpcrecpp
|
||||||
-lpcre on many systems).
|
-lpcre on many systems).
|
||||||
|
|
||||||
--libs-posix
|
--libs-posix
|
||||||
Writes to the standard output the command line options
|
Writes to the standard output the command line options re-
|
||||||
required to link with PCRE's POSIX API wrapper library
|
quired to link with PCRE's POSIX API wrapper library
|
||||||
(-lpcreposix -lpcre on many systems).
|
(-lpcreposix -lpcre on many systems).
|
||||||
|
|
||||||
--cflags Writes to the standard output the command line options
|
--cflags Writes to the standard output the command line options re-
|
||||||
required to compile files that use PCRE (this may include
|
quired to compile files that use PCRE (this may include some
|
||||||
some -I options, but is blank on many systems).
|
-I options, but is blank on many systems).
|
||||||
|
|
||||||
--cflags-posix
|
--cflags-posix
|
||||||
Writes to the standard output the command line options
|
Writes to the standard output the command line options re-
|
||||||
required to compile files that use PCRE's POSIX API wrapper
|
quired to compile files that use PCRE's POSIX API wrapper li-
|
||||||
library (this may include some -I options, but is blank on
|
brary (this may include some -I options, but is blank on many
|
||||||
many systems).
|
systems).
|
||||||
|
|
||||||
|
|
||||||
SEE ALSO
|
SEE ALSO
|
||||||
|
@ -146,7 +146,7 @@ performance.
|
|||||||
One way of guarding against this possibility is to use the
|
One way of guarding against this possibility is to use the
|
||||||
\fBpcre_fullinfo()\fP function to check the compiled pattern's options for UTF.
|
\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
|
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.
|
UTF-setting sequence.
|
||||||
.P
|
.P
|
||||||
If your application is one that supports UTF, be aware that validity checking
|
If your application is one that supports UTF, be aware that validity checking
|
||||||
|
1557
pcre/doc/pcre.txt
1557
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_BADOPTION the value of \fIwhat\fP was invalid
|
||||||
PCRE_ERROR_UNSET the requested field is not set
|
PCRE_ERROR_UNSET the requested field is not set
|
||||||
.sp
|
.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
|
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
|
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
|
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
|
.sp
|
||||||
Return the value of the first data unit (non-UTF character) of any matched
|
Return the value of the first data unit (non-UTF character) of any matched
|
||||||
string in the situation where PCRE_INFO_FIRSTCHARACTERFLAGS returns 1;
|
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.
|
variable.
|
||||||
.P
|
.P
|
||||||
In the 8-bit library, the value is always less than 256. In the 16-bit library
|
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
|
.sp
|
||||||
Return the value of the rightmost literal data unit that must exist in any
|
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
|
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.
|
value, 0 is returned.
|
||||||
.
|
.
|
||||||
.
|
.
|
||||||
|
@ -26,8 +26,8 @@ DESCRIPTION
|
|||||||
If you attempt to use delimiters (for example, by surrounding a pattern
|
If you attempt to use delimiters (for example, by surrounding a pattern
|
||||||
with slashes, as is common in Perl scripts), they are interpreted as
|
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
|
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
|
on the command line because they are interpreted by the shell, and in-
|
||||||
indeed quotes are required if a pattern contains white space or shell
|
deed quotes are required if a pattern contains white space or shell
|
||||||
metacharacters.
|
metacharacters.
|
||||||
|
|
||||||
The first argument that follows any option settings is treated as the
|
The first argument that follows any option settings is treated as the
|
||||||
@ -37,8 +37,8 @@ DESCRIPTION
|
|||||||
or an argument pattern must be provided.
|
or an argument pattern must be provided.
|
||||||
|
|
||||||
If no files are specified, pcregrep reads the standard input. The stan-
|
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
|
dard input can also be referenced by a name consisting of a single hy-
|
||||||
hyphen. For example:
|
phen. For example:
|
||||||
|
|
||||||
pcregrep some-pattern /file1 - /file3
|
pcregrep some-pattern /file1 - /file3
|
||||||
|
|
||||||
@ -47,8 +47,8 @@ DESCRIPTION
|
|||||||
the start of each line, followed by a colon. However, there are options
|
the start of each line, followed by a colon. However, there are options
|
||||||
that can change how pcregrep behaves. In particular, the -M option
|
that can change how pcregrep behaves. In particular, the -M option
|
||||||
makes it possible to search for patterns that span line boundaries.
|
makes it possible to search for patterns that span line boundaries.
|
||||||
What defines a line boundary is controlled by the -N (--newline)
|
What defines a line boundary is controlled by the -N (--newline) op-
|
||||||
option.
|
tion.
|
||||||
|
|
||||||
The amount of memory used for buffering files that are being scanned is
|
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.
|
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
|
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
|
are considered. However, if --colour (or --color) is used to colour the
|
||||||
matching substrings, or if --only-matching, --file-offsets, or --line-
|
matching substrings, or if --only-matching, --file-offsets, or --line-
|
||||||
offsets is used to output only the part of the line that matched
|
offsets is used to output only the part of the line that matched (ei-
|
||||||
(either shown literally, or as an offset), scanning resumes immediately
|
ther shown literally, or as an offset), scanning resumes immediately
|
||||||
following the match, so that further matches on the same line can be
|
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
|
found. If there are multiple patterns, they are all tried on the re-
|
||||||
remainder of the line, but patterns that follow the one that matched
|
mainder of the line, but patterns that follow the one that matched are
|
||||||
are not tried on the earlier part of the line.
|
not tried on the earlier part of the line.
|
||||||
|
|
||||||
This behaviour means that the order in which multiple patterns are
|
This behaviour means that the order in which multiple patterns are
|
||||||
specified can affect the output when one of the above options is used.
|
specified can affect the output when one of the above options is used.
|
||||||
@ -80,11 +80,11 @@ DESCRIPTION
|
|||||||
overlap).
|
overlap).
|
||||||
|
|
||||||
Patterns that can match an empty string are accepted, but empty string
|
Patterns that can match an empty string are accepted, but empty string
|
||||||
matches are never recognized. An example is the pattern
|
matches are never recognized. An example is the pattern "(su-
|
||||||
"(super)?(man)?", in which all components are optional. This pattern
|
per)?(man)?", in which all components are optional. This pattern finds
|
||||||
finds all occurrences of both "super" and "man"; the output differs
|
all occurrences of both "super" and "man"; the output differs from
|
||||||
from matching with "super|man" when only the matching substrings are
|
matching with "super|man" when only the matching substrings are being
|
||||||
being shown.
|
shown.
|
||||||
|
|
||||||
If the LC_ALL or LC_CTYPE environment variable is set, pcregrep uses
|
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
|
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
|
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.
|
1024 bytes is identified as a binary file, and is processed specially.
|
||||||
(GNU grep also identifies binary files in this manner.) See the
|
(GNU grep also identifies binary files in this manner.) See the --bi-
|
||||||
--binary-files option for a means of changing the way binary files are
|
nary-files option for a means of changing the way binary files are han-
|
||||||
handled.
|
dled.
|
||||||
|
|
||||||
|
|
||||||
OPTIONS
|
OPTIONS
|
||||||
@ -151,16 +151,16 @@ OPTIONS
|
|||||||
|
|
||||||
--binary-files=word
|
--binary-files=word
|
||||||
Specify how binary files are to be processed. If the word is
|
Specify how binary files are to be processed. If the word is
|
||||||
"binary" (the default), pattern matching is performed on
|
"binary" (the default), pattern matching is performed on bi-
|
||||||
binary files, but the only output is "Binary file <name>
|
nary files, but the only output is "Binary file <name>
|
||||||
matches" when a match succeeds. If the word is "text", which
|
matches" when a match succeeds. If the word is "text", which
|
||||||
is equivalent to the -a or --text option, binary files are
|
is equivalent to the -a or --text option, binary files are
|
||||||
processed in the same way as any other file. In this case,
|
processed in the same way as any other file. In this case,
|
||||||
when a match succeeds, the output may be binary garbage,
|
when a match succeeds, the output may be binary garbage,
|
||||||
which can have nasty effects if sent to a terminal. If the
|
which can have nasty effects if sent to a terminal. If the
|
||||||
word is "without-match", which is equivalent to the -I
|
word is "without-match", which is equivalent to the -I op-
|
||||||
option, binary files are not processed at all; they are
|
tion, binary files are not processed at all; they are assumed
|
||||||
assumed not to be of interest.
|
not to be of interest.
|
||||||
|
|
||||||
--buffer-size=number
|
--buffer-size=number
|
||||||
Set the parameter that controls how much memory is used for
|
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
|
ronment variable PCREGREP_COLOUR or PCREGREP_COLOR. The value
|
||||||
of this variable should be a string of two numbers, separated
|
of this variable should be a string of two numbers, separated
|
||||||
by a semicolon. They are copied directly into the control
|
by a semicolon. They are copied directly into the control
|
||||||
string for setting colour on a terminal, so it is your
|
string for setting colour on a terminal, so it is your re-
|
||||||
responsibility to ensure that they make sense. If neither of
|
sponsibility to ensure that they make sense. If neither of
|
||||||
the environment variables is set, the default is "1;31",
|
the environment variables is set, the default is "1;31",
|
||||||
which gives red.
|
which gives red.
|
||||||
|
|
||||||
-D action, --devices=action
|
-D action, --devices=action
|
||||||
If an input path is not a regular file or a directory,
|
If an input path is not a regular file or a directory, "ac-
|
||||||
"action" specifies how it is to be processed. Valid values
|
tion" specifies how it is to be processed. Valid values are
|
||||||
are "read" (the default) or "skip" (silently skip the path).
|
"read" (the default) or "skip" (silently skip the path).
|
||||||
|
|
||||||
-d action, --directories=action
|
-d action, --directories=action
|
||||||
If an input path is a directory, "action" specifies how it is
|
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
|
"recurse" (equivalent to the -r option), or "skip" (silently
|
||||||
skip the path, the default in Windows environments). In the
|
skip the path, the default in Windows environments). In the
|
||||||
"read" case, directories are read as if they were ordinary
|
"read" case, directories are read as if they were ordinary
|
||||||
files. In some operating systems the effect of reading a
|
files. In some operating systems the effect of reading a di-
|
||||||
directory like this is an immediate end-of-file; in others it
|
rectory like this is an immediate end-of-file; in others it
|
||||||
may provoke an error.
|
may provoke an error.
|
||||||
|
|
||||||
-e pattern, --regex=pattern, --regexp=pattern
|
-e pattern, --regex=pattern, --regexp=pattern
|
||||||
@ -249,8 +249,8 @@ OPTIONS
|
|||||||
whether listed on the command line, obtained from --file-
|
whether listed on the command line, obtained from --file-
|
||||||
list, or by scanning a directory. The pattern is a PCRE regu-
|
list, or by scanning a directory. The pattern is a PCRE regu-
|
||||||
lar expression, and is matched against the final component of
|
lar expression, and is matched against the final component of
|
||||||
the file name, not the entire path. The -F, -w, and -x
|
the file name, not the entire path. The -F, -w, and -x op-
|
||||||
options do not apply to this pattern. The option may be given
|
tions do not apply to this pattern. The option may be given
|
||||||
any number of times in order to specify multiple patterns. If
|
any number of times in order to specify multiple patterns. If
|
||||||
a file name matches both an --include and an --exclude pat-
|
a file name matches both an --include and an --exclude pat-
|
||||||
tern, it is excluded. There is no short form for this option.
|
tern, it is excluded. There is no short form for this option.
|
||||||
@ -264,29 +264,29 @@ OPTIONS
|
|||||||
|
|
||||||
--exclude-dir=pattern
|
--exclude-dir=pattern
|
||||||
Directories whose names match the pattern are skipped without
|
Directories whose names match the pattern are skipped without
|
||||||
being processed, whatever the setting of the --recursive
|
being processed, whatever the setting of the --recursive op-
|
||||||
option. This applies to all directories, whether listed on
|
tion. This applies to all directories, whether listed on the
|
||||||
the command line, obtained from --file-list, or by scanning a
|
command line, obtained from --file-list, or by scanning a
|
||||||
parent directory. The pattern is a PCRE regular expression,
|
parent directory. The pattern is a PCRE regular expression,
|
||||||
and is matched against the final component of the directory
|
and is matched against the final component of the directory
|
||||||
name, not the entire path. The -F, -w, and -x options do not
|
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
|
apply to this pattern. The option may be given any number of
|
||||||
times in order to specify more than one pattern. If a direc-
|
times in order to specify more than one pattern. If a direc-
|
||||||
tory matches both --include-dir and --exclude-dir, it is
|
tory matches both --include-dir and --exclude-dir, it is ex-
|
||||||
excluded. There is no short form for this option.
|
cluded. There is no short form for this option.
|
||||||
|
|
||||||
-F, --fixed-strings
|
-F, --fixed-strings
|
||||||
Interpret each data-matching pattern as a list of fixed
|
Interpret each data-matching pattern as a list of fixed
|
||||||
strings, separated by newlines, instead of as a regular
|
strings, separated by newlines, instead of as a regular ex-
|
||||||
expression. What constitutes a newline for this purpose is
|
pression. What constitutes a newline for this purpose is con-
|
||||||
controlled by the --newline option. The -w (match as a word)
|
trolled by the --newline option. The -w (match as a word) and
|
||||||
and -x (match whole line) options can be used with -F. They
|
-x (match whole line) options can be used with -F. They ap-
|
||||||
apply to each of the fixed strings. A line is selected if any
|
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
|
of the fixed strings are found in it (subject to -w or -x, if
|
||||||
present). This option applies only to the patterns that are
|
present). This option applies only to the patterns that are
|
||||||
matched against the contents of files; it does not apply to
|
matched against the contents of files; it does not apply to
|
||||||
patterns specified by any of the --include or --exclude
|
patterns specified by any of the --include or --exclude op-
|
||||||
options.
|
tions.
|
||||||
|
|
||||||
-f filename, --file=filename
|
-f filename, --file=filename
|
||||||
Read patterns from the file, one per line, and match them
|
Read patterns from the file, one per line, and match them
|
||||||
@ -358,16 +358,16 @@ OPTIONS
|
|||||||
--include=pattern
|
--include=pattern
|
||||||
If any --include patterns are specified, the only files that
|
If any --include patterns are specified, the only files that
|
||||||
are processed are those that match one of the patterns (and
|
are processed are those that match one of the patterns (and
|
||||||
do not match an --exclude pattern). This option does not
|
do not match an --exclude pattern). This option does not af-
|
||||||
affect directories, but it applies to all files, whether
|
fect directories, but it applies to all files, whether listed
|
||||||
listed on the command line, obtained from --file-list, or by
|
on the command line, obtained from --file-list, or by scan-
|
||||||
scanning a directory. The pattern is a PCRE regular expres-
|
ning a directory. The pattern is a PCRE regular expression,
|
||||||
sion, and is matched against the final component of the file
|
and is matched against the final component of the file name,
|
||||||
name, not the entire path. The -F, -w, and -x options do not
|
not the entire path. The -F, -w, and -x options do not apply
|
||||||
apply to this pattern. The option may be given any number of
|
to this pattern. The option may be given any number of times.
|
||||||
times. If a file name matches both an --include and an
|
If a file name matches both an --include and an --exclude
|
||||||
--exclude pattern, it is excluded. There is no short form
|
pattern, it is excluded. There is no short form for this op-
|
||||||
for this option.
|
tion.
|
||||||
|
|
||||||
--include-from=filename
|
--include-from=filename
|
||||||
Treat each non-empty line of the file as the data for an
|
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
|
tories that are processed are those that match one of the
|
||||||
patterns (and do not match an --exclude-dir pattern). This
|
patterns (and do not match an --exclude-dir pattern). This
|
||||||
applies to all directories, whether listed on the command
|
applies to all directories, whether listed on the command
|
||||||
line, obtained from --file-list, or by scanning a parent
|
line, obtained from --file-list, or by scanning a parent di-
|
||||||
directory. The pattern is a PCRE regular expression, and is
|
rectory. The pattern is a PCRE regular expression, and is
|
||||||
matched against the final component of the directory name,
|
matched against the final component of the directory name,
|
||||||
not the entire path. The -F, -w, and -x options do not apply
|
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.
|
to this pattern. The option may be given any number of times.
|
||||||
@ -413,9 +413,9 @@ OPTIONS
|
|||||||
|
|
||||||
--line-buffered
|
--line-buffered
|
||||||
When this option is given, input is read and processed line
|
When this option is given, input is read and processed line
|
||||||
by line, and the output is flushed after each write. By
|
by line, and the output is flushed after each write. By de-
|
||||||
default, input is read in large chunks, unless pcregrep can
|
fault, input is read in large chunks, unless pcregrep can de-
|
||||||
determine that it is reading from a terminal (which is cur-
|
termine that it is reading from a terminal (which is cur-
|
||||||
rently possible only in Unix-like environments). Output to
|
rently possible only in Unix-like environments). Output to
|
||||||
terminal is normally automatically flushed by the operating
|
terminal is normally automatically flushed by the operating
|
||||||
system. This option can be useful when the input or output is
|
system. This option can be useful when the input or output is
|
||||||
@ -437,9 +437,9 @@ OPTIONS
|
|||||||
--locale=locale-name
|
--locale=locale-name
|
||||||
This option specifies a locale to be used for pattern match-
|
This option specifies a locale to be used for pattern match-
|
||||||
ing. It overrides the value in the LC_ALL or LC_CTYPE envi-
|
ing. It overrides the value in the LC_ALL or LC_CTYPE envi-
|
||||||
ronment variables. If no locale is specified, the PCRE
|
ronment variables. If no locale is specified, the PCRE li-
|
||||||
library's default (usually the "C" locale) is used. There is
|
brary's default (usually the "C" locale) is used. There is no
|
||||||
no short form for this option.
|
short form for this option.
|
||||||
|
|
||||||
--match-limit=number
|
--match-limit=number
|
||||||
Processing some regular expression patterns can require a
|
Processing some regular expression patterns can require a
|
||||||
@ -447,26 +447,26 @@ OPTIONS
|
|||||||
gram crash if not enough is available. Other patterns may
|
gram crash if not enough is available. Other patterns may
|
||||||
take a very long time to search for all possible matching
|
take a very long time to search for all possible matching
|
||||||
strings. The pcre_exec() function that is called by pcregrep
|
strings. The pcre_exec() function that is called by pcregrep
|
||||||
to do the matching has two parameters that can limit the
|
to do the matching has two parameters that can limit the re-
|
||||||
resources that it uses.
|
sources that it uses.
|
||||||
|
|
||||||
The --match-limit option provides a means of limiting
|
The --match-limit option provides a means of limiting re-
|
||||||
resource usage when processing patterns that are not going to
|
source usage when processing patterns that are not going to
|
||||||
match, but which have a very large number of possibilities in
|
match, but which have a very large number of possibilities in
|
||||||
their search trees. The classic example is a pattern that
|
their search trees. The classic example is a pattern that
|
||||||
uses nested unlimited repeats. Internally, PCRE uses a func-
|
uses nested unlimited repeats. Internally, PCRE uses a func-
|
||||||
tion called match() which it calls repeatedly (sometimes
|
tion called match() which it calls repeatedly (sometimes re-
|
||||||
recursively). The limit set by --match-limit is imposed on
|
cursively). The limit set by --match-limit is imposed on the
|
||||||
the number of times this function is called during a match,
|
number of times this function is called during a match, which
|
||||||
which has the effect of limiting the amount of backtracking
|
has the effect of limiting the amount of backtracking that
|
||||||
that can take place.
|
can take place.
|
||||||
|
|
||||||
The --recursion-limit option is similar to --match-limit, but
|
The --recursion-limit option is similar to --match-limit, but
|
||||||
instead of limiting the total number of times that match() is
|
instead of limiting the total number of times that match() is
|
||||||
called, it limits the depth of recursive calls, which in turn
|
called, it limits the depth of recursive calls, which in turn
|
||||||
limits the amount of memory that can be used. The recursion
|
limits the amount of memory that can be used. The recursion
|
||||||
depth is a smaller number than the total number of calls,
|
depth is a smaller number than the total number of calls, be-
|
||||||
because not all calls to match() are recursive. This limit is
|
cause not all calls to match() are recursive. This limit is
|
||||||
of use only if it is set smaller than --match-limit.
|
of use only if it is set smaller than --match-limit.
|
||||||
|
|
||||||
There are no short forms for these options. The default set-
|
There are no short forms for these options. The default set-
|
||||||
@ -494,30 +494,30 @@ OPTIONS
|
|||||||
is read line by line (see --line-buffered.)
|
is read line by line (see --line-buffered.)
|
||||||
|
|
||||||
-N newline-type, --newline=newline-type
|
-N newline-type, --newline=newline-type
|
||||||
The PCRE library supports five different conventions for
|
The PCRE library supports five different conventions for in-
|
||||||
indicating the ends of lines. They are the single-character
|
dicating the ends of lines. They are the single-character se-
|
||||||
sequences CR (carriage return) and LF (linefeed), the two-
|
quences CR (carriage return) and LF (linefeed), the two-char-
|
||||||
character sequence CRLF, an "anycrlf" convention, which rec-
|
acter sequence CRLF, an "anycrlf" convention, which recog-
|
||||||
ognizes any of the preceding three types, and an "any" con-
|
nizes any of the preceding three types, and an "any" conven-
|
||||||
vention, in which any Unicode line ending sequence is assumed
|
tion, in which any Unicode line ending sequence is assumed to
|
||||||
to end a line. The Unicode sequences are the three just men-
|
end a line. The Unicode sequences are the three just men-
|
||||||
tioned, plus VT (vertical tab, U+000B), FF (form feed,
|
tioned, plus VT (vertical tab, U+000B), FF (form feed,
|
||||||
U+000C), NEL (next line, U+0085), LS (line separator,
|
U+000C), NEL (next line, U+0085), LS (line separator,
|
||||||
U+2028), and PS (paragraph separator, U+2029).
|
U+2028), and PS (paragraph separator, U+2029).
|
||||||
|
|
||||||
When the PCRE library is built, a default line-ending
|
When the PCRE library is built, a default line-ending se-
|
||||||
sequence is specified. This is normally the standard
|
quence is specified. This is normally the standard sequence
|
||||||
sequence for the operating system. Unless otherwise specified
|
for the operating system. Unless otherwise specified by this
|
||||||
by this option, pcregrep uses the library's default. The
|
option, pcregrep uses the library's default. The possible
|
||||||
possible values for this option are CR, LF, CRLF, ANYCRLF, or
|
values for this option are CR, LF, CRLF, ANYCRLF, or ANY.
|
||||||
ANY. This makes it possible to use pcregrep to scan files
|
This makes it possible to use pcregrep to scan files that
|
||||||
that have come from other environments without having to mod-
|
have come from other environments without having to modify
|
||||||
ify their line endings. If the data that is being scanned
|
their line endings. If the data that is being scanned does
|
||||||
does not agree with the convention set by this option, pcre-
|
not agree with the convention set by this option, pcregrep
|
||||||
grep may behave in strange ways. Note that this option does
|
may behave in strange ways. Note that this option does not
|
||||||
not apply to files specified by the -f, --exclude-from, or
|
apply to files specified by the -f, --exclude-from, or --in-
|
||||||
--include-from options, which are expected to use the operat-
|
clude-from options, which are expected to use the operating
|
||||||
ing system's standard newline sequence.
|
system's standard newline sequence.
|
||||||
|
|
||||||
-n, --line-number
|
-n, --line-number
|
||||||
Precede each output line by its line number in the file, fol-
|
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
|
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.
|
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
|
If -o is combined with -v (invert the sense of the match to
|
||||||
find non-matching lines), no output is generated, but the
|
find non-matching lines), no output is generated, but the re-
|
||||||
return code is set appropriately. If the matched portion of
|
turn code is set appropriately. If the matched portion of the
|
||||||
the line is empty, nothing is output unless the file name or
|
line is empty, nothing is output unless the file name or line
|
||||||
line number are being printed, in which case they are shown
|
number are being printed, in which case they are shown on an
|
||||||
on an otherwise empty line. This option is mutually exclusive
|
otherwise empty line. This option is mutually exclusive with
|
||||||
with --file-offsets and --line-offsets.
|
--file-offsets and --line-offsets.
|
||||||
|
|
||||||
-onumber, --only-matching=number
|
-onumber, --only-matching=number
|
||||||
Show only the part of the line that matched the capturing
|
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-
|
it contains, taking note of any --include and --exclude set-
|
||||||
tings. By default, a directory is read as a normal file; in
|
tings. By default, a directory is read as a normal file; in
|
||||||
some operating systems this gives an immediate end-of-file.
|
some operating systems this gives an immediate end-of-file.
|
||||||
This option is a shorthand for setting the -d option to
|
This option is a shorthand for setting the -d option to "re-
|
||||||
"recurse".
|
curse".
|
||||||
|
|
||||||
--recursion-limit=number
|
--recursion-limit=number
|
||||||
See --match-limit above.
|
See --match-limit above.
|
||||||
@ -626,10 +626,10 @@ OPTIONS
|
|||||||
|
|
||||||
ENVIRONMENT VARIABLES
|
ENVIRONMENT VARIABLES
|
||||||
|
|
||||||
The environment variables LC_ALL and LC_CTYPE are examined, in that
|
The environment variables LC_ALL and LC_CTYPE are examined, in that or-
|
||||||
order, for a locale. The first one that is set is used. This can be
|
der, for a locale. The first one that is set is used. This can be over-
|
||||||
overridden by the --locale option. If no locale is set, the PCRE
|
ridden by the --locale option. If no locale is set, the PCRE library's
|
||||||
library's default (usually the "C" locale) is used.
|
default (usually the "C" locale) is used.
|
||||||
|
|
||||||
|
|
||||||
NEWLINES
|
NEWLINES
|
||||||
@ -640,8 +640,8 @@ NEWLINES
|
|||||||
ever newline sequences they have in the input. However, the setting of
|
ever newline sequences they have in the input. However, the setting of
|
||||||
this option does not affect the interpretation of files specified by
|
this option does not affect the interpretation of files specified by
|
||||||
the -f, --exclude-from, or --include-from options, which are assumed to
|
the -f, --exclude-from, or --include-from options, which are assumed to
|
||||||
use the operating system's standard newline sequence, nor does it
|
use the operating system's standard newline sequence, nor does it af-
|
||||||
affect the way in which pcregrep writes informational messages to the
|
fect the way in which pcregrep writes informational messages to the
|
||||||
standard error and output streams. For these it uses the string "\n" to
|
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
|
indicate newlines, relying on the C I/O library to convert this to an
|
||||||
appropriate sequence.
|
appropriate sequence.
|
||||||
@ -687,13 +687,13 @@ OPTIONS WITH DATA
|
|||||||
--file /some/file
|
--file /some/file
|
||||||
|
|
||||||
Note, however, that if you want to supply a file name beginning with ~
|
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
|
as data in a shell command, and have the shell expand ~ to a home di-
|
||||||
directory, you must separate the file name from the option, because the
|
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.
|
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-
|
The exceptions to the above are the --colour (or --color) and --only-
|
||||||
matching options, for which the data is optional. If one of these
|
matching options, for which the data is optional. If one of these op-
|
||||||
options does have data, it must be given in the first form, using an
|
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.
|
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
|
It is possible to supply a regular expression that takes a very long
|
||||||
time to fail to match certain lines. Such patterns normally involve
|
time to fail to match certain lines. Such patterns normally involve
|
||||||
nested indefinite repeats, for example: (a+)*\d when matched against a
|
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
|
line of a's with no final digit. The PCRE matching function has a re-
|
||||||
resource limit that causes it to abort in these circumstances. If this
|
source limit that causes it to abort in these circumstances. If this
|
||||||
happens, pcregrep outputs an error message and the line that caused the
|
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
|
problem to the standard error stream. If there are more than 20 such
|
||||||
errors, pcregrep gives up.
|
errors, pcregrep gives up.
|
||||||
|
|
||||||
The --match-limit option of pcregrep can be used to set the overall
|
The --match-limit option of pcregrep can be used to set the overall re-
|
||||||
resource limit; there is a second option called --recursion-limit that
|
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
|
sets a limit on the amount of memory (usually stack) that is used (see
|
||||||
the discussion of these options above).
|
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
|
.SH NAME
|
||||||
pcretest - a program for testing Perl-compatible regular expressions.
|
pcretest - a program for testing Perl-compatible regular expressions.
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@ -78,21 +78,19 @@ the 16-bit library, or \fBpcre32_xx\fP when using the 32-bit library".
|
|||||||
.rs
|
.rs
|
||||||
.TP 10
|
.TP 10
|
||||||
\fB-8\fP
|
\fB-8\fP
|
||||||
If both the 8-bit library has been built, this option causes the 8-bit library
|
If the 8-bit library has been built, this option causes it to be used (this is
|
||||||
to be used (which is the default); if the 8-bit library has not been built,
|
the default). If the 8-bit library has not been built, this option causes an
|
||||||
this option causes an error.
|
error.
|
||||||
.TP 10
|
.TP 10
|
||||||
\fB-16\fP
|
\fB-16\fP
|
||||||
If both the 8-bit or the 32-bit, and the 16-bit libraries have been built, this
|
If the 16-bit library has been built, this option causes it to be used. If only
|
||||||
option causes the 16-bit library to be used. If only the 16-bit library has been
|
the 16-bit library has been built, this is the default. If the 16-bit library
|
||||||
built, this is the default (so has no effect). If only the 8-bit or the 32-bit
|
has not been built, this option causes an error.
|
||||||
library has been built, this option causes an error.
|
|
||||||
.TP 10
|
.TP 10
|
||||||
\fB-32\fP
|
\fB-32\fP
|
||||||
If both the 8-bit or the 16-bit, and the 32-bit libraries have been built, this
|
If the 32-bit library has been built, this option causes it to be used. If only
|
||||||
option causes the 32-bit library to be used. If only the 32-bit library has been
|
the 32-bit library has been built, this is the default. If the 32-bit library
|
||||||
built, this is the default (so has no effect). If only the 8-bit or the 16-bit
|
has not been built, this option causes an error.
|
||||||
library has been built, this option causes an error.
|
|
||||||
.TP 10
|
.TP 10
|
||||||
\fB-b\fP
|
\fB-b\fP
|
||||||
Behave as if each pattern has the \fB/B\fP (show byte code) modifier; the
|
Behave as if each pattern has the \fB/B\fP (show byte code) modifier; the
|
||||||
@ -1155,6 +1153,6 @@ Cambridge CB2 3QH, England.
|
|||||||
.rs
|
.rs
|
||||||
.sp
|
.sp
|
||||||
.nf
|
.nf
|
||||||
Last updated: 23 February 2017
|
Last updated: 10 February 2020
|
||||||
Copyright (c) 1997-2017 University of Cambridge.
|
Copyright (c) 1997-2020 University of Cambridge.
|
||||||
.fi
|
.fi
|
||||||
|
@ -47,15 +47,15 @@ INPUT DATA FORMAT
|
|||||||
PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES
|
PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES
|
||||||
|
|
||||||
From release 8.30, two separate PCRE libraries can be built. The origi-
|
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
|
nal one supports 8-bit character strings, whereas the newer 16-bit li-
|
||||||
library supports character strings encoded in 16-bit units. From
|
brary supports character strings encoded in 16-bit units. From release
|
||||||
release 8.32, a third library can be built, supporting character
|
8.32, a third library can be built, supporting character strings en-
|
||||||
strings encoded in 32-bit units. The pcretest program can be used to
|
coded in 32-bit units. The pcretest program can be used to test all
|
||||||
test all three libraries. However, it is itself still an 8-bit program,
|
three libraries. However, it is itself still an 8-bit program, reading
|
||||||
reading 8-bit input and writing 8-bit output. When testing the 16-bit
|
8-bit input and writing 8-bit output. When testing the 16-bit or
|
||||||
or 32-bit library, the patterns and data strings are converted to 16-
|
32-bit library, the patterns and data strings are converted to 16- or
|
||||||
or 32-bit format before being passed to the PCRE library functions.
|
32-bit format before being passed to the PCRE library functions. Re-
|
||||||
Results are converted to 8-bit for output.
|
sults are converted to 8-bit for output.
|
||||||
|
|
||||||
References to functions and structures of the form pcre[16|32]_xx below
|
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
|
mean "pcre_xx when using the 8-bit library, pcre16_xx when using the
|
||||||
@ -64,30 +64,27 @@ PCRE's 8-BIT, 16-BIT AND 32-BIT LIBRARIES
|
|||||||
|
|
||||||
COMMAND LINE OPTIONS
|
COMMAND LINE OPTIONS
|
||||||
|
|
||||||
-8 If both the 8-bit library has been built, this option causes
|
-8 If the 8-bit library has been built, this option causes it to
|
||||||
the 8-bit library to be used (which is the default); if the
|
be used (this is the default). If the 8-bit library has not
|
||||||
8-bit library has not been built, this option causes an
|
been built, this option causes an error.
|
||||||
error.
|
|
||||||
|
|
||||||
-16 If both the 8-bit or the 32-bit, and the 16-bit libraries
|
-16 If the 16-bit library has been built, this option causes it
|
||||||
have been built, this option causes the 16-bit library to be
|
to be used. If only the 16-bit library has been built, this
|
||||||
used. If only the 16-bit library has been built, this is the
|
is the default. If the 16-bit library has not been built,
|
||||||
default (so has no effect). If only the 8-bit or the 32-bit
|
this option causes an error.
|
||||||
library has been built, this option causes an error.
|
|
||||||
|
|
||||||
-32 If both the 8-bit or the 16-bit, and the 32-bit libraries
|
-32 If the 32-bit library has been built, this option causes it
|
||||||
have been built, this option causes the 32-bit library to be
|
to be used. If only the 32-bit library has been built, this
|
||||||
used. If only the 32-bit library has been built, this is the
|
is the default. If the 32-bit library has not been built,
|
||||||
default (so has no effect). If only the 8-bit or the 16-bit
|
this option causes an error.
|
||||||
library has 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.
|
fier; the internal form is output after compilation.
|
||||||
|
|
||||||
-C Output the version number of the PCRE library, and all avail-
|
-C Output the version number of the PCRE library, and all avail-
|
||||||
able information about the optional features that are
|
able information about the optional features that are in-
|
||||||
included, and then exit with zero exit code. All other
|
cluded, and then exit with zero exit code. All other options
|
||||||
options are ignored.
|
are ignored.
|
||||||
|
|
||||||
-C option Output information about a specific build-time option, then
|
-C option Output information about a specific build-time option, then
|
||||||
exit. This functionality is intended for use in scripts such
|
exit. This functionality is intended for use in scripts such
|
||||||
@ -142,8 +139,8 @@ COMMAND LINE OPTIONS
|
|||||||
repeatedly with different limits.
|
repeatedly with different limits.
|
||||||
|
|
||||||
-m Output the size of each compiled pattern after it has been
|
-m Output the size of each compiled pattern after it has been
|
||||||
compiled. This is equivalent to adding /M to each regular
|
compiled. This is equivalent to adding /M to each regular ex-
|
||||||
expression. The size is given in bytes for both libraries.
|
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.
|
able auto-possessification for all patterns.
|
||||||
@ -188,22 +185,22 @@ COMMAND LINE OPTIONS
|
|||||||
after a match or no match when JIT-compiled code was actually
|
after a match or no match when JIT-compiled code was actually
|
||||||
used.
|
used.
|
||||||
|
|
||||||
Note that there are pattern options that can override -s,
|
Note that there are pattern options that can override -s, ei-
|
||||||
either specifying no studying at all, or suppressing JIT com-
|
ther specifying no studying at all, or suppressing JIT compi-
|
||||||
pilation.
|
lation.
|
||||||
|
|
||||||
If the /I or /D option is present on a pattern (requesting
|
If the /I or /D option is present on a pattern (requesting
|
||||||
output about the compiled pattern), information about the
|
output about the compiled pattern), information about the re-
|
||||||
result of studying is not included when studying is caused
|
sult of studying is not included when studying is caused only
|
||||||
only by -s and neither -i nor -d is present on the command
|
by -s and neither -i nor -d is present on the command line.
|
||||||
line. This behaviour means that the output from tests that
|
This behaviour means that the output from tests that are run
|
||||||
are run with and without -s should be identical, except when
|
with and without -s should be identical, except when options
|
||||||
options that output information about the actual running of a
|
that output information about the actual running of a match
|
||||||
match are set.
|
are set.
|
||||||
|
|
||||||
The -M, -t, and -tm options, which give information about
|
The -M, -t, and -tm options, which give information about re-
|
||||||
resources used, are likely to produce different output with
|
sources used, are likely to produce different output with and
|
||||||
and without -s. Output may also differ if the /C option is
|
without -s. Output may also differ if the /C option is
|
||||||
present on an individual pattern. This uses callouts to trace
|
present on an individual pattern. This uses callouts to trace
|
||||||
the the matching process, and this may be different between
|
the the matching process, and this may be different between
|
||||||
studied and non-studied patterns. If the pattern contains
|
studied and non-studied patterns. If the pattern contains
|
||||||
@ -397,9 +394,9 @@ PATTERN MODIFIERS
|
|||||||
/^abc/m<CRLF>
|
/^abc/m<CRLF>
|
||||||
|
|
||||||
As well as turning on the PCRE_UTF8/16/32 option, the /8 modifier
|
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
|
causes all non-printing characters in output strings to be printed us-
|
||||||
using the \x{hh...} notation. Otherwise, those less than 0x100 are out-
|
ing the \x{hh...} notation. Otherwise, those less than 0x100 are output
|
||||||
put in hex without the curly brackets.
|
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.
|
tion.
|
||||||
@ -410,11 +407,11 @@ PATTERN MODIFIERS
|
|||||||
requested by the /g or /G modifier. After finding a match, PCRE is
|
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-
|
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
|
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
|
to pcre[16|32]_exec() to start searching at a new point within the en-
|
||||||
entire string (which is in effect what Perl does), whereas the latter
|
tire string (which is in effect what Perl does), whereas the latter
|
||||||
passes over a shortened substring. This makes a difference to the
|
passes over a shortened substring. This makes a difference to the
|
||||||
matching process if the pattern begins with a lookbehind assertion
|
matching process if the pattern begins with a lookbehind assertion (in-
|
||||||
(including \b or \B).
|
cluding \b or \B).
|
||||||
|
|
||||||
If any call to pcre[16|32]_exec() in a /g or /G sequence matches an
|
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
|
empty string, the next call is done with the PCRE_NOTEMPTY_ATSTART and
|
||||||
@ -431,11 +428,11 @@ PATTERN MODIFIERS
|
|||||||
There are yet more modifiers for controlling the way pcretest operates.
|
There are yet more modifiers for controlling the way pcretest operates.
|
||||||
|
|
||||||
The /+ modifier requests that as well as outputting the substring that
|
The /+ modifier requests that as well as outputting the substring that
|
||||||
matched the entire pattern, pcretest should in addition output the
|
matched the entire pattern, pcretest should in addition output the re-
|
||||||
remainder of the subject string. This is useful for tests where the
|
mainder of the subject string. This is useful for tests where the sub-
|
||||||
subject contains multiple copies of the same substring. If the + modi-
|
ject contains multiple copies of the same substring. If the + modifier
|
||||||
fier appears twice, the same action is taken for captured substrings.
|
appears twice, the same action is taken for captured substrings. In
|
||||||
In each case the remainder is output on the following line with a plus
|
each case the remainder is output on the following line with a plus
|
||||||
character following the capture number. Note that this modifier must
|
character following the capture number. Note that this modifier must
|
||||||
not immediately follow the /S modifier because /S+ and /S++ have other
|
not immediately follow the /S modifier because /S+ and /S++ have other
|
||||||
meanings.
|
meanings.
|
||||||
@ -471,13 +468,13 @@ PATTERN MODIFIERS
|
|||||||
and so on). It does this by calling pcre[16|32]_fullinfo() after com-
|
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
|
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,
|
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,
|
that is, the value of a single data item (8-bit, 16-bit, or 32-bit, de-
|
||||||
depending on the library that is being tested).
|
pending on the library that is being tested).
|
||||||
|
|
||||||
The /K modifier requests pcretest to show names from backtracking con-
|
The /K modifier requests pcretest to show names from backtracking con-
|
||||||
trol verbs that are returned from calls to pcre[16|32]_exec(). It
|
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
|
causes pcretest to create a pcre[16|32]_extra block if one has not al-
|
||||||
already been created by a call to pcre[16|32]_study(), and to set the
|
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_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
|
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,
|
points to is non-NULL for a match, non-match, or partial match,
|
||||||
@ -494,8 +491,8 @@ PATTERN MODIFIERS
|
|||||||
pcre[16|32]_maketables() is called to build a set of character tables
|
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
|
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
|
compiling the regular expression. Without an /L (or /T) modifier, NULL
|
||||||
is passed as the tables pointer; that is, /L applies only to the
|
is passed as the tables pointer; that is, /L applies only to the ex-
|
||||||
expression on which it appears.
|
pression on which it appears.
|
||||||
|
|
||||||
The /M modifier causes the size in bytes of the memory block used to
|
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
|
hold the compiled pattern to be output. This does not include the size
|
||||||
@ -508,9 +505,9 @@ PATTERN MODIFIERS
|
|||||||
external function that is passed to PCRE and used for stack checking
|
external function that is passed to PCRE and used for stack checking
|
||||||
during compilation (see the pcreapi documentation for details).
|
during compilation (see the pcreapi documentation for details).
|
||||||
|
|
||||||
The /S modifier causes pcre[16|32]_study() to be called after the
|
The /S modifier causes pcre[16|32]_study() to be called after the ex-
|
||||||
expression has been compiled, and the results used when the expression
|
pression has been compiled, and the results used when the expression is
|
||||||
is matched. There are a number of qualifying characters that may follow
|
matched. There are a number of qualifying characters that may follow
|
||||||
/S. They may appear in any order.
|
/S. They may appear in any order.
|
||||||
|
|
||||||
If /S is followed by an exclamation mark, pcre[16|32]_study() is called
|
If /S is followed by an exclamation mark, pcre[16|32]_study() is called
|
||||||
@ -582,8 +579,8 @@ PATTERN MODIFIERS
|
|||||||
/W REG_UCP ) the POSIX standard
|
/W REG_UCP ) the POSIX standard
|
||||||
/8 REG_UTF8 )
|
/8 REG_UTF8 )
|
||||||
|
|
||||||
The /+ modifier works as described above. All other modifiers are
|
The /+ modifier works as described above. All other modifiers are ig-
|
||||||
ignored.
|
nored.
|
||||||
|
|
||||||
Locking out certain modifiers
|
Locking out certain modifiers
|
||||||
|
|
||||||
@ -611,10 +608,10 @@ PATTERN MODIFIERS
|
|||||||
< forbid <JS><cr>
|
< forbid <JS><cr>
|
||||||
|
|
||||||
There must be a single space between < and "forbid" for this feature to
|
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
|
be recognised. If there is not, the line is interpreted either as a re-
|
||||||
request to re-load a pre-compiled pattern (see "SAVING AND RELOADING
|
quest to re-load a pre-compiled pattern (see "SAVING AND RELOADING COM-
|
||||||
COMPILED PATTERNS" below) or, if there is a another < character, as a
|
PILED PATTERNS" below) or, if there is a another < character, as a pat-
|
||||||
pattern that uses < as its delimiter.
|
tern that uses < as its delimiter.
|
||||||
|
|
||||||
|
|
||||||
DATA LINES
|
DATA LINES
|
||||||
@ -726,8 +723,8 @@ DATA LINES
|
|||||||
makes it possible to construct invalid UTF-32 sequences for testing
|
makes it possible to construct invalid UTF-32 sequences for testing
|
||||||
purposes.
|
purposes.
|
||||||
|
|
||||||
The escapes that specify line ending sequences are literal strings,
|
The escapes that specify line ending sequences are literal strings, ex-
|
||||||
exactly as shown. No more than one newline setting should be present in
|
actly as shown. No more than one newline setting should be present in
|
||||||
any data line.
|
any data line.
|
||||||
|
|
||||||
A backslash followed by anything else just escapes the anything else.
|
A backslash followed by anything else just escapes the anything else.
|
||||||
@ -744,8 +741,8 @@ DATA LINES
|
|||||||
different values in the match_limit and match_limit_recursion fields of
|
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-
|
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
|
out error. Because this is testing a specific feature of the normal in-
|
||||||
interpretive pcre[16|32]_exec() execution, the use of any JIT optimiza-
|
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
|
tion that might have been set up by the /S+ qualifier of -s+ option is
|
||||||
disabled.
|
disabled.
|
||||||
|
|
||||||
@ -755,27 +752,27 @@ DATA LINES
|
|||||||
numbers of matching possibilities, it can become large very quickly
|
numbers of matching possibilities, it can become large very quickly
|
||||||
with increasing length of subject string. The match_limit_recursion
|
with increasing length of subject string. The match_limit_recursion
|
||||||
number is a measure of how much stack (or, if PCRE is compiled with
|
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
|
NO_RECURSE, how much heap) memory is needed to complete the match at-
|
||||||
attempt.
|
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
|
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
|
only to the call of pcre[16|32]_exec() for the line in which it ap-
|
||||||
appears.
|
pears.
|
||||||
|
|
||||||
If the /P modifier was present on the pattern, causing the POSIX wrap-
|
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
|
per API to be used, the only option-setting sequences that have any ef-
|
||||||
effect are \B, \N, and \Z, causing REG_NOTBOL, REG_NOTEMPTY, and
|
fect are \B, \N, and \Z, causing REG_NOTBOL, REG_NOTEMPTY, and REG_NO-
|
||||||
REG_NOTEOL, respectively, to be passed to regexec().
|
TEOL, respectively, to be passed to regexec().
|
||||||
|
|
||||||
|
|
||||||
THE ALTERNATIVE MATCHING FUNCTION
|
THE ALTERNATIVE MATCHING FUNCTION
|
||||||
|
|
||||||
By default, pcretest uses the standard PCRE matching function,
|
By default, pcretest uses the standard PCRE matching function,
|
||||||
pcre[16|32]_exec() to match each data line. PCRE also supports an
|
pcre[16|32]_exec() to match each data line. PCRE also supports an al-
|
||||||
alternative matching function, pcre[16|32]_dfa_test(), which operates
|
ternative matching function, pcre[16|32]_dfa_test(), which operates in
|
||||||
in a different way, and has some restrictions. The differences between
|
a different way, and has some restrictions. The differences between the
|
||||||
the two functions are described in the pcrematching documentation.
|
two functions are described in the pcrematching documentation.
|
||||||
|
|
||||||
If a data line contains the \D escape sequence, or if the command line
|
If a data line contains the \D escape sequence, or if the command line
|
||||||
contains the -dfa option, the alternative matching function is used.
|
contains the -dfa option, the alternative matching function is used.
|
||||||
@ -793,16 +790,15 @@ DEFAULT OUTPUT FROM PCRETEST
|
|||||||
that pcre[16|32]_exec() returns, starting with number 0 for the string
|
that pcre[16|32]_exec() returns, starting with number 0 for the string
|
||||||
that matched the whole pattern. Otherwise, it outputs "No match" when
|
that matched the whole pattern. Otherwise, it outputs "No match" when
|
||||||
the return is PCRE_ERROR_NOMATCH, and "Partial match:" followed by the
|
the return is PCRE_ERROR_NOMATCH, and "Partial match:" followed by the
|
||||||
partially matching substring when pcre[16|32]_exec() returns
|
partially matching substring when pcre[16|32]_exec() returns PCRE_ER-
|
||||||
PCRE_ERROR_PARTIAL. (Note that this is the entire substring that was
|
ROR_PARTIAL. (Note that this is the entire substring that was inspected
|
||||||
inspected during the partial match; it may include characters before
|
during the partial match; it may include characters before the actual
|
||||||
the actual match start if a lookbehind assertion, \K, \b, or \B was
|
match start if a lookbehind assertion, \K, \b, or \B was involved.) For
|
||||||
involved.) For any other return, pcretest outputs the PCRE negative
|
any other return, pcretest outputs the PCRE negative error number and a
|
||||||
error number and a short descriptive phrase. If the error is a failed
|
short descriptive phrase. If the error is a failed UTF string check,
|
||||||
UTF string check, the offset of the start of the failing character and
|
the offset of the start of the failing character and the reason code
|
||||||
the reason code are also output, provided that the size of the output
|
are also output, provided that the size of the output vector is at
|
||||||
vector is at least two. Here is an example of an interactive pcretest
|
least two. Here is an example of an interactive pcretest run.
|
||||||
run.
|
|
||||||
|
|
||||||
$ pcretest
|
$ pcretest
|
||||||
PCRE version 8.13 2011-04-30
|
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".)
|
(Using the normal matching function on this data finds only "tang".)
|
||||||
The longest matching string is always given first (and numbered zero).
|
The longest matching string is always given first (and numbered zero).
|
||||||
After a PCRE_ERROR_PARTIAL return, the output is "Partial match:", fol-
|
After a PCRE_ERROR_PARTIAL return, the output is "Partial match:", fol-
|
||||||
lowed by the partially matching substring. (Note that this is the
|
lowed by the partially matching substring. (Note that this is the en-
|
||||||
entire substring that was inspected during the partial match; it may
|
tire substring that was inspected during the partial match; it may in-
|
||||||
include characters before the actual match start if a lookbehind asser-
|
clude characters before the actual match start if a lookbehind asser-
|
||||||
tion, \K, \b, or \B was involved.)
|
tion, \K, \b, or \B was involved.)
|
||||||
|
|
||||||
If /g is present on the pattern, the search for further matches resumes
|
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
|
1: tan
|
||||||
0: tan
|
0: tan
|
||||||
|
|
||||||
Since the matching function does not support substring capture, the
|
Since the matching function does not support substring capture, the es-
|
||||||
escape sequences that are concerned with captured substrings are not
|
cape sequences that are concerned with captured substrings are not rel-
|
||||||
relevant.
|
evant.
|
||||||
|
|
||||||
|
|
||||||
RESTARTING AFTER A PARTIAL MATCH
|
RESTARTING AFTER A PARTIAL MATCH
|
||||||
@ -942,9 +938,9 @@ CALLOUTS
|
|||||||
--->pqrabcdef
|
--->pqrabcdef
|
||||||
0 ^ ^ \d
|
0 ^ ^ \d
|
||||||
|
|
||||||
This output indicates that callout number 0 occurred for a match
|
This output indicates that callout number 0 occurred for a match at-
|
||||||
attempt starting at the fourth character of the subject string, when
|
tempt starting at the fourth character of the subject string, when the
|
||||||
the pointer was at the seventh character of the data, and when the next
|
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
|
pattern item was \d. Just one circumflex is output if the start and
|
||||||
current positions are the same.
|
current positions are the same.
|
||||||
|
|
||||||
@ -963,8 +959,8 @@ CALLOUTS
|
|||||||
0: E*
|
0: E*
|
||||||
|
|
||||||
If a pattern contains (*MARK) items, an additional line is output when-
|
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
|
ever a change of latest mark is passed to the callout function. For ex-
|
||||||
example:
|
ample:
|
||||||
|
|
||||||
re> /a(*MARK:X)bc/C
|
re> /a(*MARK:X)bc/C
|
||||||
data> abc
|
data> abc
|
||||||
@ -999,8 +995,8 @@ NON-PRINTING CHARACTERS
|
|||||||
|
|
||||||
When pcretest is outputting text that is a matched part of a subject
|
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
|
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
|
set for the pattern (using the /L modifier). In this case, the is-
|
||||||
isprint() function to distinguish printing and non-printing characters.
|
print() function to distinguish printing and non-printing characters.
|
||||||
|
|
||||||
|
|
||||||
SAVING AND RELOADING COMPILED PATTERNS
|
SAVING AND RELOADING COMPILED PATTERNS
|
||||||
@ -1020,14 +1016,14 @@ SAVING AND RELOADING COMPILED PATTERNS
|
|||||||
studied with JIT optimization, the JIT data cannot be saved.
|
studied with JIT optimization, the JIT data cannot be saved.
|
||||||
|
|
||||||
The data that is written is binary. The first eight bytes are the
|
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
|
length of the compiled pattern data followed by the length of the op-
|
||||||
optional study data, each written as four bytes in big-endian order
|
tional study data, each written as four bytes in big-endian order (most
|
||||||
(most significant byte first). If there is no study data (either the
|
significant byte first). If there is no study data (either the pattern
|
||||||
pattern was not studied, or studying did not return any data), the sec-
|
was not studied, or studying did not return any data), the second
|
||||||
ond length is zero. The lengths are followed by an exact copy of the
|
length is zero. The lengths are followed by an exact copy of the com-
|
||||||
compiled pattern. If there is additional study data, this (excluding
|
piled pattern. If there is additional study data, this (excluding any
|
||||||
any JIT data) follows immediately after the compiled pattern. After
|
JIT data) follows immediately after the compiled pattern. After writing
|
||||||
writing the file, pcretest expects to read a new pattern.
|
the file, pcretest expects to read a new pattern.
|
||||||
|
|
||||||
A saved pattern can be reloaded into pcretest by specifying < and a
|
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
|
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
|
ing and experimentation. It is not intended for production use because
|
||||||
only a single pattern can be written to a file. Furthermore, there is
|
only a single pattern can be written to a file. Furthermore, there is
|
||||||
no facility for supplying custom character tables for use with a
|
no facility for supplying custom character tables for use with a
|
||||||
reloaded pattern. If the original pattern was compiled with custom
|
reloaded pattern. If the original pattern was compiled with custom ta-
|
||||||
tables, an attempt to match a subject string using a reloaded pattern
|
bles, an attempt to match a subject string using a reloaded pattern is
|
||||||
is likely to cause pcretest to crash. Finally, if you attempt to load
|
likely to cause pcretest to crash. Finally, if you attempt to load a
|
||||||
a file that is not in the correct format, the result is undefined.
|
file that is not in the correct format, the result is undefined.
|
||||||
|
|
||||||
|
|
||||||
SEE ALSO
|
SEE ALSO
|
||||||
@ -1087,5 +1083,5 @@ AUTHOR
|
|||||||
|
|
||||||
REVISION
|
REVISION
|
||||||
|
|
||||||
Last updated: 23 February 2017
|
Last updated: 10 February 2020
|
||||||
Copyright (c) 1997-2017 University of Cambridge.
|
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.
|
and semantics are as close as possible to those of the Perl 5 language.
|
||||||
|
|
||||||
Written by Philip Hazel
|
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
|
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. */
|
/* 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
|
/* 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
|
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. */
|
/* Private flags added to firstchar and reqchar. */
|
||||||
|
|
||||||
#define REQ_CASELESS (1 << 0) /* Indicates caselessness */
|
#define REQ_CASELESS (1U << 0) /* Indicates caselessness */
|
||||||
#define REQ_VARY (1 << 1) /* Reqchar followed non-literal item */
|
#define REQ_VARY (1U << 1) /* Reqchar followed non-literal item */
|
||||||
/* Negative values for the firstchar and reqchar flags */
|
/* Negative values for the firstchar and reqchar flags */
|
||||||
#define REQ_UNSET (-2)
|
#define REQ_UNSET (-2)
|
||||||
#define REQ_NONE (-1)
|
#define REQ_NONE (-1)
|
||||||
@ -3612,7 +3612,7 @@ for(;;)
|
|||||||
if (chr > 255) break;
|
if (chr > 255) break;
|
||||||
class_bitset = (pcre_uint8 *)
|
class_bitset = (pcre_uint8 *)
|
||||||
((list_ptr == list ? code : base_end) - list_ptr[2]);
|
((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;
|
break;
|
||||||
|
|
||||||
#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
|
#if defined SUPPORT_UTF || !defined COMPILE_PCRE8
|
||||||
@ -7133,17 +7133,19 @@ for (;; ptr++)
|
|||||||
int n = 0;
|
int n = 0;
|
||||||
ptr++;
|
ptr++;
|
||||||
while(IS_DIGIT(*ptr))
|
while(IS_DIGIT(*ptr))
|
||||||
n = n * 10 + *ptr++ - CHAR_0;
|
|
||||||
if (*ptr != CHAR_RIGHT_PARENTHESIS)
|
|
||||||
{
|
{
|
||||||
*errorcodeptr = ERR39;
|
n = n * 10 + *ptr++ - CHAR_0;
|
||||||
goto FAILED;
|
|
||||||
}
|
|
||||||
if (n > 255)
|
if (n > 255)
|
||||||
{
|
{
|
||||||
*errorcodeptr = ERR38;
|
*errorcodeptr = ERR38;
|
||||||
goto FAILED;
|
goto FAILED;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (*ptr != CHAR_RIGHT_PARENTHESIS)
|
||||||
|
{
|
||||||
|
*errorcodeptr = ERR39;
|
||||||
|
goto FAILED;
|
||||||
|
}
|
||||||
*code++ = n;
|
*code++ = n;
|
||||||
PUT(code, 0, (int)(ptr - cd->start_pattern + 1)); /* Pattern offset */
|
PUT(code, 0, (int)(ptr - cd->start_pattern + 1)); /* Pattern offset */
|
||||||
PUT(code, LINK_SIZE, 0); /* Default length */
|
PUT(code, LINK_SIZE, 0); /* Default length */
|
||||||
@ -7459,7 +7461,7 @@ for (;; ptr++)
|
|||||||
{
|
{
|
||||||
open_capitem *oc;
|
open_capitem *oc;
|
||||||
recno = GET2(slot, 0);
|
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;
|
if (recno > cd->top_backref) cd->top_backref = recno;
|
||||||
|
|
||||||
/* Check to see if this back reference is recursive, that it, it
|
/* 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;
|
item_hwm_offset = cd->hwm - cd->start_workspace;
|
||||||
*code++ = ((options & PCRE_CASELESS) != 0)? OP_REFI : OP_REF;
|
*code++ = ((options & PCRE_CASELESS) != 0)? OP_REFI : OP_REF;
|
||||||
PUT2INC(code, 0, recno);
|
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;
|
if (recno > cd->top_backref) cd->top_backref = recno;
|
||||||
|
|
||||||
/* Check to see if this back reference is recursive, that it, it
|
/* Check to see if this back reference is recursive, that it, it
|
||||||
@ -8683,7 +8685,7 @@ do {
|
|||||||
op == OP_SCBRA || op == OP_SCBRAPOS)
|
op == OP_SCBRA || op == OP_SCBRAPOS)
|
||||||
{
|
{
|
||||||
int n = GET2(scode, 1+LINK_SIZE);
|
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;
|
if (!is_anchored(scode, new_map, cd, atomcount)) return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8811,7 +8813,7 @@ do {
|
|||||||
op == OP_SCBRA || op == OP_SCBRAPOS)
|
op == OP_SCBRA || op == OP_SCBRAPOS)
|
||||||
{
|
{
|
||||||
int n = GET2(scode, 1+LINK_SIZE);
|
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;
|
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;
|
sljit_s32 value = (sljit_s32)chr;
|
||||||
#if defined COMPILE_PCRE8
|
#if defined COMPILE_PCRE8
|
||||||
#define SSE2_COMPARE_TYPE_INDEX 0
|
#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
|
#elif defined COMPILE_PCRE16
|
||||||
#define SSE2_COMPARE_TYPE_INDEX 1
|
#define SSE2_COMPARE_TYPE_INDEX 1
|
||||||
return (value << 16) | value;
|
return ((unsigned int)value << 16) | value;
|
||||||
#elif defined COMPILE_PCRE32
|
#elif defined COMPILE_PCRE32
|
||||||
#define SSE2_COMPARE_TYPE_INDEX 2
|
#define SSE2_COMPARE_TYPE_INDEX 2
|
||||||
return value;
|
return value;
|
||||||
@ -8507,7 +8507,7 @@ if (opcode == OP_ONCE)
|
|||||||
/* We temporarily encode the needs_control_head in the lowest bit.
|
/* We temporarily encode the needs_control_head in the lowest bit.
|
||||||
Note: on the target architectures of SLJIT the ((x << 1) >> 1) returns
|
Note: on the target architectures of SLJIT the ((x << 1) >> 1) returns
|
||||||
the same value for small signed numbers (including negative numbers). */
|
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;
|
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
|
// inclusive test if we ever needed it. (Note that not only the
|
||||||
// __attribute__ syntax, but also __USER_LABEL_PREFIX__, are
|
// __attribute__ syntax, but also __USER_LABEL_PREFIX__, are
|
||||||
// gnu-specific.)
|
// 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(x) ULP_AS_STRING_INTERNAL(x)
|
||||||
# define ULP_AS_STRING_INTERNAL(x) #x
|
# define ULP_AS_STRING_INTERNAL(x) #x
|
||||||
# define USER_LABEL_PREFIX_STR ULP_AS_STRING(__USER_LABEL_PREFIX__)
|
# define USER_LABEL_PREFIX_STR ULP_AS_STRING(__USER_LABEL_PREFIX__)
|
||||||
@ -91,6 +92,7 @@ static const char *start_options[] = {
|
|||||||
"(*LIMIT_RECURSION=",
|
"(*LIMIT_RECURSION=",
|
||||||
"(*LIMIT_MATCH=",
|
"(*LIMIT_MATCH=",
|
||||||
"(*CRLF)",
|
"(*CRLF)",
|
||||||
|
"(*LF)",
|
||||||
"(*CR)",
|
"(*CR)",
|
||||||
"(*BSR_UNICODE)",
|
"(*BSR_UNICODE)",
|
||||||
"(*BSR_ANYCRLF)",
|
"(*BSR_ANYCRLF)",
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
and semantics are as close as possible to those of the Perl 5 language.
|
and semantics are as close as possible to those of the Perl 5 language.
|
||||||
|
|
||||||
Written by Philip Hazel
|
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
|
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,
|
(void)pcre_fullinfo((const pcre *)preg->re_pcre, NULL, PCRE_INFO_CAPTURECOUNT,
|
||||||
&re_nsub);
|
&re_nsub);
|
||||||
preg->re_nsub = (size_t)re_nsub;
|
preg->re_nsub = (size_t)re_nsub;
|
||||||
|
preg->re_erroffset = (size_t)(-1); /* No meaning after successful compile */
|
||||||
return 0;
|
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_NOTEOL) != 0) options |= PCRE_NOTEOL;
|
||||||
if ((eflags & REG_NOTEMPTY) != 0) options |= PCRE_NOTEMPTY;
|
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
|
/* 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
|
to put it, ensure that nmatch is zero. Otherwise, ensure the vector for holding
|
||||||
the return data is large enough. */
|
the return data is large enough. */
|
||||||
|
@ -500,7 +500,7 @@ enum {
|
|||||||
#if (defined (SUPPORT_PCRE8) + defined (SUPPORT_PCRE16) + \
|
#if (defined (SUPPORT_PCRE8) + defined (SUPPORT_PCRE16) + \
|
||||||
defined (SUPPORT_PCRE32)) >= 2
|
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
|
/* 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
|
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 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) <
|
if (fwrite(extra->study_data, 1, true_study_size, f) <
|
||||||
true_study_size)
|
true_study_size)
|
||||||
@ -4736,7 +4736,7 @@ while (!done)
|
|||||||
if (isdigit(*p)) /* Set copy string */
|
if (isdigit(*p)) /* Set copy string */
|
||||||
{
|
{
|
||||||
while(isdigit(*p)) n = n * 10 + *p++ - '0';
|
while(isdigit(*p)) n = n * 10 + *p++ - '0';
|
||||||
copystrings |= 1 << n;
|
copystrings |= 1U << n;
|
||||||
}
|
}
|
||||||
else if (isalnum(*p))
|
else if (isalnum(*p))
|
||||||
{
|
{
|
||||||
@ -4799,7 +4799,7 @@ while (!done)
|
|||||||
if (isdigit(*p))
|
if (isdigit(*p))
|
||||||
{
|
{
|
||||||
while(isdigit(*p)) n = n * 10 + *p++ - '0';
|
while(isdigit(*p)) n = n * 10 + *p++ - '0';
|
||||||
getstrings |= 1 << n;
|
getstrings |= 1U << n;
|
||||||
}
|
}
|
||||||
else if (isalnum(*p))
|
else if (isalnum(*p))
|
||||||
{
|
{
|
||||||
@ -5336,7 +5336,7 @@ while (!done)
|
|||||||
|
|
||||||
for (i = 0; i < 32; i++)
|
for (i = 0; i < 32; i++)
|
||||||
{
|
{
|
||||||
if ((copystrings & (1 << i)) != 0)
|
if ((copystrings & (1U << i)) != 0)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
char copybuffer[256];
|
char copybuffer[256];
|
||||||
@ -5401,7 +5401,7 @@ while (!done)
|
|||||||
|
|
||||||
for (i = 0; i < 32; i++)
|
for (i = 0; i < 32; i++)
|
||||||
{
|
{
|
||||||
if ((getstrings & (1 << i)) != 0)
|
if ((getstrings & (1U << i)) != 0)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
const char *substring;
|
const char *substring;
|
||||||
|
2
pcre/testdata/testinput2
vendored
2
pcre/testdata/testinput2
vendored
@ -1380,7 +1380,7 @@
|
|||||||
1X
|
1X
|
||||||
123456\P
|
123456\P
|
||||||
|
|
||||||
//KF>testsavedregex
|
//S-KF>testsavedregex
|
||||||
|
|
||||||
/abc/IS>testsavedregex
|
/abc/IS>testsavedregex
|
||||||
<testsavedregex
|
<testsavedregex
|
||||||
|
3
pcre/testdata/testoutput2
vendored
3
pcre/testdata/testoutput2
vendored
@ -5614,9 +5614,8 @@ No match
|
|||||||
123456\P
|
123456\P
|
||||||
No match
|
No match
|
||||||
|
|
||||||
//KF>testsavedregex
|
//S-KF>testsavedregex
|
||||||
Compiled pattern written to testsavedregex
|
Compiled pattern written to testsavedregex
|
||||||
Study data written to testsavedregex
|
|
||||||
|
|
||||||
/abc/IS>testsavedregex
|
/abc/IS>testsavedregex
|
||||||
Capturing subpattern count = 0
|
Capturing subpattern count = 0
|
||||||
|
@ -1405,9 +1405,23 @@ unpack_fields(MYSQL *mysql, MYSQL_DATA *data,MEM_ROOT *alloc,uint fields,
|
|||||||
{
|
{
|
||||||
if (field >= result + fields)
|
if (field >= result + fields)
|
||||||
goto err;
|
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);
|
cli_fetch_lengths(&lengths[0], row->data, default_value ? 6 : 5);
|
||||||
field->org_table= field->table= strdup_root(alloc,(char*) row->data[0]);
|
field->org_table= field->table= strmake_root(alloc,(char*) row->data[0], lengths[0]);
|
||||||
field->name= strdup_root(alloc,(char*) row->data[1]);
|
field->name= strmake_root(alloc,(char*) row->data[1], lengths[1]);
|
||||||
field->length= (uint) uint3korr(row->data[2]);
|
field->length= (uint) uint3korr(row->data[2]);
|
||||||
field->type= (enum enum_field_types) (uchar) row->data[3][0];
|
field->type= (enum enum_field_types) (uchar) row->data[3][0];
|
||||||
|
|
||||||
@ -1432,7 +1446,7 @@ unpack_fields(MYSQL *mysql, MYSQL_DATA *data,MEM_ROOT *alloc,uint fields,
|
|||||||
field->flags|= NUM_FLAG;
|
field->flags|= NUM_FLAG;
|
||||||
if (default_value && row->data[5])
|
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];
|
field->def_length= lengths[5];
|
||||||
}
|
}
|
||||||
else
|
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
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -497,6 +498,7 @@ Event_scheduler::run(THD *thd)
|
|||||||
DBUG_PRINT("info", ("job_data is NULL, the thread was killed"));
|
DBUG_PRINT("info", ("job_data is NULL, the thread was killed"));
|
||||||
}
|
}
|
||||||
DBUG_PRINT("info", ("state=%s", scheduler_states_names[state].str));
|
DBUG_PRINT("info", ("state=%s", scheduler_states_names[state].str));
|
||||||
|
free_root(thd->mem_root, MYF(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
LOCK_DATA();
|
LOCK_DATA();
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
write-output "/* This file was generated using gen_win_tzname_data.ps1 */"
|
write-output "/* This file was generated using gen_win_tzname_data.ps1 */"
|
||||||
$xdoc = new-object System.Xml.XmlDocument
|
$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)
|
$nodes = $xdoc.SelectNodes("//mapZone[@territory='001']") # use default territory (001)
|
||||||
foreach ($node in $nodes) {
|
foreach ($node in $nodes) {
|
||||||
write-output ('{L"'+ $node.other + '","'+ $node.type+'"},')
|
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);
|
uint mrr_buf_size, MEM_ROOT *alloc);
|
||||||
static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree,
|
static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree,
|
||||||
bool index_read_must_be_used,
|
bool index_read_must_be_used,
|
||||||
bool update_tbl_stats,
|
bool for_range_access,
|
||||||
double read_time,
|
double read_time);
|
||||||
bool ror_scans_required);
|
|
||||||
static
|
static
|
||||||
TRP_INDEX_INTERSECT *get_best_index_intersect(PARAM *param, SEL_TREE *tree,
|
TRP_INDEX_INTERSECT *get_best_index_intersect(PARAM *param, SEL_TREE *tree,
|
||||||
double read_time);
|
double read_time);
|
||||||
@ -2593,7 +2592,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 */
|
/* Get best 'range' plan and prepare data for making other plans */
|
||||||
if ((range_trp= get_key_scans_params(¶m, tree, FALSE, TRUE,
|
if ((range_trp= get_key_scans_params(¶m, tree, FALSE, TRUE,
|
||||||
best_read_time, FALSE)))
|
best_read_time)))
|
||||||
{
|
{
|
||||||
best_trp= range_trp;
|
best_trp= range_trp;
|
||||||
best_read_time= best_trp->read_cost;
|
best_read_time= best_trp->read_cost;
|
||||||
@ -4680,7 +4679,6 @@ TABLE_READ_PLAN *get_best_disjunct_quick(PARAM *param, SEL_IMERGE *imerge,
|
|||||||
double roru_index_costs;
|
double roru_index_costs;
|
||||||
ha_rows roru_total_records;
|
ha_rows roru_total_records;
|
||||||
double roru_intersect_part= 1.0;
|
double roru_intersect_part= 1.0;
|
||||||
bool only_ror_scans_required= FALSE;
|
|
||||||
size_t n_child_scans;
|
size_t n_child_scans;
|
||||||
DBUG_ENTER("get_best_disjunct_quick");
|
DBUG_ENTER("get_best_disjunct_quick");
|
||||||
DBUG_PRINT("info", ("Full table scan cost: %g", read_time));
|
DBUG_PRINT("info", ("Full table scan cost: %g", read_time));
|
||||||
@ -4708,8 +4706,6 @@ TABLE_READ_PLAN *get_best_disjunct_quick(PARAM *param, SEL_IMERGE *imerge,
|
|||||||
n_child_scans)))
|
n_child_scans)))
|
||||||
DBUG_RETURN(NULL);
|
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,
|
Collect best 'range' scan for each of disjuncts, and, while doing so,
|
||||||
analyze possibility of ROR scans. Also calculate some values needed by
|
analyze possibility of ROR scans. Also calculate some values needed by
|
||||||
@ -4722,8 +4718,7 @@ TABLE_READ_PLAN *get_best_disjunct_quick(PARAM *param, SEL_IMERGE *imerge,
|
|||||||
DBUG_EXECUTE("info", print_sel_tree(param, *ptree, &(*ptree)->keys_map,
|
DBUG_EXECUTE("info", print_sel_tree(param, *ptree, &(*ptree)->keys_map,
|
||||||
"tree in SEL_IMERGE"););
|
"tree in SEL_IMERGE"););
|
||||||
if (!(*cur_child= get_key_scans_params(param, *ptree, TRUE, FALSE,
|
if (!(*cur_child= get_key_scans_params(param, *ptree, TRUE, FALSE,
|
||||||
read_time,
|
read_time)))
|
||||||
only_ror_scans_required)))
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
One of index scans in this index_merge is more expensive than entire
|
One of index scans in this index_merge is more expensive than entire
|
||||||
@ -5043,9 +5038,12 @@ TABLE_READ_PLAN *merge_same_index_scans(PARAM *param, SEL_IMERGE *imerge,
|
|||||||
a random order
|
a random order
|
||||||
2. the functions that estimate the cost of a range scan and an
|
2. the functions that estimate the cost of a range scan and an
|
||||||
index merge retrievals are not well calibrated
|
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,
|
trp= 0;
|
||||||
read_time, FALSE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DBUG_RETURN(trp);
|
DBUG_RETURN(trp);
|
||||||
@ -6772,9 +6770,9 @@ TRP_ROR_INTERSECT *get_best_covering_ror_intersect(PARAM *param,
|
|||||||
tree make range select for this SEL_TREE
|
tree make range select for this SEL_TREE
|
||||||
index_read_must_be_used if TRUE, assume 'index only' option will be set
|
index_read_must_be_used if TRUE, assume 'index only' option will be set
|
||||||
(except for clustered PK indexes)
|
(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.
|
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
|
RETURN
|
||||||
Best range read plan
|
Best range read plan
|
||||||
NULL if no plan found or error occurred
|
NULL if no plan found or error occurred
|
||||||
@ -6782,9 +6780,8 @@ TRP_ROR_INTERSECT *get_best_covering_ror_intersect(PARAM *param,
|
|||||||
|
|
||||||
static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree,
|
static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree,
|
||||||
bool index_read_must_be_used,
|
bool index_read_must_be_used,
|
||||||
bool update_tbl_stats,
|
bool for_range_access,
|
||||||
double read_time,
|
double read_time)
|
||||||
bool only_ror_scans_required)
|
|
||||||
{
|
{
|
||||||
uint idx, UNINIT_VAR(best_idx);
|
uint idx, UNINIT_VAR(best_idx);
|
||||||
SEL_ARG *key_to_read= NULL;
|
SEL_ARG *key_to_read= NULL;
|
||||||
@ -6829,10 +6826,11 @@ static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree,
|
|||||||
(bool) param->table->covering_keys.is_set(keynr);
|
(bool) param->table->covering_keys.is_set(keynr);
|
||||||
|
|
||||||
found_records= check_quick_select(param, idx, read_index_only, key,
|
found_records= check_quick_select(param, idx, read_index_only, key,
|
||||||
update_tbl_stats, &mrr_flags,
|
for_range_access, &mrr_flags,
|
||||||
&buf_size, &cost);
|
&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 */
|
/* The scan is not a ROR-scan, just skip it */
|
||||||
continue;
|
continue;
|
||||||
|
@ -4454,6 +4454,7 @@ connected:
|
|||||||
goto err;
|
goto err;
|
||||||
goto connected;
|
goto connected;
|
||||||
}
|
}
|
||||||
|
DBUG_EXECUTE_IF("fail_com_register_slave", goto err;);
|
||||||
}
|
}
|
||||||
|
|
||||||
DBUG_PRINT("info",("Starting reading binary log from master"));
|
DBUG_PRINT("info",("Starting reading binary log from master"));
|
||||||
|
@ -71,6 +71,7 @@
|
|||||||
#ifdef HAVE_SYS_SYSCALL_H
|
#ifdef HAVE_SYS_SYSCALL_H
|
||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include "repl_failsafe.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The following is used to initialise Table_ident with a internal
|
The following is used to initialise Table_ident with a internal
|
||||||
@ -1417,6 +1418,10 @@ void THD::cleanup(void)
|
|||||||
DBUG_ASSERT(!mdl_context.has_locks());
|
DBUG_ASSERT(!mdl_context.has_locks());
|
||||||
|
|
||||||
apc_target.destroy();
|
apc_target.destroy();
|
||||||
|
#ifdef HAVE_REPLICATION
|
||||||
|
unregister_slave(this, true, true);
|
||||||
|
#endif
|
||||||
|
|
||||||
cleanup_done=1;
|
cleanup_done=1;
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2000, 2014, Oracle and/or its affiliates.
|
/* Copyright (c) 2000, 2019, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2009, 2018, MariaDB Corporation
|
Copyright (c) 2009, 2020, MariaDB Corporation
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -1190,17 +1190,27 @@ static inline uint int_token(const char *str,uint length)
|
|||||||
*/
|
*/
|
||||||
bool consume_comment(Lex_input_stream *lip, int remaining_recursions_permitted)
|
bool consume_comment(Lex_input_stream *lip, int remaining_recursions_permitted)
|
||||||
{
|
{
|
||||||
|
// only one level of nested comments are allowed
|
||||||
|
DBUG_ASSERT(remaining_recursions_permitted == 0 ||
|
||||||
|
remaining_recursions_permitted == 1);
|
||||||
uchar c;
|
uchar c;
|
||||||
while (! lip->eof())
|
while (! lip->eof())
|
||||||
{
|
{
|
||||||
c= lip->yyGet();
|
c= lip->yyGet();
|
||||||
|
|
||||||
if (remaining_recursions_permitted > 0)
|
if (remaining_recursions_permitted == 1)
|
||||||
{
|
{
|
||||||
if ((c == '/') && (lip->yyPeek() == '*'))
|
if ((c == '/') && (lip->yyPeek() == '*'))
|
||||||
{
|
{
|
||||||
|
lip->yyUnput('('); // Replace nested "/*..." with "(*..."
|
||||||
|
lip->yySkip(); // and skip "("
|
||||||
|
|
||||||
lip->yySkip(); /* Eat asterisk */
|
lip->yySkip(); /* Eat asterisk */
|
||||||
consume_comment(lip, remaining_recursions_permitted-1);
|
if (consume_comment(lip, 0))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
lip->yyUnput(')'); // Replace "...*/" with "...*)"
|
||||||
|
lip->yySkip(); // and skip ")"
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2082,7 +2082,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||||||
general_log_print(thd, command, "Log: '%s' Pos: %lu", name, pos);
|
general_log_print(thd, command, "Log: '%s' Pos: %lu", name, pos);
|
||||||
if (nlen < FN_REFLEN)
|
if (nlen < FN_REFLEN)
|
||||||
mysql_binlog_send(thd, thd->strmake(name, nlen), (my_off_t)pos, flags);
|
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 */
|
/* fake COM_QUIT -- if we get here, the thread needs to terminate */
|
||||||
error = TRUE;
|
error = TRUE;
|
||||||
break;
|
break;
|
||||||
|
@ -23,13 +23,13 @@
|
|||||||
{L"Haiti Standard Time","America/Port-au-Prince"},
|
{L"Haiti Standard Time","America/Port-au-Prince"},
|
||||||
{L"Cuba Standard Time","America/Havana"},
|
{L"Cuba Standard Time","America/Havana"},
|
||||||
{L"US Eastern Standard Time","America/Indianapolis"},
|
{L"US Eastern Standard Time","America/Indianapolis"},
|
||||||
|
{L"Turks And Caicos Standard Time","America/Grand_Turk"},
|
||||||
{L"Paraguay Standard Time","America/Asuncion"},
|
{L"Paraguay Standard Time","America/Asuncion"},
|
||||||
{L"Atlantic Standard Time","America/Halifax"},
|
{L"Atlantic Standard Time","America/Halifax"},
|
||||||
{L"Venezuela Standard Time","America/Caracas"},
|
{L"Venezuela Standard Time","America/Caracas"},
|
||||||
{L"Central Brazilian Standard Time","America/Cuiaba"},
|
{L"Central Brazilian Standard Time","America/Cuiaba"},
|
||||||
{L"SA Western Standard Time","America/La_Paz"},
|
{L"SA Western Standard Time","America/La_Paz"},
|
||||||
{L"Pacific SA Standard Time","America/Santiago"},
|
{L"Pacific SA Standard Time","America/Santiago"},
|
||||||
{L"Turks And Caicos Standard Time","America/Grand_Turk"},
|
|
||||||
{L"Newfoundland Standard Time","America/St_Johns"},
|
{L"Newfoundland Standard Time","America/St_Johns"},
|
||||||
{L"Tocantins Standard Time","America/Araguaina"},
|
{L"Tocantins Standard Time","America/Araguaina"},
|
||||||
{L"E. South America Standard Time","America/Sao_Paulo"},
|
{L"E. South America Standard Time","America/Sao_Paulo"},
|
||||||
@ -46,11 +46,11 @@
|
|||||||
{L"UTC","Etc/GMT"},
|
{L"UTC","Etc/GMT"},
|
||||||
{L"GMT Standard Time","Europe/London"},
|
{L"GMT Standard Time","Europe/London"},
|
||||||
{L"Greenwich Standard Time","Atlantic/Reykjavik"},
|
{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"W. Europe Standard Time","Europe/Berlin"},
|
||||||
{L"Central Europe Standard Time","Europe/Budapest"},
|
{L"Central Europe Standard Time","Europe/Budapest"},
|
||||||
{L"Romance Standard Time","Europe/Paris"},
|
{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"Central European Standard Time","Europe/Warsaw"},
|
||||||
{L"W. Central Africa Standard Time","Africa/Lagos"},
|
{L"W. Central Africa Standard Time","Africa/Lagos"},
|
||||||
{L"Jordan Standard Time","Asia/Amman"},
|
{L"Jordan Standard Time","Asia/Amman"},
|
||||||
@ -81,11 +81,13 @@
|
|||||||
{L"Mauritius Standard Time","Indian/Mauritius"},
|
{L"Mauritius Standard Time","Indian/Mauritius"},
|
||||||
{L"Saratov Standard Time","Europe/Saratov"},
|
{L"Saratov Standard Time","Europe/Saratov"},
|
||||||
{L"Georgian Standard Time","Asia/Tbilisi"},
|
{L"Georgian Standard Time","Asia/Tbilisi"},
|
||||||
|
{L"Volgograd Standard Time","Europe/Volgograd"},
|
||||||
{L"Caucasus Standard Time","Asia/Yerevan"},
|
{L"Caucasus Standard Time","Asia/Yerevan"},
|
||||||
{L"Afghanistan Standard Time","Asia/Kabul"},
|
{L"Afghanistan Standard Time","Asia/Kabul"},
|
||||||
{L"West Asia Standard Time","Asia/Tashkent"},
|
{L"West Asia Standard Time","Asia/Tashkent"},
|
||||||
{L"Ekaterinburg Standard Time","Asia/Yekaterinburg"},
|
{L"Ekaterinburg Standard Time","Asia/Yekaterinburg"},
|
||||||
{L"Pakistan Standard Time","Asia/Karachi"},
|
{L"Pakistan Standard Time","Asia/Karachi"},
|
||||||
|
{L"Qyzylorda Standard Time","Asia/Qyzylorda"},
|
||||||
{L"India Standard Time","Asia/Calcutta"},
|
{L"India Standard Time","Asia/Calcutta"},
|
||||||
{L"Sri Lanka Standard Time","Asia/Colombo"},
|
{L"Sri Lanka Standard Time","Asia/Colombo"},
|
||||||
{L"Nepal Standard Time","Asia/Katmandu"},
|
{L"Nepal Standard Time","Asia/Katmandu"},
|
||||||
|
@ -813,13 +813,16 @@ bool TDBXML::Initialize(PGLOBAL g)
|
|||||||
if (Void)
|
if (Void)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (Columns && !Bufdone) {
|
if (Columns) {
|
||||||
// Allocate the buffers that will contain node values
|
// Allocate the buffers that will contain node values
|
||||||
for (colp = (PXMLCOL)Columns; colp; colp = (PXMLCOL)colp->GetNext())
|
for (colp = (PXMLCOL)Columns; colp; colp = (PXMLCOL)colp->GetNext())
|
||||||
if (!colp->IsSpecial()) // Not a pseudo column
|
if (!colp->IsSpecial()) { // Not a pseudo column
|
||||||
if (colp->AllocBuf(g, Mode == MODE_INSERT))
|
if (!Bufdone && colp->AllocBuf(g, Mode == MODE_INSERT))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
colp->Nx = colp->Sx = -1;
|
||||||
|
} // endif Special
|
||||||
|
|
||||||
Bufdone = true;
|
Bufdone = true;
|
||||||
} // endif Bufdone
|
} // endif Bufdone
|
||||||
|
|
||||||
|
@ -157,6 +157,7 @@ class DllExport TDBXML : public TDBASE {
|
|||||||
/* Class XMLCOL: XDB table access method column descriptor. */
|
/* Class XMLCOL: XDB table access method column descriptor. */
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
class XMLCOL : public COLBLK {
|
class XMLCOL : public COLBLK {
|
||||||
|
friend class TDBXML;
|
||||||
public:
|
public:
|
||||||
// Constructors
|
// Constructors
|
||||||
XMLCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "XML");
|
XMLCOL(PCOLDEF cdp, PTDB tdbp, PCOL cprec, int i, PCSZ am = "XML");
|
||||||
|
@ -170,9 +170,9 @@ if (NOT CMAKE_CXX_COMPILER_ID STREQUAL Clang)
|
|||||||
set_cflags_if_supported(-Wcast-align)
|
set_cflags_if_supported(-Wcast-align)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
## always want these in debug builds
|
## never want these
|
||||||
set(CMAKE_C_FLAGS_DEBUG "-Wall -Werror ${CMAKE_C_FLAGS_DEBUG}")
|
set(CMAKE_C_FLAGS "-Wno-error ${CMAKE_C_FLAGS}")
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "-Wall -Werror ${CMAKE_CXX_FLAGS_DEBUG}")
|
set(CMAKE_CXX_FLAGS "-Wno-error ${CMAKE_CXX_FLAGS}")
|
||||||
|
|
||||||
# pick language dialect
|
# pick language dialect
|
||||||
set(CMAKE_C_FLAGS "-std=c99 ${CMAKE_C_FLAGS}")
|
set(CMAKE_C_FLAGS "-std=c99 ${CMAKE_C_FLAGS}")
|
||||||
|
@ -60,7 +60,7 @@ Copyright (c) 2006, 2015, Percona and/or its affiliates. All rights reserved.
|
|||||||
#if defined(HAVE_SYS_SYSCALL_H)
|
#if defined(HAVE_SYS_SYSCALL_H)
|
||||||
# include <sys/syscall.h>
|
# include <sys/syscall.h>
|
||||||
#endif
|
#endif
|
||||||
#if defined(HAVE_SYS_SYSCTL_H)
|
#if defined(HAVE_SYS_SYSCTL_H) && !defined(_SC_PHYS_PAGES)
|
||||||
# include <sys/sysctl.h>
|
# include <sys/sysctl.h>
|
||||||
#endif
|
#endif
|
||||||
#if defined(HAVE_PTHREAD_H)
|
#if defined(HAVE_PTHREAD_H)
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
MY_ADD_TESTS(bitmap base64 my_atomic my_rdtsc lf my_malloc my_getopt dynstring
|
MY_ADD_TESTS(bitmap base64 my_atomic my_rdtsc lf my_malloc my_getopt dynstring
|
||||||
byte_order
|
byte_order
|
||||||
LINK_LIBRARIES mysys)
|
queues LINK_LIBRARIES mysys)
|
||||||
MY_ADD_TESTS(my_vsnprintf LINK_LIBRARIES strings mysys)
|
MY_ADD_TESTS(my_vsnprintf LINK_LIBRARIES strings mysys)
|
||||||
MY_ADD_TESTS(aes LINK_LIBRARIES mysys mysys_ssl)
|
MY_ADD_TESTS(aes LINK_LIBRARIES mysys mysys_ssl)
|
||||||
ADD_DEFINITIONS(${SSL_DEFINES})
|
ADD_DEFINITIONS(${SSL_DEFINES})
|
||||||
|
139
unittest/mysys/queues-t.c
Normal file
139
unittest/mysys/queues-t.c
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
/* Copyright (c) 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
|
||||||
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
|
||||||
|
|
||||||
|
#include <my_global.h>
|
||||||
|
#include <my_sys.h>
|
||||||
|
#include <queues.h>
|
||||||
|
#include <my_rnd.h>
|
||||||
|
#include "tap.h"
|
||||||
|
|
||||||
|
int cmp(void *arg __attribute__((unused)), uchar *a, uchar *b)
|
||||||
|
{
|
||||||
|
return *a < *b ? -1 : *a > *b;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define rnd(R) ((uint)(my_rnd(R) * INT_MAX32))
|
||||||
|
|
||||||
|
#define el(Q,I) ((uint)*queue_element(Q, I))
|
||||||
|
|
||||||
|
my_bool verbose;
|
||||||
|
|
||||||
|
my_bool check_queue(QUEUE *queue)
|
||||||
|
{
|
||||||
|
char b[1024]={0}, *s, *e=b+sizeof(b)-2;
|
||||||
|
my_bool ok=1;
|
||||||
|
uint i;
|
||||||
|
|
||||||
|
s= b + my_snprintf(b, e-b, "%x", el(queue, 1));
|
||||||
|
for (i=2; i <= queue->elements; i++)
|
||||||
|
{
|
||||||
|
s+= my_snprintf(s, e-s, ", %x", el(queue, i));
|
||||||
|
ok &= el(queue, i) <= el(queue, i>>1);
|
||||||
|
}
|
||||||
|
if (!ok || verbose)
|
||||||
|
diag("%s", b);
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc __attribute__((unused)), char *argv[])
|
||||||
|
{
|
||||||
|
QUEUE q, *queue=&q;
|
||||||
|
MY_INIT(argv[0]);
|
||||||
|
plan(19);
|
||||||
|
|
||||||
|
verbose=1;
|
||||||
|
|
||||||
|
init_queue(queue, 256, 0, 1, cmp, NULL, 0, 0);
|
||||||
|
queue_insert(queue, (uchar*)"\x99");
|
||||||
|
queue_insert(queue, (uchar*)"\x19");
|
||||||
|
queue_insert(queue, (uchar*)"\x36");
|
||||||
|
queue_insert(queue, (uchar*)"\x17");
|
||||||
|
queue_insert(queue, (uchar*)"\x12");
|
||||||
|
queue_insert(queue, (uchar*)"\x05");
|
||||||
|
queue_insert(queue, (uchar*)"\x25");
|
||||||
|
queue_insert(queue, (uchar*)"\x09");
|
||||||
|
queue_insert(queue, (uchar*)"\x15");
|
||||||
|
queue_insert(queue, (uchar*)"\x06");
|
||||||
|
queue_insert(queue, (uchar*)"\x11");
|
||||||
|
queue_insert(queue, (uchar*)"\x01");
|
||||||
|
queue_insert(queue, (uchar*)"\x04");
|
||||||
|
queue_insert(queue, (uchar*)"\x13");
|
||||||
|
queue_insert(queue, (uchar*)"\x24");
|
||||||
|
ok(check_queue(queue), "after insert");
|
||||||
|
queue_remove(queue, 5);
|
||||||
|
ok(check_queue(queue), "after remove 5th");
|
||||||
|
|
||||||
|
queue_element(queue, 1) = (uchar*)"\x01";
|
||||||
|
queue_element(queue, 2) = (uchar*)"\x10";
|
||||||
|
queue_element(queue, 3) = (uchar*)"\x04";
|
||||||
|
queue_element(queue, 4) = (uchar*)"\x09";
|
||||||
|
queue_element(queue, 5) = (uchar*)"\x13";
|
||||||
|
queue_element(queue, 6) = (uchar*)"\x03";
|
||||||
|
queue_element(queue, 7) = (uchar*)"\x08";
|
||||||
|
queue_element(queue, 8) = (uchar*)"\x07";
|
||||||
|
queue_element(queue, 9) = (uchar*)"\x06";
|
||||||
|
queue_element(queue,10) = (uchar*)"\x12";
|
||||||
|
queue_element(queue,11) = (uchar*)"\x05";
|
||||||
|
queue_element(queue,12) = (uchar*)"\x02";
|
||||||
|
queue_element(queue,13) = (uchar*)"\x11";
|
||||||
|
queue->elements= 13;
|
||||||
|
ok(!check_queue(queue), "manually filled (queue property violated)");
|
||||||
|
|
||||||
|
queue_fix(queue);
|
||||||
|
ok(check_queue(queue), "fixed");
|
||||||
|
|
||||||
|
ok(*queue_remove_top(queue) == 0x13, "remove top 13");
|
||||||
|
ok(*queue_remove_top(queue) == 0x12, "remove top 12");
|
||||||
|
ok(*queue_remove_top(queue) == 0x11, "remove top 11");
|
||||||
|
ok(*queue_remove_top(queue) == 0x10, "remove top 10");
|
||||||
|
ok(*queue_remove_top(queue) == 0x09, "remove top 9");
|
||||||
|
ok(*queue_remove_top(queue) == 0x08, "remove top 8");
|
||||||
|
ok(*queue_remove_top(queue) == 0x07, "remove top 7");
|
||||||
|
ok(*queue_remove_top(queue) == 0x06, "remove top 6");
|
||||||
|
ok(*queue_remove_top(queue) == 0x05, "remove top 5");
|
||||||
|
ok(*queue_remove_top(queue) == 0x04, "remove top 4");
|
||||||
|
ok(*queue_remove_top(queue) == 0x03, "remove top 3");
|
||||||
|
ok(*queue_remove_top(queue) == 0x02, "remove top 2");
|
||||||
|
ok(*queue_remove_top(queue) == 0x01, "remove top 1");
|
||||||
|
|
||||||
|
/* random test */
|
||||||
|
{
|
||||||
|
int i, res;
|
||||||
|
struct my_rnd_struct rand;
|
||||||
|
my_rnd_init(&rand, (ulong)(intptr)&i, (ulong)(intptr)argv);
|
||||||
|
verbose=0;
|
||||||
|
|
||||||
|
for (res= i=1; i <= 250; i++)
|
||||||
|
{
|
||||||
|
uchar *s=alloca(2);
|
||||||
|
*s= rnd(&rand) % 251;
|
||||||
|
queue_insert(queue, s);
|
||||||
|
res &= check_queue(queue);
|
||||||
|
}
|
||||||
|
ok(res, "inserted 250");
|
||||||
|
|
||||||
|
while (queue->elements)
|
||||||
|
{
|
||||||
|
queue_remove(queue, (rnd(&rand) % queue->elements) + 1);
|
||||||
|
res &= check_queue(queue);
|
||||||
|
}
|
||||||
|
ok(res, "removed 250");
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_queue(queue);
|
||||||
|
my_end(0);
|
||||||
|
return exit_status();
|
||||||
|
}
|
||||||
|
|
@ -879,7 +879,7 @@ static my_bool socket_peek_read(Vio *vio, uint *bytes)
|
|||||||
@param timeout Interval (in milliseconds) to wait for an I/O event.
|
@param timeout Interval (in milliseconds) to wait for an I/O event.
|
||||||
A negative timeout value means an infinite timeout.
|
A negative timeout value means an infinite timeout.
|
||||||
|
|
||||||
@remark sock_errno is set to SOCKET_ETIMEDOUT on timeout.
|
@remark socket_errno is set to SOCKET_ETIMEDOUT on timeout.
|
||||||
|
|
||||||
@return A three-state value which indicates the operation status.
|
@return A three-state value which indicates the operation status.
|
||||||
@retval -1 Failure, socket_errno indicates the error.
|
@retval -1 Failure, socket_errno indicates the error.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user