Merge branch 'Kentoku:10.0' into 10.0

This commit is contained in:
Sergei Golubchik 2015-05-05 08:19:20 +02:00
commit d08b7ed514
426 changed files with 24793 additions and 5520 deletions

View File

@ -20,37 +20,43 @@
cmake_minimum_required(VERSION 2.6)
project(mroonga)
include(TestBigEndian)
test_big_endian(BIG_ENDIAN)
if(BIG_ENDIAN)
message(STATUS "Mroonga is not supported on big-endian")
return()
endif()
if(MSVC)
if(MSVC_VERSION LESS 1600)
message(STATUS "Mroonga supports only MSVC 2010 or later")
return()
endif()
endif()
if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
set(MRN_BUNDLED FALSE)
else()
set(MRN_BUNDLED TRUE)
endif()
include(TestBigEndian)
test_big_endian(BIG_ENDIAN)
if(BIG_ENDIAN)
set(MRN_BIG_ENDIAN_NOT_SUPPORTED_MESSAGE
"Mroonga doesn't support on big-endian")
if(MRN_BUNDLED)
message(STATUS ${MRN_BIG_ENDIAN_NOT_SUPPORTED_MESSAGE})
return()
else()
message(FATAL_ERROR ${MRN_BIG_ENDIAN_NOT_SUPPORTED_MESSAGE})
endif()
endif()
if(MSVC)
if(MSVC_VERSION LESS 1800)
set(MRN_OLD_MSVC_MESSAGE "Mroonga supports only MSVC 2013 or later")
if(MRN_BUNDLED)
message(STATUS ${MRN_OLD_MSVC_MESSAGE})
return()
else()
message(FATAL_ERROR ${MRN_OLD_MSVC_MESSAGE})
endif()
endif()
endif()
if(MRN_BUNDLED)
if(WITHOUT_MROONGA OR WITHOUT_MROONGA_STORAGE_ENGINE)
return()
endif()
endif()
IF(HAVE_WVLA)
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wno-vla")
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wno-vla")
ENDIF()
set(MRN_BUNDLED_GROONGA_RELATIVE_DIR "vendor/groonga")
set(MRN_BUNDLED_GROONGA_DIR
"${CMAKE_CURRENT_SOURCE_DIR}/${MRN_BUNDLED_GROONGA_RELATIVE_DIR}")
@ -184,6 +190,12 @@ else()
endif()
find_path(MYSQL_CONFIG "${MYSQL_CONFIG}")
if(EXISTS "${MYSQL_SOURCE_DIR}/storage/maria")
set(MYSQL_VARIANT "MariaDB")
else()
set(MYSQL_VARIANT "MySQL")
endif()
if(EXISTS "${MYSQL_SOURCE_DIR}/pcre")
set(MYSQL_REGEX_INCLUDE_DIR "${MYSQL_SOURCE_DIR}/pcre")
else()
@ -196,12 +208,24 @@ else()
set(MYSQL_RAPIDJSON_INCLUDE_DIR)
endif()
if(EXISTS "${MYSQL_SOURCE_DIR}/libbinlogevents")
set(MYSQL_LIBBINLOGEVENTS_EXPORT_DIR
"${MYSQL_SOURCE_DIR}/libbinlogevents/export")
set(MYSQL_LIBBINLOGEVENTS_INCLUDE_DIR
"${MYSQL_SOURCE_DIR}/libbinlogevents/include")
else()
set(MYSQL_LIBBINLOGEVENTS_EXPORT_DIR)
set(MYSQL_LIBBINLOGEVENTS_INCLUDE_DIR)
endif()
set(MYSQL_INCLUDE_DIRS
"${MYSQL_BUILD_DIR}/include"
"${MYSQL_SOURCE_DIR}/sql"
"${MYSQL_SOURCE_DIR}/include"
"${MYSQL_REGEX_INCLUDE_DIR}"
"${MYSQL_RAPIDJSON_INCLUDE_DIR}"
"${MYSQL_LIBBINLOGEVENTS_EXPORT_DIR}"
"${MYSQL_LIBBINLOGEVENTS_INCLUDE_DIR}"
"${MYSQL_SOURCE_DIR}")
if(MRN_BUNDLED)
@ -261,6 +285,9 @@ else()
pkg_check_modules(GROONGA REQUIRED "groonga >= ${REQUIRED_GROONGA_VERSION}")
pkg_check_modules(GROONGA_NORMALIZER_MYSQL
"groonga-normalizer-mysql >= ${REQUIRED_GROONGA_NORMALIZER_MYSQL_VERSION}")
set(MRN_LIBRARY_DIRS
${MRN_LIBRARY_DIRS}
${GROONGA_LIBRARY_DIRS})
endif()
include_directories(
@ -337,8 +364,12 @@ else()
mrn_build_flag("-Wno-strict-aliasing")
mrn_build_flag("-Wno-deprecated")
mrn_check_cxxflag("-fno-implicit-templates")
mrn_check_cxxflag("-fno-exceptions")
mrn_check_cxxflag("-fno-rtti")
if(("${MYSQL_VARIANT}" STREQUAL "MariaDB") OR
("${MYSQL_VARIANT}" STREQUAL "MySQL" AND
${MYSQL_VERSION} VERSION_LESS "5.7.0"))
mrn_check_cxxflag("-fno-exceptions")
mrn_check_cxxflag("-fno-rtti")
endif()
mrn_check_cxxflag("-felide-constructors")
endif()
set_source_files_properties(${MRN_SOURCES} PROPERTIES

504
storage/mroonga/COPYING Normal file
View File

@ -0,0 +1,504 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it becomes
a de-facto standard. To achieve this, non-free programs must be
allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control compilation
and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at
least three years, to give the same user the materials
specified in Subsection 6a, above, for a charge no more
than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any
particular circumstance, the balance of the section is intended to apply,
and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License may add
an explicit geographical distribution limitation excluding those countries,
so that distribution is permitted only in or among countries not thus
excluded. In such case, this License incorporates the limitation as if
written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms of the
ordinary General Public License).
To apply these terms, attach the following notices to the library. It is
safest to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the library, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!

View File

@ -40,7 +40,6 @@ SUBDIRS = \
EXTRA_DIST = \
AUTHORS \
gpg_uid \
plug.in \
CMakeLists.txt
installcheck-local: install

View File

@ -2,14 +2,17 @@ version: "{build}"
clone_depth: 10
install:
- cd ..
- choco install curl 7zip.commandline
- curl -O http://mirror.jmu.edu/pub/mariadb/mariadb-10.0.16/source/mariadb-10.0.16.tar.gz
- 7z x mariadb-10.0.16.tar.gz
- 7z x mariadb-10.0.16.tar > nul
- cd mariadb-10.0.16
- choco install -y curl 7zip.commandline
- curl -O http://mirror.jmu.edu/pub/mariadb/mariadb-10.0.17/source/mariadb-10.0.17.tar.gz
- 7z x mariadb-10.0.17.tar.gz
- 7z x mariadb-10.0.17.tar > nul
- cd mariadb-10.0.17
- rmdir /S /Q storage\mroonga\
- move ..\mroonga storage\mroonga
- git clone --quiet --depth 1 https://github.com/groonga/groonga.git ..\groonga
- cd ..\groonga
- git submodule update --init
- cd ..\mariadb-10.0.17
- rmdir /S /Q ..\groonga\test\
- mkdir storage\mroonga\vendor
- move ..\groonga storage\mroonga\vendor\groonga

View File

@ -184,6 +184,10 @@ AC_DEFUN([CONFIG_OPTION_MYSQL],[
mysql_regex_include_dir="$ac_mysql_source_dir/regex"
fi
MYSQL_INCLUDES="$MYSQL_INCLUDES -I$mysql_regex_include_dir"
if test -d "$ac_mysql_source_dir/libbinlogevents"; then
MYSQL_INCLUDES="$MYSQL_INCLUDES -I$ac_mysql_source_dir/libbinlogevents/export"
MYSQL_INCLUDES="$MYSQL_INCLUDES -I$ac_mysql_source_dir/libbinlogevents/include"
fi
MYSQL_INCLUDES="$MYSQL_INCLUDES -I$ac_mysql_source_dir"
MYSQL_INCLUDES="$MYSQL_INCLUDES $($ac_mysql_config --include)"
AC_SUBST(MYSQL_INCLUDES)
@ -191,8 +195,19 @@ AC_DEFUN([CONFIG_OPTION_MYSQL],[
MYSQL_VERSION="$($ac_mysql_config --version)"
AC_SUBST(MYSQL_VERSION)
MYSQL_MAJOR_MINOR_VERSION=["$(echo $MYSQL_VERSION | sed -e 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*[a-z]*\)[.0-9a-z-]*$/\1.\2/')"]
MYSQL_CXXFLAGS="-fno-implicit-templates -felide-constructors"
case "$MYSQL_MAJOR_MINOR_VERSION" in
5.7)
:
;;
*)
MYSQL_CXXFLAGS="$MYSQL_CXXFLAGS -fno-exceptions -fno-rtti"
;;
esac
if test "${with_libmysqlservices_compat}" = "no"; then
MYSQL_MAJOR_MINOR_VERSION=["$(echo $MYSQL_VERSION | sed -e 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*[a-z]*\)$/\1.\2/')"]
case "$MYSQL_MAJOR_MINOR_VERSION" in
5.1)
MYSQL_LIBS=""
@ -451,7 +466,7 @@ AC_SUBST(DOCUMENT_VERSION)
AC_SUBST(DOCUMENT_VERSION_FULL)
CFLAGS="$CFLAGS"
CXXFLAGS="$CXXFLAGS -fno-implicit-templates -fno-exceptions -fno-rtti -felide-constructors"
CXXFLAGS="$CXXFLAGS $MYSQL_CXXFLAGS"
AC_CONFIG_FILES([
Makefile
@ -489,6 +504,7 @@ AC_OUTPUT([
packages/rpm/centos/mysql55-mroonga.spec
packages/rpm/centos/mysql56-community-mroonga.spec
packages/rpm/centos/mariadb-mroonga.spec
packages/rpm/centos/percona-server-56-mroonga.spec
packages/yum/env.sh
data/install.sql
])

File diff suppressed because it is too large Load Diff

View File

@ -98,7 +98,13 @@ extern "C" {
# define MRN_TABLE_LIST_INIT_REQUIRE_ALIAS
#endif
#ifdef BIG_TABLES
#if MYSQL_VERSION_ID >= 50706 && !defined(MRN_MARIADB_P)
# define MRN_BIG_TABLES
#elif defined(BIG_TABLES)
# define MRN_BIG_TABLES
#endif
#ifdef MRN_BIG_TABLES
# define MRN_HA_ROWS_FORMAT "llu"
#else
# define MRN_HA_ROWS_FORMAT "lu"
@ -145,6 +151,14 @@ extern "C" {
# define MRN_HAVE_TL_WRITE_ALLOW_READ
#endif
#if MYSQL_VERSION_ID < 50706 || defined(MRN_MARIADB_P)
# define MRN_HAVE_TL_WRITE_DELAYED
#endif
#if MYSQL_VERSION_ID >= 50706 && !defined(MRN_MARIADB_P)
# define MRN_HAVE_TL_WRITE_CONCURRENT_DEFAULT
#endif
#if (defined(MRN_MARIADB_P) && \
((MYSQL_VERSION_ID >= 50306 && MYSQL_VERSION_ID < 50500) || \
MYSQL_VERSION_ID >= 50523))
@ -179,6 +193,44 @@ extern "C" {
# define MRN_HAVE_TDC_LOCK_TABLE_SHARE
#endif
#ifdef MRN_MARIADB_P
# if MYSQL_VERSION_ID >= 50542 && MYSQL_VERSION_ID < 100000
# define MRN_SUPPORT_THDVAR_SET
# elif MYSQL_VERSION_ID >= 100017
# define MRN_SUPPORT_THDVAR_SET
# endif
#else
# define MRN_SUPPORT_THDVAR_SET
#endif
#ifdef MRN_MARIADB_P
# if MYSQL_VERSION_ID < 100000
# define MRN_SUPPORT_PARTITION
# endif
#else
# define MRN_SUPPORT_PARTITION
#endif
#if MYSQL_VERSION_ID >= 50706 && !defined(MRN_MARIADB_P)
# define MRN_FLUSH_LOGS_HAVE_BINLOG_GROUP_FLUSH
#endif
#if MYSQL_VERSION_ID < 50706 || defined(MRN_MARIADB_P)
# define MRN_HAVE_HTON_ALTER_TABLE_FLAGS
#endif
#if MYSQL_VERSION_ID >= 50706 && !defined(MRN_MARIADB_P)
# define MRN_FOREIGN_KEY_USE_CONST_STRING
#endif
#if MYSQL_VERSION_ID < 50706 || defined(MRN_MARIADB_P)
# define MRN_HANDLER_IS_FATAL_ERROR_HAVE_FLAGS
#endif
#if MYSQL_VERSION_ID < 50706 || defined(MRN_MARIADB_P)
# define MRN_HANDLER_HAVE_RESET_AUTO_INCREMENT
#endif
class ha_mroonga;
/* structs */
@ -448,7 +500,7 @@ public:
bool check_and_repair(THD *thd);
int analyze(THD* thd, HA_CHECK_OPT* check_opt);
int optimize(THD* thd, HA_CHECK_OPT* check_opt);
bool is_fatal_error(int error_num, uint flags);
bool is_fatal_error(int error_num, uint flags=0);
bool check_if_incompatible_data(HA_CREATE_INFO *create_info,
uint table_changes);
#ifdef MRN_HANDLER_HAVE_CHECK_IF_SUPPORTED_INPLACE_ALTER
@ -474,7 +526,9 @@ public:
void restore_auto_increment(ulonglong prev_insert_id);
void release_auto_increment();
int check_for_upgrade(HA_CHECK_OPT *check_opt);
#ifdef MRN_HANDLER_HAVE_RESET_AUTO_INCREMENT
int reset_auto_increment(ulonglong value);
#endif
bool was_semi_consistent_read();
void try_semi_consistent_read(bool yes);
void unlock_row();
@ -556,6 +610,7 @@ private:
int drop_index(MRN_SHARE *target_share, uint key_index);
grn_obj *find_tokenizer(const char *name, int name_length);
grn_obj *find_normalizer(KEY *key_info);
bool find_index_column_flags(KEY *key_info, grn_obj_flags *index_column_flags);
bool find_token_filters(KEY *key_info, grn_obj *token_filters);
bool find_token_filters_put(grn_obj *token_filters,
const char *token_filter_name,
@ -579,6 +634,7 @@ private:
void check_count_skip(key_part_map start_key_part_map,
key_part_map end_key_part_map, bool fulltext);
bool is_grn_zero_column_value(grn_obj *column, grn_obj *value);
bool is_primary_key_field(Field *field) const;
void check_fast_order_limit(grn_table_sort_key **sort_keys, int *n_sort_keys,
longlong *limit);
@ -1040,6 +1096,7 @@ private:
int wrapper_fill_indexes(THD *thd, KEY *key_info,
grn_obj **index_columns, uint n_keys);
int wrapper_recreate_indexes(THD *thd);
int storage_recreate_indexes(THD *thd);
int wrapper_repair(THD* thd, HA_CHECK_OPT* check_opt);
int storage_repair(THD* thd, HA_CHECK_OPT* check_opt);
bool wrapper_check_and_repair(THD *thd);
@ -1131,8 +1188,10 @@ private:
void storage_release_auto_increment();
int wrapper_check_for_upgrade(HA_CHECK_OPT *check_opt);
int storage_check_for_upgrade(HA_CHECK_OPT *check_opt);
#ifdef MRN_HANDLER_HAVE_RESET_AUTO_INCREMENT
int wrapper_reset_auto_increment(ulonglong value);
int storage_reset_auto_increment(ulonglong value);
#endif
bool wrapper_was_semi_consistent_read();
bool storage_was_semi_consistent_read();
void wrapper_try_semi_consistent_read(bool yes);

View File

@ -24,4 +24,8 @@ libmrn_need_mysql_la_SOURCES = \
mrn_time_converter.cpp \
mrn_time_converter.hpp \
mrn_database_manager.cpp \
mrn_database_manager.hpp
mrn_database_manager.hpp \
mrn_value_decoder.cpp \
mrn_value_decoder.hpp \
mrn_database_repairer.cpp \
mrn_database_repairer.hpp

View File

@ -23,6 +23,8 @@
#include <groonga.h>
#include <mrn_mysql_compat.h>
#include <item_cmpfunc.h>
namespace mrn {
class ConditionConverter {
public:

View File

@ -0,0 +1,246 @@
/* -*- c-basic-offset: 2 -*- */
/*
Copyright(C) 2015 Kouhei Sutou <kou@clear-code.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <mrn_mysql.h>
#include <mrn_mysql_compat.h>
#include <mrn_constants.hpp>
#include "mrn_database_repairer.hpp"
#include "mrn_path_mapper.hpp"
// for debug
#define MRN_CLASS_NAME "mrn::DatabaseRepairer"
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#ifndef WIN32
# include <dirent.h>
#endif
namespace mrn {
DatabaseRepairer::DatabaseRepairer(grn_ctx *ctx, THD *thd)
: ctx_(ctx),
thd_(thd),
base_directory_(NULL),
base_directory_buffer_(),
path_prefix_(NULL),
path_prefix_buffer_(),
path_prefix_length_(0),
mrn_db_file_suffix_length_(strlen(MRN_DB_FILE_SUFFIX)) {
}
DatabaseRepairer::~DatabaseRepairer() {
}
bool DatabaseRepairer::is_crashed(void) {
MRN_DBUG_ENTER_METHOD();
bool is_crashed = false;
each_database(&DatabaseRepairer::is_crashed_body, &is_crashed);
DBUG_RETURN(is_crashed);
}
bool DatabaseRepairer::repair(void) {
MRN_DBUG_ENTER_METHOD();
bool succeeded = true;
each_database(&DatabaseRepairer::repair_body, &succeeded);
DBUG_RETURN(succeeded);
}
void DatabaseRepairer::each_database(EachBodyFunc each_body_func,
void *user_data) {
MRN_DBUG_ENTER_METHOD();
detect_paths();
#ifdef WIN32
WIN32_FIND_DATA data;
HANDLE finder = FindFirstFile(base_directory_, &data);
if (finder == INVALID_HANDLE_VALUE) {
DBUG_VOID_RETURN;
}
do {
each_database_body(data.cFileName, each_body_func, user_data);
} while (FindNextFile(finder, &data) != 0);
FindClose(finder);
#else
DIR *dir = opendir(base_directory_);
if (!dir) {
DBUG_VOID_RETURN;
}
while (struct dirent *entry = readdir(dir)) {
each_database_body(entry->d_name, each_body_func, user_data);
}
closedir(dir);
#endif
DBUG_VOID_RETURN;
}
void DatabaseRepairer::each_database_body(const char *base_path,
EachBodyFunc each_body_func,
void *user_data) {
MRN_DBUG_ENTER_METHOD();
if (path_prefix_length_ > 0 &&
strncmp(base_path, path_prefix_, path_prefix_length_) != 0) {
DBUG_VOID_RETURN;
}
size_t path_length = strlen(base_path);
if (path_length <= mrn_db_file_suffix_length_) {
DBUG_VOID_RETURN;
}
if (strncmp(base_path + (path_length - mrn_db_file_suffix_length_),
MRN_DB_FILE_SUFFIX, mrn_db_file_suffix_length_) != 0) {
DBUG_VOID_RETURN;
}
char db_path[MRN_MAX_PATH_SIZE];
snprintf(db_path, MRN_MAX_PATH_SIZE,
"%s%c%s", base_directory_, FN_LIBCHAR, base_path);
grn_obj *db = grn_db_open(ctx_, db_path);
if (!db) {
DBUG_VOID_RETURN;
}
(this->*each_body_func)(db, db_path, user_data);
grn_obj_close(ctx_, db);
DBUG_VOID_RETURN;
}
void DatabaseRepairer::detect_paths(void) {
MRN_DBUG_ENTER_METHOD();
const char *raw_path_prefix = mrn::PathMapper::default_path_prefix;
if (!raw_path_prefix) {
base_directory_ = ".";
path_prefix_ = NULL;
DBUG_VOID_RETURN;
}
strcpy(base_directory_buffer_, raw_path_prefix);
size_t raw_path_prefix_length = strlen(raw_path_prefix);
size_t separator_position = raw_path_prefix_length;
for (; separator_position > 0; separator_position--) {
if (base_directory_buffer_[separator_position] == FN_LIBCHAR ||
base_directory_buffer_[separator_position] == FN_LIBCHAR2) {
break;
}
}
if (separator_position == 0 ||
separator_position == raw_path_prefix_length) {
base_directory_ = ".";
} else {
base_directory_buffer_[separator_position] = '\0';
base_directory_ = base_directory_buffer_;
strcpy(path_prefix_buffer_, raw_path_prefix + separator_position + 1);
path_prefix_ = path_prefix_buffer_;
path_prefix_length_ = strlen(path_prefix_);
}
DBUG_VOID_RETURN;
}
void DatabaseRepairer::is_crashed_body(grn_obj *db,
const char *db_path,
void *user_data) {
MRN_DBUG_ENTER_METHOD();
bool *is_crashed = static_cast<bool *>(user_data);
if (grn_obj_is_locked(ctx_, db)) {
*is_crashed = true;
DBUG_VOID_RETURN;
}
grn_table_cursor *cursor;
cursor = grn_table_cursor_open(ctx_, db,
NULL, 0,
NULL, 0,
0, -1, GRN_CURSOR_BY_ID);
if (!cursor) {
*is_crashed = true;
DBUG_VOID_RETURN;
}
grn_id id;
while ((id = grn_table_cursor_next(ctx_, cursor)) != GRN_ID_NIL) {
grn_obj *object = grn_ctx_at(ctx_, id);
if (!object) {
continue;
}
switch (object->header.type) {
case GRN_TABLE_HASH_KEY :
case GRN_TABLE_PAT_KEY:
case GRN_TABLE_DAT_KEY:
case GRN_TABLE_NO_KEY:
case GRN_COLUMN_FIX_SIZE:
case GRN_COLUMN_VAR_SIZE:
case GRN_COLUMN_INDEX:
grn_obj_is_locked(ctx_, object);
*is_crashed = true;
break;
default:
break;
}
grn_obj_unlink(ctx_, object);
if (*is_crashed) {
break;
}
}
grn_table_cursor_close(ctx_, cursor);
DBUG_VOID_RETURN;
}
void DatabaseRepairer::repair_body(grn_obj *db,
const char *db_path,
void *user_data) {
MRN_DBUG_ENTER_METHOD();
bool *succeeded = static_cast<bool *>(user_data);
if (grn_db_recover(ctx_, db) != GRN_SUCCESS) {
push_warning_printf(thd_,
Sql_condition::WARN_LEVEL_WARN,
ER_NOT_KEYFILE,
"mroonga: repair: "
"Failed to recover database: <%s>: <%s>",
db_path, ctx_->errbuf);
*succeeded = false;
}
DBUG_VOID_RETURN;
}
}

View File

@ -0,0 +1,58 @@
/* -*- c-basic-offset: 2 -*- */
/*
Copyright(C) 2015 Kouhei Sutou <kou@clear-code.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef MRN_DATABASE_REPAIRER_HPP_
#define MRN_DATABASE_REPAIRER_HPP_
#include <groonga.h>
namespace mrn {
class DatabaseRepairer {
public:
DatabaseRepairer(grn_ctx *ctx, THD *thd);
~DatabaseRepairer(void);
bool is_crashed(void);
bool repair(void);
private:
grn_ctx *ctx_;
THD *thd_;
const char *base_directory_;
char base_directory_buffer_[MRN_MAX_PATH_SIZE];
const char *path_prefix_;
char path_prefix_buffer_[MRN_MAX_PATH_SIZE];
size_t path_prefix_length_;
size_t mrn_db_file_suffix_length_;
typedef void (DatabaseRepairer::*EachBodyFunc)(grn_obj *db,
const char *db_path,
void *user_data);
void each_database(EachBodyFunc each_body_func, void *user_data);
void each_database_body(const char *base_path,
EachBodyFunc each_body_func,
void *user_data);
void detect_paths(void);
void is_crashed_body(grn_obj *db, const char *db_path, void *user_data);
void repair_body(grn_obj *db, const char *db_path, void *user_data);
};
}
#endif /* MRN_DATABASE_REPAIRER_HPP_ */

View File

@ -18,6 +18,7 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <mrn_mysql.h>
#include <mrn_err.h>
#include "mrn_encoding.hpp"

View File

@ -17,6 +17,8 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <mrn_mysql.h>
#include "mrn_field_normalizer.hpp"
#include "mrn_encoding.hpp"
@ -114,6 +116,9 @@ namespace mrn {
} else if ((strcmp(charset_info->name, "utf8_unicode_ci") == 0) ||
(strcmp(charset_info->name, "utf8mb4_unicode_ci") == 0)) {
normalizer_name = "NormalizerMySQLUnicodeCI";
} else if ((strcmp(charset_info->name, "utf8_unicode_520_ci") == 0) ||
(strcmp(charset_info->name, "utf8mb4_unicode_520_ci") == 0)) {
normalizer_name = "NormalizerMySQLUnicode520CI";
}
grn_obj *normalizer = NULL;
@ -128,7 +133,7 @@ namespace mrn {
normalizer_name,
charset_info->name,
default_normalizer_name);
push_warning(thread_, Sql_condition::WARN_LEVEL_WARN,
push_warning(thread_, MRN_SEVERITY_WARNING,
HA_ERR_UNSUPPORTED, error_message);
}
}

View File

@ -1,6 +1,6 @@
/* -*- c-basic-offset: 2 -*- */
/*
Copyright(C) 2012-2014 Kouhei Sutou <kou@clear-code.com>
Copyright(C) 2012-2015 Kouhei Sutou <kou@clear-code.com>
Copyright(C) 2013 Kentoku SHIBA
This library is free software; you can redistribute it and/or
@ -23,6 +23,7 @@
#include "mrn_multiple_column_key_codec.hpp"
#include "mrn_field_normalizer.hpp"
#include "mrn_smart_grn_obj.hpp"
#include "mrn_value_decoder.hpp"
// for debug
#define MRN_CLASS_NAME "mrn::MultipleColumnKeyCodec"
@ -121,14 +122,14 @@ namespace mrn {
case TYPE_FLOAT:
{
float value;
float4get(value, current_mysql_key);
value_decoder::decode(&value, current_mysql_key);
encode_float(value, data_size, current_grn_key);
}
break;
case TYPE_DOUBLE:
{
double value;
float8get(value, current_mysql_key);
value_decoder::decode(&value, current_mysql_key);
encode_double(value, data_size, current_grn_key);
}
break;
@ -523,7 +524,7 @@ namespace mrn {
new_blob_data_length = normalized_length;
} else {
push_warning_printf(thread_,
Sql_condition::WARN_LEVEL_WARN,
MRN_SEVERITY_WARNING,
WARN_DATA_TRUNCATED,
"normalized data truncated "
"for multiple column index: "

View File

@ -1,7 +1,7 @@
/* -*- c-basic-offset: 2 -*- */
/*
Copyright(C) 2011-2013 Kentoku SHIBA
Copyright(C) 2011-2013 Kouhei Sutou <kou@clear-code.com>
Copyright(C) 2011-2015 Kouhei Sutou <kou@clear-code.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@ -21,6 +21,7 @@
#include "mrn_parameters_parser.hpp"
#include <mrn_mysql_compat.h>
#include <mrn_variables.hpp>
namespace mrn {
class Parameter {
@ -30,8 +31,8 @@ namespace mrn {
Parameter(const char *key, unsigned int key_length,
const char *value, unsigned int value_length)
: key_(my_strndup(key, key_length, MYF(0))),
value_(my_strndup(value, value_length, MYF(0))) {
: key_(mrn_my_strndup(key, key_length, MYF(0))),
value_(mrn_my_strndup(value, value_length, MYF(0))) {
};
~Parameter() {
if (key_) {

View File

@ -29,16 +29,17 @@ namespace mrn {
char *PathMapper::default_path_prefix = NULL;
char *PathMapper::default_mysql_data_home_path = NULL;
PathMapper::PathMapper(const char *mysql_path,
PathMapper::PathMapper(const char *original_mysql_path,
const char *path_prefix,
const char *mysql_data_home_path)
: mysql_path_(mysql_path),
: original_mysql_path_(original_mysql_path),
path_prefix_(path_prefix),
mysql_data_home_path_(mysql_data_home_path) {
db_path_[0] = '\0';
db_name_[0] = '\0';
table_name_[0] = '\0';
mysql_table_name_[0] = '\0';
mysql_path_[0] = '\0';
}
/**
@ -52,22 +53,25 @@ namespace mrn {
return db_path_;
}
if (mysql_path_[0] == FN_CURLIB && mysql_path_[1] == FN_LIBCHAR) {
if (original_mysql_path_[0] == FN_CURLIB &&
original_mysql_path_[1] == FN_LIBCHAR) {
if (path_prefix_) {
strcpy(db_path_, path_prefix_);
}
int i = 2, j = strlen(db_path_), len;
len = strlen(mysql_path_);
while (mysql_path_[i] != FN_LIBCHAR && i < len) {
db_path_[j++] = mysql_path_[i++];
len = strlen(original_mysql_path_);
while (original_mysql_path_[i] != FN_LIBCHAR && i < len) {
db_path_[j++] = original_mysql_path_[i++];
}
db_path_[j] = '\0';
} else if (mysql_data_home_path_) {
int len = strlen(mysql_path_);
int len = strlen(original_mysql_path_);
int mysql_data_home_len = strlen(mysql_data_home_path_);
if (len > mysql_data_home_len &&
!strncmp(mysql_path_, mysql_data_home_path_, mysql_data_home_len)) {
!strncmp(original_mysql_path_,
mysql_data_home_path_,
mysql_data_home_len)) {
int i = mysql_data_home_len, j;
if (path_prefix_ && path_prefix_[0] == FN_LIBCHAR) {
strcpy(db_path_, path_prefix_);
@ -87,19 +91,19 @@ namespace mrn {
}
}
while (mysql_path_[i] != FN_LIBCHAR && i < len) {
db_path_[j++] = mysql_path_[i++];
while (original_mysql_path_[i] != FN_LIBCHAR && i < len) {
db_path_[j++] = original_mysql_path_[i++];
}
if (i == len) {
memcpy(db_path_, mysql_path_, len);
memcpy(db_path_, original_mysql_path_, len);
} else {
db_path_[j] = '\0';
}
} else {
strcpy(db_path_, mysql_path_);
strcpy(db_path_, original_mysql_path_);
}
} else {
strcpy(db_path_, mysql_path_);
strcpy(db_path_, original_mysql_path_);
}
strcat(db_path_, MRN_DB_FILE_SUFFIX);
return db_path_;
@ -116,32 +120,35 @@ namespace mrn {
return db_name_;
}
if (mysql_path_[0] == FN_CURLIB && mysql_path_[1] == FN_LIBCHAR) {
if (original_mysql_path_[0] == FN_CURLIB &&
original_mysql_path_[1] == FN_LIBCHAR) {
int i = 2, j = 0, len;
len = strlen(mysql_path_);
while (mysql_path_[i] != FN_LIBCHAR && i < len) {
db_name_[j++] = mysql_path_[i++];
len = strlen(original_mysql_path_);
while (original_mysql_path_[i] != FN_LIBCHAR && i < len) {
db_name_[j++] = original_mysql_path_[i++];
}
db_name_[j] = '\0';
} else if (mysql_data_home_path_) {
int len = strlen(mysql_path_);
int len = strlen(original_mysql_path_);
int mysql_data_home_len = strlen(mysql_data_home_path_);
if (len > mysql_data_home_len &&
!strncmp(mysql_path_, mysql_data_home_path_, mysql_data_home_len)) {
!strncmp(original_mysql_path_,
mysql_data_home_path_,
mysql_data_home_len)) {
int i = mysql_data_home_len, j = 0;
while (mysql_path_[i] != FN_LIBCHAR && i < len) {
db_name_[j++] = mysql_path_[i++];
while (original_mysql_path_[i] != FN_LIBCHAR && i < len) {
db_name_[j++] = original_mysql_path_[i++];
}
if (i == len) {
memcpy(db_name_, mysql_path_, len);
memcpy(db_name_, original_mysql_path_, len);
} else {
db_name_[j] = '\0';
}
} else {
strcpy(db_name_, mysql_path_);
strcpy(db_name_, original_mysql_path_);
}
} else {
strcpy(db_name_, mysql_path_);
strcpy(db_name_, original_mysql_path_);
}
return db_name_;
}
@ -154,10 +161,10 @@ namespace mrn {
return table_name_;
}
int len = strlen(mysql_path_);
int len = strlen(original_mysql_path_);
int i = len, j = 0;
for (; mysql_path_[--i] != FN_LIBCHAR ;) {}
if (mysql_path_[i + 1] == '_') {
for (; original_mysql_path_[--i] != FN_LIBCHAR ;) {}
if (original_mysql_path_[i + 1] == '_') {
table_name_[j++] = '@';
table_name_[j++] = '0';
table_name_[j++] = '0';
@ -166,7 +173,7 @@ namespace mrn {
i++;
}
for (; i < len ;) {
table_name_[j++] = mysql_path_[++i];
table_name_[j++] = original_mysql_path_[++i];
}
table_name_[j] = '\0';
return table_name_;
@ -180,16 +187,39 @@ namespace mrn {
return mysql_table_name_;
}
int len = strlen(mysql_path_);
int len = strlen(original_mysql_path_);
int i = len, j = 0;
for (; mysql_path_[--i] != FN_LIBCHAR ;) {}
for (; original_mysql_path_[--i] != FN_LIBCHAR ;) {}
for (; i < len ;) {
if (len - i - 1 >= 3 && strncmp(mysql_path_ + i + 1, "#P#", 3) == 0) {
if (len - i - 1 >= 3 &&
strncmp(original_mysql_path_ + i + 1, "#P#", 3) == 0) {
break;
}
mysql_table_name_[j++] = mysql_path_[++i];
mysql_table_name_[j++] = original_mysql_path_[++i];
}
mysql_table_name_[j] = '\0';
return mysql_table_name_;
}
/**
* "./${db}/${table}" ==> "./${db}/${table}"
* "./${db}/${table}#P#xxx" ==> "./${db}/${table}"
*/
const char *PathMapper::mysql_path() {
if (mysql_path_[0] != '\0') {
return mysql_path_;
}
int i;
int len = strlen(original_mysql_path_);
for (i = 0; i < len; i++) {
if (len - i >= 3 &&
strncmp(original_mysql_path_ + i, "#P#", 3) == 0) {
break;
}
mysql_path_[i] = original_mysql_path_[i];
}
mysql_path_[i] = '\0';
return mysql_path_;
}
}

View File

@ -2,7 +2,7 @@
/*
Copyright(C) 2010 Tetsuro IKEDA
Copyright(C) 2010-2013 Kentoku SHIBA
Copyright(C) 2011-2012 Kouhei Sutou <kou@clear-code.com>
Copyright(C) 2011-2015 Kouhei Sutou <kou@clear-code.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@ -30,21 +30,23 @@ namespace mrn {
static char *default_path_prefix;
static char *default_mysql_data_home_path;
PathMapper(const char *mysql_path,
PathMapper(const char *original_mysql_path,
const char *path_prefix=default_path_prefix,
const char *mysql_data_home_path=default_mysql_data_home_path);
const char *db_path();
const char *db_name();
const char *table_name();
const char *mysql_table_name();
const char *mysql_path();
private:
const char *mysql_path_;
const char *original_mysql_path_;
const char *path_prefix_;
const char *mysql_data_home_path_;
char db_path_[MRN_MAX_PATH_SIZE];
char db_name_[MRN_MAX_PATH_SIZE];
char table_name_[MRN_MAX_PATH_SIZE];
char mysql_table_name_[MRN_MAX_PATH_SIZE];
char mysql_path_[MRN_MAX_PATH_SIZE];
};
}

View File

@ -0,0 +1,64 @@
/* -*- c-basic-offset: 2 -*- */
/*
Copyright(C) 2015 Kouhei Sutou <kou@clear-code.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "mrn_value_decoder.hpp"
#if MYSQL_VERSION_ID >= 50706 && !defined(MRN_MARIADB_P)
# define MRN_DEST_IS_POINTER
#endif
namespace mrn {
namespace value_decoder {
void decode(uint16 *dest, const uchar *source) {
MRN_DBUG_ENTER_FUNCTION();
#ifdef MRN_DEST_IS_POINTER
ushortget(dest, source);
#else
uint16 value;
ushortget(value, source);
*dest = value;
#endif
DBUG_VOID_RETURN;
};
void decode(float *dest, const uchar *source) {
MRN_DBUG_ENTER_FUNCTION();
#ifdef MRN_DEST_IS_POINTER
float4get(dest, source);
#else
float value;
float4get(value, source);
*dest = value;
#endif
DBUG_VOID_RETURN;
};
void decode(double *dest, const uchar *source) {
MRN_DBUG_ENTER_FUNCTION();
#ifdef MRN_DEST_IS_POINTER
float8get(dest, source);
#else
double value;
float8get(value, source);
*dest = value;
#endif
DBUG_VOID_RETURN;
}
}
}

View File

@ -0,0 +1,33 @@
/* -*- c-basic-offset: 2 -*- */
/*
Copyright(C) 2015 Kouhei Sutou <kou@clear-code.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef MRN_VALUE_DECODER_HPP_
#define MRN_VALUE_DECODER_HPP_
#include <mrn_mysql.h>
namespace mrn {
namespace value_decoder {
void decode(uint16 *dest, const uchar *source);
void decode(float *dest, const uchar *source);
void decode(double *dest, const uchar *source);
}
}
#endif // MRN_VALUE_DECODER_HPP_

View File

@ -22,6 +22,8 @@
#ifndef MRN_CONSTANTS_HPP_
#define MRN_CONSTANTS_HPP_
#include <limits.h>
#include <groonga.h>
#define MRN_BUFFER_SIZE 1024

View File

@ -34,5 +34,8 @@
#define ER_MRN_INVALID_COLUMN_FLAG_NUM 16507
#define ER_MRN_INVALID_COLUMN_FLAG_STR \
"The column flag '%-.64s' is invalid. '%-64s' is used instead"
#define ER_MRN_INVALID_INDEX_FLAG_NUM 16508
#define ER_MRN_INVALID_INDEX_FLAG_STR \
"The index flag '%-.64s' is invalid. It is ignored"
#endif /* MRN_ERR_H_ */

View File

@ -47,7 +47,7 @@
# include <mysql_priv.h>
# include <mysql/plugin.h>
#else
# include <sql_priv.h>
# include <sql_const.h>
# include <sql_class.h>
# include <probes_mysql.h>
# include <sql_partition.h>
@ -58,12 +58,6 @@
# define MRN_MARIADB_P 1
#endif
#if MYSQL_VERSION_ID >= 50607
# if !defined(MRN_MARIADB_P)
# define MRN_HAVE_SQL_OPTIMIZER_H
# endif
#endif
#define MRN_MESSAGE_BUFFER_SIZE 1024
#define MRN_DBUG_ENTER_FUNCTION() DBUG_ENTER(__FUNCTION__)

View File

@ -1,6 +1,6 @@
/* -*- c-basic-offset: 2 -*- */
/*
Copyright(C) 2011-2014 Kouhei Sutou <kou@clear-code.com>
Copyright(C) 2011-2015 Kouhei Sutou <kou@clear-code.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@ -61,26 +61,34 @@
# define KEY_N_KEY_PARTS(key) (key)->key_parts
#endif
#if MYSQL_VERSION_ID < 100000 || !defined(MRN_MARIADB_P)
# define init_alloc_root(PTR, SZ1, SZ2, FLAG) init_alloc_root(PTR, SZ1, SZ2)
#if defined(MRN_MARIADB_P) && MYSQL_VERSION_ID >= 100000
# define mrn_init_alloc_root(PTR, SZ1, SZ2, FLAG) \
init_alloc_root(PTR, SZ1, SZ2, FLAG)
#elif MYSQL_VERSION_ID >= 50706
# define mrn_init_alloc_root(PTR, SZ1, SZ2, FLAG) \
init_alloc_root(mrn_memory_key, PTR, SZ1, SZ2)
#else
# define mrn_init_alloc_root(PTR, SZ1, SZ2, FLAG) \
init_alloc_root(PTR, SZ1, SZ2)
#endif
#if MYSQL_VERSION_ID < 100002 || !defined(MRN_MARIADB_P)
# define GTS_TABLE 0
#endif
/* For MySQL 5.1. MySQL 5.1 doesn't have FN_LIBCHAR2. */
#ifndef FN_LIBCHAR2
# define FN_LIBCHAR2 FN_LIBCHAR
#endif
#if MYSQL_VERSION_ID >= 50607
# if MYSQL_VERSION_ID >= 100007 && defined(MRN_MARIADB_P)
# define MRN_GET_ERROR_MESSAGE thd_get_error_message(current_thd)
# define MRN_GET_CURRENT_ROW_FOR_WARNING(thd) thd_get_error_row(thd)
# else
# define MRN_GET_ERROR_MESSAGE current_thd->get_stmt_da()->message()
# define MRN_GET_CURRENT_ROW_FOR_WARNING(thd) thd->get_stmt_da()->current_row_for_warning()
# if MYSQL_VERSION_ID >= 50706
# define MRN_GET_CURRENT_ROW_FOR_WARNING(thd) \
thd->get_stmt_da()->current_row_for_condition()
# else
# define MRN_GET_CURRENT_ROW_FOR_WARNING(thd) \
thd->get_stmt_da()->current_row_for_warning()
# endif
# endif
#else
# if MYSQL_VERSION_ID >= 50500
@ -96,7 +104,7 @@
# define MRN_ITEM_HAVE_ITEM_NAME
#endif
#if MYSQL_VERSION_ID >= 50500 && MYSQL_VERSION_ID < 50700
#if MYSQL_VERSION_ID >= 50500 && MYSQL_VERSION_ID < 100000
# define MRN_HAVE_TABLE_DEF_CACHE
#endif
@ -131,4 +139,82 @@
# define MRN_USE_MYSQL_DATA_HOME
#endif
#if MYSQL_VERSION_ID >= 50706 && !defined(MRN_MARIADB_P)
# define MRN_SEVERITY_WARNING Sql_condition::SL_WARNING
#else
# define MRN_SEVERITY_WARNING Sql_condition::WARN_LEVEL_WARN
#endif
#if MYSQL_VERSION_ID >= 50706 && !defined(MRN_MARIADB_P)
# define MRN_HAVE_PSI_MEMORY_KEY
#endif
#ifdef MRN_HAVE_PSI_MEMORY_KEY
# define mrn_my_malloc(size, flags) \
my_malloc(mrn_memory_key, size, flags)
# define mrn_my_strdup(string, flags) \
my_strdup(mrn_memory_key, string, flags)
# define mrn_my_strndup(string, size, flags) \
my_strndup(mrn_memory_key, string, size, flags)
# define mrn_my_multi_malloc(flags, ...) \
my_multi_malloc(mrn_memory_key, flags, __VA_ARGS__)
#else
# define mrn_my_malloc(size, flags) my_malloc(size, flags)
# define mrn_my_strdup(string, flags) my_strdup(string, flags)
# define mrn_my_strndup(string, size, flags) \
my_strndup(string, size, flags)
# define mrn_my_multi_malloc(flags, ...) \
my_multi_malloc(flags, __VA_ARGS__)
#endif
#if MYSQL_VERSION_ID >= 50706 && !defined(MRN_MARIADB_P)
# define MRN_STRING_FREE(string) string.mem_free();
#else
# define MRN_STRING_FREE(string) string.free();
#endif
#if MYSQL_VERSION_ID >= 50706 && !defined(MRN_MARIADB_P)
# define MRN_THD_DB_PATH(thd) ((thd)->db().str)
#else
# define MRN_THD_DB_PATH(thd) ((thd)->db)
#endif
#ifndef INT_MAX64
# define INT_MAX64 LONGLONG_MAX
#endif
#ifdef UINT_MAX
# define UINT_MAX64 UINT_MAX
#else
# define UINT_MAX64 LONGLONG_MAX
#endif
#if MYSQL_VERSION_ID >= 50706 && !defined(MRN_MARIADB_P)
# define mrn_my_stpmov(dst, src) my_stpmov(dst, src)
#else
# define mrn_my_stpmov(dst, src) strmov(dst, src)
#endif
#if MYSQL_VERSION_ID >= 50607
# if !defined(MRN_MARIADB_P)
# define MRN_HAVE_SQL_OPTIMIZER_H
# endif
#endif
#if MYSQL_VERSION_ID >= 50600 && !defined(MRN_MARIADB_P)
# define MRN_HAVE_BINLOG_H
#endif
#if MYSQL_VERSION_ID >= 50706 && !defined(MRN_MARIADB_P)
# define MRN_HAVE_SPATIAL
#elif defined(HAVE_SPATIAL)
# define MRN_HAVE_SPATIAL
#endif
#if MYSQL_VERSION_ID >= 50706 && !defined(MRN_MARIADB_P)
# define MRN_FORMAT_STRING_LENGTH "zu"
#else
# define MRN_FORMAT_STRING_LENGTH "u"
#endif
#endif /* MRN_MYSQL_COMPAT_H_ */

View File

@ -1,7 +1,7 @@
/* -*- c-basic-offset: 2 -*- */
/*
Copyright(C) 2011-2013 Kentoku SHIBA
Copyright(C) 2011-2014 Kouhei Sutou <kou@clear-code.com>
Copyright(C) 2011-2015 Kouhei Sutou <kou@clear-code.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@ -24,9 +24,15 @@
# include <sql_servers.h>
# include <sql_base.h>
#endif
#ifdef WITH_PARTITION_STORAGE_ENGINE
# include <partition_info.h>
#endif
#include <sql_plugin.h>
#include "mrn_err.h"
#include "mrn_table.hpp"
#include "mrn_mysql_compat.h"
#include "mrn_variables.hpp"
#include <mrn_lock.hpp>
#if MYSQL_VERSION_ID >= 50603 && !defined(MRN_MARIADB_P)
@ -35,6 +41,12 @@
# define MRN_HA_RESOLVE_BY_NAME(name) ha_resolve_by_name(NULL, (name))
#endif
#if MYSQL_VERSION_ID >= 50706 && !defined(MRN_MARIADB_P)
# define MRN_PLUGIN_DATA(plugin, type) plugin_data<type>(plugin)
#else
# define MRN_PLUGIN_DATA(plugin, type) plugin_data(plugin, type)
#endif
#define LEX_STRING_IS_EMPTY(string) \
((string).length == 0 || !(string).str || (string).str[0] == '\0')
@ -47,23 +59,23 @@
extern HASH *mrn_table_def_cache;
#endif
#ifdef HAVE_PSI_INTERFACE
#ifdef WIN32
# ifdef MRN_TABLE_SHARE_HAVE_LOCK_SHARE
extern PSI_mutex_key *mrn_table_share_lock_share;
# endif
# ifdef MRN_TABLE_SHARE_HAVE_LOCK_HA_DATA
extern PSI_mutex_key *mrn_table_share_lock_ha_data;
# endif
#endif
extern PSI_mutex_key mrn_share_mutex_key;
extern PSI_mutex_key mrn_long_term_share_auto_inc_mutex_key;
#endif
#ifdef __cplusplus
extern "C" {
#endif
#ifdef HAVE_PSI_INTERFACE
# ifdef WIN32
# ifdef MRN_TABLE_SHARE_HAVE_LOCK_SHARE
extern PSI_mutex_key *mrn_table_share_lock_share;
# endif
# ifdef MRN_TABLE_SHARE_HAVE_LOCK_HA_DATA
extern PSI_mutex_key *mrn_table_share_lock_ha_data;
# endif
# endif
extern PSI_mutex_key mrn_share_mutex_key;
extern PSI_mutex_key mrn_long_term_share_auto_inc_mutex_key;
#endif
extern HASH mrn_open_tables;
extern mysql_mutex_t mrn_open_tables_mutex;
extern HASH mrn_long_term_share;
@ -135,7 +147,7 @@ static char *mrn_get_string_between_quote(const char *ptr)
DBUG_RETURN(NULL);
size_t length = end_ptr - start_ptr;
char *extracted_string = (char *)my_malloc(length + 1, MYF(MY_WME));
char *extracted_string = (char *)mrn_my_malloc(length + 1, MYF(MY_WME));
if (esc_flg) {
size_t extracted_index = 0;
const char *current_ptr = start_ptr;
@ -372,9 +384,9 @@ int mrn_parse_table_param(MRN_SHARE *share, TABLE *table)
}
{
params_string = my_strndup(params_string_value,
params_string_length,
MYF(MY_WME));
params_string = mrn_my_strndup(params_string_value,
params_string_length,
MYF(MY_WME));
if (!params_string) {
error = HA_ERR_OUT_OF_MEM;
goto error;
@ -437,9 +449,9 @@ int mrn_parse_table_param(MRN_SHARE *share, TABLE *table)
{
share->engine_length = strlen(mrn_default_wrapper_engine);
if (
!(share->engine = my_strndup(mrn_default_wrapper_engine,
share->engine_length,
MYF(MY_WME)))
!(share->engine = mrn_my_strndup(mrn_default_wrapper_engine,
share->engine_length,
MYF(MY_WME)))
) {
error = HA_ERR_OUT_OF_MEM;
goto error;
@ -471,7 +483,7 @@ int mrn_parse_table_param(MRN_SHARE *share, TABLE *table)
error = ER_UNKNOWN_STORAGE_ENGINE;
goto error;
}
share->hton = plugin_data(share->plugin, handlerton *);
share->hton = MRN_PLUGIN_DATA(share->plugin, handlerton *);
share->wrapper_mode = TRUE;
}
}
@ -507,7 +519,7 @@ int mrn_add_index_param(MRN_SHARE *share, KEY *key_info, int i)
my_free(share->key_parser[i]);
}
if (
!(share->key_parser[i] = my_strdup(mrn_default_parser, MYF(MY_WME)))
!(share->key_parser[i] = mrn_my_strdup(mrn_default_parser, MYF(MY_WME)))
) {
error = HA_ERR_OUT_OF_MEM;
goto error;
@ -517,9 +529,9 @@ int mrn_add_index_param(MRN_SHARE *share, KEY *key_info, int i)
}
DBUG_PRINT("info", ("mroonga create comment string"));
if (
!(param_string = my_strndup(key_info->comment.str,
key_info->comment.length,
MYF(MY_WME)))
!(param_string = mrn_my_strndup(key_info->comment.str,
key_info->comment.length,
MYF(MY_WME)))
) {
error = HA_ERR_OUT_OF_MEM;
goto error_alloc_param_string;
@ -569,7 +581,7 @@ int mrn_add_index_param(MRN_SHARE *share, KEY *key_info, int i)
#endif
if (!share->key_parser[i]) {
if (
!(share->key_parser[i] = my_strdup(mrn_default_parser, MYF(MY_WME)))
!(share->key_parser[i] = mrn_my_strdup(mrn_default_parser, MYF(MY_WME)))
) {
error = HA_ERR_OUT_OF_MEM;
goto error;
@ -630,9 +642,9 @@ int mrn_add_column_param(MRN_SHARE *share, Field *field, int i)
DBUG_PRINT("info", ("mroonga create comment string"));
if (
!(param_string = my_strndup(field->comment.str,
field->comment.length,
MYF(MY_WME)))
!(param_string = mrn_my_strndup(field->comment.str,
field->comment.length,
MYF(MY_WME)))
) {
error = HA_ERR_OUT_OF_MEM;
goto error_alloc_param_string;
@ -768,7 +780,7 @@ MRN_LONG_TERM_SHARE *mrn_get_long_term_share(const char *table_name,
table_name_length)))
{
if (!(long_term_share = (MRN_LONG_TERM_SHARE *)
my_multi_malloc(MYF(MY_WME | MY_ZEROFILL),
mrn_my_multi_malloc(MYF(MY_WME | MY_ZEROFILL),
&long_term_share, sizeof(*long_term_share),
&tmp_name, table_name_length + 1,
NullS))
@ -817,7 +829,7 @@ MRN_SHARE *mrn_get_share(const char *table_name, TABLE *table, int *error)
(uchar*) table_name, length)))
{
if (!(share = (MRN_SHARE *)
my_multi_malloc(MYF(MY_WME | MY_ZEROFILL),
mrn_my_multi_malloc(MYF(MY_WME | MY_ZEROFILL),
&share, sizeof(*share),
&tmp_name, length + 1,
&index_table, sizeof(char *) * table->s->keys,
@ -847,7 +859,7 @@ MRN_SHARE *mrn_get_share(const char *table_name, TABLE *table, int *error)
share->col_flags_length = col_flags_length;
share->col_type = col_type;
share->col_type_length = col_type_length;
strmov(share->table_name, table_name);
mrn_my_stpmov(share->table_name, table_name);
share->table_share = table->s;
if (
@ -1033,7 +1045,7 @@ TABLE_SHARE *mrn_create_tmp_table_share(TABLE_LIST *table_list, const char *path
share->tmp_table = INTERNAL_TMP_TABLE; // TODO: is this right?
share->path.str = (char *) path;
share->path.length = strlen(share->path.str);
share->normalized_path.str = my_strdup(path, MYF(MY_WME));
share->normalized_path.str = mrn_my_strdup(path, MYF(MY_WME));
share->normalized_path.length = strlen(share->normalized_path.str);
if (open_table_def(thd, share, GTS_TABLE))
{
@ -1060,7 +1072,7 @@ KEY *mrn_create_key_info_for_table(MRN_SHARE *share, TABLE *table, int *error)
if (share->wrap_keys)
{
if (!(wrap_key_info = (KEY *)
my_multi_malloc(MYF(MY_WME | MY_ZEROFILL),
mrn_my_multi_malloc(MYF(MY_WME | MY_ZEROFILL),
&wrap_key_info, sizeof(*wrap_key_info) * share->wrap_keys,
NullS))
) {

View File

@ -0,0 +1,29 @@
/* -*- c-basic-offset: 2 -*- */
/*
Copyright(C) 2015 Kouhei Sutou <kou@clear-code.com>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef MRN_VARIABLES_HPP_
#define MRN_VARIABLES_HPP_
#include "mrn_mysql_compat.h"
#ifdef MRN_HAVE_PSI_MEMORY_KEY
extern PSI_memory_key mrn_memory_key;
#endif
#endif /* MRN_VARIABLES_HPP_ */

View File

@ -1,4 +1,4 @@
# Copyright(C) 2012-2013 Kouhei Sutou <kou@clear-code.com>
# Copyright(C) 2012-2015 Kouhei Sutou <kou@clear-code.com>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
@ -20,9 +20,11 @@ let $version_major_minor =
let $version_55 = `SELECT $version_major_minor = 5.5`;
let $version_56 = `SELECT $version_major_minor = 5.6`;
let $version_57 = `SELECT $version_major_minor = 5.7`;
let $version_100 = `SELECT $version_major_minor = 10.0`;
let $version_55_or_later = `SELECT $version_major_minor >= 5.5`;
let $version_56_or_later = `SELECT $version_major_minor >= 5.6`;
let $version_57_or_later = `SELECT $version_major_minor >= 5.7`;
let $version_100_or_later = `SELECT $version_major_minor >= 10.0`;
--enable_query_log

View File

@ -0,0 +1,21 @@
# Copyright(C) 2015 Kouhei Sutou <kou@clear-code.com>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
--source ../../include/mroonga/check_version.inc
if (!$version_57) {
skip This test is for MySQL version 5.7.x;
}

View File

@ -0,0 +1,24 @@
# Copyright(C) 2012-2015 Kouhei Sutou <kou@clear-code.com>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
--source ../../include/mroonga/check_version.inc
--source ../../include/mroonga/check_mariadb.inc
if ($version_100_or_later) {
if ($mariadb) {
skip This test is not for MariaDB 10.x;
}
}

View File

@ -0,0 +1,24 @@
# Copyright(C) 2015 Kouhei Sutou <kou@clear-code.com>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
--source ../../include/mroonga/check_version.inc
--source ../../include/mroonga/check_mariadb.inc
if ($version_57) {
if (!$mariadb) {
skip This test is not for MySQL 5.7.x;
}
}

View File

@ -2,8 +2,8 @@ CREATE TABLE tags (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
) DEFAULT CHARSET=utf8;
ALTER TABLE tags ADD COLUMN name VARCHAR(64) COMMENT 'flags "COLUMN_VECTOR"';
SELECT mroonga_command("dump");
mroonga_command("dump")
SELECT mroonga_command("dump --dump_plugins no");
mroonga_command("dump --dump_plugins no")
table_create tags TABLE_PAT_KEY UInt32
column_create tags id COLUMN_SCALAR UInt32
column_create tags name COLUMN_VECTOR ShortText

View File

@ -5,12 +5,14 @@ CREATE TABLE bugs (
id INT UNSIGNED PRIMARY KEY
) DEFAULT CHARSET=utf8;
ALTER TABLE bugs ADD COLUMN name VARCHAR(64) COMMENT 'type "tags"';
SELECT mroonga_command("dump");
mroonga_command("dump")
SELECT mroonga_command("dump --dump_plugins no");
mroonga_command("dump --dump_plugins no")
table_create tags TABLE_PAT_KEY UInt32
column_create tags id COLUMN_SCALAR UInt32
table_create bugs TABLE_PAT_KEY UInt32
column_create bugs id COLUMN_SCALAR UInt32
column_create bugs name COLUMN_SCALAR tags
DROP TABLE bugs;
DROP TABLE tags;

View File

@ -5,15 +5,13 @@ SET NAMES utf8;
CREATE TABLE memos (
content VARCHAR(64) NOT NULL
) DEFAULT CHARSET=utf8;
SELECT mroonga_command("dump");
mroonga_command("dump")
table_create memos TABLE_NO_KEY
column_create memos content COLUMN_SCALAR ShortText
ALTER TABLE memos ADD FULLTEXT INDEX (content) COMMENT 'token_filters "TokenFilterStopWord"';
SELECT mroonga_command("dump");
mroonga_command("dump")
SELECT mroonga_command("dump --dump_plugins no");
mroonga_command("dump --dump_plugins no")
table_create memos TABLE_NO_KEY
column_create memos content COLUMN_SCALAR ShortText
table_create memos-content TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerMySQLGeneralCI --token_filters TokenFilterStopWord
column_create memos-content index COLUMN_INDEX|WITH_POSITION memos content
DROP TABLE memos;

View File

@ -0,0 +1,17 @@
DROP TABLE IF EXISTS ids;
CREATE TABLE ids (
id INT NOT NULL
) ENGINE=Mroonga DEFAULT CHARSET=utf8;
INSERT INTO ids VALUES (1);
INSERT INTO ids VALUES (2);
ALTER TABLE ids ADD PRIMARY KEY (id);
SHOW CREATE TABLE ids;
Table Create Table
ids CREATE TABLE `ids` (
`id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=Mroonga DEFAULT CHARSET=utf8
SELECT * FROM ids WHERE id = 2;
id
2
DROP TABLE ids;

View File

@ -10,23 +10,39 @@ id INT NOT NULL PRIMARY KEY,
content TEXT NOT NULL,
FULLTEXT INDEX (content) COMMENT 'table "terms"'
) DEFAULT CHARSET=utf8;
SELECT mroonga_command("dump");
mroonga_command("dump")
SELECT mroonga_command("dump --dump_plugins no");
mroonga_command("dump --dump_plugins no")
table_create terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerMySQLGeneralCI
column_create terms is_stop_word COLUMN_SCALAR Int8
column_create terms term COLUMN_SCALAR ShortText
table_create memos TABLE_PAT_KEY Int32
column_create memos content COLUMN_SCALAR LongText
column_create memos id COLUMN_SCALAR Int32
column_create terms content COLUMN_INDEX|WITH_POSITION memos content
ALTER TABLE terms COMMENT='default_tokenizer "TokenBigram", token_filters "TokenFilterStopWord"';
SELECT mroonga_command("dump");
mroonga_command("dump")
SELECT mroonga_command("dump --dump_plugins no");
mroonga_command("dump --dump_plugins no")
table_create memos TABLE_PAT_KEY Int32
column_create memos content COLUMN_SCALAR LongText
column_create memos id COLUMN_SCALAR Int32
table_create terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerMySQLGeneralCI --token_filters TokenFilterStopWord
column_create terms is_stop_word COLUMN_SCALAR Int8
column_create terms term COLUMN_SCALAR ShortText
ALTER TABLE memos DISABLE KEYS;
ALTER TABLE memos ENABLE KEYS;
SELECT mroonga_command("dump --dump_plugins no");
mroonga_command("dump --dump_plugins no")
table_create memos TABLE_PAT_KEY Int32
column_create memos content COLUMN_SCALAR LongText
column_create memos id COLUMN_SCALAR Int32
table_create terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerMySQLGeneralCI --token_filters TokenFilterStopWord
column_create terms is_stop_word COLUMN_SCALAR Int8
column_create terms term COLUMN_SCALAR ShortText
column_create terms content COLUMN_INDEX|WITH_POSITION memos content
DROP TABLE memos;
DROP TABLE terms;

View File

@ -8,20 +8,24 @@ id int PRIMARY KEY,
content text NOT NULL,
FULLTEXT INDEX content_index (content) COMMENT 'table "terms"'
) DEFAULT CHARSET=utf8;
SELECT mroonga_command("dump");
mroonga_command("dump")
SELECT mroonga_command("dump --dump_plugins no");
mroonga_command("dump --dump_plugins no")
table_create terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerAuto
column_create terms term COLUMN_SCALAR ShortText
table_create memos TABLE_PAT_KEY Int32
column_create memos content COLUMN_SCALAR LongText
column_create memos id COLUMN_SCALAR Int32
column_create terms content_index COLUMN_INDEX|WITH_POSITION memos content
ALTER TABLE memos DISABLE KEYS;
SELECT mroonga_command("dump");
mroonga_command("dump")
SELECT mroonga_command("dump --dump_plugins no");
mroonga_command("dump --dump_plugins no")
table_create terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerAuto
column_create terms term COLUMN_SCALAR ShortText
table_create memos TABLE_PAT_KEY Int32
column_create memos content COLUMN_SCALAR LongText
column_create memos id COLUMN_SCALAR Int32
DROP TABLE memos, terms;
DROP TABLE memos;
DROP TABLE terms;

View File

@ -0,0 +1,16 @@
DROP TABLE IF EXISTS ids;
CREATE TABLE ids (
id INT PRIMARY KEY
) ENGINE=Mroonga DEFAULT CHARSET=utf8;
INSERT INTO ids VALUES (1);
INSERT INTO ids VALUES (2);
ALTER TABLE ids DROP PRIMARY KEY;
SHOW CREATE TABLE ids;
Table Create Table
ids CREATE TABLE `ids` (
`id` int(11) NOT NULL
) ENGINE=Mroonga DEFAULT CHARSET=utf8
SELECT * FROM ids WHERE id = 2;
id
2
DROP TABLE ids;

View File

@ -9,20 +9,24 @@ content text NOT NULL,
FULLTEXT INDEX content_index (content) COMMENT 'table "terms"'
) DEFAULT CHARSET=utf8;
ALTER TABLE memos DISABLE KEYS;
SELECT mroonga_command("dump");
mroonga_command("dump")
SELECT mroonga_command("dump --dump_plugins no");
mroonga_command("dump --dump_plugins no")
table_create terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerAuto
column_create terms term COLUMN_SCALAR ShortText
table_create memos TABLE_PAT_KEY Int32
column_create memos content COLUMN_SCALAR LongText
column_create memos id COLUMN_SCALAR Int32
ALTER TABLE memos ENABLE KEYS;
SELECT mroonga_command("dump");
mroonga_command("dump")
SELECT mroonga_command("dump --dump_plugins no");
mroonga_command("dump --dump_plugins no")
table_create terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerAuto
column_create terms term COLUMN_SCALAR ShortText
table_create memos TABLE_PAT_KEY Int32
column_create memos content COLUMN_SCALAR LongText
column_create memos id COLUMN_SCALAR Int32
column_create terms content_index COLUMN_INDEX|WITH_POSITION memos content
DROP TABLE memos, terms;
DROP TABLE memos;
DROP TABLE terms;

View File

@ -6,115 +6,115 @@ location GEOMETRY NOT NULL
);
INSERT INTO shops (name, location)
VALUES ('nezu-no-taiyaki',
GeomFromText('POINT(139.762573 35.720253)'));
ST_GeomFromText('POINT(139.762573 35.720253)'));
INSERT INTO shops (name, location)
VALUES ('taiyaki-kataoka',
GeomFromText('POINT(139.715591 35.712521)'));
ST_GeomFromText('POINT(139.715591 35.712521)'));
INSERT INTO shops (name, location)
VALUES ('soba-taiyaki-ku',
GeomFromText('POINT(139.659088 35.683712)'));
ST_GeomFromText('POINT(139.659088 35.683712)'));
INSERT INTO shops (name, location)
VALUES ('kuruma',
GeomFromText('POINT(139.706207 35.721516)'));
ST_GeomFromText('POINT(139.706207 35.721516)'));
INSERT INTO shops (name, location)
VALUES ('hirose-ya',
GeomFromText('POINT(139.685608 35.714844)'));
ST_GeomFromText('POINT(139.685608 35.714844)'));
INSERT INTO shops (name, location)
VALUES ('sazare',
GeomFromText('POINT(139.685043 35.714653)'));
ST_GeomFromText('POINT(139.685043 35.714653)'));
INSERT INTO shops (name, location)
VALUES ('omede-taiyaki',
GeomFromText('POINT(139.817154 35.700516)'));
ST_GeomFromText('POINT(139.817154 35.700516)'));
INSERT INTO shops (name, location)
VALUES ('onaga-ya',
GeomFromText('POINT(139.81105 35.698254)'));
ST_GeomFromText('POINT(139.81105 35.698254)'));
INSERT INTO shops (name, location)
VALUES ('shiro-ya',
GeomFromText('POINT(139.638611 35.705517)'));
ST_GeomFromText('POINT(139.638611 35.705517)'));
INSERT INTO shops (name, location)
VALUES ('fuji-ya',
GeomFromText('POINT(139.637115 35.703938)'));
ST_GeomFromText('POINT(139.637115 35.703938)'));
INSERT INTO shops (name, location)
VALUES ('miyoshi',
GeomFromText('POINT(139.537323 35.644539)'));
ST_GeomFromText('POINT(139.537323 35.644539)'));
INSERT INTO shops (name, location)
VALUES ('juju-ya',
GeomFromText('POINT(139.695755 35.628922)'));
ST_GeomFromText('POINT(139.695755 35.628922)'));
INSERT INTO shops (name, location)
VALUES ('tatsumi-ya',
GeomFromText('POINT(139.638657 35.665501)'));
ST_GeomFromText('POINT(139.638657 35.665501)'));
INSERT INTO shops (name, location)
VALUES ('tetsuji',
GeomFromText('POINT(139.76857 35.680912)'));
ST_GeomFromText('POINT(139.76857 35.680912)'));
INSERT INTO shops (name, location)
VALUES ('gazuma-ya',
GeomFromText('POINT(139.647598 35.700817)'));
ST_GeomFromText('POINT(139.647598 35.700817)'));
INSERT INTO shops (name, location)
VALUES ('honma-mon',
GeomFromText('POINT(139.652573 35.722736)'));
ST_GeomFromText('POINT(139.652573 35.722736)'));
INSERT INTO shops (name, location)
VALUES ('naniwa-ya',
GeomFromText('POINT(139.796234 35.730061)'));
ST_GeomFromText('POINT(139.796234 35.730061)'));
INSERT INTO shops (name, location)
VALUES ('kuro-dai',
GeomFromText('POINT(139.704834 35.650345)'));
ST_GeomFromText('POINT(139.704834 35.650345)'));
INSERT INTO shops (name, location)
VALUES ('daruma',
GeomFromText('POINT(139.770599 35.681461)'));
ST_GeomFromText('POINT(139.770599 35.681461)'));
INSERT INTO shops (name, location)
VALUES ('yanagi-ya',
GeomFromText('POINT(139.783981 35.685341)'));
ST_GeomFromText('POINT(139.783981 35.685341)'));
INSERT INTO shops (name, location)
VALUES ('sharaku',
GeomFromText('POINT(139.794846 35.716969)'));
ST_GeomFromText('POINT(139.794846 35.716969)'));
INSERT INTO shops (name, location)
VALUES ('takane',
GeomFromText('POINT(139.560913 35.698601)'));
ST_GeomFromText('POINT(139.560913 35.698601)'));
INSERT INTO shops (name, location)
VALUES ('chiyoda',
GeomFromText('POINT(139.652817 35.642601)'));
ST_GeomFromText('POINT(139.652817 35.642601)'));
INSERT INTO shops (name, location)
VALUES ('da-ka-po',
GeomFromText('POINT(139.727356 35.627346)'));
ST_GeomFromText('POINT(139.727356 35.627346)'));
INSERT INTO shops (name, location)
VALUES ('matsushima-ya',
GeomFromText('POINT(139.737381 35.640556)'));
ST_GeomFromText('POINT(139.737381 35.640556)'));
INSERT INTO shops (name, location)
VALUES ('kazuya',
GeomFromText('POINT(139.760895 35.673508)'));
ST_GeomFromText('POINT(139.760895 35.673508)'));
INSERT INTO shops (name, location)
VALUES ('furuya-kogane-an',
GeomFromText('POINT(139.676071 35.680603)'));
ST_GeomFromText('POINT(139.676071 35.680603)'));
INSERT INTO shops (name, location)
VALUES ('hachi-no-ie',
GeomFromText('POINT(139.668106 35.608021)'));
ST_GeomFromText('POINT(139.668106 35.608021)'));
INSERT INTO shops (name, location)
VALUES ('azuki-chan',
GeomFromText('POINT(139.673203 35.64151)'));
ST_GeomFromText('POINT(139.673203 35.64151)'));
INSERT INTO shops (name, location)
VALUES ('kuriko-an',
GeomFromText('POINT(139.796829 35.712013)'));
ST_GeomFromText('POINT(139.796829 35.712013)'));
INSERT INTO shops (name, location)
VALUES ('yume-no-aru-machi-no-taiyaki-ya-san',
GeomFromText('POINT(139.712524 35.616199)'));
ST_GeomFromText('POINT(139.712524 35.616199)'));
INSERT INTO shops (name, location)
VALUES ('naze-ya',
GeomFromText('POINT(139.665833 35.609039)'));
ST_GeomFromText('POINT(139.665833 35.609039)'));
INSERT INTO shops (name, location)
VALUES ('sanoki-ya',
GeomFromText('POINT(139.770721 35.66592)'));
ST_GeomFromText('POINT(139.770721 35.66592)'));
INSERT INTO shops (name, location)
VALUES ('shigeta',
GeomFromText('POINT(139.780273 35.672626)'));
ST_GeomFromText('POINT(139.780273 35.672626)'));
INSERT INTO shops (name, location)
VALUES ('nishimi-ya',
GeomFromText('POINT(139.774628 35.671825)'));
ST_GeomFromText('POINT(139.774628 35.671825)'));
INSERT INTO shops (name, location)
VALUES ('hiiragi',
GeomFromText('POINT(139.711517 35.647701)'));
ST_GeomFromText('POINT(139.711517 35.647701)'));
ALTER TABLE shops ADD SPATIAL KEY location_index (location);
SELECT id, name, AsText(location) AS location_text FROM shops
WHERE MBRContains(GeomFromText('LineString(139.7727 35.6684, 139.7038 35.7121)'), location)
SELECT id, name, ST_AsText(location) AS location_text FROM shops
WHERE MBRContains(ST_GeomFromText('LineString(139.7727 35.6684, 139.7038 35.7121)'), location)
ORDER BY id;
id name location_text
14 tetsuji POINT(139.76857 35.680911944444446)

View File

@ -0,0 +1,11 @@
DROP TABLE IF EXISTS diaries;
SET NAMES utf8mb4;
CREATE TABLE diaries (
content varchar(256) COLLATE utf8mb4_unicode_520_ci,
FULLTEXT INDEX (content)
) DEFAULT CHARSET=utf8mb4;
INSERT INTO diaries VALUES ("Je suis un garçon.");
SELECT * FROM diaries WHERE MATCH (content) AGAINST ("+garcon" IN BOOLEAN MODE);
content
Je suis un garçon.
DROP TABLE diaries;

View File

@ -0,0 +1,12 @@
DROP TABLE IF EXISTS diaries;
SET NAMES utf8mb4;
CREATE TABLE diaries (
content varchar(256) COLLATE utf8mb4_unicode_520_ci,
FULLTEXT INDEX (content)
) DEFAULT CHARSET=utf8mb4;
INSERT INTO diaries VALUES ("ひらがなとカタカナを覚えました。");
SELECT * FROM diaries
WHERE MATCH (content) AGAINST ("+かたかな" IN BOOLEAN MODE);
content
ひらがなとカタカナを覚えました。
DROP TABLE diaries;

View File

@ -12,26 +12,17 @@ tags TEXT COMMENT 'flags "COLUMN_VECTOR", type "tags"',
FULLTEXT INDEX bugs_tags_index (tags) COMMENT 'table "tags"'
) DEFAULT CHARSET=utf8;
INSERT INTO bugs (id, tags) VALUES (1, "Linux MySQL groonga");
SELECT mroonga_command("dump");
mroonga_command("dump")
SELECT mroonga_command("dump --dump_plugins no --dump_records no");
mroonga_command("dump --dump_plugins no --dump_records no")
table_create tags TABLE_PAT_KEY ShortText --default_tokenizer TokenDelimit
column_create tags name COLUMN_SCALAR ShortText
table_create bugs TABLE_PAT_KEY UInt32
column_create bugs id COLUMN_SCALAR UInt32
column_create bugs tags COLUMN_VECTOR tags
column_create tags bugs_tags_index COLUMN_INDEX|WITH_POSITION bugs tags
load --table tags
[
["_key","name"],
["Linux",""],
["MySQL",""],
["groonga",""]
]
load --table bugs
[
["_key","id","tags"],
[1,1,["Linux","MySQL","groonga"]]
]
SELECT *, MATCH (tags) AGAINST ("+MySQL" IN BOOLEAN MODE) AS score
FROM bugs
WHERE MATCH (tags) AGAINST ("+MySQL" IN BOOLEAN MODE);

View File

@ -13,28 +13,17 @@ INDEX bugs_priority_index (priority) COMMENT 'table "priorities"'
INSERT INTO bugs (id, priority) VALUES (1, 10);
INSERT INTO bugs (id, priority) VALUES (2, 3);
INSERT INTO bugs (id, priority) VALUES (3, -2);
SELECT mroonga_command("dump");
mroonga_command("dump")
SELECT mroonga_command("dump --dump_plugins no --dump_records no");
mroonga_command("dump --dump_plugins no --dump_records no")
table_create priorities TABLE_PAT_KEY Int32
column_create priorities id COLUMN_SCALAR Int32
table_create bugs TABLE_PAT_KEY UInt32
column_create bugs id COLUMN_SCALAR UInt32
column_create bugs priority COLUMN_SCALAR priorities
column_create priorities bugs_priority_index COLUMN_INDEX|WITH_POSITION bugs priority
load --table priorities
[
["_key","id"],
[-2,0],
[3,0],
[10,0]
]
load --table bugs
[
["_key","id","priority"],
[1,1,10],
[2,2,3],
[3,3,-2]
]
SELECT *
FROM bugs
WHERE priority = 3;

View File

@ -3,8 +3,8 @@ name VARCHAR(64) PRIMARY KEY
) DEFAULT CHARSET=utf8
COLLATE=utf8_bin
COMMENT='default_tokenizer "TokenDelimit"';
SELECT mroonga_command("dump");
mroonga_command("dump")
SELECT mroonga_command("dump --dump_plugins no");
mroonga_command("dump --dump_plugins no")
table_create tags TABLE_PAT_KEY ShortText --default_tokenizer TokenDelimit
column_create tags name COLUMN_SCALAR ShortText
DROP TABLE tags;

View File

@ -0,0 +1,9 @@
SET NAMES utf8;
CREATE TABLE memos (
content VARCHAR(64) NOT NULL,
FULLTEXT INDEX (content) COMMENT 'index_flags "NONE"'
) DEFAULT CHARSET=utf8;
SELECT mroonga_command("dump --dump_plugins no --dump_schema no");
mroonga_command("dump --dump_plugins no --dump_schema no")
column_create memos-content index COLUMN_INDEX memos content
DROP TABLE memos;

View File

@ -0,0 +1,9 @@
SET NAMES utf8;
CREATE TABLE memos (
content VARCHAR(64) NOT NULL,
FULLTEXT INDEX (content) COMMENT 'index_flags "WITH_POSITION|WITH_WEIGHT"'
) DEFAULT CHARSET=utf8;
SELECT mroonga_command("dump --dump_plugins no --dump_schema no");
mroonga_command("dump --dump_plugins no --dump_schema no")
column_create memos-content index COLUMN_INDEX|WITH_WEIGHT|WITH_POSITION memos content
DROP TABLE memos;

View File

@ -0,0 +1,19 @@
DROP TABLE IF EXISTS memos;
DROP TABLE IF EXISTS terms;
SET NAMES utf8;
CREATE TABLE terms (
term VARCHAR(64) NOT NULL,
PRIMARY KEY (term) USING HASH
) COMMENT='default_tokenizer "TokenBigram", normalizer "NormalizerAuto"' DEFAULT CHARSET=utf8;
CREATE TABLE memos (
id INT NOT NULL PRIMARY KEY,
content TEXT NOT NULL,
FULLTEXT INDEX (content) COMMENT 'table "terms"'
) DEFAULT CHARSET=utf8;
INSERT INTO memos VALUES (1, "1日の消費㌍は約2000㌔㌍");
SELECT * FROM memos
WHERE MATCH (content) AGAINST ("+カロリー" IN BOOLEAN MODE);
id content
1 1日の消費㌍は約2000㌔㌍
DROP TABLE memos;
DROP TABLE terms;

View File

@ -5,12 +5,14 @@ CREATE TABLE bugs (
id INT UNSIGNED PRIMARY KEY,
tag VARCHAR(64) COMMENT 'type "tags"'
) DEFAULT CHARSET=utf8;
SELECT mroonga_command("dump");
mroonga_command("dump")
SELECT mroonga_command("dump --dump_plugins no");
mroonga_command("dump --dump_plugins no")
table_create tags TABLE_PAT_KEY ShortText
column_create tags name COLUMN_SCALAR ShortText
table_create bugs TABLE_PAT_KEY UInt32
column_create bugs id COLUMN_SCALAR UInt32
column_create bugs tag COLUMN_SCALAR tags
DROP TABLE bugs;
DROP TABLE tags;

View File

@ -6,10 +6,12 @@ CREATE TABLE memos (
content VARCHAR(64) NOT NULL,
FULLTEXT INDEX (content) COMMENT 'token_filters "TokenFilterStopWord,TokenFilterStopWord"'
) DEFAULT CHARSET=utf8;
SELECT mroonga_command("dump");
mroonga_command("dump")
SELECT mroonga_command("dump --dump_plugins no");
mroonga_command("dump --dump_plugins no")
table_create memos TABLE_NO_KEY
column_create memos content COLUMN_SCALAR ShortText
table_create memos-content TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerMySQLGeneralCI --token_filters TokenFilterStopWord,TokenFilterStopWord
column_create memos-content index COLUMN_INDEX|WITH_POSITION memos content
DROP TABLE memos;

View File

@ -6,10 +6,12 @@ CREATE TABLE memos (
content VARCHAR(64) NOT NULL,
FULLTEXT INDEX (content) COMMENT 'token_filters "TokenFilterStopWord"'
) DEFAULT CHARSET=utf8;
SELECT mroonga_command("dump");
mroonga_command("dump")
SELECT mroonga_command("dump --dump_plugins no");
mroonga_command("dump --dump_plugins no")
table_create memos TABLE_NO_KEY
column_create memos content COLUMN_SCALAR ShortText
table_create memos-content TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerMySQLGeneralCI --token_filters TokenFilterStopWord
column_create memos-content index COLUMN_INDEX|WITH_POSITION memos content
DROP TABLE memos;

View File

@ -10,14 +10,16 @@ id INT NOT NULL PRIMARY KEY,
content TEXT NOT NULL,
FULLTEXT INDEX (content) COMMENT 'table "terms"'
) DEFAULT CHARSET=utf8;
SELECT mroonga_command("dump");
mroonga_command("dump")
SELECT mroonga_command("dump --dump_plugins no");
mroonga_command("dump --dump_plugins no")
table_create terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerMySQLGeneralCI --token_filters TokenFilterStopWord,TokenFilterStopWord
column_create terms is_stop_word COLUMN_SCALAR Int8
column_create terms term COLUMN_SCALAR ShortText
table_create memos TABLE_PAT_KEY Int32
column_create memos content COLUMN_SCALAR LongText
column_create memos id COLUMN_SCALAR Int32
column_create terms content COLUMN_INDEX|WITH_POSITION memos content
DROP TABLE memos;
DROP TABLE terms;

View File

@ -10,14 +10,16 @@ id INT NOT NULL PRIMARY KEY,
content TEXT NOT NULL,
FULLTEXT INDEX (content) COMMENT 'table "terms"'
) DEFAULT CHARSET=utf8;
SELECT mroonga_command("dump");
mroonga_command("dump")
SELECT mroonga_command("dump --dump_plugins no");
mroonga_command("dump --dump_plugins no")
table_create terms TABLE_PAT_KEY ShortText --default_tokenizer TokenBigram --normalizer NormalizerMySQLGeneralCI --token_filters TokenFilterStopWord
column_create terms is_stop_word COLUMN_SCALAR Int8
column_create terms term COLUMN_SCALAR ShortText
table_create memos TABLE_PAT_KEY Int32
column_create memos content COLUMN_SCALAR LongText
column_create memos id COLUMN_SCALAR Int32
column_create terms content COLUMN_INDEX|WITH_POSITION memos content
DROP TABLE memos;
DROP TABLE terms;

View File

@ -2,8 +2,8 @@ CREATE TABLE bugs (
id INT UNSIGNED PRIMARY KEY,
tags TEXT COMMENT 'flags "COLUMN_VECTOR"'
) DEFAULT CHARSET=utf8;
SELECT mroonga_command("dump");
mroonga_command("dump")
SELECT mroonga_command("dump --dump_plugins no");
mroonga_command("dump --dump_plugins no")
table_create bugs TABLE_PAT_KEY UInt32
column_create bugs id COLUMN_SCALAR UInt32
column_create bugs tags COLUMN_VECTOR LongText

View File

@ -0,0 +1,21 @@
DROP TABLE IF EXISTS memos;
SET NAMES utf8;
CREATE TABLE memos (
id INT PRIMARY KEY,
title VARCHAR(255),
content TEXT,
FULLTEXT INDEX (title, content)
) DEFAULT CHARSET=utf8;
INSERT INTO memos VALUES(1, "Groonga", "Groonga is fast.");
INSERT INTO memos VALUES(2, "Mroonga", "Mroonga is also fast.");
INSERT INTO memos VALUES(3, "Rroonga", "Rroonga is also fast.");
SELECT *,
MATCH(title, content)
AGAINST("*W1:10,2:2DOR Groonga Mroonga" in BOOLEAN MODE) AS score
FROM memos
WHERE MATCH(title, content)
AGAINST("*W1:10,2:2DOR Groonga Mroonga" in BOOLEAN MODE);
id title content score
1 Groonga Groonga is fast. 12
2 Mroonga Mroonga is also fast. 12
DROP TABLE memos;

View File

@ -43,24 +43,4 @@ select * from t2 where c2>"s" order by c1 asc;
c1 c2
4 sa si su se so
5 ta ti ii ii to
select * from t1 where match(c2) against("ii") order by match(c2) against("ii") desc;
c1 c2
3 aa ii ii ii oo
5 ta ti ii ii to
1 aa ii uu ee oo
select * from t2 where match(c2) against("ii") order by match(c2) against("ii") asc;
c1 c2
1 aa ii uu ee oo
5 ta ti ii ii to
3 aa ii ii ii oo
select c1,c2,match(c2) against("ii") from t1 where match(c2) against("ii");
c1 c2 match(c2) against("ii")
1 aa ii uu ee oo 174763
3 aa ii ii ii oo 524289
5 ta ti ii ii to 349526
select c1,c2,match(c2) against("ii") from t2 where match(c2) against("ii");
c1 c2 match(c2) against("ii")
1 aa ii uu ee oo 174763
3 aa ii ii ii oo 524289
5 ta ti ii ii to 349526
drop table t1,t2;

View File

@ -0,0 +1,34 @@
DROP TABLE IF EXISTS logs;
SET NAMES UTF8;
CREATE TABLE logs(
message TEXT,
FULLTEXT KEY (message)
) DEFAULT CHARSET=utf8;
INSERT INTO logs VALUES("Error Error Error");
INSERT INTO logs VALUES("Warning Warning Warning");
INSERT INTO logs VALUES("Error Error");
INSERT INTO logs VALUES("Warning Warning");
INSERT INTO logs VALUES("Error");
INSERT INTO logs VALUES("Warning");
INSERT INTO logs VALUES("Error Error Error Error");
INSERT INTO logs VALUES("Warning Warning Warning Warning");
SELECT * FROM logs;
message
Error Error Error
Warning Warning Warning
Error Error
Warning Warning
Error
Warning
Error Error Error Error
Warning Warning Warning Warning
SELECT *, MATCH(message) AGAINST("Error" IN NATURAL LANGUAGE MODE) AS score
FROM logs
WHERE MATCH(message) AGAINST("Error" IN NATURAL LANGUAGE MODE)
ORDER BY MATCH(message) AGAINST("Error" IN NATURAL LANGUAGE MODE) ASC;
message score
Error 174763
Error Error 349526
Error Error Error 524289
Error Error Error Error 699052
DROP TABLE logs;

View File

@ -0,0 +1,34 @@
DROP TABLE IF EXISTS logs;
SET NAMES UTF8;
CREATE TABLE logs(
message TEXT,
FULLTEXT KEY (message)
) DEFAULT CHARSET=utf8;
INSERT INTO logs VALUES("Error Error Error");
INSERT INTO logs VALUES("Warning Warning Warning");
INSERT INTO logs VALUES("Error Error");
INSERT INTO logs VALUES("Warning Warning");
INSERT INTO logs VALUES("Error");
INSERT INTO logs VALUES("Warning");
INSERT INTO logs VALUES("Error Error Error Error");
INSERT INTO logs VALUES("Warning Warning Warning Warning");
SELECT * FROM logs;
message
Error Error Error
Warning Warning Warning
Error Error
Warning Warning
Error
Warning
Error Error Error Error
Warning Warning Warning Warning
SELECT *, MATCH(message) AGAINST("Error" IN NATURAL LANGUAGE MODE) AS score
FROM logs
WHERE MATCH(message) AGAINST("Error" IN NATURAL LANGUAGE MODE)
ORDER BY MATCH(message) AGAINST("Error" IN NATURAL LANGUAGE MODE) DESC;
message score
Error Error Error Error 699052
Error Error Error 524289
Error Error 349526
Error 174763
DROP TABLE logs;

View File

@ -0,0 +1,34 @@
DROP TABLE IF EXISTS logs;
SET NAMES UTF8;
CREATE TABLE logs(
message TEXT,
FULLTEXT KEY (message)
) DEFAULT CHARSET=utf8;
INSERT INTO logs VALUES("Error Error Error");
INSERT INTO logs VALUES("Warning Warning Warning");
INSERT INTO logs VALUES("Error Error");
INSERT INTO logs VALUES("Warning Warning");
INSERT INTO logs VALUES("Error");
INSERT INTO logs VALUES("Warning");
INSERT INTO logs VALUES("Error Error Error Error");
INSERT INTO logs VALUES("Warning Warning Warning Warning");
SELECT * FROM logs;
message
Error Error Error
Warning Warning Warning
Error Error
Warning Warning
Error
Warning
Error Error Error Error
Warning Warning Warning Warning
SELECT *, MATCH(message) AGAINST("Error" IN NATURAL LANGUAGE MODE) AS score
FROM logs
WHERE MATCH(message) AGAINST("Error Warning" IN NATURAL LANGUAGE MODE)
ORDER BY MATCH(message) AGAINST("Error" IN NATURAL LANGUAGE MODE);
message score
Error 174763
Error Error 349526
Error Error Error 524289
Error Error Error Error 699052
DROP TABLE logs;

View File

@ -0,0 +1,36 @@
DROP TABLE IF EXISTS logs;
SET NAMES UTF8;
CREATE TABLE logs(
message TEXT,
host TEXT,
FULLTEXT KEY (message),
FULLTEXT KEY (host)
) DEFAULT CHARSET=utf8;
INSERT INTO logs VALUES("Error Error Error", "host1");
INSERT INTO logs VALUES("Warning Warning Warning", "host1");
INSERT INTO logs VALUES("Error Error", "host2");
INSERT INTO logs VALUES("Warning Warning", "host2");
INSERT INTO logs VALUES("Error", "host2");
INSERT INTO logs VALUES("Warning", "host2");
INSERT INTO logs VALUES("Error Error Error Error", "host2");
INSERT INTO logs VALUES("Warning Warning Warning Warning", "host2");
SELECT * FROM logs;
message host
Error Error Error host1
Warning Warning Warning host1
Error Error host2
Warning Warning host2
Error host2
Warning host2
Error Error Error Error host2
Warning Warning Warning Warning host2
SELECT *, MATCH(host) AGAINST("host2" IN NATURAL LANGUAGE MODE) AS score
FROM logs
WHERE MATCH(message) AGAINST("Error" IN NATURAL LANGUAGE MODE)
ORDER BY MATCH(host) AGAINST("host2" IN NATURAL LANGUAGE MODE);
message host score
Error Error Error host1 0
Error Error host2 116509
Error host2 116509
Error Error Error Error host2 116509
DROP TABLE logs;

View File

@ -0,0 +1,37 @@
DROP TABLE IF EXISTS logs;
SET NAMES UTF8;
CREATE TABLE logs(
message TEXT,
FULLTEXT KEY (message)
) DEFAULT CHARSET=utf8;
INSERT INTO logs VALUES("Error Error Error");
INSERT INTO logs VALUES("Warning Warning Warning");
INSERT INTO logs VALUES("Error Error");
INSERT INTO logs VALUES("Warning Warning");
INSERT INTO logs VALUES("Error");
INSERT INTO logs VALUES("Warning");
INSERT INTO logs VALUES("Error Error Error Error");
INSERT INTO logs VALUES("Warning Warning Warning Warning");
SELECT * FROM logs;
message
Error Error Error
Warning Warning Warning
Error Error
Warning Warning
Error
Warning
Error Error Error Error
Warning Warning Warning Warning
SELECT *, MATCH(message) AGAINST("Error" IN NATURAL LANGUAGE MODE) AS score
FROM logs
ORDER BY MATCH(message) AGAINST("Error" IN NATURAL LANGUAGE MODE);
message score
Warning Warning Warning 0
Warning Warning 0
Warning 0
Warning Warning Warning Warning 0
Error 174763
Error Error 349526
Error Error Error 524289
Error Error Error Error 699052
DROP TABLE logs;

View File

@ -0,0 +1,34 @@
DROP TABLE IF EXISTS logs;
SET NAMES UTF8;
CREATE TABLE logs(
message TEXT,
FULLTEXT KEY (message)
) DEFAULT CHARSET=utf8;
INSERT INTO logs VALUES("Error Error Error");
INSERT INTO logs VALUES("Warning Warning Warning");
INSERT INTO logs VALUES("Error Error");
INSERT INTO logs VALUES("Warning Warning");
INSERT INTO logs VALUES("Error");
INSERT INTO logs VALUES("Warning");
INSERT INTO logs VALUES("Error Error Error Error");
INSERT INTO logs VALUES("Warning Warning Warning Warning");
SELECT * FROM logs;
message
Error Error Error
Warning Warning Warning
Error Error
Warning Warning
Error
Warning
Error Error Error Error
Warning Warning Warning Warning
SELECT *, MATCH(message) AGAINST("Error" IN NATURAL LANGUAGE MODE) AS score
FROM logs
WHERE MATCH(message) AGAINST("Error" IN NATURAL LANGUAGE MODE)
ORDER BY MATCH(message) AGAINST("Error" IN NATURAL LANGUAGE MODE);
message score
Error 174763
Error Error 349526
Error Error Error 524289
Error Error Error Error 699052
DROP TABLE logs;

View File

@ -6,8 +6,8 @@ INSERT INTO shops VALUES (NULL), (NULL);
Warnings:
Warning 1048 Column 'location' cannot be null
Warning 1048 Column 'location' cannot be null
SELECT AsText(location) FROM shops;
AsText(location)
SELECT ST_AsText(location) FROM shops;
ST_AsText(location)
POINT(0 0)
POINT(0 0)
DROP TABLE shops;

View File

@ -0,0 +1,14 @@
DROP TABLE IF EXISTS shops;
CREATE TABLE shops (
location GEOMETRY NOT NULL
);
SET SESSION sql_mode = '';
INSERT INTO shops VALUES (NULL), (NULL);
Warnings:
Warning 1048 Column 'location' cannot be null
SET SESSION sql_mode = default;
SELECT ST_AsText(location) FROM shops;
ST_AsText(location)
POINT(0 0)
POINT(0 0)
DROP TABLE shops;

View File

@ -16,113 +16,113 @@ shops CREATE TABLE `shops` (
) ENGINE=Mroonga DEFAULT CHARSET=latin1
INSERT INTO shops (name, location)
VALUES ('nezu-no-taiyaki',
GeomFromText('POINT(139.762573 35.720253)'));
ST_GeomFromText('POINT(139.762573 35.720253)'));
INSERT INTO shops (name, location)
VALUES ('taiyaki-kataoka',
GeomFromText('POINT(139.715591 35.712521)'));
ST_GeomFromText('POINT(139.715591 35.712521)'));
INSERT INTO shops (name, location)
VALUES ('soba-taiyaki-ku',
GeomFromText('POINT(139.659088 35.683712)'));
ST_GeomFromText('POINT(139.659088 35.683712)'));
INSERT INTO shops (name, location)
VALUES ('kuruma',
GeomFromText('POINT(139.706207 35.721516)'));
ST_GeomFromText('POINT(139.706207 35.721516)'));
INSERT INTO shops (name, location)
VALUES ('hirose-ya',
GeomFromText('POINT(139.685608 35.714844)'));
ST_GeomFromText('POINT(139.685608 35.714844)'));
INSERT INTO shops (name, location)
VALUES ('sazare',
GeomFromText('POINT(139.685043 35.714653)'));
ST_GeomFromText('POINT(139.685043 35.714653)'));
INSERT INTO shops (name, location)
VALUES ('omede-taiyaki',
GeomFromText('POINT(139.817154 35.700516)'));
ST_GeomFromText('POINT(139.817154 35.700516)'));
INSERT INTO shops (name, location)
VALUES ('onaga-ya',
GeomFromText('POINT(139.81105 35.698254)'));
ST_GeomFromText('POINT(139.81105 35.698254)'));
INSERT INTO shops (name, location)
VALUES ('shiro-ya',
GeomFromText('POINT(139.638611 35.705517)'));
ST_GeomFromText('POINT(139.638611 35.705517)'));
INSERT INTO shops (name, location)
VALUES ('fuji-ya',
GeomFromText('POINT(139.637115 35.703938)'));
ST_GeomFromText('POINT(139.637115 35.703938)'));
INSERT INTO shops (name, location)
VALUES ('miyoshi',
GeomFromText('POINT(139.537323 35.644539)'));
ST_GeomFromText('POINT(139.537323 35.644539)'));
INSERT INTO shops (name, location)
VALUES ('juju-ya',
GeomFromText('POINT(139.695755 35.628922)'));
ST_GeomFromText('POINT(139.695755 35.628922)'));
INSERT INTO shops (name, location)
VALUES ('tatsumi-ya',
GeomFromText('POINT(139.638657 35.665501)'));
ST_GeomFromText('POINT(139.638657 35.665501)'));
INSERT INTO shops (name, location)
VALUES ('tetsuji',
GeomFromText('POINT(139.76857 35.680912)'));
ST_GeomFromText('POINT(139.76857 35.680912)'));
INSERT INTO shops (name, location)
VALUES ('gazuma-ya',
GeomFromText('POINT(139.647598 35.700817)'));
ST_GeomFromText('POINT(139.647598 35.700817)'));
INSERT INTO shops (name, location)
VALUES ('honma-mon',
GeomFromText('POINT(139.652573 35.722736)'));
ST_GeomFromText('POINT(139.652573 35.722736)'));
INSERT INTO shops (name, location)
VALUES ('naniwa-ya',
GeomFromText('POINT(139.796234 35.730061)'));
ST_GeomFromText('POINT(139.796234 35.730061)'));
INSERT INTO shops (name, location)
VALUES ('kuro-dai',
GeomFromText('POINT(139.704834 35.650345)'));
ST_GeomFromText('POINT(139.704834 35.650345)'));
INSERT INTO shops (name, location)
VALUES ('daruma',
GeomFromText('POINT(139.770599 35.681461)'));
ST_GeomFromText('POINT(139.770599 35.681461)'));
INSERT INTO shops (name, location)
VALUES ('yanagi-ya',
GeomFromText('POINT(139.783981 35.685341)'));
ST_GeomFromText('POINT(139.783981 35.685341)'));
INSERT INTO shops (name, location)
VALUES ('sharaku',
GeomFromText('POINT(139.794846 35.716969)'));
ST_GeomFromText('POINT(139.794846 35.716969)'));
INSERT INTO shops (name, location)
VALUES ('takane',
GeomFromText('POINT(139.560913 35.698601)'));
ST_GeomFromText('POINT(139.560913 35.698601)'));
INSERT INTO shops (name, location)
VALUES ('chiyoda',
GeomFromText('POINT(139.652817 35.642601)'));
ST_GeomFromText('POINT(139.652817 35.642601)'));
INSERT INTO shops (name, location)
VALUES ('da-ka-po',
GeomFromText('POINT(139.727356 35.627346)'));
ST_GeomFromText('POINT(139.727356 35.627346)'));
INSERT INTO shops (name, location)
VALUES ('matsushima-ya',
GeomFromText('POINT(139.737381 35.640556)'));
ST_GeomFromText('POINT(139.737381 35.640556)'));
INSERT INTO shops (name, location)
VALUES ('kazuya',
GeomFromText('POINT(139.760895 35.673508)'));
ST_GeomFromText('POINT(139.760895 35.673508)'));
INSERT INTO shops (name, location)
VALUES ('furuya-kogane-an',
GeomFromText('POINT(139.676071 35.680603)'));
ST_GeomFromText('POINT(139.676071 35.680603)'));
INSERT INTO shops (name, location)
VALUES ('hachi-no-ie',
GeomFromText('POINT(139.668106 35.608021)'));
ST_GeomFromText('POINT(139.668106 35.608021)'));
INSERT INTO shops (name, location)
VALUES ('azuki-chan',
GeomFromText('POINT(139.673203 35.64151)'));
ST_GeomFromText('POINT(139.673203 35.64151)'));
INSERT INTO shops (name, location)
VALUES ('kuriko-an',
GeomFromText('POINT(139.796829 35.712013)'));
ST_GeomFromText('POINT(139.796829 35.712013)'));
INSERT INTO shops (name, location)
VALUES ('yume-no-aru-machi-no-taiyaki-ya-san',
GeomFromText('POINT(139.712524 35.616199)'));
ST_GeomFromText('POINT(139.712524 35.616199)'));
INSERT INTO shops (name, location)
VALUES ('naze-ya',
GeomFromText('POINT(139.665833 35.609039)'));
ST_GeomFromText('POINT(139.665833 35.609039)'));
INSERT INTO shops (name, location)
VALUES ('sanoki-ya',
GeomFromText('POINT(139.770721 35.66592)'));
ST_GeomFromText('POINT(139.770721 35.66592)'));
INSERT INTO shops (name, location)
VALUES ('shigeta',
GeomFromText('POINT(139.780273 35.672626)'));
ST_GeomFromText('POINT(139.780273 35.672626)'));
INSERT INTO shops (name, location)
VALUES ('nishimi-ya',
GeomFromText('POINT(139.774628 35.671825)'));
ST_GeomFromText('POINT(139.774628 35.671825)'));
INSERT INTO shops (name, location)
VALUES ('hiiragi',
GeomFromText('POINT(139.711517 35.647701)'));
SELECT id, name, AsText(location) AS location_text FROM shops;
ST_GeomFromText('POINT(139.711517 35.647701)'));
SELECT id, name, ST_AsText(location) AS location_text FROM shops;
id name location_text
1 nezu-no-taiyaki POINT(139.76257305555555 35.72025305555556)
2 taiyaki-kataoka POINT(139.7155911111111 35.712521111111116)
@ -160,8 +160,8 @@ id name location_text
34 shigeta POINT(139.78027305555557 35.67262611111111)
35 nishimi-ya POINT(139.77462805555555 35.671825)
36 hiiragi POINT(139.71151694444444 35.64770111111111)
SELECT id, name, AsText(location) AS location_text FROM shops
WHERE MBRContains(GeomFromText('LineString(139.7727 35.6684, 139.7038 35.7121)'), location)
SELECT id, name, ST_AsText(location) AS location_text FROM shops
WHERE MBRContains(ST_GeomFromText('LineString(139.7727 35.6684, 139.7038 35.7121)'), location)
ORDER BY id;
id name location_text
14 tetsuji POINT(139.76857 35.680911944444446)

View File

@ -0,0 +1,18 @@
DROP TABLE IF EXISTS ids;
SET NAMES UTF8;
CREATE TABLE ids (
id INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
value INT(10),
INDEX (value)
) ENGINE=Mroonga DEFAULT CHARSET=utf8;
INSERT INTO ids VALUES(1, 50);
INSERT INTO ids VALUES(2, 70);
INSERT INTO ids VALUES(3, 30);
INSERT INTO ids VALUES(4, 90);
INSERT INTO ids VALUES(5, 10);
SELECT id, value FROM ids WHERE value > 10 ORDER BY value ASC LIMIT 3;
id value
3 30
1 50
2 70
DROP TABLE ids;

View File

@ -0,0 +1,18 @@
DROP TABLE IF EXISTS ids;
SET NAMES UTF8;
CREATE TABLE ids (
id INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
value INT(10),
INDEX (value)
) ENGINE=Mroonga DEFAULT CHARSET=utf8;
INSERT INTO ids VALUES(1, 50);
INSERT INTO ids VALUES(2, 70);
INSERT INTO ids VALUES(3, 30);
INSERT INTO ids VALUES(4, 90);
INSERT INTO ids VALUES(5, 10);
SELECT id, value FROM ids WHERE value > 10 ORDER BY value DESC LIMIT 3;
id value
4 90
2 70
1 50
DROP TABLE ids;

View File

@ -0,0 +1,18 @@
DROP TABLE IF EXISTS ids;
SET NAMES UTF8;
CREATE TABLE ids (
id INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
value INT(10),
INDEX (value)
) ENGINE=Mroonga DEFAULT CHARSET=utf8;
INSERT INTO ids VALUES(1, 50);
INSERT INTO ids VALUES(2, 70);
INSERT INTO ids VALUES(3, 30);
INSERT INTO ids VALUES(4, 90);
INSERT INTO ids VALUES(5, 10);
SELECT id, value FROM ids WHERE value >= 30 ORDER BY value ASC LIMIT 3;
id value
3 30
1 50
2 70
DROP TABLE ids;

View File

@ -0,0 +1,18 @@
DROP TABLE IF EXISTS ids;
SET NAMES UTF8;
CREATE TABLE ids (
id INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
value INT(10),
INDEX (value)
) ENGINE=Mroonga DEFAULT CHARSET=utf8;
INSERT INTO ids VALUES(1, 50);
INSERT INTO ids VALUES(2, 70);
INSERT INTO ids VALUES(3, 30);
INSERT INTO ids VALUES(4, 90);
INSERT INTO ids VALUES(5, 10);
SELECT id, value FROM ids WHERE value >= 30 ORDER BY value DESC LIMIT 3;
id value
4 90
2 70
1 50
DROP TABLE ids;

View File

@ -0,0 +1,18 @@
DROP TABLE IF EXISTS ids;
SET NAMES UTF8;
CREATE TABLE ids (
id INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
value INT(10),
INDEX (value)
) ENGINE=Mroonga DEFAULT CHARSET=utf8;
INSERT INTO ids VALUES(1, 50);
INSERT INTO ids VALUES(2, 70);
INSERT INTO ids VALUES(3, 30);
INSERT INTO ids VALUES(4, 90);
INSERT INTO ids VALUES(5, 10);
SELECT id, value FROM ids WHERE value < 90 ORDER BY value ASC LIMIT 3;
id value
5 10
3 30
1 50
DROP TABLE ids;

View File

@ -0,0 +1,18 @@
DROP TABLE IF EXISTS ids;
SET NAMES UTF8;
CREATE TABLE ids (
id INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
value INT(10),
INDEX (value)
) ENGINE=Mroonga DEFAULT CHARSET=utf8;
INSERT INTO ids VALUES(1, 50);
INSERT INTO ids VALUES(2, 70);
INSERT INTO ids VALUES(3, 30);
INSERT INTO ids VALUES(4, 90);
INSERT INTO ids VALUES(5, 10);
SELECT id, value FROM ids WHERE value < 90 ORDER BY value DESC LIMIT 3;
id value
2 70
1 50
3 30
DROP TABLE ids;

View File

@ -0,0 +1,18 @@
DROP TABLE IF EXISTS ids;
SET NAMES UTF8;
CREATE TABLE ids (
id INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
value INT(10),
INDEX (value)
) ENGINE=Mroonga DEFAULT CHARSET=utf8;
INSERT INTO ids VALUES(1, 50);
INSERT INTO ids VALUES(2, 70);
INSERT INTO ids VALUES(3, 30);
INSERT INTO ids VALUES(4, 90);
INSERT INTO ids VALUES(5, 10);
SELECT id, value FROM ids WHERE value <= 70 ORDER BY value ASC LIMIT 3;
id value
5 10
3 30
1 50
DROP TABLE ids;

View File

@ -0,0 +1,18 @@
DROP TABLE IF EXISTS ids;
SET NAMES UTF8;
CREATE TABLE ids (
id INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
value INT(10),
INDEX (value)
) ENGINE=Mroonga DEFAULT CHARSET=utf8;
INSERT INTO ids VALUES(1, 50);
INSERT INTO ids VALUES(2, 70);
INSERT INTO ids VALUES(3, 30);
INSERT INTO ids VALUES(4, 90);
INSERT INTO ids VALUES(5, 10);
SELECT id, value FROM ids WHERE value <= 70 ORDER BY value DESC LIMIT 3;
id value
2 70
1 50
3 30
DROP TABLE ids;

View File

@ -1,4 +0,0 @@
select PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_TYPE
from information_schema.plugins where plugin_name = "Mroonga";
PLUGIN_NAME PLUGIN_VERSION PLUGIN_TYPE
Mroonga 5.0 STORAGE ENGINE

View File

@ -0,0 +1,19 @@
DROP TABLE IF EXISTS ids;
FLUSH STATUS;
SET NAMES utf8mb4;
CREATE TABLE ids (
id int PRIMARY KEY,
text varchar(32),
FULLTEXT INDEX (text)
) DEFAULT CHARSET=utf8mb4;
INSERT INTO ids VALUES (1, 'first');
SELECT * FROM ids
WHERE MATCH(text) AGAINST('+first' IN BOOLEAN MODE)
ORDER BY id, id
LIMIT 1;
id text
1 first
SHOW STATUS LIKE 'mroonga_fast_order_limit';
Variable_name Value
Mroonga_fast_order_limit 1
DROP TABLE ids;

View File

@ -0,0 +1,43 @@
DROP TABLE IF EXISTS logs;
SET NAMES UTF8;
CREATE TABLE logs (
timestamp DATETIME,
message TEXT
) DEFAULT CHARSET=UTF8
PARTITION BY RANGE (TO_DAYS(timestamp)) (
PARTITION p201501 VALUES LESS THAN (TO_DAYS('2015-02-01')),
PARTITION p201502 VALUES LESS THAN (TO_DAYS('2015-03-01')),
PARTITION p201503 VALUES LESS THAN (TO_DAYS('2015-04-01')),
PARTITION pfuture VALUES LESS THAN MAXVALUE
);
SHOW CREATE TABLE logs;
Table Create Table
logs CREATE TABLE `logs` (
`timestamp` datetime DEFAULT NULL,
`message` text
) ENGINE=Mroonga DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (TO_DAYS(timestamp))
(PARTITION p201501 VALUES LESS THAN (735995) ENGINE = Mroonga,
PARTITION p201502 VALUES LESS THAN (736023) ENGINE = Mroonga,
PARTITION p201503 VALUES LESS THAN (736054) ENGINE = Mroonga,
PARTITION pfuture VALUES LESS THAN MAXVALUE ENGINE = Mroonga) */
INSERT INTO logs VALUES('2015-01-01 00:00:00', 'Start');
INSERT INTO logs VALUES('2015-02-01 00:00:00', 'Start');
INSERT INTO logs VALUES('2015-03-01 00:00:00', 'Start');
INSERT INTO logs VALUES('2015-04-01 00:00:00', 'Start');
SELECT * FROM logs ORDER BY timestamp;
timestamp message
2015-01-01 00:00:00 Start
2015-02-01 00:00:00 Start
2015-03-01 00:00:00 Start
2015-04-01 00:00:00 Start
UPDATE logs
SET message = 'Started'
WHERE timestamp < '2015-03-01 00:00:00';
SELECT * FROM logs ORDER BY timestamp;
timestamp message
2015-01-01 00:00:00 Started
2015-02-01 00:00:00 Started
2015-03-01 00:00:00 Start
2015-04-01 00:00:00 Start
DROP TABLE logs;

View File

@ -0,0 +1,40 @@
CREATE DATABASE repair_test;
USE repair_test;
CREATE TABLE diaries (
id INT PRIMARY KEY AUTO_INCREMENT,
title TEXT,
body TEXT,
FULLTEXT INDEX body_index (body)
) DEFAULT CHARSET UTF8;
SHOW CREATE TABLE diaries;
Table Create Table
diaries CREATE TABLE `diaries` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` text,
`body` text,
PRIMARY KEY (`id`),
FULLTEXT KEY `body_index` (`body`)
) ENGINE=Mroonga DEFAULT CHARSET=utf8
INSERT INTO diaries (title, body) VALUES ("survey", "will start Groonga!");
INSERT INTO diaries (title, body) VALUES ("Groonga (1)", "starting Groonga...");
INSERT INTO diaries (title, body) VALUES ("Groonga (2)", "started Groonga.");
SELECT * FROM diaries WHERE MATCH(body) AGAINST("+starting" IN BOOLEAN MODE);
id title body
2 Groonga (1) starting Groonga...
FLUSH TABLES;
SELECT * FROM diaries WHERE MATCH(body) AGAINST("+starting" IN BOOLEAN MODE);
ERROR HY000: syscall error 'repair_test.mrn.000010A.c' (No such file or directory)
REPAIR TABLE diaries;
Table Op Msg_type Msg_text
repair_test.diaries repair status OK
SELECT * FROM diaries;
id title body
1 survey will start Groonga!
2 Groonga (1) starting Groonga...
3 Groonga (2) started Groonga.
SELECT * FROM diaries WHERE MATCH(body) AGAINST("+starting" IN BOOLEAN MODE);
id title body
2 Groonga (1) starting Groonga...
DROP TABLE diaries;
DROP DATABASE repair_test;
USE test;

View File

@ -5,19 +5,19 @@ geo GEOMETRY NOT NULL,
PRIMARY KEY(id)
) DEFAULT CHARSET=utf8;
INSERT INTO geo_replace VALUES(1, POINT(100,100));
SELECT id, ASTEXT(geo) FROM geo_replace;
id ASTEXT(geo)
SELECT id, ST_AsText(geo) FROM geo_replace;
id ST_AsText(geo)
1 POINT(100 100)
REPLACE INTO geo_replace VALUES(1, POINT(100,200));
SELECT id, ASTEXT(geo) FROM geo_replace;
id ASTEXT(geo)
SELECT id, ST_AsText(geo) FROM geo_replace;
id ST_AsText(geo)
1 POINT(100 200)
INSERT INTO geo_replace VALUES(1, POINT(200,200)) ON DUPLICATE KEY UPDATE geo = POINT(200,200);
SELECT id, ASTEXT(geo) FROM geo_replace;
id ASTEXT(geo)
SELECT id, ST_AsText(geo) FROM geo_replace;
id ST_AsText(geo)
1 POINT(200 200)
UPDATE geo_replace SET geo = POINT(200,300);
SELECT id, ASTEXT(geo) FROM geo_replace;
id ASTEXT(geo)
SELECT id, ST_AsText(geo) FROM geo_replace;
id ST_AsText(geo)
1 POINT(200 300)
DROP TABLE geo_replace;

View File

@ -13,5 +13,5 @@ id
1
DROP TABLE counts;
DROP DATABASE clean_test;
USE test;
SET GLOBAL mroonga_database_path_prefix = NULL;
USE test;

View File

@ -0,0 +1,20 @@
DROP TABLE IF EXISTS ids;
CREATE TABLE ids (
id INT PRIMARY KEY AUTO_INCREMENT
) DEFAULT CHARSET=UTF8;
INSERT INTO ids VALUES (1);
INSERT INTO ids VALUES (2);
INSERT INTO ids VALUES (3);
INSERT INTO ids VALUES (4);
INSERT INTO ids VALUES (5);
INSERT INTO ids VALUES (6);
INSERT INTO ids VALUES (7);
INSERT INTO ids VALUES (8);
INSERT INTO ids VALUES (9);
INSERT INTO ids VALUES (10);
SET GLOBAL mroonga_max_n_records_for_estimate = 1;
EXPLAIN SELECT * FROM ids WHERE id > 5;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE ids range PRIMARY PRIMARY 4 NULL 1 Using where; Using index
SET GLOBAL mroonga_max_n_records_for_estimate = DEFAULT;
DROP TABLE ids;

View File

@ -0,0 +1,20 @@
DROP TABLE IF EXISTS ids;
CREATE TABLE ids (
id INT PRIMARY KEY AUTO_INCREMENT
) DEFAULT CHARSET=UTF8;
INSERT INTO ids VALUES (1);
INSERT INTO ids VALUES (2);
INSERT INTO ids VALUES (3);
INSERT INTO ids VALUES (4);
INSERT INTO ids VALUES (5);
INSERT INTO ids VALUES (6);
INSERT INTO ids VALUES (7);
INSERT INTO ids VALUES (8);
INSERT INTO ids VALUES (9);
INSERT INTO ids VALUES (10);
SET mroonga_max_n_records_for_estimate = 1;
EXPLAIN SELECT * FROM ids WHERE id > 5;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE ids range PRIMARY PRIMARY 4 NULL 1 Using where; Using index
SET mroonga_max_n_records_for_estimate = DEFAULT;
DROP TABLE ids;

View File

@ -1,3 +0,0 @@
show variables like 'mroonga_version';
Variable_name Value
mroonga_version 5.00

View File

@ -30,7 +30,7 @@ CREATE TABLE tags (
ALTER TABLE tags ADD COLUMN name VARCHAR(64) COMMENT 'flags "COLUMN_VECTOR"';
SELECT mroonga_command("dump");
SELECT mroonga_command("dump --dump_plugins no");
DROP TABLE tags;

View File

@ -34,7 +34,7 @@ CREATE TABLE bugs (
ALTER TABLE bugs ADD COLUMN name VARCHAR(64) COMMENT 'type "tags"';
SELECT mroonga_command("dump");
SELECT mroonga_command("dump --dump_plugins no");
DROP TABLE bugs;
DROP TABLE tags;

View File

@ -31,11 +31,9 @@ CREATE TABLE memos (
content VARCHAR(64) NOT NULL
) DEFAULT CHARSET=utf8;
SELECT mroonga_command("dump");
ALTER TABLE memos ADD FULLTEXT INDEX (content) COMMENT 'token_filters "TokenFilterStopWord"';
SELECT mroonga_command("dump");
SELECT mroonga_command("dump --dump_plugins no");
DROP TABLE memos;

Some files were not shown because too many files have changed in this diff Show More