Merge 10.4 into 10.5

This commit is contained in:
Marko Mäkelä 2023-09-11 11:29:31 +03:00
commit f8f7d9de2c
83 changed files with 1045 additions and 22797 deletions

View File

@ -1686,7 +1686,7 @@ static struct my_option my_options[] =
&stop_position, &stop_position, 0, GET_ULL, &stop_position, &stop_position, 0, GET_ULL,
REQUIRED_ARG, (longlong)(~(my_off_t)0), BIN_LOG_HEADER_SIZE, REQUIRED_ARG, (longlong)(~(my_off_t)0), BIN_LOG_HEADER_SIZE,
(ulonglong)(~(my_off_t)0), 0, 0, 0}, (ulonglong)(~(my_off_t)0), 0, 0, 0},
{"table", 'T', "List entries for just this table (local log only).", {"table", 'T', "List entries for just this table (affects only row events).",
&table, &table, 0, GET_STR_ALLOC, REQUIRED_ARG, &table, &table, 0, GET_STR_ALLOC, REQUIRED_ARG,
0, 0, 0, 0, 0, 0}, 0, 0, 0, 0, 0, 0},
{"to-last-log", 't', "Requires -R. Will not stop at the end of the \ {"to-last-log", 't', "Requires -R. Will not stop at the end of the \

View File

@ -102,6 +102,9 @@ ${WOLFCRYPT_SRCDIR}/rsa.c
${WOLFCRYPT_SRCDIR}/sha.c ${WOLFCRYPT_SRCDIR}/sha.c
${WOLFCRYPT_SRCDIR}/sha256.c ${WOLFCRYPT_SRCDIR}/sha256.c
${WOLFCRYPT_SRCDIR}/sha512.c ${WOLFCRYPT_SRCDIR}/sha512.c
${WOLFCRYPT_SRCDIR}/poly1305.c
${WOLFCRYPT_SRCDIR}/chacha.c
${WOLFCRYPT_SRCDIR}/chacha20_poly1305.c
${WOLFCRYPT_SRCDIR}/wc_port.c ${WOLFCRYPT_SRCDIR}/wc_port.c
${WOLFCRYPT_SRCDIR}/wc_encrypt.c ${WOLFCRYPT_SRCDIR}/wc_encrypt.c
${WOLFCRYPT_SRCDIR}/hash.c ${WOLFCRYPT_SRCDIR}/hash.c
@ -159,6 +162,8 @@ IF(WOLFSSL_X86_64_BUILD)
LIST(APPEND WOLFCRYPT_SOURCES LIST(APPEND WOLFCRYPT_SOURCES
${WOLFCRYPT_SRCDIR}/aes_asm.S ${WOLFCRYPT_SRCDIR}/aes_asm.S
${WOLFCRYPT_SRCDIR}/aes_gcm_asm.S ${WOLFCRYPT_SRCDIR}/aes_gcm_asm.S
${WOLFCRYPT_SRCDIR}/chacha_asm.S
${WOLFCRYPT_SRCDIR}/poly1305_asm.S
${WOLFCRYPT_SRCDIR}/sha512_asm.S ${WOLFCRYPT_SRCDIR}/sha512_asm.S
${WOLFCRYPT_SRCDIR}/sha256_asm.S) ${WOLFCRYPT_SRCDIR}/sha256_asm.S)
ADD_DEFINITIONS(-maes -msse4.2 -mpclmul) ADD_DEFINITIONS(-maes -msse4.2 -mpclmul)

View File

@ -19,11 +19,15 @@
#define HAVE_TLS_EXTENSIONS #define HAVE_TLS_EXTENSIONS
#define HAVE_AES_ECB #define HAVE_AES_ECB
#define HAVE_AESGCM #define HAVE_AESGCM
#define HAVE_CHACHA
#define HAVE_POLY1305
#define WOLFSSL_AES_COUNTER #define WOLFSSL_AES_COUNTER
#define NO_WOLFSSL_STUB #define NO_WOLFSSL_STUB
#define OPENSSL_ALL #define OPENSSL_ALL
#define WOLFSSL_ALLOW_TLSV10 #define WOLFSSL_ALLOW_TLSV10
#define NO_OLD_TIMEVAL_NAME #define NO_OLD_TIMEVAL_NAME
#define HAVE_SECURE_RENEGOTIATION
#define HAVE_EXTENDED_MASTER
/* TLSv1.3 definitions (all needed to build) */ /* TLSv1.3 definitions (all needed to build) */
#define WOLFSSL_TLS13 #define WOLFSSL_TLS13

View File

@ -45,7 +45,7 @@ extern "C" {
/* The max key length of all supported algorithms */ /* The max key length of all supported algorithms */
#define MY_AES_MAX_KEY_LENGTH 32 #define MY_AES_MAX_KEY_LENGTH 32
#define MY_AES_CTX_SIZE 672 #define MY_AES_CTX_SIZE 1024
enum my_aes_mode { enum my_aes_mode {
MY_AES_ECB, MY_AES_CBC MY_AES_ECB, MY_AES_CBC

View File

@ -0,0 +1 @@
--innodb-page-size=16k

View File

@ -0,0 +1 @@
--innodb-page-size=32k

View File

@ -0,0 +1 @@
--innodb-page-size=4k

View File

@ -0,0 +1 @@
--innodb-page-size=64k

View File

@ -0,0 +1 @@
--innodb-page-size=8k

View File

@ -20,9 +20,10 @@ package My::Platform;
use strict; use strict;
use File::Basename; use File::Basename;
use File::Path; use File::Path;
use Carp;
use base qw(Exporter); use base qw(Exporter);
our @EXPORT= qw(IS_CYGWIN IS_WINDOWS IS_WIN32PERL IS_AIX our @EXPORT= qw(IS_CYGWIN IS_MSYS IS_WINDOWS IS_WIN32PERL IS_AIX
native_path posix_path mixed_path native_path posix_path mixed_path
check_socket_path_length process_alive open_for_append); check_socket_path_length process_alive open_for_append);
@ -33,9 +34,15 @@ BEGIN {
die "Could not execute 'cygpath': $!"; die "Could not execute 'cygpath': $!";
} }
eval 'sub IS_CYGWIN { 1 }'; eval 'sub IS_CYGWIN { 1 }';
eval 'sub IS_MSYS { 0 }';
}
elsif ($^O eq "msys") {
eval 'sub IS_CYGWIN { 1 }';
eval 'sub IS_MSYS { 1 }';
} }
else { else {
eval 'sub IS_CYGWIN { 0 }'; eval 'sub IS_CYGWIN { 0 }';
eval 'sub IS_MSYS { 0 }';
} }
if ($^O eq "MSWin32") { if ($^O eq "MSWin32") {
eval 'sub IS_WIN32PERL { 1 }'; eval 'sub IS_WIN32PERL { 1 }';
@ -95,8 +102,13 @@ sub mixed_path {
sub native_path { sub native_path {
my ($path)= @_; my ($path)= @_;
$path=~ s/\//\\/g if (IS_CYGWIN) {
if (IS_CYGWIN or IS_WIN32PERL); # \\\\ protects against 2 expansions (just for the case)
$path=~ s/\/+|\\+/\\\\\\\\/g;
}
elsif (IS_WINDOWS) {
$path=~ s/\/+/\\/g;
}
return $path; return $path;
} }
@ -219,4 +231,69 @@ sub open_for_append
} }
sub check_cygwin_subshell
{
# Only pipe (or sh-expansion) is fed to /bin/sh
my $out= `echo %comspec%|cat`;
return ($out =~ /\bcmd.exe\b/) ? 0 : 1;
}
sub install_shell_wrapper()
{
system("rm -f /bin/sh.exe") and die $!;
my $wrapper= <<'EOF';
#!/bin/bash
if [[ -n "$MTR_PERL" && "$1" = "-c" ]]; then
shift
exec $(cygpath -m "$COMSPEC") /C "$@"
fi
exec /bin/bash "$@"
EOF
open(OUT, '>', "/bin/sh") or die "/bin/sh: $!\n";
print OUT $wrapper;
close(OUT);
system("chmod +x /bin/sh") and die $!;
print "Cygwin subshell wrapper /bin/sh was installed, please restart MTR!\n";
exit(0);
}
sub uninstall_shell_wrapper()
{
system("rm -f /bin/sh") and die $!;
system("cp /bin/bash.exe /bin/sh.exe") and die $!;
}
sub cygwin_subshell_fix
{
my ($opt_name, $opt_value)= @_;
if ($opt_name ne "cygwin-subshell-fix") {
confess "Wrong option name: ${opt_name}";
}
if ($opt_value eq "do") {
if (check_cygwin_subshell()) {
install_shell_wrapper();
} else {
print "Cygwin subshell fix was already installed, skipping...\n";
}
} elsif ($opt_value eq "remove") {
if (check_cygwin_subshell()) {
print "Cygwin subshell fix was already uninstalled, skipping...\n";
} else {
uninstall_shell_wrapper();
}
} else {
die "Wrong --cygwin-subshell-fix value: ${opt_value} (expected do/remove)";
}
}
sub options
{
if (IS_CYGWIN) {
return ('cygwin-subshell-fix=s' => \&cygwin_subshell_fix);
} else {
return ();
}
}
1; 1;

View File

@ -102,7 +102,7 @@ else
# Find the safe process binary or script # Find the safe process binary or script
sub find_bin { sub find_bin {
if (IS_WIN32PERL or IS_CYGWIN) if (IS_WINDOWS)
{ {
# Use my_safe_process.exe # Use my_safe_process.exe
my $exe= my_find_bin($bindir, ["lib/My/SafeProcess", "My/SafeProcess"], my $exe= my_find_bin($bindir, ["lib/My/SafeProcess", "My/SafeProcess"],

View File

@ -111,7 +111,7 @@ sub read_test {
$serialized =~ s/\\([0-9a-fA-F]{2})/chr(hex($1))/eg; $serialized =~ s/\\([0-9a-fA-F]{2})/chr(hex($1))/eg;
my $test= Storable::thaw($serialized); my $test= Storable::thaw($serialized);
use Data::Dumper; use Data::Dumper;
die "wrong class (hack attempt?): ".ref($test)."\n".Dumper(\$test, $serialized) confess "Not My::Test: ". ref($test). "\n". Dumper(\$test, $serialized)
unless ref($test) eq 'My::Test'; unless ref($test) eq 'My::Test';
resfile_from_test($test) if $::opt_resfile; resfile_from_test($test) if $::opt_resfile;
return $test; return $test;

View File

@ -48,6 +48,7 @@ our $timestamp= 0;
our $timediff= 0; our $timediff= 0;
our $name; our $name;
our $verbose; our $verbose;
# TODO: no option for that? Why is it different from $verbose?
our $verbose_restart= 0; our $verbose_restart= 0;
our $timer= 1; our $timer= 1;
our $tests_total; our $tests_total;

View File

@ -455,6 +455,41 @@ create table t1 (f text not null, unique (f));
insert into t1 (f) select 'f'; insert into t1 (f) select 'f';
drop table t1; drop table t1;
# #
# MDEV-32012 hash unique corrupts index on virtual blobs
#
create table t1 (
f1 varchar(25),
v1 mediumtext generated always as (concat('f1:', f1)) virtual,
unique key (f1) using hash,
key (v1(1000))
);
flush status;
insert ignore t1 (f1) values (9599),(94410);
show status like 'handler_read_next';
Variable_name Value
Handler_read_next 1
# the above MUST BE =1
check table t1 extended;
Table Op Msg_type Msg_text
test.t1 check status OK
update t1 set f1=100 where f1=9599;
update t1 set f1=9599 where f1=100;
check table t1 extended;
Table Op Msg_type Msg_text
test.t1 check status OK
drop table t1;
#
# MDEV-32015 insert into an empty table fails with hash unique
#
create table t1 (f1 varchar(25), unique (f1) using hash);
insert ignore t1 (f1) values ('new york'),('virginia'),('spouse'),(null),('zqekmqpwutxnzddrbjycyo'),('nebraska'),('illinois'),('qe'),('ekmqpwut'),('arizona'),('arizona');
Warnings:
Warning 1062 Duplicate entry 'arizona' for key 'f1'
check table t1 extended;
Table Op Msg_type Msg_text
test.t1 check status OK
drop table t1;
#
# End of 10.4 tests # End of 10.4 tests
# #
# #

View File

@ -456,6 +456,38 @@ create table t1 (f text not null, unique (f));
insert into t1 (f) select 'f'; insert into t1 (f) select 'f';
drop table t1; drop table t1;
--echo #
--echo # MDEV-32012 hash unique corrupts index on virtual blobs
--echo #
create table t1 (
f1 varchar(25),
v1 mediumtext generated always as (concat('f1:', f1)) virtual,
unique key (f1) using hash,
key (v1(1000))
);
flush status;
insert ignore t1 (f1) values (9599),(94410);
# handler_read_next must be 1 below, meaning there was a hash collision above.
# if a change in the hash function causes these values not to collide anymore,
# the test must be adjusted to use some other values that collide.
# to find a collision add an assert into check_duplicate_long_entry_key()
# and run, like, insert...select * seq_from_1_to_1000000000
show status like 'handler_read_next';
--echo # the above MUST BE =1
check table t1 extended;
update t1 set f1=100 where f1=9599;
update t1 set f1=9599 where f1=100;
check table t1 extended;
drop table t1;
--echo #
--echo # MDEV-32015 insert into an empty table fails with hash unique
--echo #
create table t1 (f1 varchar(25), unique (f1) using hash);
insert ignore t1 (f1) values ('new york'),('virginia'),('spouse'),(null),('zqekmqpwutxnzddrbjycyo'),('nebraska'),('illinois'),('qe'),('ekmqpwut'),('arizona'),('arizona');
check table t1 extended;
drop table t1;
--echo # --echo #
--echo # End of 10.4 tests --echo # End of 10.4 tests
--echo # --echo #

View File

@ -1,3 +1,6 @@
#
# MDEV-22722 Assertion "inited==NONE" failed in handler::ha_index_init on the slave during UPDATE
#
include/master-slave.inc include/master-slave.inc
[connection master] [connection master]
create table t1 (i1 int, a1 text, unique key i1 (a1)) engine=myisam; create table t1 (i1 int, a1 text, unique key i1 (a1)) engine=myisam;
@ -6,7 +9,21 @@ insert into t1 values (2,2);
update t1 set a1 = 'd' limit 1; update t1 set a1 = 'd' limit 1;
update t1 set a1 = 'd2' where i1= 2; update t1 set a1 = 'd2' where i1= 2;
connection slave; connection slave;
connection slave;
connection master; connection master;
drop table t1; drop table t1;
#
# MDEV-32093 long uniques break old->new replication
#
connection slave;
create table t1 (id int not null, b1 varchar(255) not null, b2 varchar(2550) not null, unique (id), unique key (b1,b2) using hash) default charset utf8mb3;
set global slave_exec_mode=idempotent;
binlog 'aRf2ZA8BAAAA/AAAAAABAAAAAAQAMTAuNS4xNS1NYXJpYURCLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABpF/ZkEzgNAAgAEgAEBAQEEgAA5AAEGggAAAAICAgCAAAACgoKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEwQADQgICAoKCgFRmTlk';
binlog 'bBf2ZBMBAAAANAAAAJgHAAAAAHEAAAAAAAEABHRlc3QAAnQxAAQDDw8IBP0C4h0AeqMD4A==bBf2ZBcBAAAANAAAAMwHAAAAAHEAAAAAAAEABP/wj6QAAAEAYgEAZa6/VU0JAAAANteqUw==';
binlog 'bBf2ZBMBAAAANAAAAJgHAAAAAHEAAAAAAAEABHRlc3QAAnQxAAQDDw8IBP0C4h0AeqMD4A==bBf2ZBcBAAAANAAAAMwHAAAAAHEAAAAAAAEABP/wj6QAAAEAYgEAZa6/VU0JAAAANteqUw==';
binlog 'bBf2ZBMBAAAANAAAAHUkAAAAAHEAAAAAAAEABHRlc3QAAnQxAAQDDw8IBP0C4h0AaTGFIg==bBf2ZBgBAAAASAAAAL0kAAAAAHEAAAAAAAEABP//8I+kAAABAGIBAGWuv1VNCQAAAPBuWwAAAQBiAQBlrr9VTQkAAADxS9Lu';
drop table t1;
set global slave_exec_mode=default;
#
# End of 10.4 tests
#
include/rpl_end.inc include/rpl_end.inc

View File

@ -2,9 +2,9 @@
# Long unique bugs related to master slave replication # Long unique bugs related to master slave replication
# #
# --echo #
# MDEV-22722 Assertion "inited==NONE" failed in handler::ha_index_init on the slave during UPDATE --echo # MDEV-22722 Assertion "inited==NONE" failed in handler::ha_index_init on the slave during UPDATE
# --echo #
--source include/have_binlog_format_row.inc --source include/have_binlog_format_row.inc
--source include/master-slave.inc --source include/master-slave.inc
@ -16,9 +16,34 @@ update t1 set a1 = 'd' limit 1;
update t1 set a1 = 'd2' where i1= 2; update t1 set a1 = 'd2' where i1= 2;
sync_slave_with_master; sync_slave_with_master;
connection slave;
connection master; connection master;
drop table t1; drop table t1;
--echo #
--echo # MDEV-32093 long uniques break old->new replication
--echo #
# this is techically a bug in replication, but it needs an old master
# so we'll run it as a non-replicated test with BINLOG command
sync_slave_with_master;
create table t1 (id int not null, b1 varchar(255) not null, b2 varchar(2550) not null, unique (id), unique key (b1,b2) using hash) default charset utf8mb3;
set global slave_exec_mode=idempotent;
# Format_description_log_event, MariaDB-10.5.15
binlog 'aRf2ZA8BAAAA/AAAAAABAAAAAAQAMTAuNS4xNS1NYXJpYURCLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABpF/ZkEzgNAAgAEgAEBAQEEgAA5AAEGggAAAAICAgCAAAACgoKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEwQADQgICAoKCgFRmTlk';
### INSERT t1 VALUES (42127, 'b', 'e', 39952170926)
binlog 'bBf2ZBMBAAAANAAAAJgHAAAAAHEAAAAAAAEABHRlc3QAAnQxAAQDDw8IBP0C4h0AeqMD4A==bBf2ZBcBAAAANAAAAMwHAAAAAHEAAAAAAAEABP/wj6QAAAEAYgEAZa6/VU0JAAAANteqUw==';
binlog 'bBf2ZBMBAAAANAAAAJgHAAAAAHEAAAAAAAEABHRlc3QAAnQxAAQDDw8IBP0C4h0AeqMD4A==bBf2ZBcBAAAANAAAAMwHAAAAAHEAAAAAAAEABP/wj6QAAAEAYgEAZa6/VU0JAAAANteqUw==';
### UPDATE t1 WHERE (42127, 'b', 'e', 39952170926) SET (23406, 'b', 'e', 39952170926)
binlog 'bBf2ZBMBAAAANAAAAHUkAAAAAHEAAAAAAAEABHRlc3QAAnQxAAQDDw8IBP0C4h0AaTGFIg==bBf2ZBgBAAAASAAAAL0kAAAAAHEAAAAAAAEABP//8I+kAAABAGIBAGWuv1VNCQAAAPBuWwAAAQBiAQBlrr9VTQkAAADxS9Lu';
drop table t1;
set global slave_exec_mode=default;
--echo #
--echo # End of 10.4 tests
--echo #
--source include/rpl_end.inc --source include/rpl_end.inc

View File

@ -1271,4 +1271,16 @@ SET sql_mode=ORACLE;
SET STATEMENT max_statement_time=30 FOR DELETE FROM mysql.user where user = 'unknown'; SET STATEMENT max_statement_time=30 FOR DELETE FROM mysql.user where user = 'unknown';
SET sql_mode=default; SET sql_mode=default;
SET STATEMENT max_statement_time=30 FOR DELETE FROM mysql.user where user = 'unknown'; SET STATEMENT max_statement_time=30 FOR DELETE FROM mysql.user where user = 'unknown';
#
# MDEV-17711 Assertion `arena_for_set_stmt== 0' failed in LEX::set_arena_for_set_stmt upon SET STATEMENT
#
set rand_seed1=1, rand_seed2=2;
set statement rand_seed1=4 for select 2, @@rand_seed1, @@rand_seed2;
set statement rand_seed2=5 for select 3, @@rand_seed1, @@rand_seed2 $
2 @@rand_seed1 @@rand_seed2
2 4 2
3 @@rand_seed1 @@rand_seed2
3 1 5
#
# End of 10.4 tests # End of 10.4 tests
#

View File

@ -1191,4 +1191,16 @@ SET STATEMENT max_statement_time=30 FOR DELETE FROM mysql.user where user = 'unk
SET sql_mode=default; SET sql_mode=default;
SET STATEMENT max_statement_time=30 FOR DELETE FROM mysql.user where user = 'unknown'; SET STATEMENT max_statement_time=30 FOR DELETE FROM mysql.user where user = 'unknown';
--echo #
--echo # MDEV-17711 Assertion `arena_for_set_stmt== 0' failed in LEX::set_arena_for_set_stmt upon SET STATEMENT
--echo #
--delimiter $
set rand_seed1=1, rand_seed2=2;
set statement rand_seed1=4 for select 2, @@rand_seed1, @@rand_seed2;
set statement rand_seed2=5 for select 3, @@rand_seed1, @@rand_seed2 $
--delimiter ;
--echo #
--echo # End of 10.4 tests --echo # End of 10.4 tests
--echo #

View File

@ -347,7 +347,7 @@ $| = 1; # Automatically flush STDOUT
main(); main();
sub main { sub main {
$ENV{MTR_PERL}=$^X; $ENV{MTR_PERL}= mixed_path($^X);
# Default, verbosity on # Default, verbosity on
report_option('verbose', 0); report_option('verbose', 0);
@ -490,7 +490,7 @@ sub main {
mark_time_used('init'); mark_time_used('init');
my ($prefix, $fail, $completed, $extra_warnings)= my ($prefix, $fail, $completed, $extra_warnings)=
run_test_server($server, $tests, \%children); Manager::run($server, $tests, \%children);
exit(0) if $opt_start_exit; exit(0) if $opt_start_exit;
@ -569,23 +569,205 @@ sub main {
} }
sub run_test_server ($$$) { package Manager;
use POSIX ":sys_wait_h";
use File::Basename;
use File::Find;
use IO::Socket::INET;
use IO::Select;
use mtr_report;
use My::Platform;
my $num_saved_datadir; # Number of datadirs saved in vardir/log/ so far.
my $num_failed_test; # Number of tests failed so far
my $test_failure; # Set true if test suite failed
my $extra_warnings; # Warnings found during server shutdowns
my $completed;
my %running;
my $result;
my $exe_mysqld; # Used as hint to CoreDump
my %names;
sub parse_protocol($$) {
my $sock= shift;
my $line= shift;
if ($line eq 'TESTRESULT'){
mtr_verbose2("Got TESTRESULT from ". $names{$sock});
$result= My::Test::read_test($sock);
# Report test status
mtr_report_test($result);
if ( $result->is_failed() ) {
# Save the workers "savedir" in var/log
my $worker_savedir= $result->{savedir};
my $worker_savename= basename($worker_savedir);
my $savedir= "$opt_vardir/log/$worker_savename";
# Move any core files from e.g. mysqltest
foreach my $coref (glob("core*"), glob("*.dmp"))
{
mtr_report(" - found '$coref', moving it to '$worker_savedir'");
::move($coref, $worker_savedir);
}
find(
{
no_chdir => 1,
wanted => sub
{
My::CoreDump::core_wanted(\$num_saved_cores,
$opt_max_save_core,
@opt_cases == 0,
$exe_mysqld, $opt_parallel);
}
},
$worker_savedir);
if ($num_saved_datadir >= $opt_max_save_datadir)
{
mtr_report(" - skipping '$worker_savedir/'");
main::rmtree($worker_savedir);
}
else
{
mtr_report(" - saving '$worker_savedir/' to '$savedir/'");
rename($worker_savedir, $savedir);
$num_saved_datadir++;
}
main::resfile_print_test();
$num_failed_test++ unless ($result->{retries} ||
$result->{exp_fail});
$test_failure= 1;
if ( !$opt_force ) {
# Test has failed, force is off
push(@$completed, $result);
if ($result->{'dont_kill_server'})
{
mtr_verbose2("${line}: saying BYE to ". $names{$sock});
print $sock "BYE\n";
return 2;
}
return ["Failure", 1, $completed, $extra_warnings];
}
elsif ($opt_max_test_fail > 0 and
$num_failed_test >= $opt_max_test_fail) {
push(@$completed, $result);
mtr_report("Too many tests($num_failed_test) failed!",
"Terminating...");
return ["Too many failed", 1, $completed, $extra_warnings];
}
}
main::resfile_print_test();
# Retry test run after test failure
my $retries= $result->{retries} || 2;
my $test_has_failed= $result->{failures} || 0;
if ($test_has_failed and $retries <= $opt_retry){
# Test should be run one more time unless it has failed
# too many times already
my $tname= $result->{name};
my $failures= $result->{failures};
if ($opt_retry > 1 and $failures >= $opt_retry_failure){
mtr_report("\nTest $tname has failed $failures times,",
"no more retries!\n");
}
else {
mtr_report("\nRetrying test $tname, ".
"attempt($retries/$opt_retry)...\n");
#saving the log file as filename.failed in case of retry
if ( $result->is_failed() ) {
my $worker_logdir= $result->{savedir};
my $log_file_name=dirname($worker_logdir)."/".$result->{shortname}.".log";
if (-e $log_file_name) {
$result->{'logfile-failed'} = ::mtr_lastlinesfromfile($log_file_name, 20);
} else {
$result->{'logfile-failed'} = "";
}
rename $log_file_name, $log_file_name.".failed";
}
{
local @$result{'retries', 'result'};
delete $result->{result};
$result->{retries}= $retries+1;
$result->write_test($sock, 'TESTCASE');
}
push(@$completed, $result);
return 2;
}
}
# Repeat test $opt_repeat number of times
my $repeat= $result->{repeat} || 1;
if ($repeat < $opt_repeat)
{
$result->{retries}= 0;
$result->{rep_failures}++ if $result->{failures};
$result->{failures}= 0;
delete($result->{result});
$result->{repeat}= $repeat+1;
$result->write_test($sock, 'TESTCASE');
return 2;
}
# Remove from list of running
mtr_error("'", $result->{name},"' is not known to be running")
unless delete $running{$result->key()};
# Save result in completed list
push(@$completed, $result);
} # if ($line eq 'TESTRESULT')
elsif ($line=~ /^START (.*)$/){
# Send first test
$names{$sock}= $1;
}
elsif ($line eq 'WARNINGS'){
my $fake_test= My::Test::read_test($sock);
my $test_list= join (" ", @{$fake_test->{testnames}});
push @$extra_warnings, $test_list;
my $report= $fake_test->{'warnings'};
mtr_report("***Warnings generated in error logs during shutdown ".
"after running tests: $test_list\n\n$report");
$test_failure= 1;
if ( !$opt_force ) {
# Test failure due to warnings, force is off
mtr_verbose2("Socket loop exiting 3");
return ["Warnings in log", 1, $completed, $extra_warnings];
}
return 1;
}
elsif ($line =~ /^SPENT/) {
main::add_total_times($line);
}
elsif ($line eq 'VALGREP' && $opt_valgrind) {
$valgrind_reports= 1;
}
else {
mtr_error("Unknown response: '$line' from client");
}
return 0;
}
sub run ($$$) {
my ($server, $tests, $children) = @_; my ($server, $tests, $children) = @_;
my $suite_timeout= main::start_timer(main::suite_timeout());
my $num_saved_datadir= 0; # Number of datadirs saved in vardir/log/ so far. $exe_mysqld= main::find_mysqld($bindir) || ""; # Used as hint to CoreDump
my $num_failed_test= 0; # Number of tests failed so far $num_saved_datadir= 0; # Number of datadirs saved in vardir/log/ so far.
my $test_failure= 0; # Set true if test suite failed $num_failed_test= 0; # Number of tests failed so far
my $extra_warnings= []; # Warnings found during server shutdowns $test_failure= 0; # Set true if test suite failed
$extra_warnings= []; # Warnings found during server shutdowns
my $completed= []; $completed= [];
my %running;
my $result;
my $exe_mysqld= find_mysqld($bindir) || ""; # Used as hint to CoreDump
my $suite_timeout= start_timer(suite_timeout());
my $s= IO::Select->new(); my $s= IO::Select->new();
my $childs= 0; my $childs= 0;
$s->add($server); $s->add($server);
while (1) { while (1) {
if ($opt_stop_file) if ($opt_stop_file)
@ -593,190 +775,60 @@ sub run_test_server ($$$) {
if (mtr_wait_lock_file($opt_stop_file, $opt_stop_keep_alive)) if (mtr_wait_lock_file($opt_stop_file, $opt_stop_keep_alive))
{ {
# We were waiting so restart timer process # We were waiting so restart timer process
my $suite_timeout= start_timer(suite_timeout()); my $suite_timeout= main::start_timer(main::suite_timeout());
} }
} }
mark_time_used('admin'); main::mark_time_used('admin');
my @ready = $s->can_read(1); # Wake up once every second my @ready = $s->can_read(1); # Wake up once every second
mtr_debug("Got ". (0 + @ready). " connection(s)"); if (@ready > 0) {
mark_time_idle(); mtr_verbose2("Got ". (0 + @ready). " connection(s)");
foreach my $sock (@ready) { }
main::mark_time_idle();
my $i= 0;
sock_loop: foreach my $sock (@ready) {
++$i;
if ($sock == $server) { if ($sock == $server) {
# New client connected # New client connected
++$childs; ++$childs;
my $child= $sock->accept(); my $child= $sock->accept();
mtr_verbose2("Client connected (got ${childs} childs)"); mtr_verbose2("Connection ${i}: Worker connected (got ${childs} childs)");
$s->add($child); $s->add($child);
print $child "HELLO\n"; print $child "HELLO\n";
} }
else { else {
my $line= <$sock>; my $j= 0;
if (!defined $line) { $sock->blocking(0);
# Client disconnected while (my $line= <$sock>) {
--$childs; ++$j;
mtr_verbose2("Child closed socket (left ${childs} childs)"); chomp($line);
$s->remove($sock); mtr_verbose2("Connection ${i}.${j}". (exists $names{$sock} ? " from $names{$sock}" : "") .": $line");
$sock->close;
next;
}
chomp($line);
if ($line eq 'TESTRESULT'){ $sock->blocking(1);
$result= My::Test::read_test($sock); my $res= parse_protocol($sock, $line);
$sock->blocking(0);
# Report test status if (ref $res eq 'ARRAY') {
mtr_report_test($result); return @$res;
} elsif ($res == 1) {
if ( $result->is_failed() ) { next;
} elsif ($res == 2) {
# Save the workers "savedir" in var/log next sock_loop;
my $worker_savedir= $result->{savedir};
my $worker_savename= basename($worker_savedir);
my $savedir= "$opt_vardir/log/$worker_savename";
# Move any core files from e.g. mysqltest
foreach my $coref (glob("core*"), glob("*.dmp"))
{
mtr_report(" - found '$coref', moving it to '$worker_savedir'");
move($coref, $worker_savedir);
}
find(
{
no_chdir => 1,
wanted => sub
{
My::CoreDump::core_wanted(\$num_saved_cores,
$opt_max_save_core,
@opt_cases == 0,
$exe_mysqld, $opt_parallel);
}
},
$worker_savedir);
if ($num_saved_datadir >= $opt_max_save_datadir)
{
mtr_report(" - skipping '$worker_savedir/'");
rmtree($worker_savedir);
}
else
{
mtr_report(" - saving '$worker_savedir/' to '$savedir/'");
rename($worker_savedir, $savedir);
$num_saved_datadir++;
}
resfile_print_test();
$num_failed_test++ unless ($result->{retries} ||
$result->{exp_fail});
$test_failure= 1;
if ( !$opt_force ) {
# Test has failed, force is off
push(@$completed, $result);
if ($result->{'dont_kill_server'})
{
print $sock "BYE\n";
next;
}
return ("Failure", 1, $completed, $extra_warnings);
}
elsif ($opt_max_test_fail > 0 and
$num_failed_test >= $opt_max_test_fail) {
push(@$completed, $result);
mtr_report("Too many tests($num_failed_test) failed!",
"Terminating...");
return ("Too many failed", 1, $completed, $extra_warnings);
}
}
resfile_print_test();
# Retry test run after test failure
my $retries= $result->{retries} || 2;
my $test_has_failed= $result->{failures} || 0;
if ($test_has_failed and $retries <= $opt_retry){
# Test should be run one more time unless it has failed
# too many times already
my $tname= $result->{name};
my $failures= $result->{failures};
if ($opt_retry > 1 and $failures >= $opt_retry_failure){
mtr_report("\nTest $tname has failed $failures times,",
"no more retries!\n");
}
else {
mtr_report("\nRetrying test $tname, ".
"attempt($retries/$opt_retry)...\n");
#saving the log file as filename.failed in case of retry
if ( $result->is_failed() ) {
my $worker_logdir= $result->{savedir};
my $log_file_name=dirname($worker_logdir)."/".$result->{shortname}.".log";
if (-e $log_file_name) {
$result->{'logfile-failed'} = mtr_lastlinesfromfile($log_file_name, 20);
} else {
$result->{'logfile-failed'} = "";
}
rename $log_file_name, $log_file_name.".failed";
}
{
local @$result{'retries', 'result'};
delete $result->{result};
$result->{retries}= $retries+1;
$result->write_test($sock, 'TESTCASE');
}
push(@$completed, $result);
next;
}
}
# Repeat test $opt_repeat number of times
my $repeat= $result->{repeat} || 1;
if ($repeat < $opt_repeat)
{
$result->{retries}= 0;
$result->{rep_failures}++ if $result->{failures};
$result->{failures}= 0;
delete($result->{result});
$result->{repeat}= $repeat+1;
$result->write_test($sock, 'TESTCASE');
next;
}
# Remove from list of running
mtr_error("'", $result->{name},"' is not known to be running")
unless delete $running{$result->key()};
# Save result in completed list
push(@$completed, $result);
}
elsif ($line eq 'START'){
; # Send first test
}
elsif ($line eq 'WARNINGS'){
my $fake_test= My::Test::read_test($sock);
my $test_list= join (" ", @{$fake_test->{testnames}});
push @$extra_warnings, $test_list;
my $report= $fake_test->{'warnings'};
mtr_report("***Warnings generated in error logs during shutdown ".
"after running tests: $test_list\n\n$report");
$test_failure= 1;
if ( !$opt_force ) {
# Test failure due to warnings, force is off
return ("Warnings in log", 1, $completed, $extra_warnings);
} }
if (IS_WINDOWS and !IS_CYGWIN) {
# Strawberry and ActiveState don't support blocking(0), the next iteration will be blocked!
# If there is next response now in the buffer and it is TESTRESULT we are affected by MDEV-30836 and the manager will hang.
last;
}
}
$sock->blocking(1);
if ($j == 0) {
# Client disconnected
--$childs;
mtr_verbose2((exists $names{$sock} ? $names{$sock} : "Worker"). " closed socket (left ${childs} childs)");
$s->remove($sock);
$sock->close;
next; next;
} }
elsif ($line =~ /^SPENT/) {
add_total_times($line);
}
elsif ($line eq 'VALGREP' && $opt_valgrind) {
$valgrind_reports= 1;
}
else {
mtr_error("Unknown response: '$line' from client");
}
# Find next test to schedule # Find next test to schedule
# - Try to use same configuration as worker used last time # - Try to use same configuration as worker used last time
@ -789,7 +841,7 @@ sub run_test_server ($$$) {
last unless defined $t; last unless defined $t;
if (run_testcase_check_skip_test($t)){ if (main::run_testcase_check_skip_test($t)){
# Move the test to completed list # Move the test to completed list
#mtr_report("skip - Moving test $i to completed"); #mtr_report("skip - Moving test $i to completed");
push(@$completed, splice(@$tests, $i, 1)); push(@$completed, splice(@$tests, $i, 1));
@ -835,7 +887,7 @@ sub run_test_server ($$$) {
# At this point we have found next suitable test # At this point we have found next suitable test
$next= splice(@$tests, $i, 1); $next= splice(@$tests, $i, 1);
last; last;
} } # for(my $i= 0; $i <= @$tests; $i++)
# Use second best choice if no other test has been found # Use second best choice if no other test has been found
if (!$next and defined $second_best){ if (!$next and defined $second_best){
@ -854,11 +906,11 @@ sub run_test_server ($$$) {
} }
else { else {
# No more test, tell child to exit # No more test, tell child to exit
#mtr_report("Saying BYE to child"); mtr_verbose2("Saying BYE to ". $names{$sock});
print $sock "BYE\n"; print $sock "BYE\n";
} } # else (!$next)
} } # else ($sock != $server)
} } # foreach my $sock (@ready)
if (!IS_WINDOWS) { if (!IS_WINDOWS) {
foreach my $pid (keys %$children) foreach my $pid (keys %$children)
@ -890,7 +942,7 @@ sub run_test_server ($$$) {
# ---------------------------------------------------- # ----------------------------------------------------
# Check if test suite timer expired # Check if test suite timer expired
# ---------------------------------------------------- # ----------------------------------------------------
if ( has_expired($suite_timeout) ) if ( main::has_expired($suite_timeout) )
{ {
mtr_report("Test suite timeout! Terminating..."); mtr_report("Test suite timeout! Terminating...");
return ("Timeout", 1, $completed, $extra_warnings); return ("Timeout", 1, $completed, $extra_warnings);
@ -898,6 +950,9 @@ sub run_test_server ($$$) {
} }
} }
1;
package main;
sub run_worker ($) { sub run_worker ($) {
my ($server_port, $thread_num)= @_; my ($server_port, $thread_num)= @_;
@ -918,7 +973,10 @@ sub run_worker ($) {
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
# Set worker name # Set worker name
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
report_option('name',"worker[$thread_num]"); report_option('name',"worker[". sprintf("%02d", $thread_num). "]");
my $proc_title= basename($0). " ${mtr_report::name} :". $server->sockport(). " -> :${server_port}";
$0= $proc_title;
mtr_verbose2("Running at PID $$");
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
# Set different ports per thread # Set different ports per thread
@ -944,7 +1002,7 @@ sub run_worker ($) {
} }
# Ask server for first test # Ask server for first test
print $server "START\n"; print $server "START ${mtr_report::name}\n";
mark_time_used('init'); mark_time_used('init');
@ -952,6 +1010,7 @@ sub run_worker ($) {
chomp($line); chomp($line);
if ($line eq 'TESTCASE'){ if ($line eq 'TESTCASE'){
my $test= My::Test::read_test($server); my $test= My::Test::read_test($server);
$0= $proc_title. " ". $test->{name};
# Clear comment and logfile, to avoid # Clear comment and logfile, to avoid
# reusing them from previous test # reusing them from previous test
@ -968,11 +1027,12 @@ sub run_worker ($) {
run_testcase($test, $server); run_testcase($test, $server);
#$test->{result}= 'MTR_RES_PASSED'; #$test->{result}= 'MTR_RES_PASSED';
# Send it back, now with results set # Send it back, now with results set
mtr_verbose2('Writing TESTRESULT');
$test->write_test($server, 'TESTRESULT'); $test->write_test($server, 'TESTRESULT');
mark_time_used('restart'); mark_time_used('restart');
} }
elsif ($line eq 'BYE'){ elsif ($line eq 'BYE'){
mtr_report("Server said BYE"); mtr_verbose2("Manager said BYE");
# We need to gracefully shut down the servers to see any # We need to gracefully shut down the servers to see any
# Valgrind memory leak errors etc. since last server restart. # Valgrind memory leak errors etc. since last server restart.
if ($opt_warnings) { if ($opt_warnings) {
@ -1198,7 +1258,8 @@ sub command_line_setup {
'xml-report=s' => \$opt_xml_report, 'xml-report=s' => \$opt_xml_report,
My::Debugger::options(), My::Debugger::options(),
My::CoreDump::options() My::CoreDump::options(),
My::Platform::options()
); );
# fix options (that take an optional argument and *only* after = sign # fix options (that take an optional argument and *only* after = sign
@ -1234,6 +1295,9 @@ sub command_line_setup {
} }
if (IS_CYGWIN) if (IS_CYGWIN)
{ {
if (My::Platform::check_cygwin_subshell()) {
die("Cygwin /bin/sh subshell requires fix with --cygwin-subshell-fix=do\n");
}
# Use mixed path format i.e c:/path/to/ # Use mixed path format i.e c:/path/to/
$glob_mysql_test_dir= mixed_path($glob_mysql_test_dir); $glob_mysql_test_dir= mixed_path($glob_mysql_test_dir);
} }
@ -1729,11 +1793,12 @@ sub collect_mysqld_features {
# to simplify the parsing, we'll merge all nicely formatted --help texts # to simplify the parsing, we'll merge all nicely formatted --help texts
$list =~ s/\n {22}(\S)/ $1/g; $list =~ s/\n {22}(\S)/ $1/g;
my @list= split '\n', $list; my @list= split '\R', $list;
$mysql_version_id= 0; $mysql_version_id= 0;
my $exe= basename($exe_mysqld);
while (defined(my $line = shift @list)){ while (defined(my $line = shift @list)){
if ($line =~ /^\Q$exe_mysqld\E\s+Ver\s(\d+)\.(\d+)\.(\d+)(\S*)/ ) { if ($line =~ /\W\Q$exe\E\s+Ver\s(\d+)\.(\d+)\.(\d+)(\S*)/ ) {
$mysql_version_id= $1*10000 + $2*100 + $3; $mysql_version_id= $1*10000 + $2*100 + $3;
mtr_report("MariaDB Version $1.$2.$3$4"); mtr_report("MariaDB Version $1.$2.$3$4");
last; last;
@ -1757,7 +1822,7 @@ sub collect_mysqld_features {
next; next;
} }
last if /^$/; # then goes a list of variables, it ends with an empty line last if /^\r?$/; # then goes a list of variables, it ends with an empty line
# Put a variable into hash # Put a variable into hash
/^([\S]+)[ \t]+(.*?)\r?$/ or die "Could not parse mysqld --help: $_\n"; /^([\S]+)[ \t]+(.*?)\r?$/ or die "Could not parse mysqld --help: $_\n";
@ -1788,7 +1853,7 @@ sub collect_mysqld_features_from_running_server ()
my $list = `$cmd` or my $list = `$cmd` or
mtr_error("Could not connect to extern server using command: '$cmd'"); mtr_error("Could not connect to extern server using command: '$cmd'");
foreach my $line (split('\n', $list )) foreach my $line (split('\R', $list ))
{ {
# Put variables into hash # Put variables into hash
if ( $line =~ /^([\S]+)[ \t]+(.*?)\r?$/ ) if ( $line =~ /^([\S]+)[ \t]+(.*?)\r?$/ )
@ -1878,7 +1943,7 @@ sub client_debug_arg($$) {
if ( $opt_debug ) { if ( $opt_debug ) {
mtr_add_arg($args, mtr_add_arg($args,
"--loose-debug=$debug_d:t:A,%s/log/%s.trace", "--loose-debug=d,info,warning,warnings:t:A,%s/log/%s.trace",
$path_vardir_trace, $client_name) $path_vardir_trace, $client_name)
} }
} }
@ -2924,7 +2989,7 @@ sub initialize_servers {
# #
sub sql_to_bootstrap { sub sql_to_bootstrap {
my ($sql) = @_; my ($sql) = @_;
my @lines= split(/\n/, $sql); my @lines= split(/\R/, $sql);
my $result= "\n"; my $result= "\n";
my $delimiter= ';'; my $delimiter= ';';
@ -4081,9 +4146,8 @@ sub run_testcase ($$) {
} }
return ($res == 62) ? 0 : $res; return ($res == 62) ? 0 : $res;
} } # if ($proc and $proc eq $test)
elsif ($proc)
if ($proc)
{ {
# It was not mysqltest that exited, add to a wait-to-be-started-again list. # It was not mysqltest that exited, add to a wait-to-be-started-again list.
$keep_waiting_proc{$proc} = 1; $keep_waiting_proc{$proc} = 1;
@ -4112,7 +4176,7 @@ sub run_testcase ($$) {
{ {
# do nothing # do nothing
} }
} } # foreach my $wait_for_proc
next; next;
@ -5494,7 +5558,11 @@ sub start_mysqltest ($) {
mtr_init_args(\$args); mtr_init_args(\$args);
mtr_add_arg($args, "--defaults-file=%s", $path_config_file); mtr_add_arg($args, "--defaults-file=%s", $path_config_file);
mtr_add_arg($args, "--silent"); if ($opt_verbose > 1) {
mtr_add_arg($args, "--verbose");
} else {
mtr_add_arg($args, "--silent");
}
mtr_add_arg($args, "--tmpdir=%s", $opt_tmpdir); mtr_add_arg($args, "--tmpdir=%s", $opt_tmpdir);
mtr_add_arg($args, "--character-sets-dir=%s", $path_charsetsdir); mtr_add_arg($args, "--character-sets-dir=%s", $path_charsetsdir);
mtr_add_arg($args, "--logdir=%s/log", $opt_vardir); mtr_add_arg($args, "--logdir=%s/log", $opt_vardir);

View File

@ -14,19 +14,19 @@ Table Create Table
innodb_compact CREATE TABLE `innodb_compact` ( innodb_compact CREATE TABLE `innodb_compact` (
`c1` bigint(20) NOT NULL, `c1` bigint(20) NOT NULL,
`b` char(200) DEFAULT NULL `b` char(200) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT `encrypted`=yes `encryption_key_id`=1 ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=COMPACT `encrypted`=yes `encryption_key_id`=1
show create table innodb_dynamic; show create table innodb_dynamic;
Table Create Table Table Create Table
innodb_dynamic CREATE TABLE `innodb_dynamic` ( innodb_dynamic CREATE TABLE `innodb_dynamic` (
`c1` bigint(20) NOT NULL, `c1` bigint(20) NOT NULL,
`b` char(200) DEFAULT NULL `b` char(200) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC `encrypted`=yes `encryption_key_id`=33 ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=DYNAMIC `encrypted`=yes `encryption_key_id`=33
show create table innodb_redundant; show create table innodb_redundant;
Table Create Table Table Create Table
innodb_redundant CREATE TABLE `innodb_redundant` ( innodb_redundant CREATE TABLE `innodb_redundant` (
`c1` bigint(20) NOT NULL, `c1` bigint(20) NOT NULL,
`b` char(200) DEFAULT NULL `b` char(200) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=REDUNDANT `encrypted`=yes `encryption_key_id`=4 ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=REDUNDANT `encrypted`=yes `encryption_key_id`=4
create procedure innodb_insert_proc (repeat_count int) create procedure innodb_insert_proc (repeat_count int)
begin begin
declare current_num int; declare current_num int;
@ -56,6 +56,7 @@ count(*)
select count(*) from innodb_redundant where c1 < 1500000; select count(*) from innodb_redundant where c1 < 1500000;
count(*) count(*)
5000 5000
# restart
update innodb_compact set c1 = c1 + 1; update innodb_compact set c1 = c1 + 1;
update innodb_dynamic set c1 = c1 + 1; update innodb_dynamic set c1 = c1 + 1;
update innodb_redundant set c1 = c1 + 1; update innodb_redundant set c1 = c1 + 1;
@ -74,39 +75,40 @@ Table Create Table
innodb_compact CREATE TABLE `innodb_compact` ( innodb_compact CREATE TABLE `innodb_compact` (
`c1` bigint(20) NOT NULL, `c1` bigint(20) NOT NULL,
`b` char(200) DEFAULT NULL `b` char(200) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=COMPACT
alter table innodb_dynamic engine=innodb encrypted=DEFAULT encryption_key_id=DEFAULT; alter table innodb_dynamic engine=innodb encrypted=DEFAULT encryption_key_id=DEFAULT;
show create table innodb_dynamic; show create table innodb_dynamic;
Table Create Table Table Create Table
innodb_dynamic CREATE TABLE `innodb_dynamic` ( innodb_dynamic CREATE TABLE `innodb_dynamic` (
`c1` bigint(20) NOT NULL, `c1` bigint(20) NOT NULL,
`b` char(200) DEFAULT NULL `b` char(200) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=DYNAMIC
alter table innodb_redundant engine=innodb encrypted=DEFAULT encryption_key_id=DEFAULT; alter table innodb_redundant engine=innodb encrypted=DEFAULT encryption_key_id=DEFAULT;
show create table innodb_redundant; show create table innodb_redundant;
Table Create Table Table Create Table
innodb_redundant CREATE TABLE `innodb_redundant` ( innodb_redundant CREATE TABLE `innodb_redundant` (
`c1` bigint(20) NOT NULL, `c1` bigint(20) NOT NULL,
`b` char(200) DEFAULT NULL `b` char(200) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=REDUNDANT ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=REDUNDANT
# restart
show create table innodb_compact; show create table innodb_compact;
Table Create Table Table Create Table
innodb_compact CREATE TABLE `innodb_compact` ( innodb_compact CREATE TABLE `innodb_compact` (
`c1` bigint(20) NOT NULL, `c1` bigint(20) NOT NULL,
`b` char(200) DEFAULT NULL `b` char(200) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=COMPACT
show create table innodb_dynamic; show create table innodb_dynamic;
Table Create Table Table Create Table
innodb_dynamic CREATE TABLE `innodb_dynamic` ( innodb_dynamic CREATE TABLE `innodb_dynamic` (
`c1` bigint(20) NOT NULL, `c1` bigint(20) NOT NULL,
`b` char(200) DEFAULT NULL `b` char(200) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=DYNAMIC
show create table innodb_redundant; show create table innodb_redundant;
Table Create Table Table Create Table
innodb_redundant CREATE TABLE `innodb_redundant` ( innodb_redundant CREATE TABLE `innodb_redundant` (
`c1` bigint(20) NOT NULL, `c1` bigint(20) NOT NULL,
`b` char(200) DEFAULT NULL `b` char(200) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=REDUNDANT ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=REDUNDANT
update innodb_compact set c1 = c1 + 1; update innodb_compact set c1 = c1 + 1;
update innodb_dynamic set c1 = c1 + 1; update innodb_dynamic set c1 = c1 + 1;
update innodb_redundant set c1 = c1 + 1; update innodb_redundant set c1 = c1 + 1;

View File

@ -646,6 +646,8 @@ LIKE 'buffer_page_written_index_leaf';
NAME COUNT > 0 NAME COUNT > 0
buffer_page_written_index_leaf 0 buffer_page_written_index_leaf 0
SET GLOBAL innodb_monitor_enable='%'; SET GLOBAL innodb_monitor_enable='%';
SET GLOBAL innodb_monitor_reset_all= '%', innodb_compression_algorithm= foo;
ERROR 42000: Variable 'innodb_compression_algorithm' can't be set to the value of 'foo'
INSERT INTO t1 VALUES (5), (6), (7), (8); INSERT INTO t1 VALUES (5), (6), (7), (8);
FLUSH TABLES t1 FOR EXPORT; FLUSH TABLES t1 FOR EXPORT;
UNLOCK TABLES; UNLOCK TABLES;

View File

@ -396,3 +396,18 @@ set innodb_strict_mode = 1;
alter table t1 engine=InnoDB; alter table t1 engine=InnoDB;
ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 8126. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
drop table t1; drop table t1;
#
# MDEV-32128 wrong table name in innodb's "row too big" errors
#
create temporary table t1 (
c1 char(255), c2 char(255), c3 char(255), c4 char(255),
c5 char(255), c6 char(255), c7 char(255), c8 char(255),
c9 char(255), c10 char(255), c11 char(255), c12 char(255),
c13 char(255), c14 char(255), c15 char(255), c16 char(255),
c17 char(255), c18 char(255), c19 char(255), c20 char(255),
c21 char(255), c22 char(255), c23 char(255), c24 char(255),
c25 char(255), c26 char(255), c27 char(255), c28 char(255),
c29 char(255), c30 char(255), c31 char(255), c32 char(255)
) engine=innodb;
ERROR 42000: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
FOUND 1 /Cannot add field `c32` in table `test`.`t1` because/ in mysqld.1.err

View File

@ -433,6 +433,8 @@ SELECT NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME
LIKE 'buffer_page_written_index_leaf'; LIKE 'buffer_page_written_index_leaf';
SET GLOBAL innodb_monitor_enable='%'; SET GLOBAL innodb_monitor_enable='%';
--error ER_WRONG_VALUE_FOR_VAR
SET GLOBAL innodb_monitor_reset_all= '%', innodb_compression_algorithm= foo;
INSERT INTO t1 VALUES (5), (6), (7), (8); FLUSH TABLES t1 FOR EXPORT; INSERT INTO t1 VALUES (5), (6), (7), (8); FLUSH TABLES t1 FOR EXPORT;
UNLOCK TABLES; UNLOCK TABLES;
SELECT NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME SELECT NAME, COUNT > 0 FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME

View File

@ -1,4 +1,5 @@
--source include/have_innodb.inc --source include/have_innodb.inc
--source include/not_embedded.inc
--echo # --echo #
--echo # Bug #17852083 PRINT A WARNING WHEN DDL HAS AN ERROR IN --echo # Bug #17852083 PRINT A WARNING WHEN DDL HAS AN ERROR IN
@ -401,3 +402,21 @@ set innodb_strict_mode = 1;
alter table t1 engine=InnoDB; alter table t1 engine=InnoDB;
drop table t1; drop table t1;
--echo #
--echo # MDEV-32128 wrong table name in innodb's "row too big" errors
--echo #
--error ER_TOO_BIG_ROWSIZE
create temporary table t1 (
c1 char(255), c2 char(255), c3 char(255), c4 char(255),
c5 char(255), c6 char(255), c7 char(255), c8 char(255),
c9 char(255), c10 char(255), c11 char(255), c12 char(255),
c13 char(255), c14 char(255), c15 char(255), c16 char(255),
c17 char(255), c18 char(255), c19 char(255), c20 char(255),
c21 char(255), c22 char(255), c23 char(255), c24 char(255),
c25 char(255), c26 char(255), c27 char(255), c28 char(255),
c29 char(255), c30 char(255), c31 char(255), c32 char(255)
) engine=innodb;
let SEARCH_FILE=$MYSQLTEST_VARDIR/log/mysqld.1.err;
let SEARCH_PATTERN=Cannot add field `c32` in table `test`.`t1` because;
source include/search_pattern_in_file.inc;

View File

@ -20,12 +20,6 @@ INSERT INTO gis_point VALUES
(108, ST_POINTFROMWKB(POINT(0,10))), (108, ST_POINTFROMWKB(POINT(0,10))),
(109, ST_POINTFROMWKB(POINT(-10,0))), (109, ST_POINTFROMWKB(POINT(-10,0))),
(110, ST_POINTFROMWKB(POINT(0,-10))); (110, ST_POINTFROMWKB(POINT(0,-10)));
Warnings:
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
INSERT INTO gis_point VALUES INSERT INTO gis_point VALUES
(111, ST_POINTFROMWKB(ST_ASWKB(ST_POINTFROMTEXT('POINT(1 1)')))), (111, ST_POINTFROMWKB(ST_ASWKB(ST_POINTFROMTEXT('POINT(1 1)')))),
(112, ST_POINTFROMWKB(ST_ASWKB(ST_POINTFROMTEXT('POINT(1e308 1e308)')))), (112, ST_POINTFROMWKB(ST_ASWKB(ST_POINTFROMTEXT('POINT(1e308 1e308)')))),
@ -45,18 +39,10 @@ INSERT INTO gis_linestring VALUES
(207, ST_LINEFROMWKB(LINESTRING(POINT(0,0), POINT(5,5)))), (207, ST_LINEFROMWKB(LINESTRING(POINT(0,0), POINT(5,5)))),
(208, ST_LINEFROMWKB(LINESTRING(POINT(0,0), POINT(-5,-5), POINT(-10,10)))), (208, ST_LINEFROMWKB(LINESTRING(POINT(0,0), POINT(-5,-5), POINT(-10,10)))),
(209, ST_LINEFROMWKB(LINESTRING(POINT(0,0), POINT(2,2), POINT(4,4), POINT(6,6), POINT(8,8)))); (209, ST_LINEFROMWKB(LINESTRING(POINT(0,0), POINT(2,2), POINT(4,4), POINT(6,6), POINT(8,8))));
Warnings:
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
INSERT INTO gis_linestring VALUES INSERT INTO gis_linestring VALUES
(210, ST_LINESTRINGFROMWKB(LINESTRING(POINT(0,0), POINT(5,5)))), (210, ST_LINESTRINGFROMWKB(LINESTRING(POINT(0,0), POINT(5,5)))),
(211, ST_LINESTRINGFROMWKB(LINESTRING(POINT(0,0), POINT(-50,-50), POINT(10,-10)))), (211, ST_LINESTRINGFROMWKB(LINESTRING(POINT(0,0), POINT(-50,-50), POINT(10,-10)))),
(212, ST_LINESTRINGFROMWKB(LINESTRING(POINT(0,0), POINT(1e308,1e308), POINT(1e308,-1e308)))); (212, ST_LINESTRINGFROMWKB(LINESTRING(POINT(0,0), POINT(1e308,1e308), POINT(1e308,-1e308))));
Warnings:
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
INSERT INTO gis_linestring VALUES INSERT INTO gis_linestring VALUES
(213, ST_LINEFROMWKB(ST_ASWKB(ST_LINEFROMTEXT('LINESTRING(1e308 1e308,1e308 -1e308)')))), (213, ST_LINEFROMWKB(ST_ASWKB(ST_LINEFROMTEXT('LINESTRING(1e308 1e308,1e308 -1e308)')))),
(214, ST_LINEFROMWKB(ST_ASWKB(ST_LINEFROMTEXT('LINESTRING(1 1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,9 9)')))), (214, ST_LINEFROMWKB(ST_ASWKB(ST_LINEFROMTEXT('LINESTRING(1 1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,9 9)')))),
@ -75,19 +61,11 @@ INSERT INTO gis_polygon VALUES
(308, ST_POLYFROMWKB(POLYGON(LINESTRING(POINT(0,0), POINT(0,15), POINT(15,15), POINT(15,0), POINT(0,0))))), (308, ST_POLYFROMWKB(POLYGON(LINESTRING(POINT(0,0), POINT(0,15), POINT(15,15), POINT(15,0), POINT(0,0))))),
(309, ST_POLYFROMWKB(POLYGON(LINESTRING(POINT(0,0), POINT(0,10), POINT(10,10), POINT(10,0), POINT(0,0)), (309, ST_POLYFROMWKB(POLYGON(LINESTRING(POINT(0,0), POINT(0,10), POINT(10,10), POINT(10,0), POINT(0,0)),
LINESTRING(POINT(4,4), POINT(4,6), POINT(6,6), POINT(6,4), POINT(4,4))))); LINESTRING(POINT(4,4), POINT(4,6), POINT(6,6), POINT(6,4), POINT(4,4)))));
Warnings:
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
INSERT INTO gis_polygon VALUES INSERT INTO gis_polygon VALUES
(310, ST_POLYGONFROMWKB(POLYGON(LINESTRING(POINT(0,0), POINT(0,5), POINT(5,5), POINT(0,0))))), (310, ST_POLYGONFROMWKB(POLYGON(LINESTRING(POINT(0,0), POINT(0,5), POINT(5,5), POINT(0,0))))),
(311, ST_POLYGONFROMWKB(POLYGON(LINESTRING(POINT(10,10), POINT(10,15), POINT(15,15), POINT(15,10), POINT(10,10))))), (311, ST_POLYGONFROMWKB(POLYGON(LINESTRING(POINT(10,10), POINT(10,15), POINT(15,15), POINT(15,10), POINT(10,10))))),
(312, ST_POLYGONFROMWKB(POLYGON(LINESTRING(POINT(10,10), POINT(10,20), POINT(20,20), POINT(20,10), POINT(10,10)), (312, ST_POLYGONFROMWKB(POLYGON(LINESTRING(POINT(10,10), POINT(10,20), POINT(20,20), POINT(20,10), POINT(10,10)),
LINESTRING(POINT(14,14), POINT(14,16), POINT(16,16), POINT(16,14), POINT(14,14))))); LINESTRING(POINT(14,14), POINT(14,16), POINT(16,16), POINT(16,14), POINT(14,14)))));
Warnings:
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
INSERT INTO gis_polygon VALUES INSERT INTO gis_polygon VALUES
(313, ST_POLYFROMWKB(ST_ASWKB(ST_POLYFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,5 5,0 0))')))), (313, ST_POLYFROMWKB(ST_ASWKB(ST_POLYFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,5 5,0 0))')))),
(314, ST_POLYFROMWKB(ST_ASWKB(ST_POLYGONFROMTEXT('POLYGON((10 0,10 10,0 10,-10 10,-10 0,-10 -10,0 10,10 -10,10 0))')))), (314, ST_POLYFROMWKB(ST_ASWKB(ST_POLYGONFROMTEXT('POLYGON((10 0,10 10,0 10,-10 10,-10 0,-10 -10,0 10,10 -10,10 0))')))),
@ -105,18 +83,10 @@ INSERT INTO gis_multi_point VALUES
(407, ST_GEOMFROMWKB(MULTIPOINT(POINT(0,0)))), (407, ST_GEOMFROMWKB(MULTIPOINT(POINT(0,0)))),
(408, ST_GEOMFROMWKB(MULTIPOINT(POINT(0,0), POINT(10,10)))), (408, ST_GEOMFROMWKB(MULTIPOINT(POINT(0,0), POINT(10,10)))),
(409, ST_GEOMFROMWKB(MULTIPOINT(POINT(0,0), POINT(2,2), POINT(4,4), POINT(6,6)))); (409, ST_GEOMFROMWKB(MULTIPOINT(POINT(0,0), POINT(2,2), POINT(4,4), POINT(6,6))));
Warnings:
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
INSERT INTO gis_multi_point VALUES INSERT INTO gis_multi_point VALUES
(410, ST_GEOMFROMWKB(MULTIPOINT(POINT(0,0)))), (410, ST_GEOMFROMWKB(MULTIPOINT(POINT(0,0)))),
(411, ST_GEOMFROMWKB(MULTIPOINT(POINT(0,0), POINT(1e308,1e308)))), (411, ST_GEOMFROMWKB(MULTIPOINT(POINT(0,0), POINT(1e308,1e308)))),
(412, ST_GEOMFROMWKB(MULTIPOINT(POINT(1e308,1e308), POINT(-1e308,1e308), POINT(1e308,-1e308), POINT(-1e308,-1e308)))); (412, ST_GEOMFROMWKB(MULTIPOINT(POINT(1e308,1e308), POINT(-1e308,1e308), POINT(1e308,-1e308), POINT(-1e308,-1e308))));
Warnings:
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
INSERT INTO gis_multi_point VALUES INSERT INTO gis_multi_point VALUES
(413, ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('MULTIPOINT(0 0)')))), (413, ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('MULTIPOINT(0 0)')))),
(414, ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('MULTIPOINT(0 0,1e308 1e308,-1e308 -1e308)')))), (414, ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('MULTIPOINT(0 0,1e308 1e308,-1e308 -1e308)')))),
@ -135,19 +105,11 @@ INSERT INTO gis_multi_linestring VALUES
(508, ST_GEOMFROMWKB(MULTILINESTRING(LINESTRING(POINT(0,0), POINT(12,12), POINT(24,24))))), (508, ST_GEOMFROMWKB(MULTILINESTRING(LINESTRING(POINT(0,0), POINT(12,12), POINT(24,24))))),
(509, ST_GEOMFROMWKB(MULTILINESTRING(LINESTRING(POINT(0,0), POINT(2,2), POINT(4,4)), (509, ST_GEOMFROMWKB(MULTILINESTRING(LINESTRING(POINT(0,0), POINT(2,2), POINT(4,4)),
LINESTRING(POINT(6,6), POINT(8,8), POINT(10,10))))); LINESTRING(POINT(6,6), POINT(8,8), POINT(10,10)))));
Warnings:
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
INSERT INTO gis_multi_linestring VALUES INSERT INTO gis_multi_linestring VALUES
(510, ST_GEOMFROMWKB(MULTILINESTRING(LINESTRING(POINT(0,0), POINT(2,2), POINT(4,4))))), (510, ST_GEOMFROMWKB(MULTILINESTRING(LINESTRING(POINT(0,0), POINT(2,2), POINT(4,4))))),
(511, ST_GEOMFROMWKB(MULTILINESTRING(LINESTRING(POINT(0,0), POINT(1,1), POINT(2,2))))), (511, ST_GEOMFROMWKB(MULTILINESTRING(LINESTRING(POINT(0,0), POINT(1,1), POINT(2,2))))),
(512, ST_GEOMFROMWKB(MULTILINESTRING(LINESTRING(POINT(0,0), POINT(12,12), POINT(24,24)), (512, ST_GEOMFROMWKB(MULTILINESTRING(LINESTRING(POINT(0,0), POINT(12,12), POINT(24,24)),
LINESTRING(POINT(36,36), POINT(48,48), POINT(50,50))))); LINESTRING(POINT(36,36), POINT(48,48), POINT(50,50)))));
Warnings:
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
INSERT INTO gis_multi_linestring VALUES INSERT INTO gis_multi_linestring VALUES
(513, ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,10 10),(0 10,10 0))')))), (513, ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,10 10),(0 10,10 0))')))),
(514, ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,10 10,-10 10,0 0),(0 0,-10 -10,10 -10,0 0))')))), (514, ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,10 10,-10 10,0 0),(0 0,-10 -10,10 -10,0 0))')))),
@ -167,10 +129,6 @@ INSERT INTO gis_multi_polygon VALUES
LINESTRING(POINT(4,4), POINT(4,6), POINT(6,6), POINT(6,4), POINT(4,4)))))), LINESTRING(POINT(4,4), POINT(4,6), POINT(6,6), POINT(6,4), POINT(4,4)))))),
(609, ST_GEOMFROMWKB(MULTIPOLYGON(POLYGON(LINESTRING(POINT(0,0), POINT(5,0), POINT(5,5), POINT(0,5), POINT(0,0))), (609, ST_GEOMFROMWKB(MULTIPOLYGON(POLYGON(LINESTRING(POINT(0,0), POINT(5,0), POINT(5,5), POINT(0,5), POINT(0,0))),
POLYGON(LINESTRING(POINT(0,0), POINT(-5,0), POINT(-5,-5), POINT(0,-5), POINT(0,0)))))); POLYGON(LINESTRING(POINT(0,0), POINT(-5,0), POINT(-5,-5), POINT(0,-5), POINT(0,0))))));
Warnings:
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
INSERT INTO gis_multi_polygon VALUES INSERT INTO gis_multi_polygon VALUES
(610, ST_GEOMFROMWKB(MULTIPOLYGON(POLYGON(LINESTRING(POINT(0,0), POINT(-5,0), POINT(-5,-5), POINT(0,-5), POINT(0,0)))))), (610, ST_GEOMFROMWKB(MULTIPOLYGON(POLYGON(LINESTRING(POINT(0,0), POINT(-5,0), POINT(-5,-5), POINT(0,-5), POINT(0,0)))))),
(611, ST_GEOMFROMWKB(MULTIPOLYGON(POLYGON(LINESTRING(POINT(10,10), POINT(20,10), POINT(20,20), POINT(10,20), POINT(10,10)), (611, ST_GEOMFROMWKB(MULTIPOLYGON(POLYGON(LINESTRING(POINT(10,10), POINT(20,10), POINT(20,20), POINT(10,20), POINT(10,10)),
@ -178,10 +136,6 @@ LINESTRING(POINT(14,14), POINT(14,16), POINT(16,16), POINT(16,14), POINT(14,14))
(612, ST_GEOMFROMWKB(MULTIPOLYGON(POLYGON(LINESTRING(POINT(0,0), POINT(0,10), POINT(10,10), POINT(10,0), POINT(0,0)), (612, ST_GEOMFROMWKB(MULTIPOLYGON(POLYGON(LINESTRING(POINT(0,0), POINT(0,10), POINT(10,10), POINT(10,0), POINT(0,0)),
LINESTRING(POINT(4,4), POINT(4,6), POINT(6,6), POINT(6,4), POINT(4,4))), LINESTRING(POINT(4,4), POINT(4,6), POINT(6,6), POINT(6,4), POINT(4,4))),
POLYGON(LINESTRING(POINT(0,0), POINT(-5,0), POINT(-5,-5), POINT(0,-5), POINT(0,0)))))); POLYGON(LINESTRING(POINT(0,0), POINT(-5,0), POINT(-5,-5), POINT(0,-5), POINT(0,0))))));
Warnings:
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
INSERT INTO gis_multi_polygon VALUES INSERT INTO gis_multi_polygon VALUES
(613, ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,5 5,5 -5,0 0)),((0 0,-5 5,-5 -5,0 0)))')))), (613, ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,5 5,5 -5,0 0)),((0 0,-5 5,-5 -5,0 0)))')))),
(614, ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,10 10,-10 10,0 0)),((0 0,-10 -10,10 -10,0 0)))')))), (614, ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,10 10,-10 10,0 0)),((0 0,-10 -10,10 -10,0 0)))')))),
@ -212,10 +166,6 @@ LINESTRING(POINT(10,10), POINT(5,5), POINT(0,10))),
MULTIPOLYGON(POLYGON(LINESTRING(POINT(0,0), POINT(0,10), POINT(10,10), POINT(10,0), POINT(0,0)), MULTIPOLYGON(POLYGON(LINESTRING(POINT(0,0), POINT(0,10), POINT(10,10), POINT(10,0), POINT(0,0)),
LINESTRING(POINT(4,4), POINT(4,6), POINT(6,6), POINT(6,4), POINT(4,4))), LINESTRING(POINT(4,4), POINT(4,6), POINT(6,6), POINT(6,4), POINT(4,4))),
POLYGON(LINESTRING(POINT(0,0), POINT(-10,0), POINT(-10,-10), POINT(0,0))))))); POLYGON(LINESTRING(POINT(0,0), POINT(-10,0), POINT(-10,-10), POINT(0,0)))))));
Warnings:
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
INSERT INTO gis_geometrycollection VALUES INSERT INTO gis_geometrycollection VALUES
(710, ST_GEOMETRYCOLLECTIONFROMWKB(GEOMETRYCOLLECTION(POINT(0,0), (710, ST_GEOMETRYCOLLECTIONFROMWKB(GEOMETRYCOLLECTION(POINT(0,0),
LINESTRING(POINT(0,0), POINT(100,100))))), LINESTRING(POINT(0,0), POINT(100,100))))),
@ -229,10 +179,6 @@ LINESTRING(POINT(10,10), POINT(5,5), POINT(0,10))),
MULTIPOLYGON(POLYGON(LINESTRING(POINT(0,0), POINT(0,10), POINT(10,10), POINT(10,0), POINT(0,0)), MULTIPOLYGON(POLYGON(LINESTRING(POINT(0,0), POINT(0,10), POINT(10,10), POINT(10,0), POINT(0,0)),
LINESTRING(POINT(4,4), POINT(4,6), POINT(6,6), POINT(6,4), POINT(4,4))), LINESTRING(POINT(4,4), POINT(4,6), POINT(6,6), POINT(6,4), POINT(4,4))),
POLYGON(LINESTRING(POINT(0,0), POINT(-10,0), POINT(-10,-10), POINT(0,0))))))); POLYGON(LINESTRING(POINT(0,0), POINT(-10,0), POINT(-10,-10), POINT(0,0)))))));
Warnings:
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
Warning 3195 st_geometryfromwkb(geometry) is deprecated and will be replaced by st_srid(geometry, 0) in a future version. Use st_geometryfromwkb(st_aswkb(geometry), 0) instead.
INSERT INTO gis_geometrycollection VALUES INSERT INTO gis_geometrycollection VALUES
(713, ST_GEOMCOLLFROMWKB(ST_ASWKB(ST_GEOMCOLLFROMTEXT('GEOMETRYCOLLECTION(' (713, ST_GEOMCOLLFROMWKB(ST_ASWKB(ST_GEOMCOLLFROMTEXT('GEOMETRYCOLLECTION('
'POINT(0 0),' 'POINT(0 0),'
@ -240,33 +186,6 @@ INSERT INTO gis_geometrycollection VALUES
'POLYGON((0 0,0 10,10 10,10 0,0 0)),' 'POLYGON((0 0,0 10,10 10,10 0,0 0)),'
'MULTIPOINT(0 0,2 2,4 4,6 6,8 8,10 10),' 'MULTIPOINT(0 0,2 2,4 4,6 6,8 8,10 10),'
'MULTILINESTRING((0 0,10 10),(0 10,10 0)),' 'MULTILINESTRING((0 0,10 10),(0 10,10 0)),'
'MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((5 5,5 10,10 10,10 5,5 5))))')))),
(714, ST_GEOMCOLLFROMWKB(ST_ASWKB(ST_GEOMCOLLFROMTEXT('GEOMETRYCOLLECTION('
'GEOMETRYCOLLECTION('
'POINT(0 0)),'
'GEOMETRYCOLLECTION('
'LINESTRING(0 0,10 10)),'
'GEOMETRYCOLLECTION('
'POLYGON((0 0,0 10,10 10,10 0,0 0))),'
'GEOMETRYCOLLECTION('
'MULTIPOINT(0 0,2 2,4 4,6 6,8 8,10 10)),'
'GEOMETRYCOLLECTION('
'MULTILINESTRING((0 0,10 10),(0 10,10 0))),'
'GEOMETRYCOLLECTION('
'MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((5 5,5 10,10 10,10 5,5 5)))))')))),
(715, ST_GEOMCOLLFROMWKB(ST_ASWKB(ST_GEOMCOLLFROMTEXT('GEOMETRYCOLLECTION('
'GEOMETRYCOLLECTION(),'
'POINT(0 0),'
'GEOMETRYCOLLECTION('
'LINESTRING(0 0,10 10),'
'GEOMETRYCOLLECTION('
'GEOMETRYCOLLECTION())),'
'GEOMETRYCOLLECTION(),'
'GEOMETRYCOLLECTION('
'GEOMETRYCOLLECTION()),'
'POLYGON((0 0,0 10,10 10,10 0,0 0)),'
'MULTIPOINT(0 0,2 2,4 4,6 6,8 8,10 10),'
'MULTILINESTRING((0 0,10 10),(0 10,10 0)),'
'MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((5 5,5 10,10 10,10 5,5 5))))')))); 'MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((5 5,5 10,10 10,10 5,5 5))))'))));
# Creating a table with spatial index column # Creating a table with spatial index column
CREATE TABLE geom_index (fid INTEGER NOT NULL PRIMARY KEY, g GEOMETRY NOT NULL, SPATIAL INDEX(g)); CREATE TABLE geom_index (fid INTEGER NOT NULL PRIMARY KEY, g GEOMETRY NOT NULL, SPATIAL INDEX(g));

View File

@ -1,7 +1,6 @@
--source include/have_innodb.inc --source include/have_innodb.inc
--source include/have_debug.inc
--source include/have_geometry.inc --source include/have_geometry.inc
--source include/have_innodb_4k.inc --source include/innodb_page_size.inc
############################################################################################ ############################################################################################
# Creating the spatial objects # # Creating the spatial objects #
@ -233,33 +232,6 @@ INSERT INTO gis_geometrycollection VALUES
'POLYGON((0 0,0 10,10 10,10 0,0 0)),' 'POLYGON((0 0,0 10,10 10,10 0,0 0)),'
'MULTIPOINT(0 0,2 2,4 4,6 6,8 8,10 10),' 'MULTIPOINT(0 0,2 2,4 4,6 6,8 8,10 10),'
'MULTILINESTRING((0 0,10 10),(0 10,10 0)),' 'MULTILINESTRING((0 0,10 10),(0 10,10 0)),'
'MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((5 5,5 10,10 10,10 5,5 5))))')))),
(714, ST_GEOMCOLLFROMWKB(ST_ASWKB(ST_GEOMCOLLFROMTEXT('GEOMETRYCOLLECTION('
'GEOMETRYCOLLECTION('
'POINT(0 0)),'
'GEOMETRYCOLLECTION('
'LINESTRING(0 0,10 10)),'
'GEOMETRYCOLLECTION('
'POLYGON((0 0,0 10,10 10,10 0,0 0))),'
'GEOMETRYCOLLECTION('
'MULTIPOINT(0 0,2 2,4 4,6 6,8 8,10 10)),'
'GEOMETRYCOLLECTION('
'MULTILINESTRING((0 0,10 10),(0 10,10 0))),'
'GEOMETRYCOLLECTION('
'MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((5 5,5 10,10 10,10 5,5 5)))))')))),
(715, ST_GEOMCOLLFROMWKB(ST_ASWKB(ST_GEOMCOLLFROMTEXT('GEOMETRYCOLLECTION('
'GEOMETRYCOLLECTION(),'
'POINT(0 0),'
'GEOMETRYCOLLECTION('
'LINESTRING(0 0,10 10),'
'GEOMETRYCOLLECTION('
'GEOMETRYCOLLECTION())),'
'GEOMETRYCOLLECTION(),'
'GEOMETRYCOLLECTION('
'GEOMETRYCOLLECTION()),'
'POLYGON((0 0,0 10,10 10,10 0,0 0)),'
'MULTIPOINT(0 0,2 2,4 4,6 6,8 8,10 10),'
'MULTILINESTRING((0 0,10 10),(0 10,10 0)),'
'MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((5 5,5 10,10 10,10 5,5 5))))')))); 'MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((5 5,5 10,10 10,10 5,5 5))))'))));
############################################################################################ ############################################################################################

View File

@ -8,11 +8,8 @@ insert into worklog5743 values(repeat("a", 20000));
update worklog5743 set a = (repeat("b", 16000)); update worklog5743 set a = (repeat("b", 16000));
SET sql_mode= ''; SET sql_mode= '';
create index idx on worklog5743(a(900)); create index idx on worklog5743(a(900));
Warnings:
Note 1071 Specified key was too long; max key length is 768 bytes
show warnings; show warnings;
Level Code Message Level Code Message
Note 1071 Specified key was too long; max key length is 768 bytes
SET sql_mode= default; SET sql_mode= default;
begin; begin;
update worklog5743 set a = (repeat("x", 17000)); update worklog5743 set a = (repeat("x", 17000));
@ -101,7 +98,7 @@ create index idx1 on worklog5743_1(a2(4000));
ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 1982. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 1982. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
show warnings; show warnings;
Level Code Message Level Code Message
Note 1071 Specified key was too long; max key length is 768 bytes Note 1071 Specified key was too long; max key length is 1173 bytes
Error 1118 Row size too large. The maximum row size for the used table type, not counting BLOBs, is 1982. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs Error 1118 Row size too large. The maximum row size for the used table type, not counting BLOBs, is 1982. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
create index idx3 on worklog5743_1(a2(436)); create index idx3 on worklog5743_1(a2(436));
ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 1982. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 1982. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
@ -120,69 +117,54 @@ create index idx6 on worklog5743_1(a1, a2(428));
show warnings; show warnings;
Level Code Message Level Code Message
SET sql_mode= ''; SET sql_mode= '';
set innodb_strict_mode=off;
create index idx1 on worklog5743_2(a2(4000)); create index idx1 on worklog5743_2(a2(4000));
Warnings: Warnings:
Note 1071 Specified key was too long; max key length is 768 bytes Note 1071 Specified key was too long; max key length is 1173 bytes
Warning 139 Row size too large (> 1982). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
set innodb_strict_mode=on;
show warnings; show warnings;
Level Code Message Level Code Message
Note 1071 Specified key was too long; max key length is 768 bytes Note 1071 Specified key was too long; max key length is 1173 bytes
Warning 139 Row size too large (> 1982). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.
show create table worklog5743_2; show create table worklog5743_2;
Table Create Table Table Create Table
worklog5743_2 CREATE TABLE `worklog5743_2` ( worklog5743_2 CREATE TABLE `worklog5743_2` (
`a1` int(11) DEFAULT NULL, `a1` int(11) DEFAULT NULL,
`a2` text NOT NULL, `a2` text NOT NULL,
KEY `idx1` (`a2`(768)) KEY `idx1` (`a2`(1173))
) ENGINE=InnoDB DEFAULT CHARSET=latin1 KEY_BLOCK_SIZE=2 ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci KEY_BLOCK_SIZE=2
drop index idx1 on worklog5743_2;
create index idx3 on worklog5743_2(a2(769)); create index idx3 on worklog5743_2(a2(769));
Warnings:
Note 1071 Specified key was too long; max key length is 768 bytes
show warnings; show warnings;
Level Code Message Level Code Message
Note 1071 Specified key was too long; max key length is 768 bytes
create index idx4 on worklog5743_2(a2(768)); create index idx4 on worklog5743_2(a2(768));
Warnings:
Note 1831 Duplicate index `idx4`. This is deprecated and will be disallowed in a future release
show warnings; show warnings;
Level Code Message Level Code Message
Note 1831 Duplicate index `idx4`. This is deprecated and will be disallowed in a future release create index idx6 on worklog5743_2(a1, a2(768));
create index idx5 on worklog5743_2(a1, a2(765));
ERROR 42000: Specified key was too long; max key length is 768 bytes
show warnings;
Level Code Message
Error 1071 Specified key was too long; max key length is 768 bytes
create index idx6 on worklog5743_2(a1, a2(764));
show warnings; show warnings;
Level Code Message Level Code Message
set innodb_strict_mode=off;
create index idx1 on worklog5743_4(a2(4000)); create index idx1 on worklog5743_4(a2(4000));
Warnings: Warnings:
Note 1071 Specified key was too long; max key length is 768 bytes Note 1071 Specified key was too long; max key length is 1173 bytes
set innodb_strict_mode=on;
show warnings; show warnings;
Level Code Message Level Code Message
Note 1071 Specified key was too long; max key length is 768 bytes Note 1071 Specified key was too long; max key length is 1173 bytes
show create table worklog5743_4; show create table worklog5743_4;
Table Create Table Table Create Table
worklog5743_4 CREATE TABLE `worklog5743_4` ( worklog5743_4 CREATE TABLE `worklog5743_4` (
`a1` int(11) DEFAULT NULL, `a1` int(11) DEFAULT NULL,
`a2` text NOT NULL, `a2` text NOT NULL,
KEY `idx1` (`a2`(768)) KEY `idx1` (`a2`(1173))
) ENGINE=InnoDB DEFAULT CHARSET=latin1 KEY_BLOCK_SIZE=4 ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci KEY_BLOCK_SIZE=4
create index idx3 on worklog5743_4(a2(769)); create index idx3 on worklog5743_4(a2(769));
Warnings:
Note 1071 Specified key was too long; max key length is 768 bytes
show warnings; show warnings;
Level Code Message Level Code Message
Note 1071 Specified key was too long; max key length is 768 bytes
create index idx4 on worklog5743_4(a2(768)); create index idx4 on worklog5743_4(a2(768));
Warnings:
Note 1831 Duplicate index `idx4`. This is deprecated and will be disallowed in a future release
show warnings; show warnings;
Level Code Message Level Code Message
Note 1831 Duplicate index `idx4`. This is deprecated and will be disallowed in a future release
create index idx5 on worklog5743_4(a1, a2(765));
ERROR 42000: Specified key was too long; max key length is 768 bytes
show warnings;
Level Code Message
Error 1071 Specified key was too long; max key length is 768 bytes
create index idx6 on worklog5743_4(a1, a2(764)); create index idx6 on worklog5743_4(a1, a2(764));
show warnings; show warnings;
Level Code Message Level Code Message
@ -253,25 +235,23 @@ drop table worklog5743_4;
### Test 5 ### ### Test 5 ###
create table worklog5743(a1 int, a2 varchar(20000)) ROW_FORMAT=DYNAMIC; create table worklog5743(a1 int, a2 varchar(20000)) ROW_FORMAT=DYNAMIC;
create index idx1 on worklog5743(a2); create index idx1 on worklog5743(a2);
ERROR 42000: Specified key was too long; max key length is 3072 bytes ERROR 42000: Specified key was too long; max key length is 1173 bytes
show warnings; show warnings;
Level Code Message Level Code Message
Error 1071 Specified key was too long; max key length is 3072 bytes Note 1071 Specified key was too long; max key length is 3072 bytes
Error 1071 Specified key was too long; max key length is 768 bytes Error 1071 Specified key was too long; max key length is 1173 bytes
drop table worklog5743; drop table worklog5743;
create table worklog5743(a1 int, a2 varchar(3072)) ROW_FORMAT=DYNAMIC; create table worklog5743(a1 int, a2 varchar(3072)) ROW_FORMAT=DYNAMIC;
create index idx1 on worklog5743(a2); create index idx1 on worklog5743(a2);
ERROR 42000: Specified key was too long; max key length is 768 bytes ERROR 42000: Specified key was too long; max key length is 1173 bytes
show warnings; show warnings;
Level Code Message Level Code Message
Error 1071 Specified key was too long; max key length is 768 bytes Error 1071 Specified key was too long; max key length is 1173 bytes
drop table worklog5743; drop table worklog5743;
create table worklog5743(a1 int, a2 varchar(769)) ROW_FORMAT=DYNAMIC; create table worklog5743(a1 int, a2 varchar(769)) ROW_FORMAT=DYNAMIC;
create index idx1 on worklog5743(a2); create index idx1 on worklog5743(a2);
ERROR 42000: Specified key was too long; max key length is 768 bytes
show warnings; show warnings;
Level Code Message Level Code Message
Error 1071 Specified key was too long; max key length is 768 bytes
drop table worklog5743; drop table worklog5743;
create table worklog5743(a1 int, a2 varchar(768)) ROW_FORMAT=DYNAMIC; create table worklog5743(a1 int, a2 varchar(768)) ROW_FORMAT=DYNAMIC;
create index idx1 on worklog5743(a2); create index idx1 on worklog5743(a2);
@ -282,10 +262,8 @@ update worklog5743 set a1 = 3333;
drop table worklog5743; drop table worklog5743;
create table worklog5743(a1 int, a2 varchar(765)) ROW_FORMAT=DYNAMIC; create table worklog5743(a1 int, a2 varchar(765)) ROW_FORMAT=DYNAMIC;
create index idx1 on worklog5743(a1, a2); create index idx1 on worklog5743(a1, a2);
ERROR 42000: Specified key was too long; max key length is 768 bytes
show warnings; show warnings;
Level Code Message Level Code Message
Error 1071 Specified key was too long; max key length is 768 bytes
drop table worklog5743; drop table worklog5743;
create table worklog5743(a1 int, a2 varchar(764)) ROW_FORMAT=DYNAMIC; create table worklog5743(a1 int, a2 varchar(764)) ROW_FORMAT=DYNAMIC;
create index idx1 on worklog5743(a1, a2); create index idx1 on worklog5743(a1, a2);
@ -316,7 +294,7 @@ rollback;
drop table worklog5743; drop table worklog5743;
### Test 6 ### ### Test 6 ###
create table worklog5743(a TEXT not null, primary key (a(1000))); create table worklog5743(a TEXT not null, primary key (a(1000)));
ERROR 42000: Specified key was too long; max key length is 768 bytes drop table worklog5743;
create table worklog5743(a TEXT) ROW_FORMAT=COMPACT; create table worklog5743(a TEXT) ROW_FORMAT=COMPACT;
create index idx on worklog5743(a(768)); create index idx on worklog5743(a(768));
ERROR HY000: Index column size too large. The maximum column size is 767 bytes ERROR HY000: Index column size too large. The maximum column size is 767 bytes
@ -350,25 +328,19 @@ drop table worklog5743;
create table worklog5743(a TEXT not null) ROW_FORMAT=DYNAMIC; create table worklog5743(a TEXT not null) ROW_FORMAT=DYNAMIC;
SET sql_mode= ''; SET sql_mode= '';
create index idx1 on worklog5743(a(769)); create index idx1 on worklog5743(a(769));
Warnings:
Note 1071 Specified key was too long; max key length is 768 bytes
show warnings; show warnings;
Level Code Message Level Code Message
Note 1071 Specified key was too long; max key length is 768 bytes
SET sql_mode= default; SET sql_mode= default;
create index idx2 on worklog5743(a(768)); create index idx2 on worklog5743(a(768));
Warnings:
Note 1831 Duplicate index `idx2`. This is deprecated and will be disallowed in a future release
show warnings; show warnings;
Level Code Message Level Code Message
Note 1831 Duplicate index `idx2`. This is deprecated and will be disallowed in a future release
show create table worklog5743; show create table worklog5743;
Table Create Table Table Create Table
worklog5743 CREATE TABLE `worklog5743` ( worklog5743 CREATE TABLE `worklog5743` (
`a` text NOT NULL, `a` text NOT NULL,
KEY `idx1` (`a`(768)), KEY `idx1` (`a`(769)),
KEY `idx2` (`a`(768)) KEY `idx2` (`a`(768))
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=DYNAMIC
insert into worklog5743 values(repeat("a", 768)); insert into worklog5743 values(repeat("a", 768));
drop table worklog5743; drop table worklog5743;
create table worklog5743(a TEXT not null) ROW_FORMAT=REDUNDANT; create table worklog5743(a TEXT not null) ROW_FORMAT=REDUNDANT;

View File

@ -266,7 +266,7 @@ drop table worklog5743_8;
### Test 5 ### ### Test 5 ###
create table worklog5743(a1 int, a2 varchar(20000)) ROW_FORMAT=DYNAMIC; create table worklog5743(a1 int, a2 varchar(20000)) ROW_FORMAT=DYNAMIC;
create index idx1 on worklog5743(a2); create index idx1 on worklog5743(a2);
ERROR 42000: Specified key was too long; max key length is 3072 bytes ERROR 42000: Specified key was too long; max key length is 1536 bytes
drop table worklog5743; drop table worklog5743;
create table worklog5743(a1 int, a2 varchar(1537)) ROW_FORMAT=DYNAMIC; create table worklog5743(a1 int, a2 varchar(1537)) ROW_FORMAT=DYNAMIC;
create index idx1 on worklog5743(a2); create index idx1 on worklog5743(a2);
@ -362,7 +362,7 @@ worklog5743 CREATE TABLE `worklog5743` (
`a` text NOT NULL, `a` text NOT NULL,
KEY `idx1` (`a`(1536)), KEY `idx1` (`a`(1536)),
KEY `idx2` (`a`(1536)) KEY `idx2` (`a`(1536))
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci ROW_FORMAT=DYNAMIC
drop table worklog5743; drop table worklog5743;
create table worklog5743(a TEXT not null) ROW_FORMAT=REDUNDANT; create table worklog5743(a TEXT not null) ROW_FORMAT=REDUNDANT;
create index idx on worklog5743(a(768)); create index idx on worklog5743(a(768));

View File

@ -154,29 +154,28 @@ show warnings;
# Test edge cases for indexes using key_block_size=2 # Test edge cases for indexes using key_block_size=2
SET sql_mode= ''; SET sql_mode= '';
set innodb_strict_mode=off;
create index idx1 on worklog5743_2(a2(4000)); create index idx1 on worklog5743_2(a2(4000));
set innodb_strict_mode=on;
show warnings; show warnings;
show create table worklog5743_2; show create table worklog5743_2;
drop index idx1 on worklog5743_2;
create index idx3 on worklog5743_2(a2(769)); create index idx3 on worklog5743_2(a2(769));
show warnings; show warnings;
create index idx4 on worklog5743_2(a2(768)); create index idx4 on worklog5743_2(a2(768));
show warnings; show warnings;
-- error ER_TOO_LONG_KEY create index idx6 on worklog5743_2(a1, a2(768));
create index idx5 on worklog5743_2(a1, a2(765));
show warnings;
create index idx6 on worklog5743_2(a1, a2(764));
show warnings; show warnings;
# Test edge cases for indexes using key_block_size=4 # Test edge cases for indexes using key_block_size=4
set innodb_strict_mode=off;
create index idx1 on worklog5743_4(a2(4000)); create index idx1 on worklog5743_4(a2(4000));
set innodb_strict_mode=on;
show warnings; show warnings;
show create table worklog5743_4; show create table worklog5743_4;
create index idx3 on worklog5743_4(a2(769)); create index idx3 on worklog5743_4(a2(769));
show warnings; show warnings;
create index idx4 on worklog5743_4(a2(768)); create index idx4 on worklog5743_4(a2(768));
show warnings; show warnings;
-- error ER_TOO_LONG_KEY
create index idx5 on worklog5743_4(a1, a2(765));
show warnings;
create index idx6 on worklog5743_4(a1, a2(764)); create index idx6 on worklog5743_4(a1, a2(764));
show warnings; show warnings;
SET sql_mode= default; SET sql_mode= default;
@ -272,7 +271,6 @@ show warnings;
drop table worklog5743; drop table worklog5743;
create table worklog5743(a1 int, a2 varchar(769)) ROW_FORMAT=DYNAMIC; create table worklog5743(a1 int, a2 varchar(769)) ROW_FORMAT=DYNAMIC;
-- error ER_TOO_LONG_KEY
create index idx1 on worklog5743(a2); create index idx1 on worklog5743(a2);
show warnings; show warnings;
drop table worklog5743; drop table worklog5743;
@ -285,7 +283,6 @@ update worklog5743 set a1 = 3333;
drop table worklog5743; drop table worklog5743;
create table worklog5743(a1 int, a2 varchar(765)) ROW_FORMAT=DYNAMIC; create table worklog5743(a1 int, a2 varchar(765)) ROW_FORMAT=DYNAMIC;
-- error ER_TOO_LONG_KEY
create index idx1 on worklog5743(a1, a2); create index idx1 on worklog5743(a1, a2);
show warnings; show warnings;
drop table worklog5743; drop table worklog5743;
@ -316,9 +313,8 @@ rollback;
drop table worklog5743; drop table worklog5743;
-- echo ### Test 6 ### -- echo ### Test 6 ###
# Create a table with old format, and the limit is 768 bytes.
-- error ER_TOO_LONG_KEY
create table worklog5743(a TEXT not null, primary key (a(1000))); create table worklog5743(a TEXT not null, primary key (a(1000)));
drop table worklog5743;
create table worklog5743(a TEXT) ROW_FORMAT=COMPACT; create table worklog5743(a TEXT) ROW_FORMAT=COMPACT;

View File

@ -42,9 +42,15 @@ IF(HAVE_PAM_APPL_H AND HAVE_GETGROUPLIST)
IF (TARGET auth_pam) IF (TARGET auth_pam)
MYSQL_ADD_EXECUTABLE(auth_pam_tool auth_pam_tool.c DESTINATION ${INSTALL_PLUGINDIR}/auth_pam_tool_dir COMPONENT Server) MYSQL_ADD_EXECUTABLE(auth_pam_tool auth_pam_tool.c DESTINATION ${INSTALL_PLUGINDIR}/auth_pam_tool_dir COMPONENT Server)
TARGET_LINK_LIBRARIES(auth_pam_tool pam) TARGET_LINK_LIBRARIES(auth_pam_tool pam)
IF (CMAKE_MAJOR_VERSION EQUAL 2)
# 2.8.12 bug (in CentOS 7)
SET(user mysql)
ELSE()
SET(user "%{mysqld_user}")
ENDIF()
SET(CPACK_RPM_server_USER_FILELIST ${CPACK_RPM_server_USER_FILELIST} SET(CPACK_RPM_server_USER_FILELIST ${CPACK_RPM_server_USER_FILELIST}
"%attr(700,-,-) ${INSTALL_PLUGINDIRABS}/auth_pam_tool_dir" "%attr(700,${user},-) ${INSTALL_PLUGINDIRABS}/auth_pam_tool_dir"
"%attr(4755,-,-) ${INSTALL_PLUGINDIRABS}/auth_pam_tool_dir/auth_pam_tool") "%attr(4755,root,-) ${INSTALL_PLUGINDIRABS}/auth_pam_tool_dir/auth_pam_tool")
SET(CPACK_RPM_server_USER_FILELIST ${CPACK_RPM_server_USER_FILELIST} PARENT_SCOPE) SET(CPACK_RPM_server_USER_FILELIST ${CPACK_RPM_server_USER_FILELIST} PARENT_SCOPE)
ENDIF() ENDIF()
IF(TARGET auth_pam OR TARGET auth_pam_v1) IF(TARGET auth_pam OR TARGET auth_pam_v1)

View File

@ -6879,6 +6879,7 @@ int handler::check_duplicate_long_entry_key(const uchar *new_rec, uint key_no)
KEY *key_info= table->key_info + key_no; KEY *key_info= table->key_info + key_no;
Field *hash_field= key_info->key_part->field; Field *hash_field= key_info->key_part->field;
uchar ptr[HA_HASH_KEY_LENGTH_WITH_NULL]; uchar ptr[HA_HASH_KEY_LENGTH_WITH_NULL];
String *blob_storage;
DBUG_ENTER("handler::check_duplicate_long_entry_key"); DBUG_ENTER("handler::check_duplicate_long_entry_key");
DBUG_ASSERT((key_info->flags & HA_NULL_PART_KEY && DBUG_ASSERT((key_info->flags & HA_NULL_PART_KEY &&
@ -6893,9 +6894,11 @@ int handler::check_duplicate_long_entry_key(const uchar *new_rec, uint key_no)
result= lookup_handler->ha_index_init(key_no, 0); result= lookup_handler->ha_index_init(key_no, 0);
if (result) if (result)
DBUG_RETURN(result); DBUG_RETURN(result);
blob_storage= (String*)alloca(sizeof(String)*table->s->virtual_not_stored_blob_fields);
table->remember_blob_values(blob_storage);
store_record(table, file->lookup_buffer); store_record(table, file->lookup_buffer);
result= lookup_handler->ha_index_read_map(table->record[0], result= lookup_handler->ha_index_read_map(table->record[0], ptr,
ptr, HA_WHOLE_KEY, HA_READ_KEY_EXACT); HA_WHOLE_KEY, HA_READ_KEY_EXACT);
if (!result) if (!result)
{ {
bool is_same; bool is_same;
@ -6903,6 +6906,13 @@ int handler::check_duplicate_long_entry_key(const uchar *new_rec, uint key_no)
Item_func_hash * temp= (Item_func_hash *)hash_field->vcol_info->expr; Item_func_hash * temp= (Item_func_hash *)hash_field->vcol_info->expr;
Item ** arguments= temp->arguments(); Item ** arguments= temp->arguments();
uint arg_count= temp->argument_count(); uint arg_count= temp->argument_count();
// restore pointers after swap_values in TABLE::update_virtual_fields()
for (Field **vf= table->vfield; *vf; vf++)
{
if (!(*vf)->stored_in_db() && (*vf)->flags & BLOB_FLAG &&
bitmap_is_set(table->read_set, (*vf)->field_index))
((Field_blob*)*vf)->swap_value_and_read_value();
}
do do
{ {
my_ptrdiff_t diff= table->file->lookup_buffer - new_rec; my_ptrdiff_t diff= table->file->lookup_buffer - new_rec;
@ -6950,6 +6960,7 @@ exit:
} }
} }
restore_record(table, file->lookup_buffer); restore_record(table, file->lookup_buffer);
table->restore_blob_values(blob_storage);
lookup_handler->ha_index_end(); lookup_handler->ha_index_end();
DBUG_RETURN(error); DBUG_RETURN(error);
} }

View File

@ -7260,7 +7260,7 @@ Rows_log_event::write_row(rpl_group_info *rgi,
DBUG_RETURN(error); DBUG_RETURN(error);
} }
if (m_curr_row == m_rows_buf && !invoke_triggers) if (m_curr_row == m_rows_buf && !invoke_triggers && !table->s->long_unique_table)
{ {
/* /*
This table has no triggers so we can do bulk insert. This table has no triggers so we can do bulk insert.
@ -7293,6 +7293,9 @@ Rows_log_event::write_row(rpl_group_info *rgi,
DBUG_PRINT_BITSET("debug", "rpl_write_set: %s", table->rpl_write_set); DBUG_PRINT_BITSET("debug", "rpl_write_set: %s", table->rpl_write_set);
DBUG_PRINT_BITSET("debug", "read_set: %s", table->read_set); DBUG_PRINT_BITSET("debug", "read_set: %s", table->read_set);
if (table->s->long_unique_table)
table->update_virtual_fields(table->file, VCOL_UPDATE_FOR_WRITE);
if (invoke_triggers && if (invoke_triggers &&
unlikely(process_triggers(TRG_EVENT_INSERT, TRG_ACTION_BEFORE, TRUE))) unlikely(process_triggers(TRG_EVENT_INSERT, TRG_ACTION_BEFORE, TRUE)))
{ {
@ -7404,7 +7407,14 @@ Rows_log_event::write_row(rpl_group_info *rgi,
Now, record[1] should contain the offending row. That Now, record[1] should contain the offending row. That
will enable us to update it or, alternatively, delete it (so will enable us to update it or, alternatively, delete it (so
that we can insert the new row afterwards). that we can insert the new row afterwards).
*/ */
if (table->s->long_unique_table)
{
/* same as for REPLACE/ODKU */
table->move_fields(table->field, table->record[1], table->record[0]);
table->update_virtual_fields(table->file, VCOL_UPDATE_FOR_REPLACE);
table->move_fields(table->field, table->record[0], table->record[1]);
}
/* /*
If row is incomplete we will use the record found to fill If row is incomplete we will use the record found to fill
@ -7414,6 +7424,8 @@ Rows_log_event::write_row(rpl_group_info *rgi,
{ {
restore_record(table,record[1]); restore_record(table,record[1]);
error= unpack_current_row(rgi); error= unpack_current_row(rgi);
if (table->s->long_unique_table)
table->update_virtual_fields(table->file, VCOL_UPDATE_FOR_WRITE);
} }
DBUG_PRINT("debug",("preparing for update: before and after image")); DBUG_PRINT("debug",("preparing for update: before and after image"));
@ -8391,6 +8403,8 @@ Update_rows_log_event::do_exec_row(rpl_group_info *rgi)
thd_proc_info(thd, message); thd_proc_info(thd, message);
if (unlikely((error= unpack_current_row(rgi, &m_cols_ai)))) if (unlikely((error= unpack_current_row(rgi, &m_cols_ai))))
goto err; goto err;
if (m_table->s->long_unique_table)
m_table->update_virtual_fields(m_table->file, VCOL_UPDATE_FOR_WRITE);
/* /*
Now we have the right row to update. The old row (the one we're Now we have the right row to update. The old row (the one we're

View File

@ -8969,7 +8969,7 @@ static int test_if_case_insensitive(const char *dir_name)
buff, 0666, O_RDWR, MYF(0))) < 0) buff, 0666, O_RDWR, MYF(0))) < 0)
{ {
if (!opt_abort) if (!opt_abort)
sql_print_warning("Can't create test file %s", buff); sql_print_warning("Can't create test file '%s' (Errcode: %M)", buff, my_errno);
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
mysql_file_close(file, MYF(0)); mysql_file_close(file, MYF(0));

View File

@ -218,6 +218,7 @@ finish_event_group(rpl_parallel_thread *rpt, uint64 sub_id,
waiting for this). In most cases (normal DML), it will be a no-op. waiting for this). In most cases (normal DML), it will be a no-op.
*/ */
rgi->mark_start_commit_no_lock(); rgi->mark_start_commit_no_lock();
rgi->commit_orderer.wakeup_blocked= false;
if (entry->last_committed_sub_id < sub_id) if (entry->last_committed_sub_id < sub_id)
{ {
@ -1427,7 +1428,22 @@ handle_rpl_parallel_thread(void *arg)
if (!thd->killed) if (!thd->killed)
{ {
DEBUG_SYNC(thd, "rpl_parallel_before_mark_start_commit"); DEBUG_SYNC(thd, "rpl_parallel_before_mark_start_commit");
rgi->mark_start_commit(); if (thd->lex->stmt_accessed_temp_table())
{
/*
Temporary tables are special, they require strict
single-threaded use as they have no locks protecting concurrent
access. Therefore, we cannot safely use the optimization of
overlapping the commit of this transaction with the start of the
following.
So we skip the early mark_start_commit() and also block any
wakeup_subsequent_commits() until this event group is fully
done, inside finish_event_group().
*/
rgi->commit_orderer.wakeup_blocked= true;
}
else
rgi->mark_start_commit();
DEBUG_SYNC(thd, "rpl_parallel_after_mark_start_commit"); DEBUG_SYNC(thd, "rpl_parallel_after_mark_start_commit");
} }
} }

View File

@ -7874,6 +7874,7 @@ wait_for_commit::reinit()
wakeup_error= 0; wakeup_error= 0;
wakeup_subsequent_commits_running= false; wakeup_subsequent_commits_running= false;
commit_started= false; commit_started= false;
wakeup_blocked= false;
#ifdef SAFE_MUTEX #ifdef SAFE_MUTEX
/* /*
When using SAFE_MUTEX, the ordering between taking the LOCK_wait_commit When using SAFE_MUTEX, the ordering between taking the LOCK_wait_commit
@ -8147,6 +8148,9 @@ wait_for_commit::wakeup_subsequent_commits2(int wakeup_error)
{ {
wait_for_commit *waiter; wait_for_commit *waiter;
if (unlikely(wakeup_blocked))
return;
mysql_mutex_lock(&LOCK_wait_commit); mysql_mutex_lock(&LOCK_wait_commit);
wakeup_subsequent_commits_running= true; wakeup_subsequent_commits_running= true;
waiter= subsequent_commits_list; waiter= subsequent_commits_list;

View File

@ -2240,6 +2240,19 @@ struct wait_for_commit
group commit as T1. group commit as T1.
*/ */
bool commit_started; bool commit_started;
/*
Set to temporarily ignore calls to wakeup_subsequent_commits(). The
caller must arrange that another wakeup_subsequent_commits() gets called
later after wakeup_blocked has been set back to false.
This is used for parallel replication with temporary tables.
Temporary tables require strict single-threaded operation. The normal
optimization, of doing wakeup_subsequent_commits early and overlapping
part of the commit with the following transaction, is not safe. Thus
when temporary tables are replicated, wakeup is blocked until the
event group is fully done.
*/
bool wakeup_blocked;
void register_wait_for_prior_commit(wait_for_commit *waitee); void register_wait_for_prior_commit(wait_for_commit *waitee);
int wait_for_prior_commit(THD *thd, bool allow_kill=true) int wait_for_prior_commit(THD *thd, bool allow_kill=true)

View File

@ -931,7 +931,7 @@ bool mysql_insert(THD *thd, TABLE_LIST *table_list,
same table in the same connection. same table in the same connection.
*/ */
if (thd->locked_tables_mode <= LTM_LOCK_TABLES && if (thd->locked_tables_mode <= LTM_LOCK_TABLES &&
values_list.elements > 1) !table->s->long_unique_table && values_list.elements > 1)
{ {
using_bulk_insert= 1; using_bulk_insert= 1;
table->file->ha_start_bulk_insert(values_list.elements); table->file->ha_start_bulk_insert(values_list.elements);
@ -3516,7 +3516,7 @@ bool Delayed_insert::handle_inserts(void)
we get a crash, then binary log will contain rows that are not yet we get a crash, then binary log will contain rows that are not yet
written to disk, which will cause problems in replication. written to disk, which will cause problems in replication.
*/ */
if (!using_bin_log) if (!using_bin_log && !table->s->long_unique_table)
table->file->extra(HA_EXTRA_WRITE_CACHE); table->file->extra(HA_EXTRA_WRITE_CACHE);
mysql_mutex_lock(&mutex); mysql_mutex_lock(&mutex);
@ -3676,7 +3676,7 @@ bool Delayed_insert::handle_inserts(void)
table->s->table_name.str); table->s->table_name.str);
goto err; goto err;
} }
if (!using_bin_log) if (!using_bin_log && !table->s->long_unique_table)
table->file->extra(HA_EXTRA_WRITE_CACHE); table->file->extra(HA_EXTRA_WRITE_CACHE);
mysql_mutex_lock(&mutex); mysql_mutex_lock(&mutex);
THD_STAGE_INFO(&thd, stage_insert); THD_STAGE_INFO(&thd, stage_insert);
@ -4053,7 +4053,8 @@ int select_insert::prepare2(JOIN *)
if (thd->lex->describe) if (thd->lex->describe)
DBUG_RETURN(0); DBUG_RETURN(0);
if (thd->lex->current_select->options & OPTION_BUFFER_RESULT && if (thd->lex->current_select->options & OPTION_BUFFER_RESULT &&
thd->locked_tables_mode <= LTM_LOCK_TABLES) thd->locked_tables_mode <= LTM_LOCK_TABLES &&
!table->s->long_unique_table)
table->file->ha_start_bulk_insert((ha_rows) 0); table->file->ha_start_bulk_insert((ha_rows) 0);
/* Same as the other variants of INSERT */ /* Same as the other variants of INSERT */
@ -4802,13 +4803,16 @@ select_create::prepare(List<Item> &_values, SELECT_LEX_UNIT *u)
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE); table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
if (info.handle_duplicates == DUP_UPDATE) if (info.handle_duplicates == DUP_UPDATE)
table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE); table->file->extra(HA_EXTRA_INSERT_WITH_UPDATE);
if (thd->locked_tables_mode <= LTM_LOCK_TABLES) if (thd->locked_tables_mode <= LTM_LOCK_TABLES &&
!table->s->long_unique_table)
{
table->file->ha_start_bulk_insert((ha_rows) 0); table->file->ha_start_bulk_insert((ha_rows) 0);
table->file->extra(HA_EXTRA_WRITE_CACHE);
}
thd->abort_on_warning= !info.ignore && thd->is_strict_mode(); thd->abort_on_warning= !info.ignore && thd->is_strict_mode();
if (check_that_all_fields_are_given_values(thd, table, table_list)) if (check_that_all_fields_are_given_values(thd, table, table_list))
DBUG_RETURN(1); DBUG_RETURN(1);
table->mark_columns_needed_for_insert(); table->mark_columns_needed_for_insert();
table->file->extra(HA_EXTRA_WRITE_CACHE);
// Mark table as used // Mark table as used
table->query_id= thd->query_id; table->query_id= thd->query_id;
DBUG_RETURN(0); DBUG_RETURN(0);

View File

@ -645,7 +645,8 @@ int mysql_load(THD *thd, const sql_exchange *ex, TABLE_LIST *table_list,
(!table->triggers || (!table->triggers ||
!table->triggers->has_delete_triggers())) !table->triggers->has_delete_triggers()))
table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE); table->file->extra(HA_EXTRA_WRITE_CAN_REPLACE);
if (thd->locked_tables_mode <= LTM_LOCK_TABLES) if (thd->locked_tables_mode <= LTM_LOCK_TABLES &&
!table->s->long_unique_table)
table->file->ha_start_bulk_insert((ha_rows) 0); table->file->ha_start_bulk_insert((ha_rows) 0);
table->copy_blobs=1; table->copy_blobs=1;

View File

@ -1933,6 +1933,8 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
MYSQL_QUERY_DONE(thd->is_error()); MYSQL_QUERY_DONE(thd->is_error());
} }
thd->lex->restore_set_statement_var();
#if defined(ENABLED_PROFILING) #if defined(ENABLED_PROFILING)
thd->profiling.finish_current_query(); thd->profiling.finish_current_query();
thd->profiling.start_new_query("continuing"); thd->profiling.start_new_query("continuing");

View File

@ -72,11 +72,9 @@ static bool make_unique_constraint_name(THD *, LEX_CSTRING *, const char *,
List<Virtual_column_info> *, uint *); List<Virtual_column_info> *, uint *);
static const char *make_unique_invisible_field_name(THD *, const char *, static const char *make_unique_invisible_field_name(THD *, const char *,
List<Create_field> *); List<Create_field> *);
static int copy_data_between_tables(THD *, TABLE *,TABLE *, static int copy_data_between_tables(THD *, TABLE *,TABLE *, bool, uint,
List<Create_field> &, bool, uint, ORDER *, ORDER *, ha_rows *, ha_rows *,
ha_rows *, ha_rows *, Alter_info *, Alter_table_ctx *);
Alter_info::enum_enable_or_disable,
Alter_table_ctx *);
static int append_system_key_parts(THD *, HA_CREATE_INFO *, Key *); static int append_system_key_parts(THD *, HA_CREATE_INFO *, Key *);
static int mysql_prepare_create_table(THD *, HA_CREATE_INFO *, Alter_info *, static int mysql_prepare_create_table(THD *, HA_CREATE_INFO *, Alter_info *,
uint *, handler *, KEY **, uint *, int); uint *, handler *, KEY **, uint *, int);
@ -11032,10 +11030,8 @@ do_continue:;
new_table->mark_columns_needed_for_insert(); new_table->mark_columns_needed_for_insert();
thd->binlog_write_table_map(new_table, 1); thd->binlog_write_table_map(new_table, 1);
} }
if (copy_data_between_tables(thd, table, new_table, if (copy_data_between_tables(thd, table, new_table, ignore, order_num,
alter_info->create_list, ignore, order, &copied, &deleted, alter_info,
order_num, order, &copied, &deleted,
alter_info->keys_onoff,
&alter_ctx)) &alter_ctx))
goto err_new_table_cleanup; goto err_new_table_cleanup;
} }
@ -11434,11 +11430,9 @@ bool mysql_trans_commit_alter_copy_data(THD *thd)
static int static int
copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, bool ignore,
List<Create_field> &create, bool ignore, uint order_num, ORDER *order, ha_rows *copied,
uint order_num, ORDER *order, ha_rows *deleted, Alter_info *alter_info,
ha_rows *copied, ha_rows *deleted,
Alter_info::enum_enable_or_disable keys_onoff,
Alter_table_ctx *alter_ctx) Alter_table_ctx *alter_ctx)
{ {
int error= 1; int error= 1;
@ -11487,7 +11481,8 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to,
backup_set_alter_copy_lock(thd, from); backup_set_alter_copy_lock(thd, from);
alter_table_manage_keys(to, from->file->indexes_are_disabled(), keys_onoff); alter_table_manage_keys(to, from->file->indexes_are_disabled(),
alter_info->keys_onoff);
from->default_column_bitmaps(); from->default_column_bitmaps();
@ -11496,12 +11491,14 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to,
from->file->info(HA_STATUS_VARIABLE); from->file->info(HA_STATUS_VARIABLE);
to->file->extra(HA_EXTRA_PREPARE_FOR_ALTER_TABLE); to->file->extra(HA_EXTRA_PREPARE_FOR_ALTER_TABLE);
to->file->ha_start_bulk_insert(from->file->stats.records, if (!to->s->long_unique_table)
ignore ? 0 : HA_CREATE_UNIQUE_INDEX_BY_SORT); {
bulk_insert_started= 1; to->file->ha_start_bulk_insert(from->file->stats.records,
ignore ? 0 : HA_CREATE_UNIQUE_INDEX_BY_SORT);
bulk_insert_started= 1;
}
mysql_stage_set_work_estimated(thd->m_stage_progress_psi, from->file->stats.records); mysql_stage_set_work_estimated(thd->m_stage_progress_psi, from->file->stats.records);
List_iterator<Create_field> it(alter_info->create_list);
List_iterator<Create_field> it(create);
Create_field *def; Create_field *def;
copy_end=copy; copy_end=copy;
to->s->default_fields= 0; to->s->default_fields= 0;
@ -11760,7 +11757,7 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to,
/* We are going to drop the temporary table */ /* We are going to drop the temporary table */
to->file->extra(HA_EXTRA_PREPARE_FOR_DROP); to->file->extra(HA_EXTRA_PREPARE_FOR_DROP);
} }
if (unlikely(to->file->ha_end_bulk_insert()) && error <= 0) if (bulk_insert_started && to->file->ha_end_bulk_insert() && error <= 0)
{ {
/* Give error, if not already given */ /* Give error, if not already given */
if (!thd->is_error()) if (!thd->is_error())
@ -11801,7 +11798,6 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to,
{ {
/* This happens if we get an error during initialization of data */ /* This happens if we get an error during initialization of data */
DBUG_ASSERT(error); DBUG_ASSERT(error);
to->file->ha_end_bulk_insert();
ha_enable_transaction(thd, TRUE); ha_enable_transaction(thd, TRUE);
} }

View File

@ -12946,7 +12946,8 @@ bool create_table_info_t::row_size_is_acceptable(
eow << "Cannot add field " << field->name << " in table "; eow << "Cannot add field " << field->name << " in table ";
else else
eow << "Cannot add an instantly dropped column in table "; eow << "Cannot add an instantly dropped column in table ";
eow << index.table->name << " because after adding it, the row size is " eow << "`" << m_form->s->db.str << "`.`" << m_form->s->table_name.str
<< "`" " because after adding it, the row size is "
<< info.get_overrun_size() << info.get_overrun_size()
<< " which is greater than maximum allowed size (" << " which is greater than maximum allowed size ("
<< info.max_leaf_size << " bytes) for a record on index leaf page."; << info.max_leaf_size << " bytes) for a record on index leaf page.";
@ -17788,13 +17789,7 @@ innodb_monitor_validate_wildcard_name(
Validate the passed in monitor name, find and save the Validate the passed in monitor name, find and save the
corresponding monitor name in the function parameter "save". corresponding monitor name in the function parameter "save".
@return 0 if monitor name is valid */ @return 0 if monitor name is valid */
static static int innodb_monitor_valid_byname(const char *name)
int
innodb_monitor_valid_byname(
/*========================*/
void* save, /*!< out: immediate result
for update function */
const char* name) /*!< in: incoming monitor name */
{ {
ulint use; ulint use;
monitor_info_t* monitor_info; monitor_info_t* monitor_info;
@ -17842,9 +17837,6 @@ innodb_monitor_valid_byname(
} }
} }
/* Save the configure name for innodb_monitor_update() */
*static_cast<const char**>(save) = name;
return(0); return(0);
} }
/*************************************************************//** /*************************************************************//**
@ -17860,41 +17852,18 @@ innodb_monitor_validate(
for update function */ for update function */
struct st_mysql_value* value) /*!< in: incoming string */ struct st_mysql_value* value) /*!< in: incoming string */
{ {
const char* name; int ret= 0;
char* monitor_name;
char buff[STRING_BUFFER_USUAL_SIZE];
int len = sizeof(buff);
int ret;
ut_a(save != NULL); if (const char *name= value->val_str(value, nullptr, &ret))
ut_a(value != NULL); {
ret= innodb_monitor_valid_byname(name);
if (!ret)
*static_cast<const char**>(save)= name;
}
else
ret= 1;
name = value->val_str(value, buff, &len); return ret;
/* monitor_name could point to memory from MySQL
or buff[]. Always dup the name to memory allocated
by InnoDB, so we can access it in another callback
function innodb_monitor_update() and free it appropriately */
if (name) {
monitor_name = my_strdup(PSI_INSTRUMENT_ME,
name, MYF(0));
} else {
return(1);
}
ret = innodb_monitor_valid_byname(save, monitor_name);
if (ret) {
/* Validation failed */
my_free(monitor_name);
} else {
/* monitor_name will be freed in separate callback function
innodb_monitor_update(). Assert "save" point to
the "monitor_name" variable */
ut_ad(*static_cast<char**>(save) == monitor_name);
}
return(ret);
} }
/****************************************************************//** /****************************************************************//**
@ -17910,11 +17879,9 @@ innodb_monitor_update(
formal string goes */ formal string goes */
const void* save, /*!< in: immediate result const void* save, /*!< in: immediate result
from check function */ from check function */
mon_option_t set_option, /*!< in: the set option, mon_option_t set_option) /*!< in: the set option,
whether to turn on/off or whether to turn on/off or
reset the counter */ reset the counter */
ibool free_mem) /*!< in: whether we will
need to free the memory */
{ {
monitor_info_t* monitor_info; monitor_info_t* monitor_info;
ulint monitor_id; ulint monitor_id;
@ -17998,12 +17965,6 @@ exit:
sql_print_warning("InnoDB: Monitor %s is already enabled.", sql_print_warning("InnoDB: Monitor %s is already enabled.",
srv_mon_get_name((monitor_id_t) err_monitor)); srv_mon_get_name((monitor_id_t) err_monitor));
} }
if (free_mem && name) {
my_free((void*) name);
}
return;
} }
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
@ -18086,7 +18047,7 @@ innodb_enable_monitor_update(
const void* save) /*!< in: immediate result const void* save) /*!< in: immediate result
from check function */ from check function */
{ {
innodb_monitor_update(thd, var_ptr, save, MONITOR_TURN_ON, TRUE); innodb_monitor_update(thd, var_ptr, save, MONITOR_TURN_ON);
} }
/****************************************************************//** /****************************************************************//**
@ -18103,7 +18064,7 @@ innodb_disable_monitor_update(
const void* save) /*!< in: immediate result const void* save) /*!< in: immediate result
from check function */ from check function */
{ {
innodb_monitor_update(thd, var_ptr, save, MONITOR_TURN_OFF, TRUE); innodb_monitor_update(thd, var_ptr, save, MONITOR_TURN_OFF);
} }
/****************************************************************//** /****************************************************************//**
@ -18121,7 +18082,7 @@ innodb_reset_monitor_update(
const void* save) /*!< in: immediate result const void* save) /*!< in: immediate result
from check function */ from check function */
{ {
innodb_monitor_update(thd, var_ptr, save, MONITOR_RESET_VALUE, TRUE); innodb_monitor_update(thd, var_ptr, save, MONITOR_RESET_VALUE);
} }
/****************************************************************//** /****************************************************************//**
@ -18139,8 +18100,7 @@ innodb_reset_all_monitor_update(
const void* save) /*!< in: immediate result const void* save) /*!< in: immediate result
from check function */ from check function */
{ {
innodb_monitor_update(thd, var_ptr, save, MONITOR_RESET_ALL_VALUE, innodb_monitor_update(thd, var_ptr, save, MONITOR_RESET_ALL_VALUE);
TRUE);
} }
static static
@ -18185,10 +18145,9 @@ innodb_enable_monitor_at_startup(
for (char* option = my_strtok_r(str, sep, &last); for (char* option = my_strtok_r(str, sep, &last);
option; option;
option = my_strtok_r(NULL, sep, &last)) { option = my_strtok_r(NULL, sep, &last)) {
char* option_name; if (!innodb_monitor_valid_byname(option)) {
if (!innodb_monitor_valid_byname(&option_name, option)) {
innodb_monitor_update(NULL, NULL, &option, innodb_monitor_update(NULL, NULL, &option,
MONITOR_TURN_ON, FALSE); MONITOR_TURN_ON);
} else { } else {
sql_print_warning("Invalid monitor counter" sql_print_warning("Invalid monitor counter"
" name: '%s'", option); " name: '%s'", option);

View File

@ -10332,13 +10332,13 @@ int ha_mroonga::generic_store_bulk_variable_size_string(Field *field,
{ {
MRN_DBUG_ENTER_METHOD(); MRN_DBUG_ENTER_METHOD();
int error = 0; int error = 0;
String value; StringBuffer<MAX_FIELD_WIDTH> buffer(field->charset());
field->val_str(NULL, &value); auto value = field->val_str(&buffer, &buffer);
grn_obj_reinit(ctx, buf, GRN_DB_SHORT_TEXT, 0); grn_obj_reinit(ctx, buf, GRN_DB_SHORT_TEXT, 0);
DBUG_PRINT("info", ("mroonga: length=%" MRN_FORMAT_STRING_LENGTH, DBUG_PRINT("info", ("mroonga: length=%" MRN_FORMAT_STRING_LENGTH,
value.length())); value->length()));
DBUG_PRINT("info", ("mroonga: value=%s", value.c_ptr_safe())); DBUG_PRINT("info", ("mroonga: value=%s", value->c_ptr_safe()));
GRN_TEXT_SET(ctx, buf, value.ptr(), value.length()); GRN_TEXT_SET(ctx, buf, value->ptr(), value->length());
DBUG_RETURN(error); DBUG_RETURN(error);
} }
@ -10705,9 +10705,8 @@ int ha_mroonga::generic_store_bulk_blob(Field *field, grn_obj *buf)
{ {
MRN_DBUG_ENTER_METHOD(); MRN_DBUG_ENTER_METHOD();
int error = 0; int error = 0;
String buffer; StringBuffer<MAX_FIELD_WIDTH> buffer(field->charset());
Field_blob *blob = (Field_blob *)field; auto value = field->val_str(&buffer, &buffer);
String *value = blob->val_str(0, &buffer);
grn_obj_reinit(ctx, buf, GRN_DB_TEXT, 0); grn_obj_reinit(ctx, buf, GRN_DB_TEXT, 0);
GRN_TEXT_SET(ctx, buf, value->ptr(), value->length()); GRN_TEXT_SET(ctx, buf, value->ptr(), value->length());
DBUG_RETURN(error); DBUG_RETURN(error);
@ -14627,7 +14626,8 @@ enum_alter_inplace_result ha_mroonga::storage_check_if_supported_inplace_alter(
ALTER_COLUMN_NAME; ALTER_COLUMN_NAME;
if (ha_alter_info->handler_flags & explicitly_unsupported_flags) { if (ha_alter_info->handler_flags & explicitly_unsupported_flags) {
DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED);
} else if (ha_alter_info->handler_flags & supported_flags) { } else if ((ha_alter_info->handler_flags & supported_flags) ==
ha_alter_info->handler_flags) {
DBUG_RETURN(HA_ALTER_INPLACE_EXCLUSIVE_LOCK); DBUG_RETURN(HA_ALTER_INPLACE_EXCLUSIVE_LOCK);
} else { } else {
DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED);

View File

@ -1 +0,0 @@
SUBDIRS = dictionary

View File

@ -1,34 +0,0 @@
SUBDIRS = \
edict \
eijiro \
gene95 \
jmdict
dist_examples_dictionary_SCRIPTS = \
init-db.sh
nobase_dist_examples_dictionary_DATA = \
readme.txt \
$(html_files)
# find html -type f | sort | sed -e 's,^,\t,g'
html_files = \
html/css/dictionary.css \
html/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png \
html/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png \
html/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png \
html/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png \
html/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png \
html/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png \
html/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png \
html/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png \
html/css/smoothness/images/ui-icons_222222_256x240.png \
html/css/smoothness/images/ui-icons_2e83ff_256x240.png \
html/css/smoothness/images/ui-icons_454545_256x240.png \
html/css/smoothness/images/ui-icons_888888_256x240.png \
html/css/smoothness/images/ui-icons_cd0a0a_256x240.png \
html/css/smoothness/jquery-ui-1.8.12.custom.css \
html/index.html \
html/js/dictionary.js \
html/js/jquery-1.7.2.js \
html/js/jquery-ui-1.8.18.custom.js

View File

@ -1,4 +0,0 @@
edictdir = $(examples_dictionarydir)/edict
dist_edict_SCRIPTS = \
edict2grn.rb \
edict-import.sh

View File

@ -1,27 +0,0 @@
#!/bin/sh
base_dir=$(dirname $0)
if [ 1 != $# -a 2 != $# ]; then
echo "usage: $0 db_path [edict.gz_path]"
exit 1
fi
if [ -z $2 ]; then
edict_gz=edict.gz
if [ ! -f $edict_gz ]; then
wget -O $edict_gz http://ftp.monash.edu.au/pub/nihongo/edict.gz
fi
else
edict_gz=$2
fi
if type gzcat > /dev/null 2>&1; then
zcat="gzcat"
else
zcat="zcat"
fi
if $zcat $edict_gz | ${base_dir}/edict2grn.rb | groonga $1 > /dev/null; then
echo "edict data loaded."
fi

View File

@ -1,34 +0,0 @@
#!/usr/bin/env ruby
require "English"
require "nkf"
require "json"
print(<<HEADER.chomp)
column_create item_dictionary edict_desc COLUMN_SCALAR ShortText
column_create bigram item_dictionary_edict_desc COLUMN_INDEX|WITH_POSITION item_dictionary edict_desc
load --table item_dictionary
[
["_key","edict_desc","kana"]
HEADER
loop do
raw_line = gets
break if raw_line.nil?
line = raw_line.encode("UTF-8", "EUC-JP")
key, body = line.strip.split("/", 2)
key = key.strip
if /\s*\[(.+)\]\z/ =~ key
key = $PREMATCH
reading = $1
body = "[#{reading}] #{body}"
kana = NKF.nkf("-Ww --katakana", reading)
else
kana = NKF.nkf("-Ww --katakana", key)
end
puts(",")
puts([key, body, kana].to_json)
end
puts
puts("]")

View File

@ -1,4 +0,0 @@
eijirodir = $(examples_dictionarydir)/eijiro
dist_eijiro_SCRIPTS = \
eijiro2grn.rb \
eijiro-import.sh

View File

@ -1,12 +0,0 @@
#!/bin/sh
base_dir=$(dirname $0)
if [ 2 != $# ]; then
echo "usage: $0 db_path eijiro.csv_path"
exit 1
fi
if iconv -f UCS2 -t UTF8 $2 | ${base_dir}/eijiro2grn.rb | groonga $1 > /dev/null; then
echo "eijiro data loaded."
fi

View File

@ -1,61 +0,0 @@
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
$KCODE = 'u'
require 'rubygems'
require 'fastercsv'
class String
def to_json
a = split(//).map {|char|
case char
when '"' then '\\"'
when '\\' then '\\\\'
when "\b" then '\b'
when "\f" then '\f'
when "\n" then '\n'
when "\r" then ''
when "\t" then '\t'
else char
end
}
"\"#{a.join('')}\""
end
end
class Array
def to_json
'[' + map {|element|
element.to_json
}.join(',') + ']'
end
end
puts <<END
column_create item_dictionary eijiro_trans COLUMN_SCALAR ShortText
column_create item_dictionary eijiro_exp COLUMN_SCALAR ShortText
column_create item_dictionary eijiro_level COLUMN_SCALAR Int32
column_create item_dictionary eijiro_memory COLUMN_SCALAR Int32
column_create item_dictionary eijiro_modify COLUMN_SCALAR Int32
column_create item_dictionary eijiro_pron COLUMN_SCALAR ShortText
column_create item_dictionary eijiro_filelink COLUMN_SCALAR ShortText
column_create bigram item_dictionary_eijiro_trans COLUMN_INDEX|WITH_POSITION item_dictionary eijiro_trans
load --table item_dictionary
[["_key","norm","eijiro_trans","eijiro_exp","eijiro_level","eijiro_memory","eijiro_modify","eijiro_pron","eijiro_filelink","kana"],
END
n = 0
FasterCSV.new(ARGF, :row_sep => "\r\n").each {|l|
if n > 0
keyword,word,trans,exp,level,memory,modify,pron,filelink = l
kana = ''
if trans =~ /【@】(.*?)(【|$)/
kana = $1.split("")
end
puts [word,keyword,trans,exp,level,memory,modify,pron,filelink,kana].map{|e| e || ''}.to_json
end
n += 1
}
puts "]"

View File

@ -1,4 +0,0 @@
gene95dir = $(examples_dictionarydir)/gene95
dist_gene95_SCRIPTS = \
gene2grn.rb \
gene-import.sh

View File

@ -1,26 +0,0 @@
#!/bin/sh
base_dir=$(dirname $0)
if [ 1 != $# -a 2 != $# ]; then
echo "usage: $0 db_path [gene.txt_path]"
exit 1
fi
if [ -z $2 ]; then
dictionary_dir=gene95-dictionary
gene_txt=${dictionary_dir}/gene.txt
if [ ! -f $gene_txt ]; then
gene95_tar_gz=gene95.tar.gz
wget -O $gene95_tar_gz \
http://www.namazu.org/~tsuchiya/sdic/data/gene95.tar.gz
mkdir -p ${dictionary_dir}
tar xvzf ${gene95_tar_gz} -C ${dictionary_dir}
fi
else
gene_txt=$2
fi
if cat $gene_txt | ${base_dir}/gene2grn.rb | groonga $1 > /dev/null; then
echo "gene95 data loaded."
fi

View File

@ -1,33 +0,0 @@
#!/usr/bin/env ruby
require "json"
print(<<HEADER.chomp)
column_create item_dictionary gene95_desc COLUMN_SCALAR ShortText
column_create bigram item_dictionary_gene95_desc COLUMN_INDEX|WITH_POSITION item_dictionary gene95_desc
load --table item_dictionary
[
["_key","gene95_desc"]
HEADER
loop do
raw_key = gets
break if raw_key.nil?
raw_body = gets
key = nil
body = nil
begin
key = raw_key.encode("UTF-8", "Windows-31J").strip
body = raw_body.encode("UTF-8", "Windows-31J").strip
rescue EncodingError
$stderr.puts("Ignore:")
$stderr.puts(" key: <#{raw_key}>")
$stderr.puts(" body: <#{raw_body}>")
next
end
puts(",")
print([key, body].to_json)
end
puts
puts("]")

View File

@ -1,3 +0,0 @@
#result {
margin-top: 7em;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -1,578 +0,0 @@
/*
* jQuery UI CSS Framework 1.8.12
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* http://docs.jquery.com/UI/Theming/API
*/
/* Layout helpers
----------------------------------*/
.ui-helper-hidden { display: none; }
.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
.ui-helper-clearfix { display: inline-block; }
/* required comment for clearfix to work in Opera \*/
* html .ui-helper-clearfix { height:1%; }
.ui-helper-clearfix { display:block; }
/* end clearfix */
.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
/* Interaction Cues
----------------------------------*/
.ui-state-disabled { cursor: default !important; }
/* Icons
----------------------------------*/
/* states and images */
.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
/* Misc visuals
----------------------------------*/
/* Overlays */
.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
/*
* jQuery UI CSS Framework 1.8.12
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* http://docs.jquery.com/UI/Theming/API
*
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
*/
/* Component containers
----------------------------------*/
.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
.ui-widget .ui-widget { font-size: 1em; }
.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
.ui-widget-content a { color: #222222; }
.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
.ui-widget-header a { color: #222222; }
/* Interaction states
----------------------------------*/
.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; }
.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; }
.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; }
.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; }
.ui-widget :active { outline: none; }
/* Interaction Cues
----------------------------------*/
.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; }
.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
/* Icons
----------------------------------*/
/* states and images */
.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); }
.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }
/* positioning */
.ui-icon-carat-1-n { background-position: 0 0; }
.ui-icon-carat-1-ne { background-position: -16px 0; }
.ui-icon-carat-1-e { background-position: -32px 0; }
.ui-icon-carat-1-se { background-position: -48px 0; }
.ui-icon-carat-1-s { background-position: -64px 0; }
.ui-icon-carat-1-sw { background-position: -80px 0; }
.ui-icon-carat-1-w { background-position: -96px 0; }
.ui-icon-carat-1-nw { background-position: -112px 0; }
.ui-icon-carat-2-n-s { background-position: -128px 0; }
.ui-icon-carat-2-e-w { background-position: -144px 0; }
.ui-icon-triangle-1-n { background-position: 0 -16px; }
.ui-icon-triangle-1-ne { background-position: -16px -16px; }
.ui-icon-triangle-1-e { background-position: -32px -16px; }
.ui-icon-triangle-1-se { background-position: -48px -16px; }
.ui-icon-triangle-1-s { background-position: -64px -16px; }
.ui-icon-triangle-1-sw { background-position: -80px -16px; }
.ui-icon-triangle-1-w { background-position: -96px -16px; }
.ui-icon-triangle-1-nw { background-position: -112px -16px; }
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
.ui-icon-arrow-1-n { background-position: 0 -32px; }
.ui-icon-arrow-1-ne { background-position: -16px -32px; }
.ui-icon-arrow-1-e { background-position: -32px -32px; }
.ui-icon-arrow-1-se { background-position: -48px -32px; }
.ui-icon-arrow-1-s { background-position: -64px -32px; }
.ui-icon-arrow-1-sw { background-position: -80px -32px; }
.ui-icon-arrow-1-w { background-position: -96px -32px; }
.ui-icon-arrow-1-nw { background-position: -112px -32px; }
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
.ui-icon-arrow-4 { background-position: 0 -80px; }
.ui-icon-arrow-4-diag { background-position: -16px -80px; }
.ui-icon-extlink { background-position: -32px -80px; }
.ui-icon-newwin { background-position: -48px -80px; }
.ui-icon-refresh { background-position: -64px -80px; }
.ui-icon-shuffle { background-position: -80px -80px; }
.ui-icon-transfer-e-w { background-position: -96px -80px; }
.ui-icon-transferthick-e-w { background-position: -112px -80px; }
.ui-icon-folder-collapsed { background-position: 0 -96px; }
.ui-icon-folder-open { background-position: -16px -96px; }
.ui-icon-document { background-position: -32px -96px; }
.ui-icon-document-b { background-position: -48px -96px; }
.ui-icon-note { background-position: -64px -96px; }
.ui-icon-mail-closed { background-position: -80px -96px; }
.ui-icon-mail-open { background-position: -96px -96px; }
.ui-icon-suitcase { background-position: -112px -96px; }
.ui-icon-comment { background-position: -128px -96px; }
.ui-icon-person { background-position: -144px -96px; }
.ui-icon-print { background-position: -160px -96px; }
.ui-icon-trash { background-position: -176px -96px; }
.ui-icon-locked { background-position: -192px -96px; }
.ui-icon-unlocked { background-position: -208px -96px; }
.ui-icon-bookmark { background-position: -224px -96px; }
.ui-icon-tag { background-position: -240px -96px; }
.ui-icon-home { background-position: 0 -112px; }
.ui-icon-flag { background-position: -16px -112px; }
.ui-icon-calendar { background-position: -32px -112px; }
.ui-icon-cart { background-position: -48px -112px; }
.ui-icon-pencil { background-position: -64px -112px; }
.ui-icon-clock { background-position: -80px -112px; }
.ui-icon-disk { background-position: -96px -112px; }
.ui-icon-calculator { background-position: -112px -112px; }
.ui-icon-zoomin { background-position: -128px -112px; }
.ui-icon-zoomout { background-position: -144px -112px; }
.ui-icon-search { background-position: -160px -112px; }
.ui-icon-wrench { background-position: -176px -112px; }
.ui-icon-gear { background-position: -192px -112px; }
.ui-icon-heart { background-position: -208px -112px; }
.ui-icon-star { background-position: -224px -112px; }
.ui-icon-link { background-position: -240px -112px; }
.ui-icon-cancel { background-position: 0 -128px; }
.ui-icon-plus { background-position: -16px -128px; }
.ui-icon-plusthick { background-position: -32px -128px; }
.ui-icon-minus { background-position: -48px -128px; }
.ui-icon-minusthick { background-position: -64px -128px; }
.ui-icon-close { background-position: -80px -128px; }
.ui-icon-closethick { background-position: -96px -128px; }
.ui-icon-key { background-position: -112px -128px; }
.ui-icon-lightbulb { background-position: -128px -128px; }
.ui-icon-scissors { background-position: -144px -128px; }
.ui-icon-clipboard { background-position: -160px -128px; }
.ui-icon-copy { background-position: -176px -128px; }
.ui-icon-contact { background-position: -192px -128px; }
.ui-icon-image { background-position: -208px -128px; }
.ui-icon-video { background-position: -224px -128px; }
.ui-icon-script { background-position: -240px -128px; }
.ui-icon-alert { background-position: 0 -144px; }
.ui-icon-info { background-position: -16px -144px; }
.ui-icon-notice { background-position: -32px -144px; }
.ui-icon-help { background-position: -48px -144px; }
.ui-icon-check { background-position: -64px -144px; }
.ui-icon-bullet { background-position: -80px -144px; }
.ui-icon-radio-off { background-position: -96px -144px; }
.ui-icon-radio-on { background-position: -112px -144px; }
.ui-icon-pin-w { background-position: -128px -144px; }
.ui-icon-pin-s { background-position: -144px -144px; }
.ui-icon-play { background-position: 0 -160px; }
.ui-icon-pause { background-position: -16px -160px; }
.ui-icon-seek-next { background-position: -32px -160px; }
.ui-icon-seek-prev { background-position: -48px -160px; }
.ui-icon-seek-end { background-position: -64px -160px; }
.ui-icon-seek-start { background-position: -80px -160px; }
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
.ui-icon-seek-first { background-position: -80px -160px; }
.ui-icon-stop { background-position: -96px -160px; }
.ui-icon-eject { background-position: -112px -160px; }
.ui-icon-volume-off { background-position: -128px -160px; }
.ui-icon-volume-on { background-position: -144px -160px; }
.ui-icon-power { background-position: 0 -176px; }
.ui-icon-signal-diag { background-position: -16px -176px; }
.ui-icon-signal { background-position: -32px -176px; }
.ui-icon-battery-0 { background-position: -48px -176px; }
.ui-icon-battery-1 { background-position: -64px -176px; }
.ui-icon-battery-2 { background-position: -80px -176px; }
.ui-icon-battery-3 { background-position: -96px -176px; }
.ui-icon-circle-plus { background-position: 0 -192px; }
.ui-icon-circle-minus { background-position: -16px -192px; }
.ui-icon-circle-close { background-position: -32px -192px; }
.ui-icon-circle-triangle-e { background-position: -48px -192px; }
.ui-icon-circle-triangle-s { background-position: -64px -192px; }
.ui-icon-circle-triangle-w { background-position: -80px -192px; }
.ui-icon-circle-triangle-n { background-position: -96px -192px; }
.ui-icon-circle-arrow-e { background-position: -112px -192px; }
.ui-icon-circle-arrow-s { background-position: -128px -192px; }
.ui-icon-circle-arrow-w { background-position: -144px -192px; }
.ui-icon-circle-arrow-n { background-position: -160px -192px; }
.ui-icon-circle-zoomin { background-position: -176px -192px; }
.ui-icon-circle-zoomout { background-position: -192px -192px; }
.ui-icon-circle-check { background-position: -208px -192px; }
.ui-icon-circlesmall-plus { background-position: 0 -208px; }
.ui-icon-circlesmall-minus { background-position: -16px -208px; }
.ui-icon-circlesmall-close { background-position: -32px -208px; }
.ui-icon-squaresmall-plus { background-position: -48px -208px; }
.ui-icon-squaresmall-minus { background-position: -64px -208px; }
.ui-icon-squaresmall-close { background-position: -80px -208px; }
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
/* Misc visuals
----------------------------------*/
/* Corner radius */
.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
.ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }
/* Overlays */
.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/*
* jQuery UI Resizable 1.8.12
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* http://docs.jquery.com/UI/Resizable#theming
*/
.ui-resizable { position: relative;}
.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;
/* http://bugs.jqueryui.com/ticket/7233
- Resizable: resizable handles fail to work in IE if transparent and content overlaps
*/
background-image:url(data:);
}
.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
* jQuery UI Selectable 1.8.12
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* http://docs.jquery.com/UI/Selectable#theming
*/
.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
/*
* jQuery UI Accordion 1.8.12
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* http://docs.jquery.com/UI/Accordion#theming
*/
/* IE/Win - Fix animation bug - #4615 */
.ui-accordion { width: 100%; }
.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
.ui-accordion .ui-accordion-li-fix { display: inline; }
.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
.ui-accordion .ui-accordion-content-active { display: block; }
/*
* jQuery UI Autocomplete 1.8.12
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* http://docs.jquery.com/UI/Autocomplete#theming
*/
.ui-autocomplete { position: absolute; cursor: default; }
/* workarounds */
* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
/*
* jQuery UI Menu 1.8.12
*
* Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* http://docs.jquery.com/UI/Menu#theming
*/
.ui-menu {
list-style:none;
padding: 2px;
margin: 0;
display:block;
float: left;
}
.ui-menu .ui-menu {
margin-top: -3px;
}
.ui-menu .ui-menu-item {
margin:0;
padding: 0;
zoom: 1;
float: left;
clear: left;
width: 100%;
}
.ui-menu .ui-menu-item a {
text-decoration:none;
display:block;
padding:.2em .4em;
line-height:1.5;
zoom:1;
}
.ui-menu .ui-menu-item a.ui-state-hover,
.ui-menu .ui-menu-item a.ui-state-active {
font-weight: normal;
margin: -1px;
}
/*
* jQuery UI Button 1.8.12
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* http://docs.jquery.com/UI/Button#theming
*/
.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
.ui-button-icons-only { width: 3.4em; }
button.ui-button-icons-only { width: 3.7em; }
/*button text element */
.ui-button .ui-button-text { display: block; line-height: 1.4; }
.ui-button-text-only .ui-button-text { padding: .4em 1em; }
.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
/* no icon support for input elements, provide padding by default */
input.ui-button { padding: .4em 1em; }
/*button icon element(s) */
.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
/*button sets*/
.ui-buttonset { margin-right: 7px; }
.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
/* workarounds */
button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
/*
* jQuery UI Dialog 1.8.12
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* http://docs.jquery.com/UI/Dialog#theming
*/
.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; }
.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; }
.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
.ui-draggable .ui-dialog-titlebar { cursor: move; }
/*
* jQuery UI Slider 1.8.12
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* http://docs.jquery.com/UI/Slider#theming
*/
.ui-slider { position: relative; text-align: left; }
.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
.ui-slider-horizontal { height: .8em; }
.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
.ui-slider-horizontal .ui-slider-range-min { left: 0; }
.ui-slider-horizontal .ui-slider-range-max { right: 0; }
.ui-slider-vertical { width: .8em; height: 100px; }
.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
* jQuery UI Tabs 1.8.12
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* http://docs.jquery.com/UI/Tabs#theming
*/
.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
.ui-tabs .ui-tabs-hide { display: none !important; }
/*
* jQuery UI Datepicker 1.8.12
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* http://docs.jquery.com/UI/Datepicker#theming
*/
.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
.ui-datepicker .ui-datepicker-prev { left:2px; }
.ui-datepicker .ui-datepicker-next { right:2px; }
.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
.ui-datepicker .ui-datepicker-next-hover { right:1px; }
.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; }
.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
.ui-datepicker select.ui-datepicker-month,
.ui-datepicker select.ui-datepicker-year { width: 49%;}
.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; }
.ui-datepicker td { border: 0; padding: 1px; }
.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
/* with multiple calendars */
.ui-datepicker.ui-datepicker-multi { width:auto; }
.ui-datepicker-multi .ui-datepicker-group { float:left; }
.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
.ui-datepicker-row-break { clear:both; width:100%; }
/* RTL support */
.ui-datepicker-rtl { direction: rtl; }
.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
.ui-datepicker-rtl .ui-datepicker-group { float:right; }
.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
.ui-datepicker-cover {
display: none; /*sorry for IE5*/
display/**/: block; /*sorry for IE5*/
position: absolute; /*must have*/
z-index: -1; /*must have*/
filter: mask(); /*must have*/
top: -4px; /*must have*/
left: -4px; /*must have*/
width: 200px; /*must have*/
height: 200px; /*must have*/
}/*
* jQuery UI Progressbar 1.8.12
*
* Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* http://docs.jquery.com/UI/Progressbar#theming
*/
.ui-progressbar { height:2em; text-align: left; }
.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }

View File

@ -1,28 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Language" content="ja" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>groonga dictionary search</title>
<meta http-equiv="content-style-type" content="text/css" />
<meta http-equiv="content-script-type" content="text/javascript" />
<link type="text/css" href="css/smoothness/jquery-ui-1.8.12.custom.css" rel="stylesheet" />
<link type="text/css" rel="stylesheet" href="css/dictionary.css" />
</head>
<body>
<form action="javascript:(function(){$('.search').blur()})()" name="search" id="search">
<input type="text" size="60" maxlength="60" name="key" class="search" />
<input type="submit" value="検索"/>
</form>
<script type="text/javascript" src="js/jquery-1.7.2.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.8.18.custom.js"></script>
<script type="text/javascript" src="js/dictionary.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$(".search").autocomplete({source: dictionarySource("http://" + location.host + "/d/suggest")});
});
</script>
<div id="result"></div>
</body>
</html>

View File

@ -1,82 +0,0 @@
function dictionarySource(url) {
function displayItems(items) {
var results = $("<dl />");
$.each(items,
function(i, val) {
results.append($("<dt />")
.append($("<span />")
.text(val[0])
.click(function() {
$(".search").val($(this).text());
$("#search").submit();
})));
results.append($("<dd />")
.append($("<span />").text(val[1]))
.append($("<span />").text(val[2]))
);
});
$("#result")
.empty()
.append(results);
};
var request_index = 0;
var columns = "_key,gene95_desc,edict_desc";
var xhr;
function source(request, response) {
function onSuccess(data, status) {
if (this.autocomplete_request != request_index) {
return;
}
var completions = data[1]["complete"];
var items = [];
if (completions && completions.length > 2) {
completions.shift();
completions.shift();
$.each(completions,
function(i, item) {
var key = item[0];
items.push(key);
if (items.length >= 3) {
return false;
}
return true;
});
}
if (completions.length > 0) {
displayItems(completions);
}
response(items);
}
function onError() {
if (this.autocomplete_request != request_index) {
return;
}
response([]);
}
if (xhr) {
xhr.abort();
}
xhr = $.ajax(url,
{
data: {
query: request.term,
types: 'complete',
table: 'item_dictionary',
column: 'kana',
limit: 25,
output_columns: columns,
frequency_threshold: 1,
prefix_search: "yes"
},
dataType: "jsonp",
autocomplete_request: ++request_index,
success: onSuccess,
error: onError
});
};
return source;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +0,0 @@
#!/bin/sh
if [ 1 != $# ]; then
echo "usage: $0 db_path"
exit 1
fi
if groonga-suggest-create-dataset $1 dictionary > /dev/null; then
echo "db initialized."
fi

View File

@ -1,3 +0,0 @@
jmdictdir = $(examples_dictionarydir)/jmdict
dist_jmdict_SCRIPTS = \
jmdict.rb

View File

@ -1,42 +0,0 @@
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'rexml/document'
require 'rexml/parsers/streamparser'
require 'rexml/parsers/baseparser'
require 'rexml/streamlistener'
#REXML::Document.new(STDIN)
class MyListener
include REXML::StreamListener
def tag_start(name, attrs)
# p name, attrs
case name
when 'entry'
@n = 0
end
end
def tag_end name
# p "tag_end: #{x}"
case name
when 'sense'
@n += 1
when 'entry'
@n_ents += 1
puts "#{@ent}:#{@n}" if (@n > 8)
when 'ent_seq'
@ent = @text
end
end
def text(text)
@text = text
end
def xmldecl(version, encoding, standalone)
@n_ents = 0
end
end
REXML::Parsers::StreamParser.new(STDIN, MyListener.new).parse

View File

@ -1,71 +0,0 @@
.. highlightlang:: none
辞書検索ツール
==============
名前
----
groonga辞書検索ツール
説明
----
様々な商用・非商用の辞書ファイルをインポートしてgroongaで検索できるようにします。
対応している辞書
++++++++++++++++
現状では下記の辞書に対応しています。
* EDICT
EDICTは、Monash大学Jim Breen教授が提供している和英辞書です。下記から入手できます。
http://ftp.monash.edu.au/pub/nihongo/edict.gz
* GENE95
GENE95は、Kurumiさん(NiftyID: GGD00145)が作成された英和辞書です。下記から入手できます。
http://www.namazu.org/~tsuchiya/sdic/data/gene95.tar.gz
* 英辞郎
英辞郎は、EDPという団体によって編纂されている英和・和英辞書です。
http://www.eijiro.jp/
書店やオンラインショップなどで購入できます。
データベースの初期化
++++++++++++++++++++
本ディレクトリで下記のように実行し、辞書データを格納するデータベースファイルを下記のようにして初期化します。
./init-db.sh データベースパス名
このようにして作成したデータベースについて、様々な辞書のデータをインポートすることができます。
インポートの方法
++++++++++++++++
* EDICT
edictディレクトリ配下で以下のように実行します。 edict.gzは自動でダウンロードします。
./edict-import.sh データベースパス名
* GENE95
gene95ディレクトリ配下で下記のように実行します。 gene95.tar.gzは自動でダウンロードします。
./gene-import.sh データベースパス名
* 英辞郎
英辞郎に付属のPDICツールを用いてCSVファイル形式に辞書をエクスポートします。(このとき「登録項目」ですべての項目を出力するようにします) eijiroディレクトリ配下で下記のように実行します。
./eijiro-import.sh データベースパス名 出力したCSVファイルのパス名
(英辞郎第四版で動作を確認しています)

View File

@ -146,17 +146,6 @@ namespace open_query
HAVE_EDGE = 4, HAVE_EDGE = 4,
}; };
// Force assignment operator, so we can trace through in the debugger
inline reference& operator=(const reference& ref)
{
m_flags = ref.m_flags;
m_sequence = ref.m_sequence;
m_vertex = ref.m_vertex;
m_edge = ref.m_edge;
m_weight = ref.m_weight;
return *this;
}
inline reference() inline reference()
: m_flags(0), m_sequence(0), : m_flags(0), m_sequence(0),
m_vertex(graph_traits<Graph>::null_vertex()), m_vertex(graph_traits<Graph>::null_vertex()),

View File

@ -107,7 +107,6 @@ namespace open_query
size_type n; size_type n;
}; };
reference operator[](size_type n) { return reference(*this, n); }
bool operator[](size_type n) const { return test(n); } bool operator[](size_type n) const { return test(n); }
size_type find_first() const; size_type find_first() const;

View File

@ -60,9 +60,6 @@ namespace oqgraph3
edge_iterator(const graph_ptr& graph, size_t offset=0) edge_iterator(const graph_ptr& graph, size_t offset=0)
: _graph(graph) : _graph(graph)
, _offset(offset) { } , _offset(offset) { }
edge_iterator(const edge_iterator& pos)
: _graph(pos._graph)
, _offset(pos._offset) { }
value_type operator*(); value_type operator*();
self& operator+=(size_t n) { _offset+= n; return *this; } self& operator+=(size_t n) { _offset+= n; return *this; }
self& operator++() { ++_offset; return *this; } self& operator++() { ++_offset; return *this; }

View File

@ -37,13 +37,6 @@ if [ $1 = 1 ] ; then
fi fi
fi fi
# Create a MySQL user and group. Do not report any problems if it already
# exists.
groupadd -r %{mysqld_group} 2> /dev/null || true
useradd -M -r --home $datadir --shell /sbin/nologin --comment "MySQL server" --gid %{mysqld_group} %{mysqld_user} 2> /dev/null || true
# The user may already exist, make sure it has the proper group nevertheless (BUG#12823)
usermod --gid %{mysqld_group} %{mysqld_user} 2> /dev/null || true
# Temporary Workaround for MDEV-11386 - will be corrected in Advance Toolchain 10.0-3 and 8.0-8 # Temporary Workaround for MDEV-11386 - will be corrected in Advance Toolchain 10.0-3 and 8.0-8
for ldconfig in /opt/at*/sbin/ldconfig; do for ldconfig in /opt/at*/sbin/ldconfig; do
test -x $ldconfig && $ldconfig test -x $ldconfig && $ldconfig
@ -69,9 +62,6 @@ if [ $1 = 1 ] ; then
chmod -R og-rw $datadir/mysql chmod -R og-rw $datadir/mysql
fi fi
# Set the correct filesystem ownership for the PAM v2 plugin
chown %{mysqld_user} /usr/lib*/mysql/plugin/auth_pam_tool_dir
# install SELinux files - but don't override existing ones # install SELinux files - but don't override existing ones
SETARGETDIR=/etc/selinux/targeted/src/policy SETARGETDIR=/etc/selinux/targeted/src/policy
SEDOMPROG=$SETARGETDIR/domains/program SEDOMPROG=$SETARGETDIR/domains/program

View File

@ -65,3 +65,8 @@ HERE
fi fi
fi fi
# Create a MySQL user and group. Do not report any problems if it already exists.
groupadd -r %{mysqld_group} 2> /dev/null || true
useradd -M -r --home %{mysqldatadir} --shell /sbin/nologin --comment "MySQL server" --gid %{mysqld_group} %{mysqld_user} 2> /dev/null || true
# The user may already exist, make sure it has the proper group nevertheless (BUG#12823)
usermod --gid %{mysqld_group} %{mysqld_user} 2> /dev/null || true

View File

@ -6305,6 +6305,318 @@ static void test_date_dt()
test_bind_date_conv(2); test_bind_date_conv(2);
} }
static void test_simple_temporal() {
MYSQL_STMT *stmt = NULL;
uint rc;
ulong length = 0;
MYSQL_BIND my_bind[4], my_bind2;
my_bool is_null = FALSE;
MYSQL_TIME tm;
char string[100];
MYSQL_RES *rs;
MYSQL_FIELD *field;
myheader("test_simple_temporal");
/* Initialize param/fetch buffers for data, null flags, lengths */
memset(&my_bind, 0, sizeof(my_bind));
memset(&my_bind2, 0, sizeof(my_bind2));
/* Initialize the first input parameter */
my_bind[0].buffer_type = MYSQL_TYPE_DATETIME;
my_bind[0].buffer = &tm;
my_bind[0].is_null = &is_null;
my_bind[0].length = &length;
my_bind[0].buffer_length = sizeof(tm);
/* Clone the other input parameters */
my_bind[3] = my_bind[2] = my_bind[1] = my_bind[0];
my_bind[1].buffer_type = MYSQL_TYPE_TIMESTAMP;
my_bind[2].buffer_type = MYSQL_TYPE_DATE;
my_bind[3].buffer_type = MYSQL_TYPE_TIME;
/* Initialize fetch parameter */
my_bind2.buffer_type = MYSQL_TYPE_STRING;
my_bind2.length = &length;
my_bind2.is_null = &is_null;
my_bind2.buffer_length = sizeof(string);
my_bind2.buffer = string;
/* Prepare and bind simple SELECT with DATETIME parameter */
stmt = mysql_simple_prepare(mysql, "SELECT ?");
check_stmt(stmt);
verify_param_count(stmt, 1);
rc = mysql_stmt_bind_param(stmt, &my_bind[0]);
check_execute(stmt, rc);
rc = mysql_stmt_bind_result(stmt, &my_bind2);
check_execute(stmt, rc);
/* Initialize DATETIME value */
tm.neg = FALSE;
tm.time_type = MYSQL_TIMESTAMP_DATETIME;
tm.year = 2001;
tm.month = 10;
tm.day = 20;
tm.hour = 10;
tm.minute = 10;
tm.second = 59;
tm.second_part = 500000;
/* Execute and fetch */
rc = mysql_stmt_execute(stmt);
check_execute(stmt, rc);
rs = mysql_stmt_result_metadata(stmt);
field = mysql_fetch_fields(rs);
rc = mysql_stmt_store_result(stmt);
check_execute(stmt, rc);
rc = mysql_stmt_fetch(stmt);
check_execute(stmt, rc);
DIE_UNLESS(field->type == MYSQL_TYPE_DATETIME);
DIE_UNLESS(strcmp(string, "2001-10-20 10:10:59.500000") == 0);
mysql_free_result(rs);
mysql_stmt_close(stmt);
/* Same test with explicit CAST */
stmt = mysql_simple_prepare(mysql, "SELECT CAST(? AS DATETIME(6))");
check_stmt(stmt);
verify_param_count(stmt, 1);
rc = mysql_stmt_bind_param(stmt, &my_bind[0]);
check_execute(stmt, rc);
rc = mysql_stmt_bind_result(stmt, &my_bind2);
check_execute(stmt, rc);
/* Execute and fetch */
rc = mysql_stmt_execute(stmt);
check_execute(stmt, rc);
rs = mysql_stmt_result_metadata(stmt);
field = mysql_fetch_fields(rs);
rc = mysql_stmt_store_result(stmt);
check_execute(stmt, rc);
rc = mysql_stmt_fetch(stmt);
check_execute(stmt, rc);
DIE_UNLESS(field->type == MYSQL_TYPE_DATETIME);
DIE_UNLESS(strcmp(string, "2001-10-20 10:10:59.500000") == 0);
mysql_free_result(rs);
mysql_stmt_close(stmt);
/* Prepare and bind simple SELECT with TIMESTAMP parameter */
stmt = mysql_simple_prepare(mysql, "SELECT ?");
check_stmt(stmt);
verify_param_count(stmt, 1);
rc = mysql_stmt_bind_param(stmt, &my_bind[1]);
check_execute(stmt, rc);
rc = mysql_stmt_bind_result(stmt, &my_bind2);
check_execute(stmt, rc);
/* Initialize TIMESTAMP value */
tm.neg = FALSE;
tm.time_type = MYSQL_TIMESTAMP_DATETIME;
tm.year = 2001;
tm.month = 10;
tm.day = 20;
tm.hour = 10;
tm.minute = 10;
tm.second = 59;
tm.second_part = 500000;
/* Execute and fetch */
rc = mysql_stmt_execute(stmt);
check_execute(stmt, rc);
rs = mysql_stmt_result_metadata(stmt);
field = mysql_fetch_fields(rs);
rc = mysql_stmt_store_result(stmt);
check_execute(stmt, rc);
rc = mysql_stmt_fetch(stmt);
check_execute(stmt, rc);
DIE_UNLESS(field->type == MYSQL_TYPE_TIMESTAMP);
DIE_UNLESS(strcmp(string, "2001-10-20 10:10:59.500000") == 0);
mysql_free_result(rs);
mysql_stmt_close(stmt);
/* Prepare and bind simple SELECT with DATE parameter */
stmt = mysql_simple_prepare(mysql, "SELECT ?");
check_stmt(stmt);
verify_param_count(stmt, 1);
rc = mysql_stmt_bind_param(stmt, &my_bind[2]);
check_execute(stmt, rc);
rc = mysql_stmt_bind_result(stmt, &my_bind2);
check_execute(stmt, rc);
/* Initialize DATE value */
tm.neg = FALSE;
tm.time_type = MYSQL_TIMESTAMP_DATE;
tm.year = 2001;
tm.month = 10;
tm.day = 20;
tm.hour = 0;
tm.minute = 0;
tm.second = 0;
tm.second_part = 0;
/* Execute and fetch */
rc = mysql_stmt_execute(stmt);
check_execute(stmt, rc);
rs = mysql_stmt_result_metadata(stmt);
field = mysql_fetch_fields(rs);
rc = mysql_stmt_store_result(stmt);
check_execute(stmt, rc);
rc = mysql_stmt_fetch(stmt);
check_execute(stmt, rc);
DIE_UNLESS(field->type == MYSQL_TYPE_DATE);
DIE_UNLESS(strcmp(string, "2001-10-20") == 0);
mysql_free_result(rs);
mysql_stmt_close(stmt);
/* Same test with explicit CAST */
stmt = mysql_simple_prepare(mysql, "SELECT CAST(? AS DATE)");
check_stmt(stmt);
verify_param_count(stmt, 1);
rc = mysql_stmt_bind_param(stmt, &my_bind[2]);
check_execute(stmt, rc);
rc = mysql_stmt_bind_result(stmt, &my_bind2);
check_execute(stmt, rc);
/* Execute and fetch */
rc = mysql_stmt_execute(stmt);
check_execute(stmt, rc);
rs = mysql_stmt_result_metadata(stmt);
field = mysql_fetch_fields(rs);
rc = mysql_stmt_store_result(stmt);
check_execute(stmt, rc);
rc = mysql_stmt_fetch(stmt);
check_execute(stmt, rc);
DIE_UNLESS(field->type == MYSQL_TYPE_DATE);
DIE_UNLESS(strcmp(string, "2001-10-20") == 0);
mysql_free_result(rs);
mysql_stmt_close(stmt);
/* Prepare and bind simple SELECT with TIME parameter */
stmt = mysql_simple_prepare(mysql, "SELECT ?");
check_stmt(stmt);
verify_param_count(stmt, 1);
rc = mysql_stmt_bind_param(stmt, &my_bind[3]);
check_execute(stmt, rc);
rc = mysql_stmt_bind_result(stmt, &my_bind2);
check_execute(stmt, rc);
/* Initialize TIME value */
tm.neg = FALSE;
tm.time_type = MYSQL_TIMESTAMP_TIME;
tm.year = 0;
tm.month = 0;
tm.day = 0;
tm.hour = 10;
tm.minute = 10;
tm.second = 59;
tm.second_part = 500000;
/* Execute and fetch */
rc = mysql_stmt_execute(stmt);
check_execute(stmt, rc);
rs = mysql_stmt_result_metadata(stmt);
field = mysql_fetch_fields(rs);
rc = mysql_stmt_store_result(stmt);
check_execute(stmt, rc);
rc = mysql_stmt_fetch(stmt);
check_execute(stmt, rc);
DIE_UNLESS(field->type == MYSQL_TYPE_TIME);
DIE_UNLESS(strcmp(string, "10:10:59.500000") == 0);
mysql_free_result(rs);
mysql_stmt_close(stmt);
/* Same test with explicit CAST */
stmt = mysql_simple_prepare(mysql, "SELECT CAST(? AS TIME(6))");
check_stmt(stmt);
verify_param_count(stmt, 1);
rc = mysql_stmt_bind_param(stmt, &my_bind[3]);
check_execute(stmt, rc);
rc = mysql_stmt_bind_result(stmt, &my_bind2);
check_execute(stmt, rc);
/* Initialize TIME value */
tm.neg = FALSE;
tm.time_type = MYSQL_TIMESTAMP_TIME;
tm.year = 0;
tm.month = 0;
tm.day = 0;
tm.hour = 10;
tm.minute = 10;
tm.second = 59;
tm.second_part = 500000;
/* Execute and fetch */
rc = mysql_stmt_execute(stmt);
check_execute(stmt, rc);
rs = mysql_stmt_result_metadata(stmt);
field = mysql_fetch_fields(rs);
rc = mysql_stmt_store_result(stmt);
check_execute(stmt, rc);
rc = mysql_stmt_fetch(stmt);
check_execute(stmt, rc);
DIE_UNLESS(field->type == MYSQL_TYPE_TIME);
DIE_UNLESS(strcmp(string, "10:10:59.500000") == 0);
mysql_free_result(rs);
mysql_stmt_close(stmt);
}
/* Misc tests to keep pure coverage happy */ /* Misc tests to keep pure coverage happy */
@ -21698,6 +22010,7 @@ static struct my_tests_st my_tests[]= {
{ "test_store_result2", test_store_result2 }, { "test_store_result2", test_store_result2 },
{ "test_subselect", test_subselect }, { "test_subselect", test_subselect },
{ "test_date", test_date }, { "test_date", test_date },
{ "test_simple_temporal", test_simple_temporal },
{ "test_date_date", test_date_date }, { "test_date_date", test_date_date },
{ "test_date_time", test_date_time }, { "test_date_time", test_date_time },
{ "test_date_ts", test_date_ts }, { "test_date_ts", test_date_ts },