Commit 83aeee64 authored by unknown's avatar unknown

Merge work:/home/bk/mysql-4.0

into mysql.sashanet.com:/home/sasha/src/bk/mysql-4.0

parents 1c809563 cc9076f1
This source diff could not be displayed because it is too large. You can view the blob instead.
@c FIX AGL 20011108 Extracted from manual.texi.
@c Contains comparison section, mSQL and PostgreSQL.
@c Also some mSQL to MySQL migration info but that is probably outdated.
@node Comparisons, TODO, Compatibility, Introduction
@section How MySQL Compares to Other Databases
@cindex databases, MySQL vs. others
@cindex comparisons, MySQL vs. others
@menu
* Compare mSQL:: How MySQL compares to @code{mSQL}
* Compare PostgreSQL:: How MySQL compares with PostgreSQL
@end menu
Our users have successfully run their own benchmarks against a number
of @code{Open Source} and traditional database servers. We are aware of
tests against @code{Oracle}, @code{DB/2}, @code{Microsoft SQL Server}
and other commercial products. Due to legal reasons we are restricted
from publishing some of those benchmarks in our reference manual.
This section includes a comparison with @code{mSQL} for historical
reasons and with @code{PostgreSQL} as it is also an Open Source
database. If you have benchmark results that we can publish, please
contact us at @email{benchmarks@@mysql.com}.
For comparative lists of all supported functions and types as well
as measured operational limits of many different database systems,
see the @code{crash-me} web page at
@uref{http://www.mysql.com/information/crash-me.php}.
@node Compare mSQL, Compare PostgreSQL, Comparisons, Comparisons
@subsection How MySQL Compares to @code{mSQL}
@table @strong
@item Performance
For a true comparison of speed, consult the growing MySQL benchmark
suite. @xref{MySQL Benchmarks}.
Because there is no thread creation overhead, a small parser, few features, and
simple security, @code{mSQL} should be quicker at:
@itemize @bullet
@item
Tests that perform repeated connects and disconnects, running a very simple
query during each connection.
@item
@code{INSERT} operations into very simple tables with few columns and keys.
@item
@code{CREATE TABLE} and @code{DROP TABLE}.
@item
@code{SELECT} on something that isn't an index. (A table scan is very
easy.)
@end itemize
Because these operations are so simple, it is hard to be better at them when
you have a higher startup overhead. After the connection is established,
MySQL should perform much better.
On the other hand, MySQL is much faster than @code{mSQL} (and
most other SQL implementations) on the following:
@itemize @bullet
@item
Complex @code{SELECT} operations.
@item
Retrieving large results (MySQL has a better, faster, and safer
protocol).
@item
Tables with variable-length strings, because MySQL has more efficient
handling and can have indexes on @code{VARCHAR} columns.
@item
Handling tables with many columns.
@item
Handling tables with large record lengths.
@item
@code{SELECT} with many expressions.
@item
@code{SELECT} on large tables.
@item
Handling many connections at the same time. MySQL is fully
multi-threaded. Each connection has its own thread, which means that
no thread has to wait for another (unless a thread is modifying
a table another thread wants to access). In @code{mSQL}, once one connection
is established, all others must wait until the first has finished, regardless
of whether the connection is running a query that is short or long. When the
first connection terminates, the next can be served, while all the others wait
again, etc.
@item
Joins.
@code{mSQL} can become pathologically slow if you change the order of tables
in a @code{SELECT}. In the benchmark suite, a time more than 15000 times
slower than MySQL was seen. This is due to @code{mSQL}'s lack of a
join optimiser to order tables in the optimal order. However, if you put the
tables in exactly the right order in @code{mSQL}2 and the @code{WHERE} is
simple and uses index columns, the join will be relatively fast!
@xref{MySQL Benchmarks}.
@item
@code{ORDER BY} and @code{GROUP BY}.
@item
@code{DISTINCT}.
@item
Using @code{TEXT} or @code{BLOB} columns.
@end itemize
@item SQL Features
@itemize @bullet
@item @code{GROUP BY} and @code{HAVING}.
@code{mSQL} does not support @code{GROUP BY} at all.
MySQL supports a full @code{GROUP BY} with both @code{HAVING} and
the following functions: @code{COUNT()}, @code{AVG()}, @code{MIN()},
@code{MAX()}, @code{SUM()}, and @code{STD()}. @code{COUNT(*)} is optimised to
return very quickly if the @code{SELECT} retrieves from one table, no other
columns are retrieved, and there is no @code{WHERE} clause. @code{MIN()} and
@code{MAX()} may take string arguments.
@item @code{INSERT} and @code{UPDATE} with calculations.
MySQL can do calculations in an @code{INSERT} or @code{UPDATE}.
For example:
@example
mysql> UPDATE SET x=x*10+y WHERE x<20;
@end example
@item Aliasing.
MySQL has column aliasing.
@item Qualifying column names.
In MySQL, if a column name is unique among the tables used in a
query, you do not have to use the full qualifier.
@item @code{SELECT} with functions.
MySQL has many functions (too many to list here; see @ref{Functions}).
@end itemize
@item Disk Space Efficiency
That is, how small can you make your tables?
MySQL has very precise types, so you can create tables that take
very little space. An example of a useful MySQL datatype is the
@code{MEDIUMINT} that is 3 bytes long. If you have 100,000,000 records,
saving even one byte per record is very important.
@code{mSQL2} has a more limited set of column types, so it is
more difficult to get small tables.
@item Stability
This is harder to judge objectively. For a discussion of MySQL
stability, see @ref{Stability}.
We have no experience with @code{mSQL} stability, so we cannot say
anything about that.
@item Price
Another important issue is the license. MySQL has a
more flexible license than @code{mSQL}, and is also less expensive than
@code{mSQL}. Whichever product you choose to use, remember to at least
consider paying for a license or e-mail support. (You are required to get
a license if you include MySQL with a product that you sell,
of course.)
@item Perl Interfaces
MySQL has basically the same interfaces to Perl as @code{mSQL} with
some added features.
@item JDBC (Java)
MySQL currently has a lot of different JDBC drivers:
@itemize @bullet
@item
The mm driver: A type 4 JDBC driver by Mark Matthews
@email{mmatthew@@ecn.purdue.edu}. This is released under the LGPL.
@item
The Resin driver. This is a commercial JDBC driver released under open
source. @uref{http://www.caucho.com/projects/jdbc-mysql/index.xtp}
@item
The gwe driver: A Java interface by GWE technologies (not supported anymore).
@item
The jms driver: An improved gwe driver by Xiaokun Kelvin ZHU
@email{X.Zhu@@brad.ac.uk} (not supported anymore).
@item
The twz driver: A type 4 JDBC driver by Terrence W. Zellers
@email{zellert@@voicenet.com}. This is commercial but is free for private
and educational use (not supported anymore).
@end itemize
The recommended driver is the mm driver. The Resin driver may also be
good (at least the benchmarks looks good), but we haven't received that much
information about this yet.
We know that @code{mSQL} has a JDBC driver, but we have too little experience
with it to compare.
@item Rate of Development
MySQL has a small core team of developers, but we are quite
used to coding C and C++ very rapidly. Because threads, functions,
@code{GROUP BY}, and so on are still not implemented in @code{mSQL}, it
has a lot of catching up to do. To get some perspective on this, you
can view the @code{mSQL} @file{HISTORY} file for the last year and
compare it with the News section of the MySQL Reference Manual
(@pxref{News}). It should be pretty obvious which one has developed
most rapidly.
@item Utility Programs
Both @code{mSQL} and MySQL have many interesting third-party
tools. Because it is very easy to port upward (from @code{mSQL} to
MySQL), almost all the interesting applications that are available for
@code{mSQL} are also available for MySQL.
MySQL comes with a simple @code{msql2mysql} program that fixes
differences in spelling between @code{mSQL} and MySQL for the
most-used C API functions.
For example, it changes instances of @code{msqlConnect()} to
@code{mysql_connect()}. Converting a client program from @code{mSQL} to
MySQL usually requires only minor effort.
@end table
@menu
* Using mSQL tools:: How to convert @code{mSQL} tools for MySQL
* Protocol differences:: How @code{mSQL} and MySQL Client/Server Communications Protocols Differ
* Syntax differences:: How @code{mSQL} 2.0 SQL Syntax Differs from MySQL
@end menu
@node Using mSQL tools, Protocol differences, Compare mSQL, Compare mSQL
@subsubsection How to Convert @code{mSQL} Tools for MySQL
@cindex MySQL tools, conversion
@cindex converting, tools
@cindex tools, converting
According to our experience, it doesn't take long to convert tools
such as @code{msql-tcl} and @code{msqljava} that use the
@code{mSQL} C API so that they work with the MySQL C API.
The conversion procedure is:
@enumerate
@item
Run the shell script @code{msql2mysql} on the source. This requires the
@code{replace} program, which is distributed with MySQL.
@item
Compile.
@item
Fix all compiler errors.
@end enumerate
Differences between the @code{mSQL} C API and the MySQL C API are:
@itemize @bullet
@item
MySQL uses a @code{MYSQL} structure as a connection type (@code{mSQL}
uses an @code{int}).
@item
@code{mysql_connect()} takes a pointer to a @code{MYSQL} structure as a
parameter. It is easy to define one globally or to use @code{malloc()} to get
one. @code{mysql_connect()} also takes two parameters for specifying the
user and password. You may set these to @code{NULL, NULL} for default use.
@item
@code{mysql_error()} takes the @code{MYSQL} structure as a parameter. Just add
the parameter to your old @code{msql_error()} code if you are porting old code.
@item
MySQL returns an error number and a text error message for all
errors. @code{mSQL} returns only a text error message.
@item
Some incompatibilities exist as a result of MySQL supporting
multiple connections to the server from the same process.
@end itemize
@node Protocol differences, Syntax differences, Using mSQL tools, Compare mSQL
@subsubsection How @code{mSQL} and MySQL Client/Server Communications Protocols Differ
@cindex communications protocols
@cindex mSQL vs. MySQL
There are enough differences that it is impossible (or at least not easy)
to support both.
The most significant ways in which the MySQL protocol differs
from the @code{mSQL} protocol are listed below:
@itemize @bullet
@item
A message buffer may contain many result rows.
@item
The message buffers are dynamically enlarged if the query or the
result is bigger than the current buffer, up to a configurable server and
client limit.
@item
All packets are numbered to catch duplicated or missing packets.
@item
All column values are sent in ASCII. The lengths of columns and rows are sent
in packed binary coding (1, 2, or 3 bytes).
@item
MySQL can read in the result unbuffered (without having to store the
full set in the client).
@item
If a single read/write takes more than 30 seconds, the server closes
the connection.
@item
If a connection is idle for 8 hours, the server closes the connection.
@end itemize
@menu
* Syntax differences:: How @code{mSQL} 2.0 SQL Syntax Differs from MySQL
@end menu
@node Syntax differences, , Protocol differences, Compare mSQL
@subsubsection How @code{mSQL} 2.0 SQL Syntax Differs from MySQL
@noindent
@strong{Column types}
@table @code
@item MySQL
Has the following additional types (among others;
@pxref{CREATE TABLE, , @code{CREATE TABLE}}):
@itemize @bullet
@item
@c FIX bad lingo, needs rephrasing
@code{ENUM} type for one of a set of strings.
@item
@c FIX bad lingo, needs rephrasing
@code{SET} type for many of a set of strings.
@item
@code{BIGINT} type for 64-bit integers.
@end itemize
@item
MySQL also supports
the following additional type attributes:
@itemize @bullet
@item
@code{UNSIGNED} option for integer columns.
@item
@code{ZEROFILL} option for integer columns.
@item
@code{AUTO_INCREMENT} option for integer columns that are a
@code{PRIMARY KEY}.
@xref{mysql_insert_id, , @code{mysql_insert_id()}}.
@item
@code{DEFAULT} value for all columns.
@end itemize
@item mSQL2
@code{mSQL} column types correspond to the MySQL types shown below:
@multitable @columnfractions .15 .85
@item @code{mSQL} @strong{type} @tab @strong{Corresponding MySQL type}
@item @code{CHAR(len)} @tab @code{CHAR(len)}
@item @code{TEXT(len)} @tab @code{TEXT(len)}. @code{len} is the maximal length.
And @code{LIKE} works.
@item @code{INT} @tab @code{INT}. With many more options!
@item @code{REAL} @tab @code{REAL}. Or @code{FLOAT}. Both 4- and 8-byte versions are available.
@item @code{UINT} @tab @code{INT UNSIGNED}
@item @code{DATE} @tab @code{DATE}. Uses ANSI SQL format rather than @code{mSQL}'s own format.
@item @code{TIME} @tab @code{TIME}
@item @code{MONEY} @tab @code{DECIMAL(12,2)}. A fixed-point value with two decimals.
@end multitable
@end table
@noindent
@strong{Index Creation}
@table @code
@item MySQL
Indexes may be specified at table creation time with the @code{CREATE TABLE}
statement.
@item mSQL
Indexes must be created after the table has been created, with separate
@code{CREATE INDEX} statements.
@end table
@noindent
@strong{To Insert a Unique Identifier into a Table}
@table @code
@item MySQL
Use @code{AUTO_INCREMENT} as a column type
specifier.
@xref{mysql_insert_id, , @code{mysql_insert_id()}}.
@item mSQL
Create a @code{SEQUENCE} on a table and select the @code{_seq} column.
@end table
@noindent
@strong{To Obtain a Unique Identifier for a Row}
@table @code
@item MySQL
Add a @code{PRIMARY KEY} or @code{UNIQUE} key to the table and use this.
New in Version 3.23.11: If the @code{PRIMARY} or @code{UNIQUE} key consists of only one
column and this is of type integer, one can also refer to it as
@code{_rowid}.
@item mSQL
Use the @code{_rowid} column. Observe that @code{_rowid} may change over time
depending on many factors.
@end table
@noindent
@strong{To Get the Time a Column Was Last Modified}
@table @code
@item MySQL
Add a @code{TIMESTAMP} column to the table. This column is automatically set
to the current date and time for @code{INSERT} or @code{UPDATE} statements if
you don't give the column a value or if you give it a @code{NULL} value.
@item mSQL
Use the @code{_timestamp} column.
@end table
@noindent
@strong{@code{NULL} Value Comparisons}
@table @code
@item MySQL
MySQL follows
ANSI SQL, and a comparison with @code{NULL} is always @code{NULL}.
@item mSQL
In @code{mSQL}, @code{NULL = NULL} is TRUE. You
must change @code{=NULL} to @code{IS NULL} and @code{<>NULL} to
@code{IS NOT NULL} when porting old code from @code{mSQL} to MySQL.
@end table
@noindent
@strong{String Comparisons}
@table @code
@item MySQL
Normally, string comparisons are performed in case-independent fashion with
the sort order determined by the current character set (ISO-8859-1 Latin1 by
default). If you don't like this, declare your columns with the
@code{BINARY} attribute, which causes comparisons to be done according to the
ASCII order used on the MySQL server host.
@item mSQL
All string comparisons are performed in case-sensitive fashion with
sorting in ASCII order.
@end table
@noindent
@strong{Case-insensitive Searching}
@table @code
@item MySQL
@code{LIKE} is a case-insensitive or case-sensitive operator, depending on
the columns involved. If possible, MySQL uses indexes if the
@code{LIKE} argument doesn't start with a wild-card character.
@item mSQL
Use @code{CLIKE}.
@end table
@noindent
@strong{Handling of Trailing Spaces}
@table @code
@item MySQL
Strips all spaces at the end of @code{CHAR} and @code{VARCHAR}
columns. Use a @code{TEXT} column if this behavior is not desired.
@item mSQL
Retains trailing space.
@end table
@noindent
@strong{@code{WHERE} Clauses}
@table @code
@item MySQL
MySQL correctly prioritises everything (@code{AND} is evaluated
before @code{OR}). To get @code{mSQL} behavior in MySQL, use
parentheses (as shown in an example below).
@item mSQL
Evaluates everything from left to right. This means that some logical
calculations with more than three arguments cannot be expressed in any
way. It also means you must change some queries when you upgrade to
MySQL. You do this easily by adding parentheses. Suppose you
have the following @code{mSQL} query:
@example
mysql> SELECT * FROM table WHERE a=1 AND b=2 OR a=3 AND b=4;
@end example
To make MySQL evaluate this the way that @code{mSQL} would,
you must add parentheses:
@example
mysql> SELECT * FROM table WHERE (a=1 AND (b=2 OR (a=3 AND (b=4))));
@end example
@end table
@noindent
@strong{Access Control}
@table @code
@item MySQL
Has tables to store grant (permission) options per user, host, and
database. @xref{Privileges}.
@item mSQL
Has a file @file{mSQL.acl} in which you can grant read/write privileges for
users.
@end table
@node Compare PostgreSQL, , Compare mSQL, Comparisons
@subsection How MySQL Compares to PostgreSQL
@cindex PostgreSQL vs. MySQL, overview
When reading the following, please note that both products are continually
evolving. We at MySQL AB and the PostgreSQL developers are both working
on making our respective database as good as possible, so we are both a
serious choice to any commercial database.
The following comparison is made by us at MySQL AB. We have tried to be
as accurate and fair as possible, but because we don't have a full
knowledge of all PostgreSQL features while we know MySQL througly, we
may have got some things wrong. We will however correct these when they
come to our attention.
We would first like to note that PostgreSQL and MySQL are both widely used
products, but with different design goals, even if we are both striving to
be ANSI SQL compatible. This means that for some applications MySQL is
more suited, while for others PostgreSQL is more suited. When choosing
which database to use, you should first check if the database's feature set
satisfies your application. If you need raw speed, MySQL is probably your
best choice. If you need some of the extra features that only PostgreSQL
can offer, you should use @code{PostgreSQL}.
@cindex PostgreSQL/MySQL, strategies
@menu
* MySQL-PostgreSQL goals:: MySQL and PostgreSQL development strategies
* MySQL-PostgreSQL features:: Featurewise Comparison of MySQL and PostgreSQL
* MySQL-PostgreSQL benchmarks:: Benchmarking MySQL and PostgreSQL
@end menu
@node MySQL-PostgreSQL goals, MySQL-PostgreSQL features, Compare PostgreSQL, Compare PostgreSQL
@subsubsection MySQL and PostgreSQL development strategies
When adding things to MySQL we take pride to do an optimal, definite
solution. The code should be so good that we shouldn't have any need to
change it in the foreseeable future. We also do not like to sacrifice
speed for features but instead will do our utmost to find a solution
that will give maximal throughput. This means that development will take
a little longer, but the end result will be well worth this. This kind
of development is only possible because all server code are checked by
one of a few (currently two) persons before it's included in the
MySQL server.
We at MySQL AB believe in frequent releases to be able to push out new
features quickly to our users. Because of this we do a new small release
about every three weeks, and a major branch every year. All releases are
throughly tested with our testing tools on a lot of different platforms.
PostgreSQL is based on a kernel with lots of contributors. In this setup
it makes sense to prioritise adding a lot of new features, instead of
implementing them optimally, because one can always optimise things
later if there arises a need for this.
Another big difference between MySQL and PostgreSQL is that
nearly all of the code in the MySQL server are coded by developers that
are employed by MySQL AB and are still working on the server code. The
exceptions are the transaction engines, and the regexp library.
This is in sharp contrast to the PostgreSQL code where the majority of
the code is coded by a big group of people with different backgrounds.
It was only recently that the PostgreSQL developers announced that their
current developer group had finally had time to take a look at all
the code in the current PostgreSQL release.
Both of the above development methods has it's own merits and drawbacks.
We here at MySQL AB think of course that our model is better because our
model gives better code consistency, more optimal and reusable code, and
in our opinion, fewer bugs. Because we are the authors of the MySQL server
code, we are better able to coordinate new features and releases.
@node MySQL-PostgreSQL features, MySQL-PostgreSQL benchmarks, MySQL-PostgreSQL goals, Compare PostgreSQL
@subsubsection Featurewise Comparison of MySQL and PostgreSQL
@cindex PostgreSQL/MySQL, features
On the crash-me page
(@uref{http://www.mysql.com/information/crash-me.php})
you can find a list of those database constructs and limits that
one can detect automatically with a program. Note however that a lot of
the numerical limits may be changed with startup options for respective
database. The above web page is however extremely useful when you want to
ensure that your applications works with many different databases or
when you want to convert your application from one datbase to another.
MySQL offers the following advantages over PostgreSQL:
@itemize @bullet
@item
@code{MySQL} is generally much faster than PostgreSQL.
@xref{MySQL-PostgreSQL benchmarks}.
@item
MySQL has a much larger user base than PostgreSQL, therefor the
code is more tested and has historically been more stable than
PostgreSQL. MySQL is the much more used in production
environments than PostgreSQL, mostly thanks to that MySQL AB,
formerly TCX DataKonsult AB, has provided top quality commercial support
for MySQL from the day it was released, whereas until recently
PostgreSQL was unsupported.
@item
MySQL works better on Windows than PostgreSQL does. MySQL runs as a
native Windows application (a service on NT/Win2000/WinXP), while
PostgreSQL is run under the cygwin emulation. We have heard that
PostgreSQL is not yet that stable on Windows but we haven't been able to
verify this ourselves.
@item
MySQL has more APIs to other languages and is supported by more
existing programs than PostgreSQL. @xref{Contrib}.
@item
MySQL works on 24/7 heavy duty systems. In most circumstances
you never have to run any cleanups on MySQL. PostgreSQL doesn't
yet support 24/7 systems because you have to run @code{VACUUM()}
once in a while to reclaim space from @code{UPDATE} and @code{DELETE}
commands and to perform statistics analyses that are critical to get
good performance with PostgreSQL. @code{VACUUM()} is also needed after
adding a lot of new rows to a table. On a busy system with lots of changes,
@code{VACUUM()} must be run very frequently, in the worst cases even
many times a day. During the @code{VACUUM()} run, which may take hours
if the database is big, the database is from a production standpoint,
practically dead. The PostgreSQL team has fixing this on their TODO,
but we assume that this is not an easy thing to fix permanently.
@item
A working, tested replication feature used by sites like:
@itemize @minus
@item Yahoo Finance (@uref{http://finance.yahoo.com/})
@item Mobile.de (@uref{http://www.mobile.de/})
@item Slashdot (@uref{http://www.slashdot.org/})
@end itemize
@item
Included in the MySQL distribution are two different testing suites,
@file{mysql-test-run} and crash-me
(@uref{http://www.mysql.com/information/crash-me.php}), as well
as a benchmark suite. The test system is actively updated with code to
test each new feature and almost all reproduceable bugs that have come to
our attention. We test MySQL with these on a lot of platforms before
every release. These tests are more sophisticated than anything we have
seen from PostgreSQL, and they ensures that the MySQL is kept to a high
standard.
@item
There are far more books in print about MySQL than about PostgreSQL.
O'Reilly, Sams, Que, and New Riders are all major publishers with books
about MySQL. All MySQL features are also documented in the MySQL on-line
manual, because when a new feature is implemented, the MySQL developers
are required to document it before it's included in the source.
@item
MySQL supports more of the standard ODBC functions than @code{PostgreSQL}.
@item
MySQL has a much more sophisticated @code{ALTER TABLE}.
@item
MySQL has support for tables without transactions for applications that
need all speed they can get. The tables may be memory based, @code{HEAP}
tables or disk based @code{MyISAM}. @xref{Table types}.
@item
MySQL has support for two different table handlers that support
transactions, @code{InnoDB} and @code{BerkeleyDB}. Because every
transaction engine performs differently under different conditions, this
gives the application writer more options to find an optimal solution for
his or her setup. @xref{Table types}.
@item
@code{MERGE} tables gives you a unique way to instantly make a view over
a set of identical tables and use these as one. This is perfect for
systems where you have log files that you order for example by month.
@xref{MERGE}.
@item
The option to compress read-only tables, but still have direct access to
the rows in the table, gives you better performance by minimising disk
reads. This is very useful when you are archiving things.
@xref{myisampack}.
@item
MySQL has internal support for fulltext search. @xref{Fulltext Search}.
@item
You can access many databases from the same connection (depending of course
on your privileges).
@item
MySQL is coded from the start to be multi-threaded while PostgreSQL uses
processes. Context switching and access to common storage areas is much
faster between threads than between separate processes, this gives MySQL
a big speed advantage in multi-user applications and also makes it easier
for MySQL to take full advantage of symmetric multiprocessor (SMP) systems.
@item
MySQL has a much more sophisticated privilege system than PostgreSQL.
While PostgreSQL only supports @code{INSERT}, @code{SELECT}, and
@code{UPDATE/DELETE} grants per user on a database or a table, MySQL allows
you to define a full set of different privileges on database, table and
column level. MySQL also allows you to specify the privilege on host and
user combinations. @xref{GRANT}.
@item
MySQL supports a compressed client/server protocol which improves
performance over slow links.
@item
MySQL employs a ``table handler'' concept, and is the only relational
database we know of built around this concept. This allows different
low-level table types to be swapped into the SQL engine, and each table
type can be optimised for different performance characteristics.
@item
All MySQL table types (except @strong{InnoDB}) are implemented as files
(one table per file), which makes it really easy to backup, move, delete
and even symlink databases and tables, even when the server is down.
@item
Tools to repair and optimise @strong{MyISAM} tables (the most common
MySQL table type). A repair tool is only needed when a physical corruption
of a data file happens, usually from a hardware failure. It allows a
majority of the data to be recovered.
@item
Upgrading MySQL is painless. When you are upgrading MySQL, you don't need
to dump/restore your data, as you have to do with most PostgreSQL upgrades.
@end itemize
Drawbacks with MySQL compared to PostgreSQL:
@itemize @bullet
@item
The transaction support in MySQL is not yet as well tested as PostgreSQL's
system.
@item
Because MySQL uses threads, which are not yet flawless on many OSes, one
must either use binaries from @uref{http://www.mysql.com/downloads/}, or
carefully follow our instructions on
@uref{http://www.mysql.com/doc/I/n/Installing_source.html} to get an
optimal binary that works in all cases.
@item
Table locking, as used by the non-transactional @code{MyISAM} tables, is
in many cases faster than page locks, row locks or versioning. The
drawback however is that if one doesn't take into account how table
locks work, a single long-running query can block a table for updates
for a long time. This can usually be avoided when designing the
application. If not, one can always switch the trouble table to use one
of the transactional table types. @xref{Table locking}.
@item
With UDF (user defined functions) one can extend MySQL with both normal
SQL functions and aggregates, but this is not yet as easy or as flexible
as in PostgreSQL. @xref{Adding functions}.
@item
Updates that run over multiple tables is harder to do in MySQL.
This will, however, be fixed in MySQL 4.0 with multi-table @code{UPDATE}
and in MySQL 4.1 with subselects.
In MySQL 4.0 one can use multi-table deletes to delete from many tables
at the same time. @xref{DELETE}.
@end itemize
PostgreSQL currently offers the following advantages over MySQL:
Note that because we know the MySQL road map, we have included in the
following table the version when MySQL should support this feature.
Unfortunately we couldn't do this for previous comparison, because we
don't know the PostgreSQL roadmap.
@multitable @columnfractions .70 .30
@item @strong{Feature} @tab @strong{MySQL version}
@item Subselects @tab 4.1
@item Foreign keys @tab 4.0 and 4.1
@item Views @tab 4.2
@item Stored procedures @tab 4.1
@item Extensible type system @tab Not planned
@item Unions @tab 4.0
@item Full join @tab 4.0 or 4.1
@item Triggers @tab 4.1
@item Constraints @tab 4.1
@item Cursors @tab 4.1 or 4.2
@item Extensible index types like R-trees @tab R-trees are planned for 4.2
@item Inherited tables @tab Not planned
@end multitable
Other reasons to use PostgreSQL:
@itemize @bullet
@item
Standard usage in PostgreSQL is closer to ANSI SQL in some cases.
@item
One can speed up PostgreSQL by coding things as stored procedures.
@item
For geographical data, R-TREES makes PostgreSQL better than MySQL.
@item
The PostgreSQL optimiser can do some optimisation that the current MySQL
optimiser can't do. Most notable is doing joins when you don't have the
proper keys in place and doing a join where you are using different keys
combined with OR. The MySQL benchmark suite at
@uref{http://www.mysql.com/information/benchmarks.html} shows you what
kind of constructs you should watch out for when using different
databases.
@item
PostgreSQL has a bigger team of developers that contribute to the server.
@end itemize
Drawbacks with PostgreSQL compared to MySQL:
@itemize @bullet
@item
@code{VACUUM()} makes PostgreSQL hard to use in a 24/7 environment.
@item
Only transactional tables.
@item
Much slower @code{INSERT}, @code{DELETE}, and @code{UPDATE}.
@end itemize
For a complete list of drawbacks, you should also examine the first table
in this section.
@menu
* MySQL-PostgreSQL benchmarks:: Benchmarking MySQL and PostgreSQL
@end menu
@node MySQL-PostgreSQL benchmarks, , MySQL-PostgreSQL features, Compare PostgreSQL
@subsubsection Benchmarking MySQL and PostgreSQL
@cindex PostgreSQL vs. MySQL, benchmarks
The only open source benchmark that we know of that can be used to
benchmark MySQL and PostgreSQL (and other databases) is our own. It can
be found at @uref{http://www.mysql.com/information/benchmarks.html}.
We have many times asked the PostgreSQL developers and some PostgreSQL
users to help us extend this benchmark to make it the definitive benchmark
for databases, but unfortunately we haven't gotten any feedback for this.
We the MySQL developers have, because of this, spent a lot of hours to get
maximum performance from PostgreSQL for the benchmarks, but because we
don't know PostgreSQL intimately, we are sure that there are things that
we have missed. We have on the benchmark page documented exactly how we
did run the benchmark so that it should be easy for anyone to repeat and
verify our results.
The benchmarks are usually run with and without the @code{--fast} option.
When run with @code{--fast} we are trying to use every trick the server can
do to get the code to execute as fast as possible. The idea is that the
normal run should show how the server would work in a default setup and
the @code{--fast} run shows how the server would do if the application
developer would use extensions in the server to make his application run
faster.
When running with PostgreSQL and @code{--fast} we do a @code{VACUUM()}
after every major table @code{UPDATE} and @code{DROP TABLE} to make the
database in perfect shape for the following @code{SELECT}s. The time for
@code{VACUUM()} is measured separately.
When running with PostgreSQL 7.1.1 we could, however, not run with
@code{--fast} because during the @code{INSERT} test, the postmaster (the
PostgreSQL deamon) died and the database was so corrupted that it was
impossible to restart postmaster. After this happened twice, we decided
to postpone the @code{--fast} test until next PostgreSQL release. The
details about the machine we run the benchmark can be found on the
benchmark page.
Before going to the other benchmarks we know of, we would like to give
some background on benchmarks:
It's very easy to write a test that shows @strong{any} database to be the best
database in the world, by just restricting the test to something the
database is very good at and not testing anything that the database is
not good at. If one, after doing this, summarises the result with as
a single figure, things are even easier.
This would be like us measuring the speed of MySQL compared to PostgreSQL
by looking at the summary time of the MySQL benchmarks on our web page.
Based on this MySQL would be more than 40 times faster than PostgreSQL,
something that is of course not true. We could make things even worse
by just taking the test where PostgreSQL performs worst and claim that
MySQL is more than 2000 times faster than PostgreSQL.
The case is that MySQL does a lot of optimisations that PostgreSQL
doesn't do. This is of course also true the other way around. An SQL
optimiser is a very complex thing, and a company could spend years on
just making the optimiser faster and faster.
When looking at the benchmark results you should look for things that
you do in your application and just use these results to decide which
database would be best suited for your application. The benchmark
results also shows things a particular database is not good at and should
give you a notion about things to avoid and what you may have to do in
other ways.
We know of two benchmark tests that claims that PostgreSQL performs better
than MySQL. These both where multi-user tests, a test that we here at
MySQL AB haven't had time to write and include in the benchmark suite,
mainly because it's a big task to do this in a manner that is fair against
all databases.
One is the benchmark paid for by Great Bridge, the company that for 16 months
attempted to build a business based on PostgreSQL but now has ceased
operations. This is the probably worst benchmark we have ever seen anyone
conduct. This was not only tuned to only test what PostgreSQL is absolutely
best at, it was also totally unfair against every other database involved in
the test.
@strong{Note}: We know that even some of the main PostgreSQL
developers did not like the way Great Bridge conducted the benchmark, so we
don't blame the PostgreSQL team for the way the benchmark was done.
This benchmark has been condemned in a lot of postings and newsgroups so
we will here just shortly repeat some things that were wrong with it.
@itemize @bullet
@item
The tests were run with an expensive commercial tool, that makes it
impossible for an open source company like us to verify the benchmarks,
or even check how the benchmarks were really done. The tool is not even
a true benchmark tool, but an application/setup testing tool. To refer
this as a ``standard'' benchmark tool is to stretch the truth a long way.
@item
Great Bridge admitted that they had optimised the PostgreSQL database
(with @code{VACUUM()} before the test) and tuned the startup for the tests,
something they hadn't done for any of the other databases involved. To
say ``This process optimises indexes and frees up disk space a bit. The
optimised indexes boost performance by some margin.'' Our benchmarks
clearly indicate that the difference in running a lot of selects on a
database with and without @code{VACUUM()} can easily differ by a factor
of ten.
@item
The test results were also strange. The AS3AP test documentation
mentions that the test does ``selections, simple joins, projections,
aggregates, one-tuple updates, and bulk updates''.
PostgreSQL is good at doing @code{SELECT}s and @code{JOIN}s (especially
after a @code{VACUUM()}), but doesn't perform as well on @code{INSERT}s or
@code{UPDATE}s. The benchmarks seem to indicate that only @code{SELECT}s
were done (or very few updates). This could easily explain they good results
for PostgreSQL in this test. The bad results for MySQL will be obvious a
bit down in this document.
@item
They did run the so-called benchmark from a Windows machine against a
Linux machine over ODBC, a setup that no normal database user would ever
do when running a heavy multi-user application. This tested more the
ODBC driver and the Windows protocol used between the clients than the
database itself.
@item
When running the database against Oracle and MS-SQL (Great Bridge has
indirectly indicated that the databases they used in the test), they
didn't use the native protocol but instead ODBC. Anyone that has ever
used Oracle knows that all real application uses the native interface
instead of ODBC. Doing a test through ODBC and claiming that the results
had anything to do with using the database in a real-world situation can't
be regarded as fair. They should have done two tests with and without ODBC
to provide the right facts (after having got experts to tune all involved
databases of course).
@item
They refer to the TPC-C tests, but they don't mention anywhere that the
test they did was not a true TPC-C test and they were not even allowed to
call it a TPC-C test. A TPC-C test can only be conducted by the rules
approved by the TPC Council (@uref{http://www.tpc.org/}). Great Bridge
didn't do that. By doing this they have both violated the TPC trademark
and miscredited their own benchmarks. The rules set by the TPC Council
are very strict to ensure that no one can produce false results or make
unprovable statements. Apparently Great Bridge wasn't interested in
doing this.
@item
After the first test, we contacted Great Bridge and mentioned to them
some of the obvious mistakes they had done with MySQL:
@itemize @minus
@item
Running with a debug version of our ODBC driver
@item
Running on a Linux system that wasn't optimised for threads
@item
Using an old MySQL version when there was a recommended newer one available
@item
Not starting MySQL with the right options for heavy multi-user use (the
default installation of MySQL is tuned for minimal resource use).
@end itemize
Great Bridge did run a new test, with our optimised ODBC driver and with
better startup options for MySQL, but refused to either use our updated
glibc library or our standard binary (used by 80% of our users), which was
statically linked with a fixed glibc library.
According to what we know, Great Bridge did nothing to ensure that the
other databases were set up correctly to run well in their test
environment. We are sure however that they didn't contact Oracle or
Microsoft to ask for their advice in this matter ;)
@item
The benchmark was paid for by Great Bridge, and they decided to publish
only partial, chosen results (instead of publishing it all).
@end itemize
Tim Perdue, a long time PostgreSQL fan and a reluctant MySQL user
published a comparison on PHPbuilder
(@uref{http://www.phpbuilder.com/columns/tim20001112.php3}).
When we became aware of the comparison, we phoned Tim Perdue about this
because there were a lot of strange things in his results. For example,
he claimed that MySQL had a problem with five users in his tests, when we
know that there are users with similar machines as his that are using
MySQL with 2000 simultaneous connections doing 400 queries per second.
(In this case the limit was the web bandwidth, not the database.)
It sounded like he was using a Linux kernel that either had some
problems with many threads, such as kernels before 2.4, which had a problem
with many threads on multi-CPU machines. We have documented in this manual
how to fix this and Tim should be aware of this problem.
The other possible problem could have been an old glibc library and
that Tim didn't use a MySQL binary from our site, which is linked with
a corrected glibc library, but had compiled a version of his own with.
In any of the above cases, the symptom would have been exactly what Tim
had measured.
We asked Tim if we could get access to his data so that we could repeat
the benchmark and if he could check the MySQL version on the machine to
find out what was wrong and he promised to come back to us about this.
He has not done that yet.
Because of this we can't put any trust in this benchmark either :(
Over time things also changes and the above benchmarks are not that
relevant anymore. MySQL now have a couple of different table handlers
with different speed/concurrency tradeoffs. @xref{Table types}. It
would be interesting to see how the above tests would run with the
different transactional table types in MySQL. PostgreSQL has of course
also got new features since the test was made. As the above test are
not publicly available there is no way for us to know how the
database would preform in the same tests today.
Conclusion:
The only benchmarks that exist today that anyone can download and run
against MySQL and PostgreSQL is the MySQL benchmarks. We here at MySQL
believe that open source databases should be tested with open source tools!
This is the only way to ensure that no one does tests that nobody can
reproduce and use this to claim that a database is better than another.
Without knowing all the facts it's impossible to answer the claims of the
tester.
The thing we find strange is that every test we have seen about
PostgreSQL, that is impossible to reproduce, claims that PostgreSQL is
better in most cases while our tests, which anyone can reproduce,
clearly shows otherwise. With this we don't want to say that PostgreSQL
isn't good at many things (it is!) or that it isn't faster than MySQL
under certain conditions. We would just like to see a fair test where
they are very good so that we could get some friendly competition going!
For more information about our benchmarks suite @xref{MySQL Benchmarks}.
We are working on an even better benchmark suite, including multi user
tests, and a better documentation of what the individual tests really
do and how to add more tests to the suite.
@c FIX AGL 20011108 Extracted from manual.texi.
@c Contains links to MySQL related info (books, articles). To web portals!
@node MySQL-Books, General-SQL, Questions, MySQL Information Sources
@subsection Books About MySQL
For the latest book information, with user comments, please visit
@uref{http://www.mysql.com/portal/books/html/}.
While this manual is still the right place for up to date technical
information, its primary goal is to contain everything there is to know
about MySQL. It is sometimes nice to have a bound book to read
in bed or while you travel. Here is a list of books about MySQL and
related subjects (in English).
By purchasing a book through these hyperlinks provided herein, you are
contributing to the development of MySQL.
@emph{MySQL}
@multitable @columnfractions .3 .7
@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=0735709211&bfmtype=book} (Barnes and Noble)
@item Publisher @tab New Riders
@item Author @tab Paul DuBois
@item Pub Date @tab 1st Edition December 1999
@item ISBN @tab 0735709211
@item Pages @tab 800
@item Price @tab $49.99 US
@item Downloadable examples @tab
@uref{http://www.kitebird.com/mysql-book/} (@code{samp_db} distribution)
@item Errata @tab
@uref{http://www.kitebird.com/mysql-book/errata.html}
@end multitable
Foreword by Michael ``Monty'' Widenius, MySQL Moderator.
@*
In @emph{MySQL}, Paul DuBois provides you with a comprehensive guide to
one of the most popular relational database systems. Paul has
contributed to the online documentation for MySQL and is an
active member of the MySQL community. The principal MySQL
developer, Monty Widenius, and a network of his fellow developers
reviewed the manuscript, and provided Paul with the kind of insight
no one else could supply.
@*
Instead of merely giving you a general overview of MySQL, Paul
teaches you how to make the most of its capabilities. Through two
sample database applications that run throughout the book, he
gives you solutions to problems you're sure to face. He helps you
integrate MySQL efficiently with third-party tools, such as PHP
and Perl, enabling you to generate dynamic Web pages through
database queries. He teaches you to write programs that access
MySQL databases, and also provides a comprehensive set of
references to column types, operators, functions, SQL syntax,
MySQL programming, C API, Perl @code{DBI}, and PHP API.
@emph{MySQL} simply gives you the kind of information you won't find
anywhere else.
@*
If you use MySQL, this book provides you with:
@itemize @bullet
@item
An introduction to MySQL and SQL.
@item
Coverage of MySQL's data types and how to use them.
@item
Thorough treatment of how to write client programs in C.
@item
A guide to using the Perl @code{DBI} and PHP APIs for developing
command-line and Web-based applications.
@item
Tips on administrative issues such as user accounts, backup,
crash recovery, and security.
@item
Help in choosing an ISP for MySQL access.
@item
A comprehensive reference for MySQL's data types, operators,
functions, and SQL statements and utilities.
@item
Complete reference guides for MySQL's C API, the Perl @code{DBI} API,
and PHP's MySQL-related functions.
@end itemize
@*
@emph{MySQL & mSQL}
@multitable @columnfractions .3 .7
@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=1565924347&bfmtype=book} (Barnes and Noble)
@item Publisher @tab O'Reilly
@item Authors @tab Randy Jay Yarger, George Reese & Tim King
@item Pub Date @tab 1st Edition July 1999
@item ISBN @tab 1-56592-434-7, Order Number: 4347
@item Pages @tab 506
@item Price @tab $34.95
@end multitable
This book teaches you how to use MySQL and @code{mSQL}, two popular
and robust database products that support key subsets of SQL on both Linux
and Unix systems. Anyone who knows basic C, Java, Perl, or Python can
write a program to interact with a database, either as a stand-alone
application or through a Web page. This book takes you through the
whole process, from installation and configuration to programming
interfaces and basic administration. Includes plenty of tutorial
material.
@*
@emph{Sams' Teach Yourself MySQL in 21 Days}
@multitable @columnfractions .3 .7
@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=0672319144&bfmtype=book} (Barnes and Noble)
@item Publisher @tab Sams
@item Authors @tab Mark Maslakowski and Tony Butcher
@item Pub Date @tab June 2000
@item ISBN @tab 0672319144
@item Pages @tab 650
@item Price @tab $39.99
@end multitable
Sams' @emph{Teach Yourself MySQL in 21 Days} is for intermediate Linux users
who want to move into databases. A large share of the audience is Web
developers who need a database to store large amounts of information that
can be retrieved via the Web.
Sams' @emph{Teach Yourself MySQL in 21 Days} is a practical, step-by-step
tutorial. The reader will learn to design and employ this open source
database technology into his or her website using practical, hands-on
examples to follow.
@*
@emph{E-Commerce Solutions with MySQL}
@multitable @columnfractions .3 .7
@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=0761524452&bfmtype=book} (Barnes and Noble)
@item Publisher @tab Prima Communications, Inc.
@item Authors @tab N/A
@item Pub Date @tab January 2000
@item ISBN @tab 0761524452
@item Pages @tab 500
@item Price @tab $39.99
@end multitable
No description available.
@*
@emph{MySQL and PHP from Scratch}
@multitable @columnfractions .3 .7
@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=0789724405&bfmtype=book} (Barnes and Noble)
@item Publisher @tab Que
@item Authors @tab N/A
@item Pub Date @tab September 2000
@item ISBN @tab 0789724405
@item Pages @tab 550
@item Price @tab $34.99
@end multitable
This book puts together information on installing, setting up, and
troubleshooting Apache, MySQL, PHP3, and IMP into one complete
volume. You also learn how each piece is part of a whole by learning,
step-by-step, how to create a web-based e-mail system. Learn to run
the equivalent of Active Server Pages (ASP) using PHP3, set up an
e-commerce site using a database and the Apache web server, and create
a data entry system (such as sales, product quality tracking, customer
preferences, etc) that no installation in the PC.
@*
@emph{Professional MySQL Programming}
@multitable @columnfractions .3 .7
@item Available @tab @uref{http://shop.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=1861005164} (Barnes and Noble)
@item Publisher @tab Wrox Press, Inc.
@item Authors @tab N/A
@item Pub Date @tab Late 2001
@item ISBN @tab 1861005164
@item Pages @tab 1000
@item Price @tab $49.99
@end multitable
No description available.
@*
@emph{Professional Linux Programming}
@multitable @columnfractions .3 .7
@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=1861003013&bfmtype=book} (Barnes and Noble)
@item Publisher @tab Wrox Press, Inc.
@item Authors @tab N/A
@item Pub Date @tab September 2000
@item ISBN @tab 1861003013
@item Pages @tab 1155
@item Price @tab $47.99
@end multitable
In this follow-up to the best-selling @emph{Beginning Linux Programming},
you will learn from the authors' real-world knowledge and experience of
developing software for Linux; you'll be taken through the development
of a sample 'DVD Store' application, with 'theme' chapters addressing
different aspects of its implementation. Meanwhile, individual
``take-a-break'' chapters cover important topics that go beyond the
bounds of the central theme. All focus on the practical aspects of
programming, showing how crucial it is to choose the right tools for
the job, use them as they should be used, and get things right first
time.
@*
@emph{PHP and MySQL Web Development}
@multitable @columnfractions .3 .7
@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=0672317842&bfmtype=book} (Barnes and Noble)
@item Publisher @tab Sams
@item Authors @tab Luke Welling, Laura Thomson
@item Pub Date @tab March 2001
@item ISBN @tab 0672317842
@item Pages @tab 700
@item Price @tab $49.99
@end multitable
@emph{PHP and MySQL Web Development} introduces you to the advantages
of implementing both MySQL and PHP. These advantages are detailed
through the provision of both statistics and several case studies. A
practical web application is developed throughout the book, providing
you with the tools necessary to implement a functional online
database. Each function is developed separately, allowing you the
choice to incorporate only those parts that you would like to
implement. Programming concepts of the PHP language are highlighted,
including functions which tie MySQL support into a PHP script and
advanced topics regarding table manipulation.
@*
@strong{Books recommended by the MySQL Developers}
@emph{SQL-99 Complete, Really}
@multitable @columnfractions .3 .7
@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=0879305681&bfmtype=book} (Barnes and Noble)
@item Publisher @tab CMP Books
@item Authors @tab Peter Gulutzan, Trudy Pelzer
@item Pub Date @tab April 1999
@item ISBN @tab 0879305681
@item Pages @tab 1104
@item Price @tab $55.96
@end multitable
This book contains complete descriptions of the new standards for
syntax, data structures, and retrieval processes of SQL databases. As
an example-based reference manual, it includes all of the CLI
functions, information, schema tables, and status codes, as well as a
working SQL database provided on the companion disk.
@*
@emph{C, A reference manual}
@multitable @columnfractions .3 .7
@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=0133262243&bfmtype=book} (Barnes and Noble)
@item Publisher @tab Prentice Hall
@item Authors @tab Samuel P. Harbison, Guy L. Steele
@item Pub Date @tab September 1994
@item ISBN @tab 0133262243
@item Pages @tab 480
@item Price @tab $35.99
@end multitable
A new and improved revision of the bestselling C language
reference. This manual introduces the notion of "Clean C", writing C
code that can be compiled as a C++ program, C programming style that
emphasizes correctness, portability, maintainability, and
incorporates the ISO C Amendment 1 (1994) which specifies new
facilities for writing portable, international programs in C.
@*
@emph{C++ for Real Programmers}
@multitable @columnfractions .3 .7
@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=0120499428&bfmtype=book} (Barnes and Noble)
@item Publisher @tab Academic Press, Incorporated
@item Authors @tab Jeff Alger, Jim Keogh
@item Pub Date @tab February 1998
@item ISBN @tab 0120499428
@item Pages @tab 388
@item Price @tab $39.95
@end multitable
@emph{C++ For Real Programmers} bridges the gap between C++ as described
in beginner and intermediate-level books and C++ as it is practiced by
experts. Numerous valuable techniques are described, organised into
three simple themes: indirection, class hierarchies, and memory
management. It also provides in-depth coverage of template creation,
exception handling, pointers and optimisation techniques. The focus of
the book is on ANSI C++ and, as such, is compiler independent.
@emph{C++ For Real Programmers} is a revision of
@emph{Secrets of the C++ Masters} and includes a new appendix comparing C++
with Java. The book comes with a 3.5" disk for Windows with source code.
@*
@emph{Algorithms in C}
@multitable @columnfractions .3 .7
@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=0201514257&bfmtype=book} (Barnes and Noble)
@item Publisher @tab Addison Wesley Longman, Inc.
@item Authors @tab Robert Sedgewick
@item Pub Date @tab April 1990
@item ISBN @tab 0201514257
@item Pages @tab 648
@item Price @tab $45.75
@end multitable
@emph{Algorithms in C} describes a variety of algorithms in a number of
areas of interest, including: sorting, searching, string-processing, and
geometric, graph and mathematical algorithms. The book emphasizes
fundamental techniques, providing readers with the tools to confidently
implement, run, and debug useful algorithms.
@*
@emph{Multithreaded Programming with Pthreads}
@multitable @columnfractions .3 .7
@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=0136807291&bfmtype=book} (Barnes and Noble)
@item Publisher @tab Prentice Hall
@item Authors @tab Bil Lewis, Daniel J. Berg
@item Pub Date @tab October 1997
@item ISBN @tab 0136807291
@item Pages @tab 432
@item Price @tab $34.95
@end multitable
Based on the best-selling @emph{Threads Primer},
@emph{Multithreaded Programming with Pthreads} gives you a solid
understanding of Posix threads: what they are, how they work, when to use
them, and how to optimise them. It retains the clarity and humor of
@emph{Threads Primer}, but includes expanded comparisons to Win32 and OS/2
implementations. Code examples tested on all of the major UNIX platforms
are featured along with detailed explanations of how and why they use threads.
@*
@emph{Programming the PERL DBI: Database Programming with PERL}
@multitable @columnfractions .3 .7
@item Available @tab @uref{http://service.bfast.com/bfast/click?bfmid=2181&sourceid=34233559&bfpid=1565926994&bfmtype=book} (Barnes and Noble)
@item Publisher @tab O'Reilly & Associates, Incorporated
@item Authors @tab Alligator Descartes, Tim Bunce
@item Pub Date @tab February 2000
@item ISBN @tab 1565926994
@item Pages @tab 400
@item Price @tab $27.96
@end multitable
@emph{Programming the Perl DBI} is coauthored by Alligator Descartes, one
of the most active members of the DBI community, and by Tim Bunce, the
inventor of DBI. For the uninitiated, the book explains the architecture
of DBI and shows you how to write DBI-based programs. For the experienced
DBI dabbler, this book explains DBI's nuances and the peculiarities of each
individual DBD.
The book includes:
@itemize @bullet
@item
An introduction to DBI and its design.
@item
How to construct queries and bind parameters.
@item
Working with database, driver, and statement handles.
@item
Debugging techniques.
@item
Coverage of each existing DBD.
@item
A complete reference to DBI.
@end itemize
@*
@node General-SQL, Useful Links, MySQL-Books, MySQL Information Sources
@subsection General SQL Information and Tutorials
The MySQL book portal is split into different sections to make it easy
to locate books for various purposes.
@uref{http://www.mysql.com/portal/books/html/}
Tutorials can be found at:
@uref{http://www.mysql.com/portal/development/html/development-61-1.html}
@node Useful Links, , General-SQL, MySQL Information Sources
@subsection Useful MySQL-related Links
The MySQL development portal is the ultimate source of MySQL related
links. @uref{http://www.mysql.com/portal/development/html/}
Apart from the following links, you can find and download a lot of
MySQL programs, tools and APIs in the Contrib directory
(@uref{http://www.mysql.com/Downloads/Contrib/}).
@cindex @code{Contrib} directory
@cindex URLs to MySQL information
@cindex MySQL related information URLs
@subheading Tutorials and Manuals
@table @asis
@item @uref{http://michael.bacarella.com/research/mysqlmyths.html} (MySQL Myths Debunked)
MySQL used in the real world.
@item @uref{http://www.4t2.com/mysql/}
Information about the German MySQL mailing list.
@item @uref{http://www2.rent-a-database.de/mysql/}
MySQL handbook in German.
@item @uref{http://www.bitmover.com:8888/home/bk/mysql/}
Web access to the MySQL BitKeeper repository.
@item @uref{http://www.analysisandsolutions.com/code/mybasic.htm}
Beginners MySQL Tutorial on how to install and set up
MySQL on a Windows machine.
@item @uref{http://www.devshed.com/Server_Side/MySQL/}
A lot of MySQL tutorials.
@item @uref{http://mysql.hitstar.com/}
MySQL manual in Chinese.
@item @uref{http://www.linuxplanet.com/linuxplanet/tutorials/1046/1/}
Setting Up a MySQL-based website.
@item @uref{http://www.hotwired.com/webmonkey/backend/tutorials/tutorial1.html}
MySQL-Perl tutorial.
@item @uref{http://www.iserver.com/support/contrib/perl5/modules.html}
Installing new Perl modules that require locally installed modules.
@item @uref{http://www.hotwired.com/webmonkey/databases/tutorials/tutorial4.html}
PHP/MySQL Tutorial.
@item @uref{http://www.useractive.com/}
Hands on tutorial for MySQL.
@end table
@subheading MySQL Discussion Forums
@table @asis
@item @uref{http://www.weberdev.com/}
Examples using MySQL; (check Top 20)
@item @uref{http://futurerealm.com/forum/futureforum.htm}
FutureForum Web Discussion Software.
@end table
@subheading Porting MySQL/Using MySQL on Different Systems
@table @asis
@item @uref{http://www.entropy.ch/software/macosx/mysql/}
Binary of MySQL for Mac OS X Client. Includes information of how to
build and use MySQL on Mac OS X.
@item @uref{http://xclave.macnn.com/MySQL/}
The Mac OS Xclave. Running MySQL on Mac OS X.
@item @uref{http://www.prnet.de/RegEx/mysql.html}
MySQL for Mac OS X Server.
@item @uref{http://www.latencyzero.com/macosx/mysql.html}
Building MySQL for Mac OS X.
@item @uref{http://www.essencesw.com/Software/mysqllib.html}
New Client libraries for the Mac OS Classic (Macintosh).
@item @uref{http://www.lilback.com/macsql/}
Client libraries for Mac OS Classic (Macintosh).
@item @uref{http://sixk.maniasys.com/index_en.html}
MySQL for Amiga
@end table
@subheading Perl-related Links
@table @asis
@item @uref{http://dbimysql.photoflux.com/}
Perl DBI with MySQL FAQ.
@end table
@c FIX We should get longer descriptions for things in this category!
@subheading Commercial Applications that Support MySQL
@table @asis
@item @uref{http://www.supportwizard.com/}
SupportWizard; Interactive helpdesk on the Web. This product includes a
licensed copy of MySQL.
@item @uref{http://www.sonork.com/}
Sonork, Instant Messenger that is not only Internet oriented. It's
focused on private networks and on small to medium companies. Client
is free, server is free for up to 5 seats.
@item @uref{http://www.stweb.org/}
StWeb - Stratos Web and Application server - An easy-to-use, cross
platform, Internet/Intranet development and deployment system for
development of web-enabled applications. The standard version of StWeb
has a native interface to MySQL database.
@item @uref{http://www.rightnowtech.com/}
Right Now Web; Web automation for customer service.
@item @uref{http://www.icaap.org/Bazaar/}
Bazaar; Interactive Discussion Forums with Web interface.
@cindex PhoneSweep
@item @uref{http://www.phonesweep.com/}
PhoneSweepT is the world's first commercial Telephone Scanner. Many break-ins
in recent years have come not through the Internet, but through unauthorised
dial-up modems. PhoneSweep lets you find these modems by repeatedly placing
phone calls to every phone number that your organisation
controls. PhoneSweep has a built-in expert system that can recognise
more than 250 different kinds of remote-access programs, including
Carbon Copy(TM), pcANYWHERE(TM), and Windows NT RAS. All information is stored
in the SQL database. It then generates a comprehensive report detailing
which services were discovered on which dial-up numbers in your organisation.
@end table
@subheading SQL Clients and Report Writers
@table @asis
@item @uref{http://www.urbanresearch.com/software/utils/urbsql/} (urSQL)
SQL Editor and Query Utility. Custom syntax highlighting, editable
results grid, exportable result-sets, basic MySQL admin functions,
Etc.. For Windows.
@item @uref{http://www.edatanew.com/} (MySQL Data Manager)
MySQL Data Manager * is platform independent web client
(written in perl) for MySQL server over TCP/IP.
@item @uref{http://ksql.sourceforge.net/}
KDE MySQL client.
@item @uref{http://www.ecker-software.de/}
A Windows GUI client by David Ecker.
@item @uref{http://www.icaap.org/software/kiosk/}
Kiosk; a MySQL client for database management. Written in Perl.
Will be a part of Bazaar.
@item @uref{http://www.casestudio.com/}
Db design tool that supports MySQL 3.23.
@item @uref{http://home.skif.net/~voland/zeos/eng/}
Zeos - A client that supports MySQL, Interbase and PostgreSQL.
@item @uref{http://www.geocities.com/SiliconValley/Ridge/4280/GenericReportWriter/grwhome.html}
A free report writer in Java
@item @uref{http://www.javaframework.de/}
MySQLExport - Export of MySQL create statements and data in a lot of
different formats (SQL, HTML, CVS, text, ZIP, GZIP...).
@item @uref{http://dlabs.4t2.com/}
M2D, a MySQL Administration client for Windows. M2D supports
administration of MySQL databases, creation of new databases and
tables, editing, and more.
@item @uref{http://dlabs.4t2.com/}
Dexter, a small server written in Perl which can be used as a proxy server for
MySQL or as a database extender.
@item @uref{http://www.scibit.com/Products/Software/Utils/Mascon.asp}
Mascon is a powerful Win32 GUI for administering MySQL databases.
@item @uref{http://www.rtlabs.com/}
MacSQL Monitor. GUI for MySQL, ODBC, and JDBC databases for the Mac OS.
@end table
@subheading Distributions that Include MySQL
@c FIX add the rest (at least a couple more Linuxes)
@table @asis
@item @uref{http://www.suse.com/}
SuSE Linux (6.1 and above)
@item @uref{http://www.redhat.com/}
RedHat Linux (7.0 and above)
@item @uref{http://distro.conectiva.com.br/}
Conectiva Linux (4.0 and above)
@end table
@subheading Web Development Tools that Support MySQL
@table @asis
@item @uref{http://www.php.net/}
PHP: A server-side HTML-embedded scripting language.
@item @uref{http://www.midgard-project.org/}
The Midgard Application Server; a powerful Web development environment
based on MySQL and PHP.
@cindex dbServ
@item @uref{http://www.dbServ.de/}
dbServ is an extension to a web server to integrate database output into
your HTML code. You may use any HTML function in your output. Only the
client will stop you. It works as standalone server or as Java servlet.
@item @uref{http://www.chilisoft.com/}
Platform independent ASP from Chili!Soft
@item @uref{http://www.voicenet.com/~zellert/tjFM/}
A JDBC driver for MySQL.
@item @uref{http://www.wernhart.priv.at/php/}
MySQL + PHP demos.
@item @uref{http://www.dbwww.com/}
ForwardSQL: HTML interface to manipulate MySQL databases.
@item @uref{http://www.daa.com.au/~james/www-sql/}
WWW-SQL: Display database information.
@item @uref{http://www.heitml.com/}
HeiTML: A server-side extension of HTML and a 4GL language at the same time.
@item @uref{http://hawkeye.net/}
Hawkeye Internet Server Suite.
@item @uref{http://www.webgroove.com/}
WebGroove Script: HTML compiler and server-side scripting language.
@item @uref{http://www.ihtml.com/}
A server-side website scripting language.
@item @uref{ftp://ftp.igc.apc.org/pub/myodbc/README}
How to use MySQL with ColdFusion on Solaris.
@item @uref{http://calistra.com/MySQL/}
Calistra's ODBC MySQL Administrator.
@item @uref{http://phpclub.net/}
PHPclub - Tips and tricks for PHP.
@item @uref{http://www.widgetchuck.com/}
The Widgetchuck; Website Tools and Gadgets
@item @uref{http://www.adcycle.com/}
AdCycle - advertising management software.
@cindex pwPage
@item @uref{http://sourceforge.net/projects/pwpage/}
pwPage - provides an extremely fast and simple approach to the creation
of database forms. That is, if a database table exists and an HTML page
has been constructed using a few simple guidelines, pwPage can be
immediately used for table data selections, insertions, updates, deletions
and selectable table content reviewing.
@item @uref{http://www.omnis-software.com/products/studio/studio.html}
OMNIS Studio is a rapid application development (RAD) tool.
@end table
@subheading Database Design Tools with MySQL Support
@table @asis
@item @uref{http://www.mysql.com/documentation/dezign/}
"DeZign for databases" is a database development tool that uses an
entity relationship diagram (ERD).
@end table
@subheading Web Servers with MySQL Tools
@table @asis
@item @uref{ftp://ftp.kcilink.com/pub/}
mod_auth_mysql, An Apache authentication module.
@item @uref{http://www.roxen.com/}
The Roxen Challenger Web server.
@end table
@subheading Extensions for Other Programs
@table @asis
@item @uref{http://www.seawood.org/msql_bind/}
MySQL support for BIND (The Internet Domain Name Server).
@item @uref{http://www.inet-interactive.com/sendmail/}
MySQL support for Sendmail and Procmail.
@end table
@subheading Using MySQL with Other Programs
@table @asis
@item @uref{http://www.iserver.com/support/addonhelp/database/mysql/msaccess.html}
Using MySQL with Access.
@item @uref{http://www.iserver.com/support/contrib/perl5/modules.html}
Installing new Perl modules that require locally installed modules.
@end table
@subheading ODBC-related Links
@table @asis
@item @uref{http://www.iodbc.org/}
Popular iODBC Driver Manager (libiodbc) now available as Open Source.
@item @uref{http://users.ids.net/~bjepson/freeODBC/}
The FreeODBC Pages.
@item @uref{http://genix.net/unixODBC/}
The unixODBC Project goals are to develop and promote unixODBC to be the
definitive standard for ODBC on the Linux platform. This is to include GUI
support for KDE.
@item @uref{http://www.sw-soft.com/products/BtrieveODBC/}
A MySQL-based ODBC driver for Btrieve.
@end table
@subheading @strong{API}-related Links
@table @asis
@item @uref{http://www.jppp.com/}
Partially implemented TDataset-compatible components for MySQL.
@item @uref{http://www.riverstyx.net/qpopmysql/}
qpopmysql - A patch to allow POP3 authentication from a MySQL
database. There's also a link to Paul Khavkine's patch for Procmail to
allow any MTA to deliver to users in a MySQL database.
@item @uref{http://www.essencesw.com/Software/mysqllib.html}
New Client libraries for the Mac OS Classic (Macintosh).
@item @uref{http://www.lilback.com/macsql/}
Client libraries for the Macintosh.
@item @uref{http://www.essencesw.com/Plugins/mysqlplug.html}
Plugin for REALbasic (for Macintosh)
@item @uref{http://www.iis.ee.ethz.ch/~neeri/macintosh/gusi-qa.html}
A library that emulates BSD sockets and pthreads on Macintosh. This can
be used if you want to compile the MySQL client library on Mac.
It could probably even be sued to port MySQL to Macintosh, but we
don't know of anyone that has tried that.
@cindex SCMDB
@item @uref{http://www.dedecker.net/jessie/scmdb/}
SCMDB - an add-on for SCM that ports the MySQL C library to scheme
(SCM). With this library scheme developers can make connections to a
MySQL database and use embedded SQL in their programs.
@end table
@subheading Other MySQL-related Links
@table @asis
@item @uref{http://www.satisoft.com/} (SAT)
The Small Application Toolkit (SAT) is a collection of utilities
intended to simplify the development of small, multi-user, GUI based
applications in a (Microsoft -or- X) Windows Client / Unix Server
environment.
@item @uref{http://www.wix.com/mysql-hosting/}
Registry of Web providers who support MySQL.
@item @uref{http://www.softagency.co.jp/mysql/index.en.html}
Links about using MySQL in Japan/Asia.
@item @uref{http://abattoir.cc.ndsu.nodak.edu/~nem/mysql/udf/}
MySQL UDF Registry.
@item @uref{http://www.open.com.au/products.html}
Commercial Web defect tracking system.
@item @uref{http://www.stonekeep.com/pts/}
PTS: Project Tracking System.
@item @uref{http://tomato.nvgc.vt.edu/~hroberts/mot/}
Job and software tracking system.
@item @uref{http://www.cynergi.net/exportsql/}
ExportSQL: A script to export data from Access95+.
@item @uref{http://SAL.KachinaTech.COM/H/1/MYSQL.html}
SAL (Scientific Applications on Linux) MySQL entry.
@item @uref{http://www.infotech-nj.com/itech/index.shtml}
A consulting company which mentions MySQL in the right company.
@item @uref{http://www.pmpcs.com/}
PMP Computer Solutions. Database developers using MySQL and
@code{mSQL}.
@item @uref{http://www.dedserius.com/y2kmatrix/}
Y2K tester.
@end table
@subheading SQL and Database Interfaces
@table @asis
@item @uref{http://java.sun.com/products/jdbc/}
The JDBC database access API.
@item @uref{http://www.gagme.com/mysql/}
Patch for @code{mSQL} Tcl.
@item @uref{http://www.amsoft.ru/easysql/}
EasySQL: An ODBC-like driver manager.
@item @uref{http://www.lightlink.com/hessling/rexxsql.html}
A REXX interface to SQL databases.
@c @item @uref{http://www.mytcl.cx/}
@c Tcl interface based on tcl-sql with many bugfixes.
@item @uref{http://www.binevolve.com/~tdarugar/tcl-sql/}
Tcl interface for MySQL.
@item @uref{http://www.contrib.andrew.cmu.edu/~shadow/sql.html}
SQL Reference Page with a lot of interesting links.
@end table
@subheading Examples of MySQL Use
@table @asis
@c Added 990601
@c EMAIL: thuss@little6.com (Todd Huss)
@item @uref{http://www.little6.com/about/linux/}
Little6 Inc., An online contract and job finding site that is powered by
MySQL, PHP3, and Linux.
@c Added 990521
@c EMAIL: info@worldrecords.com (Jim Rota)
@item @uref{http://www.worldrecords.com/}
World Records - A search engine for information about music that uses
MySQL and PHP.
@item @uref{http://www.webtechniques.com/archives/1998/01/note/}
A Contact Database using MySQL and PHP.
@item @uref{http://modems.rosenet.net/mysql/}
Web based interface and Community Calendar with PHP.
@item @uref{http://www.odbsoft.com/cook/sources.htm}
Perl package to generate html from a SQL table structure and for generating
SQL statements from an html form.
@item @uref{http://www.gusnet.cx/proj/telsql/}
Basic telephone database using @code{DBI}/@code{DBD}.
@item @uref{http://tecfa.unige.ch/guides/java/staf2x/ex/jdbc/coffee-break/}
JDBC examples by Daniel K. Schneider.
@item @uref{http://www.ooc.com/}
Object Oriented Concepts Inc; CORBA applications with examples in source.
@c EMAIL: paul@sword.damocles.com (Paul Bannister)
@item @uref{http://www.stopbit.com/}
Stopbit - A technology news site using MySQL and PHP.
@item @uref{http://www.penguinservices.com/scripts/}
Online shopping cart system.
@c Added 990928 from editor@city-gallery.com
@cindex Old Photo Album
@item @uref{http://www.city-gallery.com/album/}
Old Photo Album - The album is a collaborative popular history of photography
project that generates all pages from data stored in a MySQL
database. Pages are dynamically generated through a php3 interface to the
database content. Users contribute images and descriptions. Contributed
images are stored on the web server to avoid storing them in the database
as BLOBs. All other information is stored on the shared MySQL server.
@end table
@subheading General Database Links
@table @asis
@item @uref{http://black.hole-in-the.net/guy/webdb/}
Homepage of the webdb-l (Web Databases) mailing list.
@item @uref{http://www.symbolstone.org/technology/perl/DBI/}
Perl @code{DBI}/@code{DBD} modules homepage.
@item @uref{http://www.student.uni-koeln.de/cygwin/}
Cygwin tools. Unix on top of Windows.
@cindex Tek-Tips forums
@cindex forums, Tek-Tips
@item @uref{http://www.tek-tips.com/}
Tek-Tips Forums are 800+ independent peer-to-peer non-commercial support
forums for Computer Professionals. Features include automatic e-mail
notification of responses, a links library, and member confidentiality
guaranteed.
@item @uref{http://www.public.asu.edu/~peterjn/btree/}
B-Trees: Balanced Tree Data Structures.
@item @uref{http://www.fit.qut.edu.au/~maire/baobab/lecture/sld001.htm}
A lecture about B-Trees.
@end table
@c FIX AGL 20011108 Extracted from manual.texi.
@c Should only be on website with new submits by webform.
@node MySQL Testimonials, Contrib, Users, Top
@appendix MySQL Testimonials
@cindex MySQL Testimonials
The section 'MySQL Users' contains a lot of different links to
MySQL users but doesn't provide that much information about how
they are using MySQL. @xref{Users}. This section gives you an idea
of how other MySQL users are using MySQL to solve their problems.
Please note that all new stories are added on the MySQL website,
@uref{http://www.mysql.com/}.
Do let us know about @emph{your} success story too!
@itemize @bullet
@item
@strong{Peter Zaitsev of Spylog.ru} writes:
I think you might be interested in my database size. The whole database
is currently on 15 servers and I think it's about 60.000 of tables
containing about 5.000.000.000 of rows. My mostly loaded server
currently holds about 10.000 of tables with 1.000.000.000 of rows in it.
Hugest tables have about 50.000.000 of rows, and this value will raise
as soon as I'll move to 2.4 kernel with large files. Currently I have to
delete much of logs for large sites to hold table sizes in 2Gb.
@item
@c FIX AGL 20011108 Extracted from manual.texi.
@c Should only be on website.
@node Users, Contrib, Problems, Top
@appendix MySQL Users
@cindex users, of MySQL
@cindex news sites
This appendix lists users of MySQL that have given us permission
to list them in our documentation. It is by far not a complete list, but
should give you a general idea of who uses MySQL and what it can
be used for.
@appendixsec General News Sites
@itemize @bullet
@item @uref{http://www.yahoo.com/} (Yahoo!)
@item @uref{http://slashdot.org/} (Slashdot: A pro-Linux/tech news and comment/discussion site)
@item @uref{http://www.linux.com/} (All about Linux)
@item @uref{http://www.linuxtoday.com/} (Linuxtoday)
@item @uref{http://www.32bitsonline.com/} (32Bits Online: because there's
more than one way to compute)
@item @uref{http://www.freshmeat.net/} (Freshmeat: News about new versions of computer-related stuff)
@end itemize
@cindex search engines, web
@cindex web search engines
@appendixsec Web Search Engines
@itemize @bullet
@item @uref{http://www.aaa.com.au/} (AAA Matilda Web Search)
@item @uref{http://www.whatsnu.com/} (What's New)
@item @uref{http://www.aladin.de/} (Aladin)
@item @uref{http://www.columbus-finder.de/} (Columbus Finder)
@item @uref{http://www.spider.de/} (Spider)
@item @uref{http://www.blitzsuche.de/} (Blitzsuche)
@item @uref{http://www.indoseek.co.id/} (Indoseek Indonesia)
@item @uref{http://www.yaboo.dk/} (Yaboo - Yet Another BOOkmarker)
@item @uref{http://www.ozsearch.com.au/} (OzSearch Internet Guide)
@item @uref{http://www.splatsearch.com/} (Splat! Search)
@item @uref{http://osdls.library.arizona.edu/} (The Open Source Digital Library System Project)
@end itemize
@appendixsec Information Search Engines Specialising in a Particular Area
@itemize @bullet
@item @uref{http://www.spylog.ru/} (SpyLOG ; A very popular Web counter site)
@item @uref{http://www.tucows.com/} (TuCows Network; Free Software archive)
@item @uref{http://www.jobvertise.com/} (Jobvertise: Post and search for jobs)
@item @uref{http://www.musicdatabase.com/} (The Music Database)
@item @uref{http://www.soccersearch.com/} (Football -Soccer- search page)
@item @uref{http://www.headrush.net/takedown} (TAKEDOWN - wrestling)
@item @uref{http://www.lyrics.net/} (The International Lyrics Network)
@item @uref{http://TheMatrix.com/~matrix/band_search.phtml} (Musicians looking for other musicians; free service)
@item @uref{http://www.addall.com/AddBooks/Stores.html} (AddALL books searching and price comparison)
@item @uref{http://www.herbaria.harvard.edu/Data/Gray/gray.html} (Harvard's Gray Herbarium Index of Plant Names)
@item @uref{http://www.game-developer.com/} (The Game Development Search Engine)
@item @uref{http://www.theinnkeeper.com/} (The Innkeeper Vacation Guides)
@item @uref{http://www.macgamedatabase.com/} (The Mac Game Database uses PHP and MySQL)
@c From: Marc Antony Vose <suzerain@suzerain.com>
@item @uref{http://www.csse.monash.edu.au/publications/} (Research
Publications at Monash University in Australia)
@item @uref{http://www.ipielle.emr.it/bts/}
(Occupational Health & Safety Website database; a project for the ECC)
@c c.presutti@ipielle.emr.it
@item @uref{http://data.mch.mcgill.ca/} (Bioinformatics databases at the
Montreal Children's Hospital using MySQL)
@c saeed@www.debelle.mcgill.ca
@end itemize
@cindex online magazines
@cindex magazines, online
@appendixsec Online Magazines
@itemize @bullet
@item @uref{http://www.spoiler.com/} (Spoiler Webzine)
An online magazine featuring music, literature, arts, and design content.
@item @uref{http://www.linux-magazin.de/newsflash/} (Daily news about Linux in German language)
@item @uref{http://www.betazine.com/} (Betazine - The Ultimate Online Beta Tester's Magazine)
@item @uref{http://www.currents.net/ccinfo/aboutcc.html} (Computer Currents Magazine)
@end itemize
@cindex websites
@appendixsec Websites that Use MySQL as a Backend
@itemize @bullet
@item @uref{http://liftoff.msfc.nasa.gov/} (NASA)
@item @uref{http://kids.msfc.nasa.gov/} (NASA KIDS)
@item @uref{http://science.nasa.gov/} (Sience@@NASA)
@item @uref{http://www.handy.de/} (handy.de)
@item @uref{http://lindev.jmc.tju.edu/qwor/} (Qt Widget and Object Repository)
@item @uref{http://www.samba-choro.com.br/} (Brazilian samba site; in Portuguese)
@item @uref{http://pgss.iss.uw.edu.pl/en_index.ISS} (Polish General Social Survey)
@item @uref{http://www.expo2000.com/} Expo2000 - world-wide distribution of
tickets for this event is implemented using MySQL and Tcl/Tk. More than
5000 travel agencies all over the world have access to it.
@item @uref{http://www.freevote.com/} FreeVote.com is a free voting
service with millions of users.
@item @uref{http://f1.tauzero.se/} (Forza Motorsport)
@item @uref{http://www.dreamhost.com/} (DreamHost Web Hosting)
@end itemize
@cindex services
@appendixsec Domain/Internet/Web and Related Services
@itemize @bullet
@item @uref{http://www.wix.com/mysql-hosting/} (Registry of Web providers that
support MySQL)
@item @uref{http://www.yi.org/} (Dynamic DNS Services)
@item @uref{http://www.dynodns.net/} (Dynamic domain name service)
@item @uref{http://www.ods.org/} (Open DNS Project; free dynamic DNS service)
@c @item @uref{http://dynodns.net/} (Free dynamic DNS implementation)
@c EMAIL: A Moore <amoore@mooresystems.com>
@item @uref{http://www.hn.org/} (Hammernode; Public DNS Servers)
@item @uref{http://www.fdns.net/} (Free 3rd level domains)
@item @uref{http://worldcommunity.com/} (Online Database)
@item @uref{http://www.bigbiz.com/} (BigBiz Internet Services)
@item @uref{http://virt.circle.net/} (The Virt Gazette)
@item @uref{http://www.california.com/} (Global InfoNet Inc)
@item @uref{http://www.webhosters.com/} (WebHosters - A Guide to WWW Providers)
@item @uref{http://online.dn.ru/} (Internet information server)
@item @uref{http://www.worldnetla.net/} (WorldNet Communications - An Internet Services Provider)
@item @uref{http://www.netizen.com.au/} (Netizen: Australian-based Web consultancy)
@item @uref{http://www.trainingpages.co.uk/} (Search site for training courses in the UK)
@item @uref{http://chat.nitco.com/} (Gannon Chat; GPL. Written in Perl and Javascript)
@item @uref{http://www.addurls.com/} (A general links directory)
@item @uref{http://www.bookmarktracker.com/} (A Web-based bookmark management service)
@item @uref{http://www.cdrom.com/} (Walnut Creek CDROM)
@item @uref{http://www.wwwthreads.org/} (WWWThreads; Interactive discussion Forums)
@item @uref{http://pvmon.portici.enea.it/Meteo/} (In Italian; Storage data from meteo station)
@item @uref{http://www.buysell.net/} (Online "Person To Person" Auction)
@item @uref{http://tips.pair.com/} (Tips on Web development)
@item @uref{http://www.mailfriends.com/} (Mailfriends.com is a FREE service for
everybody who wants to find friends over the internet)
@item @uref{http://www.uninova.com/cgi-bin/wctelnets?list} (Web Page Telnet BBS List)
@item @uref{http://www.uninova.com/cnc.html} (UniNova Digital Postcards)
@c @item @uref{http://cabinboy.powersurfr.com/} (An Internet RFC search engine)
@item @uref{http://www.dslreports.com/} (DSL-provider search with reviews)
Made with MySQL and Modperl, all pages are generated dynamically out of
the MySQL database
@end itemize
@cindex PHP, websites
@appendixsec Websites that Use @code{PHP} and MySQL
@itemize @bullet
@c @item @uref{http://www.wh200th.com/} (White House 200th Anniversary site)
@item @uref{http://support.jgaa.com/} (Jgaa's Internet - Official Support Site)
@item @uref{http://io.incluso.com/} (Ionline - online publication) MySQL,
PHP, Java, Web programming, DB development
@item @uref{http://www.baboo.com/} (BaBoo - Browse and Bookmark. Free Web-based bookmark manager and Calendar)
@item @uref{http://www.courses.pjc.cc.fl.us/Schedule/}
(Course Schedule System at Pensacola Junior College)
@item @uref{http://www.fccj.org/} (Florida Community College at Jacksonville)
@item @uref{http://www.32bit.com/} (32bit.com; An extensive shareware / freeware archive)
@item @uref{http://www.jokes2000.com/} (Jokes 2000)
@c Added 990604; EMAIL: ah@dybdahl.dk
@item @uref{http://www.burken.nu/}
Burken is a webhotel that provides scripts, among other things,
for remote users, like counters, guestbooks etc.
@c Added 990608; EMAIL: spacedmp@SpaceDump.Burken.NU (Anders Olausson)
@item @uref{http://tips.pair.com/}
Contains tips on html, javascript, 2d/3d graphics, and PHP3/MySQL.
All pages are generated from a database.
@c Added 990614; EMAIL: downey@image.dk (Rune Madsen)
@item @uref{http://www.softwarezrus.com/}
Ecommerce site that is selling computers.
@end itemize
@cindex consultants, list of
@appendixsec MySQL Consultants
@itemize @bullet
@item @uref{http://www.ayni.com/} (Ayni AG)
@item @uref{http://worldcommunity.com/} (Online Database)
@item @uref{http://www2.dataguard.no/} (DataGuard; Uses MySQL and PHP)
@item @uref{http://wwits.net/programs/mysql.phtml} (WWITS; uses MySQL and PHP)
@item @uref{http://www.worldcommunity.com/} (WCN - The World Community Network)
@item @uref{http://www.chipcastle.com/} (Chip Castle Dot Com Inc)
@c Added 990603 EMAIL: chip@chipcastle.com (Chip Castle)
@item @uref{http://www.cyber.com.au/} (Cybersource Pty. Ltd)
@item @uref{http://www.spring.de/} (Spring infotainment gmbh & co. kg)
@c added 990905 "Oliver Pischke" <opischke@spring.de>
@item @uref{http://www.wamdesign.com/} (Wam Design develops websites using MySQL)
@c Added 990905; max@wamdesign.com
@item @uref{http://www.berkeleyconsultants.com/} (Berkeley Consultants Group)
@item @uref{http://www.jammconsulting.com/} (JAMM Consulting Inc)
@end itemize
@c Commented out by Arjen 011018, section is empty!
@c appendixsec Programming
@cindex web pages, miscellaneous
@appendixsec Uncategorised Pages
@itemize @bullet
@item @uref{http://www.feature-showcase.com/htmls/demo_mysql.sql} (AZC.COM's Feature Showcase)
@item @uref{http://www.teach.org.uk/subjects/trainingcourse/g.html} (Course Search)
@item @uref{http://www.northerbys.com/} (Northerbys Online Auctions)
@item @uref{http://www.schiphol.nl/flights/home.htm} (Amsterdam Airport Schiphol)
@item @uref{http://TheMatrix.com/seventhsin/query.phtml} (CD database)
@item @uref{http://TheMatrix.com/~flmm/GEAR.html} (Used Audio Gear Database)
@item @uref{http://www.kiss.de/musik-mueller/} (Musical note-sheets)
@item @uref{http://www.bagism.com/} (Bagism; A John Lennon fan page)
@item @uref{http://www.selftaught.com/} (US Folk art broker)
@item @uref{http://organizer.net/} (Mail reading on the Web)
@item @uref{http://www.mypage.org/} (Free home pages on www.somecoolname.mypage.org)
@item @uref{http://www.schulweb.de/} (Der Server f@"ur Schulen im Web - in German)
@item @uref{http://www.ald.net/} (Auldhaefen Online Services)
@item @uref{http://www.cary.net/} (CaryNET Information Center)
@item @uref{http://www.dataden.com/} (Dataden Computer Systems)
@item @uref{http://andree.grm.se/} (Andr@'emuseet; in Swedish)
@item @uref{http://www.him.net/} (HOMESITE Internet Marketing)
@item @uref{http://www.jade-v.com/techinfo.html} (Jade-V Network Services)
@item @uref{http://ww2010.atmos.uiuc.edu/(Gl)/abt/aknw/tech.rxml}
Weather World 2010 Technical Credits
@item @uref{http://gimp.foebud.org/registry/doc/}
About The Gimp plugin registry
@item @uref{http://www.fast-inc.com/Products/Archiver/database.html}
Java tool; archiver technical detail (Slightly optimistic about MySQL
ANSI-92 compliance)
@item @uref{http://www.gamesdomain.com/cheats/usrcheat.phtml} (Games Domain Cheats Database)
@item @uref{http://www.kcilink.com/poweredby/} (The "Powered By" Page; Kcilink)
@item @uref{http://www.netcasting.net/index.whtml} (Netcasting)
@item @uref{http://homepages.tig.com.au/~mjj/nbltips} (NBL: Australian National Basketball League; tipping)
@item @uref{http://www.cgishop.com/} (CGI shop)
@item @uref{http://www.whirlycott.com/} (Whirlycott: Website Design)
@item @uref{http://www.mtp.dk/} (Museum Tusculanum Press)
@item @uref{http://csdgi.historie.ku.dk/biblio/} (Centro Siciliano di Documentazione)
@item @uref{http://caribou.dyn.ml.org:8000/} (Quake statistics database)
@item @uref{http://www.astroforum.ch/} (Astroforum: Astrologie and related things; in German)
@item @uref{http://www.opendebate.com/} (OpenDebate - Interactive Polls & Open Discussion)
@item @uref{http://vermeer.organik.uni-erlangen.de/dissertationen/} (Online chemical dissertation server)
@item @uref{http://www.freschinfo.com/} (FreSch! The Free Scholarship Search Service)
@item @uref{http://www.nada.kth.se/~staffanu/pinball/} (Stockholm Pinball Locator)
@item @uref{http://www.hek.com/} (HEK - a construction company)
@item @uref{http://www.ebi.nl/} (Elsevier Business Information)
@item @uref{http://vaccination.medicallink.se/} (Medical Links; using ColdFusion and MySQL)
@item @uref{http://www.joblink-usa.com/} (Search for jobs & people at JobLink-USA)
@item @uref{http://www.skydive.net/competfs/} (Competition Formation Skydiving)
@item @uref{http://www.galaxy-net.net/} (Galaxy-NET Telecommunications; E-commerce and internal accounting)
@item @uref{http://www.borsen.dk/} (Denmark's leading business daily newspaper B@o{}rsen)
@item @uref{http://tmmm.simplenet.com/indb/} (The Internet NES Database)
@item @uref{http://www.russia.cz/} (Travel agency in Prague in 3 languages)
@item @uref{http://www.linkstation.de/} (Linkstation)
@item @uref{http://www.peoplestaff.com/} (Searchable online database at Peoplestaff)
@item @uref{http://www.dreamhorse.com/} (A searchable database system for horse classified ads)
@item @uref{http://pootpoot.com/} (The Poot site)
@item @uref{http://grateful.net/hw_html/} ("Playin' in the LAN"; a network monitoring suite)
@c Update from Christopher Milton <cmilton@bwn.net> 1999-12-21
@item @uref{http://www.usapa.army.mil/} (U.S. Army Publishing Agency)
@item @uref{http://www.nekretnine.co.yu/} (Realestate handling in Yugoslavia)
@item @uref{http://demo.cpsoft.com/pims/devFAQ.html} (PIMS; a Patient Information Management System)
@item @uref{http://cpsoft.com/} (Pilkington Software Inc)
@item @uref{http://www.no-quarter.org/} (A Vietnam Veteran's Memorial - The Wall - database)
@item @uref{http://www.gamers-union.com/} (Gamer's Union specializes in auctions of used & out-of-print gaming material)
@item @uref{http://www.montereyhigh.com/office/dbul.php3} (A daily bulletin at Monterey High school)
@item @uref{http://www.myEastside.com/} (Community-owned site serving Lake
Washington's Eastside residents and businesses)
@item @uref{http://bowling-france.net/} (French bowling site)
@end itemize
Send any additions to this list to @email{webmaster@@mysql.com}.
@page
......@@ -4,6 +4,8 @@ insert into t1 (bandID,payoutID) VALUES (1,6),(2,6),(3,4),(4,9),(5,10),(6,1),(7,
create table t2 (payoutID SMALLINT UNSIGNED NOT NULL PRIMARY KEY);
insert into t2 (payoutID) SELECT DISTINCT payoutID FROM t1;
insert into t2 (payoutID) SELECT payoutID+10 FROM t1;
Duplicate entry '16' for key 1
insert ignore into t2 (payoutID) SELECT payoutID+10 FROM t1;
select * from t2;
payoutID
1
......
......@@ -102,3 +102,13 @@ select status from t1;
status
1
drop table t1;
create table t1 (a int not null, b int not null);
insert into t1 values (1,1),(1,2),(1,3);
update t1 set b=4 where a=1 order by b asc limit 1;
update t1 set b=4 where a=1 order by b desc limit 1;
select * from t1;
a b
1 4
1 4
1 2
drop table t1;
......@@ -7,7 +7,9 @@ create table t1 (bandID MEDIUMINT UNSIGNED NOT NULL PRIMARY KEY, payoutID SMALLI
insert into t1 (bandID,payoutID) VALUES (1,6),(2,6),(3,4),(4,9),(5,10),(6,1),(7,12),(8,12);
create table t2 (payoutID SMALLINT UNSIGNED NOT NULL PRIMARY KEY);
insert into t2 (payoutID) SELECT DISTINCT payoutID FROM t1;
--error 1062
insert into t2 (payoutID) SELECT payoutID+10 FROM t1;
insert ignore into t2 (payoutID) SELECT payoutID+10 FROM t1;
select * from t2;
drop table t1,t2;
#
......
......@@ -76,3 +76,14 @@ alter table t1 change lfdnr lfdnr int(10) unsigned default 0 not null auto_incre
update t1 set status=1 where type='Open';
select status from t1;
drop table t1;
#
# Test of ORDER BY
#
create table t1 (a int not null, b int not null);
insert into t1 values (1,1),(1,2),(1,3);
update t1 set b=4 where a=1 order by b asc limit 1;
update t1 set b=4 where a=1 order by b desc limit 1;
select * from t1;
drop table t1;
......@@ -112,6 +112,10 @@ MY_DIR *my_dir(const char *path, myf MyFlags)
dirp = opendir(directory_file_name(tmp_path,(my_string) path));
size = STARTSIZE;
#if defined(__amiga__)
if ((dirp->dd_fd) < 0) /* Directory doesn't exists */
goto error;
#endif
if (dirp == NULL || ! (buffer = (char *) my_malloc(size, MyFlags)))
goto error;
......
Running crash-me on Interbase:
I
- got opensource version of interbase 6.0.1
(both mode, classic and superserver),
- set up DBD::InterBase from cpan,
- created database "test" and set sql_dialect for that database to 3
- executed crash-me for both interbase's models (classic and superserver).
There were some problems during the execution:
1) Sometimes client side got SIGSEGV , At that moment server side
writes
gds__alloc: non-positive size allocation request
to log file.
This problem has both models. I am not shure if it's interbase or
DBD:InterBase problem (though DBD::InterBase made all nesessary
tests during the installation without any problem)
2) In "superserver" mode ibserver several times died (and ibguard restarted it)
......@@ -2524,21 +2524,21 @@ sub report_trans
if ($rc) {
$dbh->{AutoCommit} = 1;
if (safe_query_result($check,"","")) {
save_config_data($limit,"yes",$prompt);
save_config_data($limit,"yes",$limit);
}
safe_query($clear);
} else {
$dbh->{AutoCommit} = 1;
save_config_data($limit,"error",$prompt);
save_config_data($limit,"error",$limit);
}
} else {
save_config_data($limit,"error",$prompt);
save_config_data($limit,"error",$limit);
}
$dbh->{AutoCommit} = 1;
}
else
{
save_config_data($limit,"no",$prompt);
save_config_data($limit,"no",$limit);
}
safe_query($clear);
}
......
#This file is automaticly generated by crash-me 1.57
NEG=no # update of column= -column
Need_cast_for_null=no # Need to cast NULL for arithmetic
alter_add_col=yes # Alter table add column
alter_add_constraint=yes # Alter table add constraint
alter_add_foreign_key=yes # Alter table add foreign key
alter_add_multi_col=with add # Alter table add many columns
alter_add_primary_key=with constraint # Alter table add primary key
alter_add_unique=no # Alter table add unique
alter_alter_col=no # Alter table alter column default
alter_change_col=no # Alter table change column
alter_drop_col=no # Alter table drop column
alter_drop_constraint=yes # Alter table drop constraint
alter_drop_foreign_key=with drop constraint # Alter table drop foreign key
alter_drop_primary_key=no # Alter table drop primary key
alter_drop_unique=no # Alter table drop unique
alter_modify_col=no # Alter table modify column
alter_rename_table=no # Alter table rename table
atomic_updates=no # atomic updates
automatic_rowid=no # Automatic row id
binary_numbers=yes # binary numbers (0b1001)
binary_strings=no # binary strings (b'0110')
case_insensitive_strings=no # Case insensitive compare
char_is_space_filled=yes # char are space filled
column_alias=yes # Column alias
columns_in_order_by=37 # number of columns in order by
comment_#=no # # as comment
comment_--=no # -- as comment (ANSI)
comment_/**/=yes # /* */ as comment
comment_//=no # // as comment
compute=no # Compute
connections=1000 # Simultaneous connections (installation default)
constraint_check=no # Column constraints
constraint_check_table=no # Table constraints
constraint_null=no # NULL constraint (SyBase style)
crash_me_safe=yes # crash me safe
crash_me_version=1.57 # crash me version
create_default=yes # default value for column
create_default_func=no # default value function for column
create_if_not_exists=no # create table if not exists
create_index=yes # create index
create_schema=no # Create SCHEMA
create_table_select=no # create table from select
cross_join=no # cross join (same as from a,b)
date_infinity=no # Supports 'infinity dates
date_last=no # Supports 9999-12-31 dates
date_one=no # Supports 0001-01-01 dates
date_with_YY=no # Supports YY-MM-DD dates
date_zero=no # Supports 0000-00-00 dates
domains=no # Domains (ANSI SQL)
double_quotes=yes # Double '' as ' in strings
drop_if_exists=no # drop table if exists
drop_index=yes # drop index
drop_requires_cascade=no # drop table require cascade/restrict
drop_restrict=no # drop table with cascade/restrict
end_colon=yes # allows end ';'
except=no # except
except_all=no # except all
except_all_incompat=no # except all (incompatible lists)
except_incompat=no # except (incompatible lists)
float_int_expr=yes # mixing of integer and float in expression
foreign_key_syntax=no # foreign key syntax
full_outer_join=yes # full outer join
func_extra_!=no # Function NOT as '!' in SELECT
func_extra_%=no # Function MOD as %
func_extra_&=no # Function & (bitwise and)
func_extra_&&=no # Function AND as '&&'
func_extra_<>=no # Function <> in SELECT
func_extra_==no # Function =
func_extra_add_months=no # Function ADD_MONTHS
func_extra_and_or=no # Function AND and OR in SELECT
func_extra_ascii_char=no # Function ASCII_CHAR
func_extra_ascii_code=no # Function ASCII_CODE
func_extra_atn2=no # Function ATN2
func_extra_auto_num2string=no # Function automatic num->string convert
func_extra_auto_string2num=no # Function automatic string->num convert
func_extra_between=no # Function BETWEEN in SELECT
func_extra_binary_shifts=no # Function << and >> (bitwise shifts)
func_extra_bit_count=no # Function BIT_COUNT
func_extra_ceil=no # Function CEIL
func_extra_charindex=no # Function CHARINDEX
func_extra_chr=no # Function CHR
func_extra_concat_as_+=no # Function concatenation with +
func_extra_concat_list=no # Function CONCAT(list)
func_extra_convert=no # Function CONVERT
func_extra_cosh=no # Function COSH
func_extra_date_format=no # Function DATE_FORMAT
func_extra_dateadd=no # Function DATEADD
func_extra_datediff=no # Function DATEDIFF
func_extra_datename=no # Function DATENAME
func_extra_datepart=no # Function DATEPART
func_extra_elt=no # Function ELT
func_extra_encrypt=no # Function ENCRYPT
func_extra_field=no # Function FIELD
func_extra_format=no # Function FORMAT
func_extra_from_days=no # Function FROM_DAYS
func_extra_from_unixtime=no # Function FROM_UNIXTIME
func_extra_getdate=no # Function GETDATE
func_extra_greatest=no # Function GREATEST
func_extra_if=no # Function IF
func_extra_in_num=no # Function IN on numbers in SELECT
func_extra_in_str=no # Function IN on strings in SELECT
func_extra_initcap=no # Function INITCAP
func_extra_instr=no # Function LOCATE as INSTR
func_extra_instr_oracle=no # Function INSTR (Oracle syntax)
func_extra_instrb=no # Function INSTRB
func_extra_interval=no # Function INTERVAL
func_extra_last_day=no # Function LAST_DAY
func_extra_last_insert_id=no # Function LAST_INSERT_ID
func_extra_least=no # Function LEAST
func_extra_lengthb=no # Function LENGTHB
func_extra_like=no # Function LIKE in SELECT
func_extra_like_escape=no # Function LIKE ESCAPE in SELECT
func_extra_ln=no # Function LN
func_extra_log(m_n)=no # Function LOG(m,n)
func_extra_logn=no # Function LOGN
func_extra_lpad=no # Function LPAD
func_extra_mdy=no # Function MDY
func_extra_mid=no # Function SUBSTRING as MID
func_extra_months_between=no # Function MONTHS_BETWEEN
func_extra_not=no # Function NOT in SELECT
func_extra_not_between=no # Function NOT BETWEEN in SELECT
func_extra_not_like=no # Function NOT LIKE in SELECT
func_extra_odbc_convert=no # Function ODBC CONVERT
func_extra_password=no # Function PASSWORD
func_extra_paste=no # Function PASTE
func_extra_patindex=no # Function PATINDEX
func_extra_period_add=no # Function PERIOD_ADD
func_extra_period_diff=no # Function PERIOD_DIFF
func_extra_pow=no # Function POW
func_extra_range=no # Function RANGE
func_extra_regexp=no # Function REGEXP in SELECT
func_extra_replicate=no # Function REPLICATE
func_extra_reverse=no # Function REVERSE
func_extra_root=no # Function ROOT
func_extra_round1=no # Function ROUND(1 arg)
func_extra_rpad=no # Function RPAD
func_extra_sec_to_time=no # Function SEC_TO_TIME
func_extra_sinh=no # Function SINH
func_extra_str=no # Function STR
func_extra_strcmp=no # Function STRCMP
func_extra_stuff=no # Function STUFF
func_extra_substrb=no # Function SUBSTRB
func_extra_substring_index=no # Function SUBSTRING_INDEX
func_extra_sysdate=no # Function SYSDATE
func_extra_tail=no # Function TAIL
func_extra_tanh=no # Function TANH
func_extra_time_to_sec=no # Function TIME_TO_SEC
func_extra_to_days=no # Function TO_DAYS
func_extra_translate=no # Function TRANSLATE
func_extra_trim_many_char=no # Function TRIM; Many char extension
func_extra_trim_substring=no # Function TRIM; Substring extension
func_extra_trunc=no # Function TRUNC
func_extra_uid=no # Function UID
func_extra_unix_timestamp=no # Function UNIX_TIMESTAMP
func_extra_userenv=no # Function USERENV
func_extra_version=no # Function VERSION
func_extra_weekday=no # Function WEEKDAY
func_extra_|=no # Function | (bitwise or)
func_extra_||=no # Function OR as '||'
func_extra_~*=no # Function ~* (case insensitive compare)
func_odbc_abs=no # Function ABS
func_odbc_acos=no # Function ACOS
func_odbc_ascii=no # Function ASCII
func_odbc_asin=no # Function ASIN
func_odbc_atan=no # Function ATAN
func_odbc_atan2=no # Function ATAN2
func_odbc_ceiling=no # Function CEILING
func_odbc_char=no # Function CHAR
func_odbc_concat=no # Function CONCAT(2 arg)
func_odbc_cos=no # Function COS
func_odbc_cot=no # Function COT
func_odbc_curdate=no # Function CURDATE
func_odbc_curtime=no # Function CURTIME
func_odbc_database=no # Function DATABASE
func_odbc_dayname=no # Function DAYNAME
func_odbc_dayofmonth=no # Function DAYOFMONTH
func_odbc_dayofweek=no # Function DAYOFWEEK
func_odbc_dayofyear=no # Function DAYOFYEAR
func_odbc_degrees=no # Function DEGREES
func_odbc_difference=no # Function DIFFERENCE()
func_odbc_exp=no # Function EXP
func_odbc_floor=no # Function FLOOR
func_odbc_fn_left=no # Function ODBC syntax LEFT & RIGHT
func_odbc_hour=no # Function HOUR
func_odbc_hour_time=no # Function ANSI HOUR
func_odbc_ifnull=no # Function IFNULL
func_odbc_insert=no # Function INSERT
func_odbc_lcase=no # Function LCASE
func_odbc_left=no # Function LEFT
func_odbc_length=no # Function REAL LENGTH
func_odbc_length_without_space=no # Function ODBC LENGTH
func_odbc_locate_2=no # Function LOCATE(2 arg)
func_odbc_locate_3=no # Function LOCATE(3 arg)
func_odbc_log=no # Function LOG
func_odbc_log10=no # Function LOG10
func_odbc_ltrim=no # Function LTRIM
func_odbc_minute=no # Function MINUTE
func_odbc_mod=no # Function MOD
func_odbc_month=no # Function MONTH
func_odbc_monthname=no # Function MONTHNAME
func_odbc_now=no # Function NOW
func_odbc_pi=no # Function PI
func_odbc_power=no # Function POWER
func_odbc_quarter=no # Function QUARTER
func_odbc_radians=no # Function RADIANS
func_odbc_rand=no # Function RAND
func_odbc_repeat=no # Function REPEAT
func_odbc_replace=no # Function REPLACE
func_odbc_right=no # Function RIGHT
func_odbc_round=no # Function ROUND(2 arg)
func_odbc_rtrim=no # Function RTRIM
func_odbc_second=no # Function SECOND
func_odbc_sign=no # Function SIGN
func_odbc_sin=no # Function SIN
func_odbc_soundex=no # Function SOUNDEX
func_odbc_space=no # Function SPACE
func_odbc_sqrt=no # Function SQRT
func_odbc_substring=no # Function ODBC SUBSTRING
func_odbc_tan=no # Function TAN
func_odbc_timestampadd=no # Function TIMESTAMPADD
func_odbc_timestampdiff=no # Function TIMESTAMPDIFF
func_odbc_truncate=no # Function TRUNCATE
func_odbc_ucase=no # Function UCASE
func_odbc_user()=no # Function USER()
func_odbc_week=no # Function WEEK
func_odbc_year=no # Function YEAR
func_sql_+=yes # Function +, -, * and /
func_sql_bit_length=no # Function BIT_LENGTH
func_sql_cast=yes # Function CAST
func_sql_char_length=no # Function CHAR_LENGTH
func_sql_char_length(constant)=no # Function CHAR_LENGTH(constant)
func_sql_character_length=no # Function CHARACTER_LENGTH
func_sql_coalesce=no # Function COALESCE
func_sql_concat_as_||=yes # Function concatenation with ||
func_sql_current_date=no # Function CURRENT_DATE
func_sql_current_time=no # Function CURRENT_TIME
func_sql_current_timestamp=yes # Function CURRENT_TIMESTAMP
func_sql_current_user=no # Function CURRENT_USER
func_sql_extract_sql=yes # Function EXTRACT
func_sql_localtime=no # Function LOCALTIME
func_sql_localtimestamp=no # Function LOCALTIMESTAMP
func_sql_lower=no # Function LOWER
func_sql_nullif_num=no # Function NULLIF with numbers
func_sql_nullif_string=no # Function NULLIF with strings
func_sql_octet_length=no # Function OCTET_LENGTH
func_sql_position=no # Function POSITION
func_sql_searched_case=no # Function searched CASE
func_sql_session_user=no # Function SESSION_USER
func_sql_simple_case=no # Function simple CASE
func_sql_substring=no # Function ANSI SQL SUBSTRING
func_sql_system_user=no # Function SYSTEM_USER
func_sql_trim=no # Function TRIM
func_sql_upper=yes # Function UPPER
func_sql_user=yes # Function USER
func_where_between=yes # Function BETWEEN
func_where_eq_all=yes # Function = ALL
func_where_eq_any=yes # Function = ANY
func_where_eq_some=yes # Function = SOME
func_where_exists=yes # Function EXISTS
func_where_in_num=yes # Function IN on numbers
func_where_like=yes # Function LIKE
func_where_like_escape=yes # Function LIKE ESCAPE
func_where_match=no # Function MATCH
func_where_match_unique=no # Function MATCH UNIQUE
func_where_matches=no # Function MATCHES
func_where_not_between=yes # Function NOT BETWEEN
func_where_not_exists=yes # Function NOT EXISTS
func_where_not_like=yes # Function NOT LIKE
func_where_not_unique=no # Function NOT UNIQUE
func_where_unique=no # Function UNIQUE
functions=yes # Functions
group_by=yes # Group by
group_by_alias=no # Group by alias
group_by_null=yes # Group on column with null values
group_by_position=no # Group by position
group_distinct_functions=yes # Group functions with distinct
group_func_extra_bit_and=no # Group function BIT_AND
group_func_extra_bit_or=no # Group function BIT_OR
group_func_extra_count_distinct_list=no # Group function COUNT(DISTINCT expr,expr,...)
group_func_extra_std=no # Group function STD
group_func_extra_stddev=no # Group function STDDEV
group_func_extra_variance=no # Group function VARIANCE
group_func_sql_any=no # Group function ANY
group_func_sql_avg=yes # Group function AVG
group_func_sql_count_*=yes # Group function COUNT (*)
group_func_sql_count_column=yes # Group function COUNT column name
group_func_sql_count_distinct=yes # Group function COUNT(DISTINCT expr)
group_func_sql_every=no # Group function EVERY
group_func_sql_max=yes # Group function MAX on numbers
group_func_sql_max_str=yes # Group function MAX on strings
group_func_sql_min=yes # Group function MIN on numbers
group_func_sql_min_str=yes # Group function MIN on strings
group_func_sql_some=no # Group function SOME
group_func_sql_sum=yes # Group function SUM
group_functions=yes # Group functions
group_on_unused=yes # Group on unused column
has_true_false=no # TRUE and FALSE
having=yes # Having
having_with_alias=no # Having on alias
having_with_group=yes # Having with group function
hex_numbers=yes # hex numbers (0x41)
hex_strings=no # hex strings (x'1ace')
ignore_end_space=yes # Ignore end space in compare
index_in_create=no # index in create table
index_namespace=no # different namespace for index
index_parts=no # index on column part (extension)
inner_join=yes # inner join
insert_empty_string=no # insert empty string
insert_multi_value=no # INSERT with Value lists
insert_select=no # insert INTO ... SELECT ...
insert_with_set=no # INSERT with set syntax
intersect=no # intersect
intersect_all=no # intersect all
intersect_all_incompat=no # intersect all (incompatible lists)
intersect_incompat=no # intersect (incompatible lists)
join_tables=+64 # tables in join
left_outer_join=yes # left outer join
left_outer_join_using=no # left outer join using
like_with_column=no # column LIKE column
like_with_number=no # LIKE on numbers
lock_tables=no # lock table
logical_value=not supported # Value of logical operation (1=1)
max_big_expressions=1 # big expressions
max_char_size=32767 # max char() size
max_column_name=18 # column name length
max_columns=4759 # Columns in table
max_conditions=2944 # OR and AND in WHERE
max_expressions=+10000 # simple expressions
max_index=+64 # max index
max_index_name=31 # index name length
max_index_parts=16 # index parts
max_index_varchar_part_length=249 # index varchar part length
max_row_length=64744 # max table row length (without blobs)
max_row_length_with_null=64744 # table row length with nulls (without blobs)
max_select_alias_name=132 # select alias name length
max_stack_expression=165 # stacked expressions
max_table_alias_name=255 # table alias name length
max_table_name=31 # table name length
max_unique_index=+64 # unique indexes
max_varchar_size=10923 # max varchar() size
minus=no # minus
minus_incompat=no # minus (incompatible lists)
minus_neg=yes # Calculate 1--1
multi_drop=no # many tables to drop table
multi_strings=no # Multiple line strings
multi_table_delete=no # DELETE FROM table1,table2...
multi_table_update=no # Update with many tables
natural_join=no # natural join
natural_join_incompat=no # natural join (incompatible lists)
natural_left_outer_join=no # natural left outer join
no_primary_key=yes # Tables without primary key
null_concat_expr=no # Is 'a' || NULL = NULL
null_in_index=yes # null in index
null_in_unique=no # null in unique index
null_num_expr=no # Is 1+NULL = NULL
nulls_in_unique=no # null combination in unique index
odbc_left_outer_join=no # left outer join odbc style
operating_system=Linux 2.4.4-64GB-SMP i686 # crash-me tested on
order_by=yes # Order by
order_by_alias=no # Order by alias
order_by_function=no # Order by function
order_by_position=yes # Order by position
order_by_remember_desc=no # Order by DESC is remembered
order_on_unused=yes # Order by on unused column
primary_key_in_create=yes # primary key in create table
psm_functions=no # PSM functions (ANSI SQL)
psm_modules=no # PSM modules (ANSI SQL)
psm_procedures=no # PSM procedures (ANSI SQL)
psm_trigger=no # Triggers (ANSI SQL)
query_size=65535 # query size
quote_ident_with_"=yes # " as identifier quote (ANSI SQL)
quote_ident_with_[=no # [] as identifier quote
quote_ident_with_`=no # ` as identifier quote
quote_with_"=no # Allows ' and " as string markers
recursive_subqueries=61 # recursive subqueries
remember_end_space=no # Remembers end space in char()
remember_end_space_varchar=yes # Remembers end space in varchar()
rename_table=no # rename table
right_outer_join=yes # right outer join
rowid=no # Type for row id
select_constants=yes # Select constants
select_limit=no # LIMIT number of rows
select_limit2=no # SELECT with LIMIT #,#
select_string_size=32767 # constant string size in SELECT
select_table_update=yes # Update with sub select
select_without_from=no # SELECT without FROM
server_version=6.0.1 # server version
simple_joins=yes # ANSI SQL simple joins
storage_of_float=round # Storage of float values
subqueries=yes # subqueries
table_alias=no # Table alias
table_name_case=yes # case independent table names
table_wildcard=yes # Select table_name.*
temporary_table=no # temporary tables
transactions=error # constant string size in where
truncate_table=no # truncate
type_extra_abstime=no # Type abstime
type_extra_bfile=no # Type bfile
type_extra_blob=yes # Type blob
type_extra_bool=no # Type bool
type_extra_box=no # Type box
type_extra_byte=no # Type byte
type_extra_char(1_arg)_binary=no # Type char(1 arg) binary
type_extra_cidr=no # Type cidr
type_extra_circle=no # Type circle
type_extra_clob=no # Type clob
type_extra_datetime=no # Type datetime
type_extra_double=no # Type double
type_extra_enum(1_arg)=no # Type enum(1 arg)
type_extra_float(2_arg)=no # Type float(2 arg)
type_extra_float4=no # Type float4
type_extra_float8=no # Type float8
type_extra_image=no # Type image
type_extra_inet=no # Type inet
type_extra_int(1_arg)_zerofill=no # Type int(1 arg) zerofill
type_extra_int1=no # Type int1
type_extra_int2=no # Type int2
type_extra_int3=no # Type int3
type_extra_int4=no # Type int4
type_extra_int8=no # Type int8
type_extra_int_auto_increment=no # Type int not null auto_increment
type_extra_int_identity=no # Type int not null identity
type_extra_int_unsigned=no # Type int unsigned
type_extra_interval=no # Type interval
type_extra_line=no # Type line
type_extra_long=no # Type long
type_extra_long_raw=no # Type long raw
type_extra_long_varbinary=no # Type long varbinary
type_extra_long_varchar(1_arg)=no # Type long varchar(1 arg)
type_extra_lseg=no # Type lseg
type_extra_macaddr=no # Type macaddr
type_extra_mediumint=no # Type mediumint
type_extra_mediumtext=no # Type mediumtext
type_extra_middleint=no # Type middleint
type_extra_mlslabel=no # Type mlslabel
type_extra_money=no # Type money
type_extra_nclob=no # Type nclob
type_extra_number=no # Type number
type_extra_number(1_arg)=no # Type number(1 arg)
type_extra_number(2_arg)=no # Type number(2 arg)
type_extra_nvarchar2(1_arg)=no # Type nvarchar2(1 arg)
type_extra_path=no # Type path
type_extra_point=no # Type point
type_extra_polygon=no # Type polygon
type_extra_raw(1_arg)=no # Type raw(1 arg)
type_extra_reltime=no # Type reltime
type_extra_rowid=no # Type rowid
type_extra_serial=no # Type serial
type_extra_set(1_arg)=no # Type set(1 arg)
type_extra_smalldatetime=no # Type smalldatetime
type_extra_smallfloat=no # Type smallfloat
type_extra_smallmoney=no # Type smallmoney
type_extra_text=no # Type text
type_extra_text(1_arg)=no # Type text(1 arg)
type_extra_timespan=no # Type timespan
type_extra_uint=no # Type uint
type_extra_varchar2(1_arg)=no # Type varchar2(1 arg)
type_extra_year=no # Type year
type_odbc_bigint=no # Type bigint
type_odbc_binary(1_arg)=no # Type binary(1 arg)
type_odbc_datetime=no # Type datetime
type_odbc_tinyint=no # Type tinyint
type_odbc_varbinary(1_arg)=no # Type varbinary(1 arg)
type_sql_bit=no # Type bit
type_sql_bit(1_arg)=no # Type bit(1 arg)
type_sql_bit_varying(1_arg)=no # Type bit varying(1 arg)
type_sql_boolean=no # Type boolean
type_sql_char(1_arg)=yes # Type char(1 arg)
type_sql_char_varying(1_arg)=yes # Type char varying(1 arg)
type_sql_character(1_arg)=yes # Type character(1 arg)
type_sql_character_varying(1_arg)=yes # Type character varying(1 arg)
type_sql_date=no # Type date
type_sql_dec(2_arg)=yes # Type dec(2 arg)
type_sql_decimal(2_arg)=yes # Type decimal(2 arg)
type_sql_double_precision=yes # Type double precision
type_sql_float=yes # Type float
type_sql_float(1_arg)=yes # Type float(1 arg)
type_sql_int=yes # Type int
type_sql_integer=yes # Type integer
type_sql_interval_day=no # Type interval day
type_sql_interval_day_to_hour=no # Type interval day to hour
type_sql_interval_day_to_minute=no # Type interval day to minute
type_sql_interval_day_to_second=no # Type interval day to second
type_sql_interval_hour=no # Type interval hour
type_sql_interval_hour_to_minute=no # Type interval hour to minute
type_sql_interval_hour_to_second=no # Type interval hour to second
type_sql_interval_minute=no # Type interval minute
type_sql_interval_minute_to_second=no # Type interval minute to second
type_sql_interval_month=no # Type interval month
type_sql_interval_second=no # Type interval second
type_sql_interval_year=no # Type interval year
type_sql_interval_year_to_month=no # Type interval year to month
type_sql_national_char_varying(1_arg)=yes # Type national char varying(1 arg)
type_sql_national_character(1_arg)=yes # Type national character(1 arg)
type_sql_national_character_varying(1_arg)=yes # Type national character varying(1 arg)
type_sql_nchar(1_arg)=yes # Type nchar(1 arg)
type_sql_nchar_varying(1_arg)=yes # Type nchar varying(1 arg)
type_sql_numeric(2_arg)=yes # Type numeric(2 arg)
type_sql_real=yes # Type real
type_sql_smallint=yes # Type smallint
type_sql_time=no # Type time
type_sql_timestamp=yes # Type timestamp
type_sql_timestamp_with_time_zone=no # Type timestamp with time zone
type_sql_varchar(1_arg)=yes # Type varchar(1 arg)
union=yes # union
union_all=yes # union all
union_all_incompat=yes # union all (incompatible lists)
union_incompat=yes # union (incompatible lists)
unique_in_create=yes # unique in create table
unique_null_in_create=no # unique null in create
views=no # views
where_string_size=32767 # constant string size in where
#This file is automaticly generated by crash-me 1.57
NEG=no # update of column= -column
Need_cast_for_null=no # Need to cast NULL for arithmetic
alter_add_col=yes # Alter table add column
alter_add_constraint=yes # Alter table add constraint
alter_add_foreign_key=yes # Alter table add foreign key
alter_add_multi_col=with add # Alter table add many columns
alter_add_primary_key=with constraint # Alter table add primary key
alter_add_unique=no # Alter table add unique
alter_alter_col=no # Alter table alter column default
alter_change_col=no # Alter table change column
alter_drop_col=no # Alter table drop column
alter_drop_constraint=yes # Alter table drop constraint
alter_drop_foreign_key=with drop constraint # Alter table drop foreign key
alter_drop_primary_key=no # Alter table drop primary key
alter_drop_unique=no # Alter table drop unique
alter_modify_col=no # Alter table modify column
alter_rename_table=no # Alter table rename table
atomic_updates=no # atomic updates
automatic_rowid=no # Automatic row id
binary_numbers=yes # binary numbers (0b1001)
binary_strings=no # binary strings (b'0110')
case_insensitive_strings=no # Case insensitive compare
char_is_space_filled=yes # char are space filled
column_alias=yes # Column alias
columns_in_order_by=37 # number of columns in order by
comment_#=no # # as comment
comment_--=no # -- as comment (ANSI)
comment_/**/=yes # /* */ as comment
comment_//=no # // as comment
compute=no # Compute
connections=1000 # Simultaneous connections (installation default)
constraint_check=no # Column constraints
constraint_check_table=no # Table constraints
constraint_null=no # NULL constraint (SyBase style)
crash_me_safe=yes # crash me safe
crash_me_version=1.57 # crash me version
create_default=yes # default value for column
create_default_func=no # default value function for column
create_if_not_exists=no # create table if not exists
create_index=yes # create index
create_schema=no # Create SCHEMA
create_table_select=no # create table from select
cross_join=no # cross join (same as from a,b)
date_infinity=no # Supports 'infinity dates
date_last=error # Supports 9999-12-31 dates
date_one=error # Supports 0001-01-01 dates
date_with_YY=no # Supports YY-MM-DD dates
date_zero=no # Supports 0000-00-00 dates
domains=no # Domains (ANSI SQL)
double_quotes=yes # Double '' as ' in strings
drop_if_exists=no # drop table if exists
drop_index=yes # drop index
drop_requires_cascade=no # drop table require cascade/restrict
drop_restrict=no # drop table with cascade/restrict
end_colon=yes # allows end ';'
except=no # except
except_all=no # except all
except_all_incompat=no # except all (incompatible lists)
except_incompat=no # except (incompatible lists)
float_int_expr=yes # mixing of integer and float in expression
foreign_key_syntax=no # foreign key syntax
full_outer_join=yes # full outer join
func_extra_!=no # Function NOT as '!' in SELECT
func_extra_%=no # Function MOD as %
func_extra_&=no # Function & (bitwise and)
func_extra_&&=no # Function AND as '&&'
func_extra_<>=no # Function <> in SELECT
func_extra_==no # Function =
func_extra_add_months=no # Function ADD_MONTHS
func_extra_and_or=no # Function AND and OR in SELECT
func_extra_ascii_char=no # Function ASCII_CHAR
func_extra_ascii_code=no # Function ASCII_CODE
func_extra_atn2=no # Function ATN2
func_extra_auto_num2string=no # Function automatic num->string convert
func_extra_auto_string2num=no # Function automatic string->num convert
func_extra_between=no # Function BETWEEN in SELECT
func_extra_binary_shifts=no # Function << and >> (bitwise shifts)
func_extra_bit_count=no # Function BIT_COUNT
func_extra_ceil=no # Function CEIL
func_extra_charindex=no # Function CHARINDEX
func_extra_chr=no # Function CHR
func_extra_concat_as_+=no # Function concatenation with +
func_extra_concat_list=no # Function CONCAT(list)
func_extra_convert=no # Function CONVERT
func_extra_cosh=no # Function COSH
func_extra_date_format=no # Function DATE_FORMAT
func_extra_dateadd=no # Function DATEADD
func_extra_datediff=no # Function DATEDIFF
func_extra_datename=no # Function DATENAME
func_extra_datepart=no # Function DATEPART
func_extra_elt=no # Function ELT
func_extra_encrypt=no # Function ENCRYPT
func_extra_field=no # Function FIELD
func_extra_format=no # Function FORMAT
func_extra_from_days=no # Function FROM_DAYS
func_extra_from_unixtime=no # Function FROM_UNIXTIME
func_extra_getdate=no # Function GETDATE
func_extra_greatest=no # Function GREATEST
func_extra_if=no # Function IF
func_extra_in_num=no # Function IN on numbers in SELECT
func_extra_in_str=no # Function IN on strings in SELECT
func_extra_initcap=no # Function INITCAP
func_extra_instr=no # Function LOCATE as INSTR
func_extra_instr_oracle=no # Function INSTR (Oracle syntax)
func_extra_instrb=no # Function INSTRB
func_extra_interval=no # Function INTERVAL
func_extra_last_day=no # Function LAST_DAY
func_extra_last_insert_id=no # Function LAST_INSERT_ID
func_extra_least=no # Function LEAST
func_extra_lengthb=no # Function LENGTHB
func_extra_like=no # Function LIKE in SELECT
func_extra_like_escape=no # Function LIKE ESCAPE in SELECT
func_extra_ln=no # Function LN
func_extra_log(m_n)=no # Function LOG(m,n)
func_extra_logn=no # Function LOGN
func_extra_lpad=no # Function LPAD
func_extra_mdy=no # Function MDY
func_extra_mid=no # Function SUBSTRING as MID
func_extra_months_between=no # Function MONTHS_BETWEEN
func_extra_not=no # Function NOT in SELECT
func_extra_not_between=no # Function NOT BETWEEN in SELECT
func_extra_not_like=no # Function NOT LIKE in SELECT
func_extra_odbc_convert=no # Function ODBC CONVERT
func_extra_password=no # Function PASSWORD
func_extra_paste=no # Function PASTE
func_extra_patindex=no # Function PATINDEX
func_extra_period_add=no # Function PERIOD_ADD
func_extra_period_diff=no # Function PERIOD_DIFF
func_extra_pow=no # Function POW
func_extra_range=no # Function RANGE
func_extra_regexp=no # Function REGEXP in SELECT
func_extra_replicate=no # Function REPLICATE
func_extra_reverse=no # Function REVERSE
func_extra_root=no # Function ROOT
func_extra_round1=no # Function ROUND(1 arg)
func_extra_rpad=no # Function RPAD
func_extra_sec_to_time=no # Function SEC_TO_TIME
func_extra_sinh=no # Function SINH
func_extra_str=no # Function STR
func_extra_strcmp=no # Function STRCMP
func_extra_stuff=no # Function STUFF
func_extra_substrb=no # Function SUBSTRB
func_extra_substring_index=no # Function SUBSTRING_INDEX
func_extra_sysdate=no # Function SYSDATE
func_extra_tail=no # Function TAIL
func_extra_tanh=no # Function TANH
func_extra_time_to_sec=no # Function TIME_TO_SEC
func_extra_to_days=no # Function TO_DAYS
func_extra_translate=no # Function TRANSLATE
func_extra_trim_many_char=no # Function TRIM; Many char extension
func_extra_trim_substring=no # Function TRIM; Substring extension
func_extra_trunc=no # Function TRUNC
func_extra_uid=no # Function UID
func_extra_unix_timestamp=no # Function UNIX_TIMESTAMP
func_extra_userenv=no # Function USERENV
func_extra_version=no # Function VERSION
func_extra_weekday=no # Function WEEKDAY
func_extra_|=no # Function | (bitwise or)
func_extra_||=no # Function OR as '||'
func_extra_~*=no # Function ~* (case insensitive compare)
func_odbc_abs=no # Function ABS
func_odbc_acos=no # Function ACOS
func_odbc_ascii=no # Function ASCII
func_odbc_asin=no # Function ASIN
func_odbc_atan=no # Function ATAN
func_odbc_atan2=no # Function ATAN2
func_odbc_ceiling=no # Function CEILING
func_odbc_char=no # Function CHAR
func_odbc_concat=no # Function CONCAT(2 arg)
func_odbc_cos=no # Function COS
func_odbc_cot=no # Function COT
func_odbc_curdate=no # Function CURDATE
func_odbc_curtime=no # Function CURTIME
func_odbc_database=no # Function DATABASE
func_odbc_dayname=no # Function DAYNAME
func_odbc_dayofmonth=no # Function DAYOFMONTH
func_odbc_dayofweek=no # Function DAYOFWEEK
func_odbc_dayofyear=no # Function DAYOFYEAR
func_odbc_degrees=no # Function DEGREES
func_odbc_difference=no # Function DIFFERENCE()
func_odbc_exp=no # Function EXP
func_odbc_floor=no # Function FLOOR
func_odbc_fn_left=no # Function ODBC syntax LEFT & RIGHT
func_odbc_hour=no # Function HOUR
func_odbc_hour_time=no # Function ANSI HOUR
func_odbc_ifnull=no # Function IFNULL
func_odbc_insert=no # Function INSERT
func_odbc_lcase=no # Function LCASE
func_odbc_left=no # Function LEFT
func_odbc_length=no # Function REAL LENGTH
func_odbc_length_without_space=no # Function ODBC LENGTH
func_odbc_locate_2=no # Function LOCATE(2 arg)
func_odbc_locate_3=no # Function LOCATE(3 arg)
func_odbc_log=no # Function LOG
func_odbc_log10=no # Function LOG10
func_odbc_ltrim=no # Function LTRIM
func_odbc_minute=no # Function MINUTE
func_odbc_mod=no # Function MOD
func_odbc_month=no # Function MONTH
func_odbc_monthname=no # Function MONTHNAME
func_odbc_now=no # Function NOW
func_odbc_pi=no # Function PI
func_odbc_power=no # Function POWER
func_odbc_quarter=no # Function QUARTER
func_odbc_radians=no # Function RADIANS
func_odbc_rand=no # Function RAND
func_odbc_repeat=no # Function REPEAT
func_odbc_replace=no # Function REPLACE
func_odbc_right=no # Function RIGHT
func_odbc_round=no # Function ROUND(2 arg)
func_odbc_rtrim=no # Function RTRIM
func_odbc_second=no # Function SECOND
func_odbc_sign=no # Function SIGN
func_odbc_sin=no # Function SIN
func_odbc_soundex=no # Function SOUNDEX
func_odbc_space=no # Function SPACE
func_odbc_sqrt=no # Function SQRT
func_odbc_substring=no # Function ODBC SUBSTRING
func_odbc_tan=no # Function TAN
func_odbc_timestampadd=no # Function TIMESTAMPADD
func_odbc_timestampdiff=no # Function TIMESTAMPDIFF
func_odbc_truncate=no # Function TRUNCATE
func_odbc_ucase=no # Function UCASE
func_odbc_user()=no # Function USER()
func_odbc_week=no # Function WEEK
func_odbc_year=no # Function YEAR
func_sql_+=yes # Function +, -, * and /
func_sql_bit_length=no # Function BIT_LENGTH
func_sql_cast=yes # Function CAST
func_sql_char_length=no # Function CHAR_LENGTH
func_sql_char_length(constant)=no # Function CHAR_LENGTH(constant)
func_sql_character_length=no # Function CHARACTER_LENGTH
func_sql_coalesce=no # Function COALESCE
func_sql_concat_as_||=yes # Function concatenation with ||
func_sql_current_date=yes # Function CURRENT_DATE
func_sql_current_time=yes # Function CURRENT_TIME
func_sql_current_timestamp=yes # Function CURRENT_TIMESTAMP
func_sql_current_user=no # Function CURRENT_USER
func_sql_extract_sql=yes # Function EXTRACT
func_sql_localtime=no # Function LOCALTIME
func_sql_localtimestamp=no # Function LOCALTIMESTAMP
func_sql_lower=no # Function LOWER
func_sql_nullif_num=no # Function NULLIF with numbers
func_sql_nullif_string=no # Function NULLIF with strings
func_sql_octet_length=no # Function OCTET_LENGTH
func_sql_position=no # Function POSITION
func_sql_searched_case=no # Function searched CASE
func_sql_session_user=no # Function SESSION_USER
func_sql_simple_case=no # Function simple CASE
func_sql_substring=no # Function ANSI SQL SUBSTRING
func_sql_system_user=no # Function SYSTEM_USER
func_sql_trim=no # Function TRIM
func_sql_upper=yes # Function UPPER
func_sql_user=yes # Function USER
func_where_between=yes # Function BETWEEN
func_where_eq_all=yes # Function = ALL
func_where_eq_any=yes # Function = ANY
func_where_eq_some=yes # Function = SOME
func_where_exists=yes # Function EXISTS
func_where_in_num=yes # Function IN on numbers
func_where_like=yes # Function LIKE
func_where_like_escape=yes # Function LIKE ESCAPE
func_where_match=no # Function MATCH
func_where_match_unique=no # Function MATCH UNIQUE
func_where_matches=no # Function MATCHES
func_where_not_between=yes # Function NOT BETWEEN
func_where_not_exists=yes # Function NOT EXISTS
func_where_not_like=yes # Function NOT LIKE
func_where_not_unique=no # Function NOT UNIQUE
func_where_unique=no # Function UNIQUE
functions=yes # Functions
group_by=yes # Group by
group_by_alias=no # Group by alias
group_by_null=yes # Group on column with null values
group_by_position=no # Group by position
group_distinct_functions=yes # Group functions with distinct
group_func_extra_bit_and=no # Group function BIT_AND
group_func_extra_bit_or=no # Group function BIT_OR
group_func_extra_count_distinct_list=no # Group function COUNT(DISTINCT expr,expr,...)
group_func_extra_std=no # Group function STD
group_func_extra_stddev=no # Group function STDDEV
group_func_extra_variance=no # Group function VARIANCE
group_func_sql_any=no # Group function ANY
group_func_sql_avg=yes # Group function AVG
group_func_sql_count_*=yes # Group function COUNT (*)
group_func_sql_count_column=yes # Group function COUNT column name
group_func_sql_count_distinct=yes # Group function COUNT(DISTINCT expr)
group_func_sql_every=no # Group function EVERY
group_func_sql_max=yes # Group function MAX on numbers
group_func_sql_max_str=yes # Group function MAX on strings
group_func_sql_min=yes # Group function MIN on numbers
group_func_sql_min_str=yes # Group function MIN on strings
group_func_sql_some=no # Group function SOME
group_func_sql_sum=yes # Group function SUM
group_functions=yes # Group functions
group_on_unused=yes # Group on unused column
has_true_false=no # TRUE and FALSE
having=yes # Having
having_with_alias=no # Having on alias
having_with_group=yes # Having with group function
hex_numbers=yes # hex numbers (0x41)
hex_strings=no # hex strings (x'1ace')
ignore_end_space=yes # Ignore end space in compare
index_in_create=no # index in create table
index_namespace=no # different namespace for index
index_parts=no # index on column part (extension)
inner_join=yes # inner join
insert_empty_string=no # insert empty string
insert_multi_value=no # INSERT with Value lists
insert_select=no # insert INTO ... SELECT ...
insert_with_set=no # INSERT with set syntax
intersect=no # intersect
intersect_all=no # intersect all
intersect_all_incompat=no # intersect all (incompatible lists)
intersect_incompat=no # intersect (incompatible lists)
join_tables=+64 # tables in join
left_outer_join=yes # left outer join
left_outer_join_using=no # left outer join using
like_with_column=no # column LIKE column
like_with_number=no # LIKE on numbers
lock_tables=no # lock table
logical_value=not supported # Value of logical operation (1=1)
max_big_expressions=1 # big expressions
max_char_size=32767 # max char() size
max_columns=4759 # Columns in table
max_conditions=5888 # OR and AND in WHERE
max_expressions=+10000 # simple expressions
max_index=+64 # max index
max_index_name=31 # index name length
max_index_parts=16 # index parts
max_index_varchar_part_length=249 # index varchar part length
max_row_length=64744 # max table row length (without blobs)
max_row_length_with_null=64744 # table row length with nulls (without blobs)
max_select_alias_name=132 # select alias name length
max_stack_expression=165 # stacked expressions
max_table_alias_name=255 # table alias name length
max_table_name=31 # table name length
max_unique_index=+64 # unique indexes
max_varchar_size=10923 # max varchar() size
minus=no # minus
minus_incompat=no # minus (incompatible lists)
minus_neg=yes # Calculate 1--1
multi_drop=no # many tables to drop table
multi_strings=no # Multiple line strings
multi_table_delete=no # DELETE FROM table1,table2...
multi_table_update=no # Update with many tables
natural_join=no # natural join
natural_join_incompat=no # natural join (incompatible lists)
natural_left_outer_join=no # natural left outer join
no_primary_key=yes # Tables without primary key
null_concat_expr=no # Is 'a' || NULL = NULL
null_in_index=yes # null in index
null_in_unique=no # null in unique index
null_num_expr=no # Is 1+NULL = NULL
nulls_in_unique=no # null combination in unique index
odbc_left_outer_join=no # left outer join odbc style
operating_system=Linux 2.4.4-64GB-SMP i686 # crash-me tested on
order_by=yes # Order by
order_by_alias=no # Order by alias
order_by_function=no # Order by function
order_by_position=yes # Order by position
order_by_remember_desc=no # Order by DESC is remembered
order_on_unused=yes # Order by on unused column
primary_key_in_create=yes # primary key in create table
psm_functions=no # PSM functions (ANSI SQL)
psm_modules=no # PSM modules (ANSI SQL)
psm_procedures=no # PSM procedures (ANSI SQL)
psm_trigger=no # Triggers (ANSI SQL)
query_size=65535 # query size
quote_ident_with_"=yes # " as identifier quote (ANSI SQL)
quote_ident_with_[=no # [] as identifier quote
quote_ident_with_`=no # ` as identifier quote
quote_with_"=no # Allows ' and " as string markers
recursive_subqueries=61 # recursive subqueries
remember_end_space=no # Remembers end space in char()
remember_end_space_varchar=yes # Remembers end space in varchar()
rename_table=no # rename table
right_outer_join=yes # right outer join
rowid=no # Type for row id
select_constants=yes # Select constants
select_limit=no # LIMIT number of rows
select_limit2=no # SELECT with LIMIT #,#
select_string_size=32767 # constant string size in SELECT
select_table_update=yes # Update with sub select
select_without_from=no # SELECT without FROM
server_version=6.0.1 # server version
simple_joins=yes # ANSI SQL simple joins
storage_of_float=round # Storage of float values
subqueries=yes # subqueries
table_alias=no # Table alias
table_name_case=yes # case independent table names
table_wildcard=yes # Select table_name.*
temporary_table=no # temporary tables
transactions=error # constant string size in where
truncate_table=no # truncate
type_extra_abstime=no # Type abstime
type_extra_bfile=no # Type bfile
type_extra_blob=yes # Type blob
type_extra_bool=no # Type bool
type_extra_box=no # Type box
type_extra_byte=no # Type byte
type_extra_char(1_arg)_binary=no # Type char(1 arg) binary
type_extra_cidr=no # Type cidr
type_extra_circle=no # Type circle
type_extra_clob=no # Type clob
type_extra_datetime=no # Type datetime
type_extra_double=no # Type double
type_extra_enum(1_arg)=no # Type enum(1 arg)
type_extra_float(2_arg)=no # Type float(2 arg)
type_extra_float4=no # Type float4
type_extra_float8=no # Type float8
type_extra_image=no # Type image
type_extra_inet=no # Type inet
type_extra_int(1_arg)_zerofill=no # Type int(1 arg) zerofill
type_extra_int1=no # Type int1
type_extra_int2=no # Type int2
type_extra_int3=no # Type int3
type_extra_int4=no # Type int4
type_extra_int8=no # Type int8
type_extra_int_auto_increment=no # Type int not null auto_increment
type_extra_int_identity=no # Type int not null identity
type_extra_int_unsigned=no # Type int unsigned
type_extra_interval=no # Type interval
type_extra_line=no # Type line
type_extra_long=no # Type long
type_extra_long_raw=no # Type long raw
type_extra_long_varbinary=no # Type long varbinary
type_extra_long_varchar(1_arg)=no # Type long varchar(1 arg)
type_extra_lseg=no # Type lseg
type_extra_macaddr=no # Type macaddr
type_extra_mediumint=no # Type mediumint
type_extra_mediumtext=no # Type mediumtext
type_extra_middleint=no # Type middleint
type_extra_mlslabel=no # Type mlslabel
type_extra_money=no # Type money
type_extra_nclob=no # Type nclob
type_extra_number=no # Type number
type_extra_number(1_arg)=no # Type number(1 arg)
type_extra_number(2_arg)=no # Type number(2 arg)
type_extra_nvarchar2(1_arg)=no # Type nvarchar2(1 arg)
type_extra_path=no # Type path
type_extra_point=no # Type point
type_extra_polygon=no # Type polygon
type_extra_raw(1_arg)=no # Type raw(1 arg)
type_extra_reltime=no # Type reltime
type_extra_rowid=no # Type rowid
type_extra_serial=no # Type serial
type_extra_set(1_arg)=no # Type set(1 arg)
type_extra_smalldatetime=no # Type smalldatetime
type_extra_smallfloat=no # Type smallfloat
type_extra_smallmoney=no # Type smallmoney
type_extra_text=no # Type text
type_extra_text(1_arg)=no # Type text(1 arg)
type_extra_timespan=no # Type timespan
type_extra_uint=no # Type uint
type_extra_varchar2(1_arg)=no # Type varchar2(1 arg)
type_extra_year=no # Type year
type_odbc_bigint=no # Type bigint
type_odbc_binary(1_arg)=no # Type binary(1 arg)
type_odbc_datetime=no # Type datetime
type_odbc_tinyint=no # Type tinyint
type_odbc_varbinary(1_arg)=no # Type varbinary(1 arg)
type_sql_=no # Type
type_sql_bit=no # Type bit
type_sql_bit(1_arg)=no # Type bit(1 arg)
type_sql_bit_varying(1_arg)=no # Type bit varying(1 arg)
type_sql_boolean=no # Type boolean
type_sql_char(1_arg)=yes # Type char(1 arg)
type_sql_char_varying(1_arg)=yes # Type char varying(1 arg)
type_sql_character(1_arg)=yes # Type character(1 arg)
type_sql_character_varying(1_arg)=yes # Type character varying(1 arg)
type_sql_date=yes # Type date
type_sql_dec(2_arg)=yes # Type dec(2 arg)
type_sql_decimal(2_arg)=yes # Type decimal(2 arg)
type_sql_double_precision=yes # Type double precision
type_sql_float=yes # Type float
type_sql_float(1_arg)=yes # Type float(1 arg)
type_sql_int=yes # Type int
type_sql_integer=yes # Type integer
type_sql_interval_day=no # Type interval day
type_sql_interval_day_to_hour=no # Type interval day to hour
type_sql_interval_day_to_minute=no # Type interval day to minute
type_sql_interval_day_to_second=no # Type interval day to second
type_sql_interval_hour=no # Type interval hour
type_sql_interval_hour_to_minute=no # Type interval hour to minute
type_sql_interval_hour_to_second=no # Type interval hour to second
type_sql_interval_minute=no # Type interval minute
type_sql_interval_minute_to_second=no # Type interval minute to second
type_sql_interval_month=no # Type interval month
type_sql_interval_second=no # Type interval second
type_sql_interval_year=no # Type interval year
type_sql_interval_year_to_month=no # Type interval year to month
type_sql_national_char_varying(1_arg)=yes # Type national char varying(1 arg)
type_sql_national_character(1_arg)=yes # Type national character(1 arg)
type_sql_national_character_varying(1_arg)=yes # Type national character varying(1 arg)
type_sql_nchar(1_arg)=yes # Type nchar(1 arg)
type_sql_nchar_varying(1_arg)=yes # Type nchar varying(1 arg)
type_sql_numeric(2_arg)=yes # Type numeric(2 arg)
type_sql_real=yes # Type real
type_sql_smallint=yes # Type smallint
type_sql_time=yes # Type time
type_sql_timestamp=yes # Type timestamp
type_sql_timestamp_with_time_zone=no # Type timestamp with time zone
type_sql_varchar(1_arg)=yes # Type varchar(1 arg)
union=yes # union
union_all=yes # union all
union_all_incompat=yes # union all (incompatible lists)
union_incompat=yes # union (incompatible lists)
unique_in_create=yes # unique in create table
unique_null_in_create=no # unique null in create
views=no # views
where_string_size=32767 # constant string size in where
#This file is automaticly generated by crash-me 1.57
NEG=no # update of column= -column
Need_cast_for_null=no # Need to cast NULL for arithmetic
alter_add_col=yes # Alter table add column
alter_add_constraint=yes # Alter table add constraint
alter_add_foreign_key=yes # Alter table add foreign key
alter_add_multi_col=with add # Alter table add many columns
alter_add_primary_key=with constraint # Alter table add primary key
alter_add_unique=no # Alter table add unique
alter_alter_col=no # Alter table alter column default
alter_change_col=no # Alter table change column
alter_drop_col=no # Alter table drop column
alter_drop_constraint=yes # Alter table drop constraint
alter_drop_foreign_key=with drop constraint # Alter table drop foreign key
alter_drop_primary_key=no # Alter table drop primary key
alter_drop_unique=no # Alter table drop unique
alter_modify_col=no # Alter table modify column
alter_rename_table=no # Alter table rename table
atomic_updates=no # atomic updates
automatic_rowid=no # Automatic row id
binary_numbers=yes # binary numbers (0b1001)
binary_strings=no # binary strings (b'0110')
case_insensitive_strings=no # Case insensitive compare
char_is_space_filled=yes # char are space filled
column_alias=yes # Column alias
columns_in_order_by=37 # number of columns in order by
comment_#=no # # as comment
comment_--=no # -- as comment (ANSI)
comment_/**/=yes # /* */ as comment
comment_//=no # // as comment
compute=no # Compute
connections=395 # Simultaneous connections (installation default)
constraint_check=no # Column constraints
constraint_check_table=no # Table constraints
constraint_null=no # NULL constraint (SyBase style)
crash_me_safe=no # crash me safe
crash_me_version=1.57 # crash me version
create_default=yes # default value for column
create_default_func=no # default value function for column
create_if_not_exists=no # create table if not exists
create_index=yes # create index
create_schema=no # Create SCHEMA
create_table_select=no # create table from select
cross_join=no # cross join (same as from a,b)
date_infinity=no # Supports 'infinity dates
date_last=error # Supports 9999-12-31 dates
date_one=error # Supports 0001-01-01 dates
date_with_YY=no # Supports YY-MM-DD dates
date_zero=no # Supports 0000-00-00 dates
domains=no # Domains (ANSI SQL)
double_quotes=yes # Double '' as ' in strings
drop_if_exists=no # drop table if exists
drop_index=yes # drop index
drop_requires_cascade=no # drop table require cascade/restrict
drop_restrict=no # drop table with cascade/restrict
end_colon=yes # allows end ';'
except=no # except
except_all=no # except all
except_all_incompat=no # except all (incompatible lists)
except_incompat=no # except (incompatible lists)
float_int_expr=yes # mixing of integer and float in expression
foreign_key_syntax=no # foreign key syntax
full_outer_join=yes # full outer join
func_extra_!=no # Function NOT as '!' in SELECT
func_extra_%=no # Function MOD as %
func_extra_&=no # Function & (bitwise and)
func_extra_&&=no # Function AND as '&&'
func_extra_<>=no # Function <> in SELECT
func_extra_==no # Function =
func_extra_add_months=no # Function ADD_MONTHS
func_extra_and_or=no # Function AND and OR in SELECT
func_extra_ascii_char=no # Function ASCII_CHAR
func_extra_ascii_code=no # Function ASCII_CODE
func_extra_atn2=no # Function ATN2
func_extra_auto_num2string=no # Function automatic num->string convert
func_extra_auto_string2num=no # Function automatic string->num convert
func_extra_between=no # Function BETWEEN in SELECT
func_extra_binary_shifts=no # Function << and >> (bitwise shifts)
func_extra_bit_count=no # Function BIT_COUNT
func_extra_ceil=no # Function CEIL
func_extra_charindex=no # Function CHARINDEX
func_extra_chr=no # Function CHR
func_extra_concat_as_+=no # Function concatenation with +
func_extra_concat_list=no # Function CONCAT(list)
func_extra_convert=no # Function CONVERT
func_extra_cosh=no # Function COSH
func_extra_date_format=no # Function DATE_FORMAT
func_extra_dateadd=no # Function DATEADD
func_extra_datediff=no # Function DATEDIFF
func_extra_datename=no # Function DATENAME
func_extra_datepart=no # Function DATEPART
func_extra_elt=no # Function ELT
func_extra_encrypt=no # Function ENCRYPT
func_extra_field=no # Function FIELD
func_extra_format=no # Function FORMAT
func_extra_from_days=no # Function FROM_DAYS
func_extra_from_unixtime=no # Function FROM_UNIXTIME
func_extra_getdate=no # Function GETDATE
func_extra_greatest=no # Function GREATEST
func_extra_if=no # Function IF
func_extra_in_num=no # Function IN on numbers in SELECT
func_extra_in_str=no # Function IN on strings in SELECT
func_extra_initcap=no # Function INITCAP
func_extra_instr=no # Function LOCATE as INSTR
func_extra_instr_oracle=no # Function INSTR (Oracle syntax)
func_extra_instrb=no # Function INSTRB
func_extra_interval=no # Function INTERVAL
func_extra_last_day=no # Function LAST_DAY
func_extra_last_insert_id=no # Function LAST_INSERT_ID
func_extra_least=no # Function LEAST
func_extra_lengthb=no # Function LENGTHB
func_extra_like=no # Function LIKE in SELECT
func_extra_like_escape=no # Function LIKE ESCAPE in SELECT
func_extra_ln=no # Function LN
func_extra_log(m_n)=no # Function LOG(m,n)
func_extra_logn=no # Function LOGN
func_extra_lpad=no # Function LPAD
func_extra_mdy=no # Function MDY
func_extra_mid=no # Function SUBSTRING as MID
func_extra_months_between=no # Function MONTHS_BETWEEN
func_extra_not=no # Function NOT in SELECT
func_extra_not_between=no # Function NOT BETWEEN in SELECT
func_extra_not_like=no # Function NOT LIKE in SELECT
func_extra_odbc_convert=no # Function ODBC CONVERT
func_extra_password=no # Function PASSWORD
func_extra_paste=no # Function PASTE
func_extra_patindex=no # Function PATINDEX
func_extra_period_add=no # Function PERIOD_ADD
func_extra_period_diff=no # Function PERIOD_DIFF
func_extra_pow=no # Function POW
func_extra_range=no # Function RANGE
func_extra_regexp=no # Function REGEXP in SELECT
func_extra_replicate=no # Function REPLICATE
func_extra_reverse=no # Function REVERSE
func_extra_root=no # Function ROOT
func_extra_round1=no # Function ROUND(1 arg)
func_extra_rpad=no # Function RPAD
func_extra_sec_to_time=no # Function SEC_TO_TIME
func_extra_sinh=no # Function SINH
func_extra_str=no # Function STR
func_extra_strcmp=no # Function STRCMP
func_extra_stuff=no # Function STUFF
func_extra_substrb=no # Function SUBSTRB
func_extra_substring_index=no # Function SUBSTRING_INDEX
func_extra_sysdate=no # Function SYSDATE
func_extra_tail=no # Function TAIL
func_extra_tanh=no # Function TANH
func_extra_time_to_sec=no # Function TIME_TO_SEC
func_extra_to_days=no # Function TO_DAYS
func_extra_translate=no # Function TRANSLATE
func_extra_trim_many_char=no # Function TRIM; Many char extension
func_extra_trim_substring=no # Function TRIM; Substring extension
func_extra_trunc=no # Function TRUNC
func_extra_uid=no # Function UID
func_extra_unix_timestamp=no # Function UNIX_TIMESTAMP
func_extra_userenv=no # Function USERENV
func_extra_version=no # Function VERSION
func_extra_weekday=no # Function WEEKDAY
func_extra_|=no # Function | (bitwise or)
func_extra_||=no # Function OR as '||'
func_extra_~*=no # Function ~* (case insensitive compare)
func_odbc_abs=no # Function ABS
func_odbc_acos=no # Function ACOS
func_odbc_ascii=no # Function ASCII
func_odbc_asin=no # Function ASIN
func_odbc_atan=no # Function ATAN
func_odbc_atan2=no # Function ATAN2
func_odbc_ceiling=no # Function CEILING
func_odbc_char=no # Function CHAR
func_odbc_concat=no # Function CONCAT(2 arg)
func_odbc_cos=no # Function COS
func_odbc_cot=no # Function COT
func_odbc_curdate=no # Function CURDATE
func_odbc_curtime=no # Function CURTIME
func_odbc_database=no # Function DATABASE
func_odbc_dayname=no # Function DAYNAME
func_odbc_dayofmonth=no # Function DAYOFMONTH
func_odbc_dayofweek=no # Function DAYOFWEEK
func_odbc_dayofyear=no # Function DAYOFYEAR
func_odbc_degrees=no # Function DEGREES
func_odbc_difference=no # Function DIFFERENCE()
func_odbc_exp=no # Function EXP
func_odbc_floor=no # Function FLOOR
func_odbc_fn_left=no # Function ODBC syntax LEFT & RIGHT
func_odbc_hour=no # Function HOUR
func_odbc_hour_time=no # Function ANSI HOUR
func_odbc_ifnull=no # Function IFNULL
func_odbc_insert=no # Function INSERT
func_odbc_lcase=no # Function LCASE
func_odbc_left=no # Function LEFT
func_odbc_length=no # Function REAL LENGTH
func_odbc_length_without_space=no # Function ODBC LENGTH
func_odbc_locate_2=no # Function LOCATE(2 arg)
func_odbc_locate_3=no # Function LOCATE(3 arg)
func_odbc_log=no # Function LOG
func_odbc_log10=no # Function LOG10
func_odbc_ltrim=no # Function LTRIM
func_odbc_minute=no # Function MINUTE
func_odbc_mod=no # Function MOD
func_odbc_month=no # Function MONTH
func_odbc_monthname=no # Function MONTHNAME
func_odbc_now=no # Function NOW
func_odbc_pi=no # Function PI
func_odbc_power=no # Function POWER
func_odbc_quarter=no # Function QUARTER
func_odbc_radians=no # Function RADIANS
func_odbc_rand=no # Function RAND
func_odbc_repeat=no # Function REPEAT
func_odbc_replace=no # Function REPLACE
func_odbc_right=no # Function RIGHT
func_odbc_round=no # Function ROUND(2 arg)
func_odbc_rtrim=no # Function RTRIM
func_odbc_second=no # Function SECOND
func_odbc_sign=no # Function SIGN
func_odbc_sin=no # Function SIN
func_odbc_soundex=no # Function SOUNDEX
func_odbc_space=no # Function SPACE
func_odbc_sqrt=no # Function SQRT
func_odbc_substring=no # Function ODBC SUBSTRING
func_odbc_tan=no # Function TAN
func_odbc_timestampadd=no # Function TIMESTAMPADD
func_odbc_timestampdiff=no # Function TIMESTAMPDIFF
func_odbc_truncate=no # Function TRUNCATE
func_odbc_ucase=no # Function UCASE
func_odbc_user()=no # Function USER()
func_odbc_week=no # Function WEEK
func_odbc_year=no # Function YEAR
func_sql_+=yes # Function +, -, * and /
func_sql_bit_length=no # Function BIT_LENGTH
func_sql_cast=yes # Function CAST
func_sql_char_length=no # Function CHAR_LENGTH
func_sql_char_length(constant)=no # Function CHAR_LENGTH(constant)
func_sql_character_length=no # Function CHARACTER_LENGTH
func_sql_coalesce=no # Function COALESCE
func_sql_concat_as_||=yes # Function concatenation with ||
func_sql_current_date=yes # Function CURRENT_DATE
func_sql_current_time=yes # Function CURRENT_TIME
func_sql_current_timestamp=yes # Function CURRENT_TIMESTAMP
func_sql_current_user=no # Function CURRENT_USER
func_sql_extract_sql=yes # Function EXTRACT
func_sql_localtime=no # Function LOCALTIME
func_sql_localtimestamp=no # Function LOCALTIMESTAMP
func_sql_lower=no # Function LOWER
func_sql_nullif_num=no # Function NULLIF with numbers
func_sql_nullif_string=no # Function NULLIF with strings
func_sql_octet_length=no # Function OCTET_LENGTH
func_sql_position=no # Function POSITION
func_sql_searched_case=no # Function searched CASE
func_sql_session_user=no # Function SESSION_USER
func_sql_simple_case=no # Function simple CASE
func_sql_substring=no # Function ANSI SQL SUBSTRING
func_sql_system_user=no # Function SYSTEM_USER
func_sql_trim=no # Function TRIM
func_sql_upper=yes # Function UPPER
func_sql_user=yes # Function USER
func_where_between=yes # Function BETWEEN
func_where_eq_all=yes # Function = ALL
func_where_eq_any=yes # Function = ANY
func_where_eq_some=yes # Function = SOME
func_where_exists=yes # Function EXISTS
func_where_in_num=yes # Function IN on numbers
func_where_like=yes # Function LIKE
func_where_like_escape=yes # Function LIKE ESCAPE
func_where_match=no # Function MATCH
func_where_match_unique=no # Function MATCH UNIQUE
func_where_matches=no # Function MATCHES
func_where_not_between=yes # Function NOT BETWEEN
func_where_not_exists=yes # Function NOT EXISTS
func_where_not_like=yes # Function NOT LIKE
func_where_not_unique=no # Function NOT UNIQUE
func_where_unique=no # Function UNIQUE
functions=yes # Functions
group_by=yes # Group by
group_by_alias=no # Group by alias
group_by_null=yes # Group on column with null values
group_by_position=no # Group by position
group_distinct_functions=yes # Group functions with distinct
group_func_extra_bit_and=no # Group function BIT_AND
group_func_extra_bit_or=no # Group function BIT_OR
group_func_extra_count_distinct_list=no # Group function COUNT(DISTINCT expr,expr,...)
group_func_extra_std=no # Group function STD
group_func_extra_stddev=no # Group function STDDEV
group_func_extra_variance=no # Group function VARIANCE
group_func_sql_any=no # Group function ANY
group_func_sql_avg=yes # Group function AVG
group_func_sql_count_*=yes # Group function COUNT (*)
group_func_sql_count_column=yes # Group function COUNT column name
group_func_sql_count_distinct=yes # Group function COUNT(DISTINCT expr)
group_func_sql_every=no # Group function EVERY
group_func_sql_max=yes # Group function MAX on numbers
group_func_sql_max_str=yes # Group function MAX on strings
group_func_sql_min=yes # Group function MIN on numbers
group_func_sql_min_str=yes # Group function MIN on strings
group_func_sql_some=no # Group function SOME
group_func_sql_sum=yes # Group function SUM
group_functions=yes # Group functions
group_on_unused=yes # Group on unused column
has_true_false=no # TRUE and FALSE
having=yes # Having
having_with_alias=no # Having on alias
having_with_group=yes # Having with group function
hex_numbers=yes # hex numbers (0x41)
hex_strings=no # hex strings (x'1ace')
ignore_end_space=yes # Ignore end space in compare
index_in_create=no # index in create table
index_namespace=no # different namespace for index
index_parts=no # index on column part (extension)
inner_join=yes # inner join
insert_empty_string=no # insert empty string
insert_multi_value=no # INSERT with Value lists
insert_select=no # insert INTO ... SELECT ...
insert_with_set=no # INSERT with set syntax
intersect=no # intersect
intersect_all=no # intersect all
intersect_all_incompat=no # intersect all (incompatible lists)
intersect_incompat=no # intersect (incompatible lists)
join_tables=+64 # tables in join
left_outer_join=yes # left outer join
left_outer_join_using=no # left outer join using
like_with_column=no # column LIKE column
like_with_number=no # LIKE on numbers
lock_tables=no # lock table
logical_value=not supported # Value of logical operation (1=1)
max_big_expressions=1 # big expressions
max_char_size=32745 # max char() size
max_column_name=18 # column name length
max_columns=4759 # Columns in table
max_conditions=441504 # OR and AND in WHERE
max_expressions=5486 # simple expressions
max_index=+64 # max index
max_index_name=31 # index name length
max_index_parts=16 # index parts
max_index_varchar_part_length=218 # index varchar part length
max_row_length=64744 # max table row length (without blobs)
max_row_length_with_null=64744 # table row length with nulls (without blobs)
max_select_alias_name=132 # select alias name length
max_stack_expression=165 # stacked expressions
max_table_alias_name=255 # table alias name length
max_table_name=31 # table name length
max_unique_index=+64 # unique indexes
max_varchar_size=32745 # max varchar() size
minus=no # minus
minus_incompat=no # minus (incompatible lists)
minus_neg=yes # Calculate 1--1
multi_drop=no # many tables to drop table
multi_strings=no # Multiple line strings
multi_table_delete=no # DELETE FROM table1,table2...
multi_table_update=no # Update with many tables
natural_join=no # natural join
natural_join_incompat=no # natural join (incompatible lists)
natural_left_outer_join=no # natural left outer join
no_primary_key=yes # Tables without primary key
null_concat_expr=no # Is 'a' || NULL = NULL
null_in_index=yes # null in index
null_in_unique=no # null in unique index
null_num_expr=no # Is 1+NULL = NULL
nulls_in_unique=no # null combination in unique index
odbc_left_outer_join=no # left outer join odbc style
operating_system=Linux 2.4.4-64GB-SMP i686 # crash-me tested on
order_by=yes # Order by
order_by_alias=no # Order by alias
order_by_function=no # Order by function
order_by_position=yes # Order by position
order_by_remember_desc=no # Order by DESC is remembered
order_on_unused=yes # Order by on unused column
primary_key_in_create=yes # primary key in create table
psm_functions=no # PSM functions (ANSI SQL)
psm_modules=no # PSM modules (ANSI SQL)
psm_procedures=no # PSM procedures (ANSI SQL)
psm_trigger=no # Triggers (ANSI SQL)
query_size=16777216 # query size
quote_ident_with_"=yes # " as identifier quote (ANSI SQL)
quote_ident_with_[=no # [] as identifier quote
quote_ident_with_`=no # ` as identifier quote
quote_with_"=no # Allows ' and " as string markers
recursive_subqueries=61 # recursive subqueries
remember_end_space=no # Remembers end space in char()
remember_end_space_varchar=yes # Remembers end space in varchar()
rename_table=no # rename table
right_outer_join=yes # right outer join
rowid=no # Type for row id
select_constants=yes # Select constants
select_limit=no # LIMIT number of rows
select_limit2=no # SELECT with LIMIT #,#
select_string_size=32767 # constant string size in SELECT
select_table_update=yes # Update with sub select
select_without_from=no # SELECT without FROM
server_version=6.0.1 # server version
simple_joins=yes # ANSI SQL simple joins
storage_of_float=round # Storage of float values
subqueries=yes # subqueries
table_alias=no # Table alias
table_name_case=yes # case independent table names
table_wildcard=yes # Select table_name.*
temporary_table=no # temporary tables
transactions=error # constant string size in where
truncate_table=no # truncate
type_extra_abstime=no # Type abstime
type_extra_bfile=no # Type bfile
type_extra_blob=yes # Type blob
type_extra_bool=no # Type bool
type_extra_box=no # Type box
type_extra_byte=no # Type byte
type_extra_char(1_arg)_binary=no # Type char(1 arg) binary
type_extra_cidr=no # Type cidr
type_extra_circle=no # Type circle
type_extra_clob=no # Type clob
type_extra_datetime=no # Type datetime
type_extra_double=no # Type double
type_extra_enum(1_arg)=no # Type enum(1 arg)
type_extra_float(2_arg)=no # Type float(2 arg)
type_extra_float4=no # Type float4
type_extra_float8=no # Type float8
type_extra_image=no # Type image
type_extra_inet=no # Type inet
type_extra_int(1_arg)_zerofill=no # Type int(1 arg) zerofill
type_extra_int1=no # Type int1
type_extra_int2=no # Type int2
type_extra_int3=no # Type int3
type_extra_int4=no # Type int4
type_extra_int8=no # Type int8
type_extra_int_auto_increment=no # Type int not null auto_increment
type_extra_int_identity=no # Type int not null identity
type_extra_int_unsigned=no # Type int unsigned
type_extra_interval=no # Type interval
type_extra_line=no # Type line
type_extra_long=no # Type long
type_extra_long_raw=no # Type long raw
type_extra_long_varbinary=no # Type long varbinary
type_extra_long_varchar(1_arg)=no # Type long varchar(1 arg)
type_extra_lseg=no # Type lseg
type_extra_macaddr=no # Type macaddr
type_extra_mediumint=no # Type mediumint
type_extra_mediumtext=no # Type mediumtext
type_extra_middleint=no # Type middleint
type_extra_mlslabel=no # Type mlslabel
type_extra_money=no # Type money
type_extra_nclob=no # Type nclob
type_extra_number=no # Type number
type_extra_number(1_arg)=no # Type number(1 arg)
type_extra_number(2_arg)=no # Type number(2 arg)
type_extra_nvarchar2(1_arg)=no # Type nvarchar2(1 arg)
type_extra_path=no # Type path
type_extra_point=no # Type point
type_extra_polygon=no # Type polygon
type_extra_raw(1_arg)=no # Type raw(1 arg)
type_extra_reltime=no # Type reltime
type_extra_rowid=no # Type rowid
type_extra_serial=no # Type serial
type_extra_set(1_arg)=no # Type set(1 arg)
type_extra_smalldatetime=no # Type smalldatetime
type_extra_smallfloat=no # Type smallfloat
type_extra_smallmoney=no # Type smallmoney
type_extra_text=no # Type text
type_extra_text(1_arg)=no # Type text(1 arg)
type_extra_timespan=no # Type timespan
type_extra_uint=no # Type uint
type_extra_varchar2(1_arg)=no # Type varchar2(1 arg)
type_extra_year=no # Type year
type_odbc_bigint=no # Type bigint
type_odbc_binary(1_arg)=no # Type binary(1 arg)
type_odbc_datetime=no # Type datetime
type_odbc_tinyint=no # Type tinyint
type_odbc_varbinary(1_arg)=no # Type varbinary(1 arg)
type_sql_bit=no # Type bit
type_sql_bit(1_arg)=no # Type bit(1 arg)
type_sql_bit_varying(1_arg)=no # Type bit varying(1 arg)
type_sql_boolean=no # Type boolean
type_sql_char(1_arg)=yes # Type char(1 arg)
type_sql_char_varying(1_arg)=yes # Type char varying(1 arg)
type_sql_character(1_arg)=yes # Type character(1 arg)
type_sql_character_varying(1_arg)=yes # Type character varying(1 arg)
type_sql_date=yes # Type date
type_sql_dec(2_arg)=yes # Type dec(2 arg)
type_sql_decimal(2_arg)=yes # Type decimal(2 arg)
type_sql_double_precision=yes # Type double precision
type_sql_float=yes # Type float
type_sql_float(1_arg)=yes # Type float(1 arg)
type_sql_int=yes # Type int
type_sql_integer=yes # Type integer
type_sql_interval_day=no # Type interval day
type_sql_interval_day_to_hour=no # Type interval day to hour
type_sql_interval_day_to_minute=no # Type interval day to minute
type_sql_interval_day_to_second=no # Type interval day to second
type_sql_interval_hour=no # Type interval hour
type_sql_interval_hour_to_minute=no # Type interval hour to minute
type_sql_interval_hour_to_second=no # Type interval hour to second
type_sql_interval_minute=no # Type interval minute
type_sql_interval_minute_to_second=no # Type interval minute to second
type_sql_interval_month=no # Type interval month
type_sql_interval_second=no # Type interval second
type_sql_interval_year=no # Type interval year
type_sql_interval_year_to_month=no # Type interval year to month
type_sql_national_char_varying(1_arg)=yes # Type national char varying(1 arg)
type_sql_national_character(1_arg)=yes # Type national character(1 arg)
type_sql_national_character_varying(1_arg)=yes # Type national character varying(1 arg)
type_sql_nchar(1_arg)=yes # Type nchar(1 arg)
type_sql_nchar_varying(1_arg)=yes # Type nchar varying(1 arg)
type_sql_numeric(2_arg)=yes # Type numeric(2 arg)
type_sql_real=yes # Type real
type_sql_smallint=yes # Type smallint
type_sql_time=yes # Type time
type_sql_timestamp=yes # Type timestamp
type_sql_timestamp_with_time_zone=no # Type timestamp with time zone
type_sql_varchar(1_arg)=yes # Type varchar(1 arg)
union=yes # union
union_all=yes # union all
union_all_incompat=yes # union all (incompatible lists)
union_incompat=yes # union (incompatible lists)
unique_in_create=yes # unique in create table
unique_null_in_create=no # unique null in create
views=no # views
where_string_size=32767 # constant string size in where
......@@ -121,6 +121,7 @@ sub new
$self->{'double_quotes'} = 1; # Can handle: 'Walker''s'
$self->{'vacuum'} = 1; # When using with --fast
$self->{'drop_attr'} = "";
$self->{'transactions'} = 1; # Transactions enabled
$limits{'NEG'} = 1; # Supports -id
$limits{'alter_add_multi_col'}= 1; #Have ALTER TABLE t add a int,add b int;
......@@ -370,6 +371,7 @@ sub new
$self->{'limits'} = \%limits;
$self->{'double_quotes'} = 0;
$self->{'drop_attr'} = "";
$self->{'transactions'} = 0; # No transactions
$self->{'blob'} = "text(" . $limits{'max_text_size'} .")";
$self->{'text'} = "text(" . $limits{'max_text_size'} .")";
......@@ -565,6 +567,7 @@ sub new
$self->{'text'} = "text";
$self->{'double_quotes'} = 1;
$self->{'drop_attr'} = "";
$self->{'transactions'} = 1; # Transactions enabled
$self->{"vacuum"} = 1;
$limits{'join_optimizer'} = 1; # Can optimize FROM tables
$limits{'load_data_infile'} = 0;
......@@ -854,6 +857,7 @@ sub new
$self->{'text'} = "long varchar";
$self->{'double_quotes'} = 1;
$self->{'drop_attr'} = "";
$self->{'transactions'} = 1; # Transactions enabled
$limits{'max_conditions'} = 9999; # Probably big enough
$limits{'max_columns'} = 2000; # From crash-me
......@@ -1095,6 +1099,7 @@ sub new
$self->{'text'} = "text";
$self->{'double_quotes'} = 1; # Can handle: 'Walker''s'
$self->{'drop_attr'} = "";
$self->{'transactions'} = 1; # Transactions enabled
$limits{'max_conditions'} = 1258;
$limits{'max_columns'} = 226; # server is disconnecting????
......@@ -1377,6 +1382,7 @@ sub new
$self->{'text'} = "long";
$self->{'double_quotes'} = 1; # Can handle: 'Walker''s'
$self->{'drop_attr'} = "";
$self->{'transactions'} = 1; # Transactions enabled
$self->{"vacuum"} = 1;
$limits{'max_conditions'} = 9999; # (Actually not a limit)
......@@ -1633,6 +1639,7 @@ sub new
$self->{'text'} = "byte in table";
$self->{'double_quotes'} = 0; # Can handle: 'Walker''s'
$self->{'drop_attr'} = "";
$self->{'transactions'} = 1; # Transactions enabled
$self->{'host'} = $host;
$limits{'NEG'} = 1; # Supports -id
......@@ -1834,6 +1841,7 @@ sub new
$self->{'text'} = "blob"; # text ?
$self->{'double_quotes'} = 1; # Can handle: 'Walker''s'
$self->{'drop_attr'} = "";
$self->{'transactions'} = 1; # Transactions enabled
$limits{'max_conditions'} = 97; # We get 'Query is too complex'
$limits{'max_columns'} = 255; # Max number of columns in table
......@@ -2010,6 +2018,7 @@ sub new
$self->{'text'} = "text";
$self->{'double_quotes'} = 1; # Can handle: 'Walker''s'
$self->{'drop_attr'} = "";
$self->{'transactions'} = 1; # Transactions enabled
$limits{'max_conditions'} = 1030; # We get 'Query is too complex'
$limits{'max_columns'} = 250; # Max number of columns in table
......@@ -2197,6 +2206,7 @@ sub new
$self->{'text'} = "text";
$self->{'double_quotes'} = 1; # Can handle: 'Walker''s'
$self->{'drop_attr'} = "";
$self->{'transactions'} = 1; # Transactions enabled
$self->{"vacuum"} = 1;
$limits{'max_conditions'} = 1030; # We get 'Query is too complex'
......@@ -2389,6 +2399,7 @@ sub new
$self->{'text'} = "long";
$self->{'double_quotes'} = 1; # Can handle: 'Walker''s'
$self->{'drop_attr'} = "";
$self->{'transactions'} = 1; # Transactions enabled
$limits{'max_conditions'} = 50; # (Actually not a limit)
$limits{'max_columns'} = 254; # Max number of columns in table
......@@ -2603,6 +2614,7 @@ sub new
$self->{'text'} = "varchar(255)";
$self->{'double_quotes'} = 1; # Can handle: 'Walker''s'
$self->{'drop_attr'} = "";
$self->{'transactions'} = 1; # Transactions enabled
$limits{'max_conditions'} = 418; # We get 'Query is too complex'
$limits{'max_columns'} = 500; # Max number of columns in table
......@@ -2772,6 +2784,7 @@ sub new
$self->{'text'} = "character varying(15000)";
$self->{'double_quotes'} = 1; # Can handle: 'Walker''s'
$self->{'drop_attr'} = "";
$self->{'transactions'} = 1; # Transactions enabled
$self->{'char_null'} = "cast(NULL as char(1))";
$self->{'numeric_null'} = "cast(NULL as int)";
......@@ -2972,6 +2985,7 @@ sub new
$self->{'text'} = "";
$self->{'double_quotes'} = 1; # Can handle: 'Walker''s'
$self->{'drop_attr'} = "";
$self->{'transactions'} = 1; # Transactions enabled
$self->{'char_null'} = "";
$self->{'numeric_null'} = "";
......@@ -3184,6 +3198,7 @@ sub new
$self->{'text'} = "varchar(8000000)";
$self->{'double_quotes'} = 1; # Can handle: 'Walker''s'
$self->{'drop_attr'} = ' restrict';
$self->{'transactions'} = 1; # Transactions enabled
$self->{'error_on_execute_means_zero_rows'}=1;
$limits{'max_conditions'} = 5427; # (Actually not a limit)
......
......@@ -106,6 +106,12 @@ if (!$opt_skip_create)
}
else
{
if ($opt_fast && $server->{transactions})
{
$dbh->{AutoCommit} = 0;
print "Transactions enabled\n" if ($opt_debug);
}
for ($ti = 0; $ti <= $#table_names; $ti++)
{
my $table_name = $table_names[$ti];
......@@ -128,8 +134,14 @@ if (!$opt_skip_create)
$row_count++;
}
}
if ($opt_fast && $server->{transactions})
{
$dbh->commit;
$dbh->{AutoCommit} = 1;
}
close(DATA);
}
if ($opt_lock_tables)
{
$dbh->do("UNLOCK TABLES");
......
......@@ -74,11 +74,25 @@ do_many($dbh,$server->create("bench",\@fields,\@index));
print "Insert data into the table\n";
$loop_time=new Benchmark;
if ($opt_fast && defined($server->{transactions}))
{
$dbh->{AutoCommit} = 0;
print "Transactions enabled\n" if ($opt_debug);
}
for ($i=0 ; $i < $opt_row_count ; $i++)
{
$query="insert into bench values ( " . ("$i," x ($opt_start_field_count-1)) . "$i)";
$dbh->do($query) or die $DBI::errstr;
}
if ($opt_fast && defined($server->{transactions}))
{
$dbh->commit;
$dbh->{AutoCommit} = 1;
}
$end_time=new Benchmark;
print "Time for insert ($opt_row_count)",
......
......@@ -127,14 +127,28 @@ end_benchmark($start_time);
sub test_query
{
my($test_text,$result_text,$query,$dbh,$count)=@_;
my($i,$loop_time,$end_time);
my($i,$loop_time,$end_time, $using_transactions);
print $test_text . "\n";
$loop_time=new Benchmark;
$using_transactions=0;
if ($opt_fast && server->{transactions} && $query=~ /^insert /i)
{
$using_transactions=1;
$dbh->{AutoCommit} = 0;
print "Transactions enabled\n" if ($opt_debug);
}
for ($i=0 ; $i < $count ; $i++)
{
defined(fetch_all_rows($dbh,$query)) or die $DBI::errstr;
}
if ($using_transactions)
{
$dbh->commit;
$dbh->{AutoCommit} = 1;
}
$end_time=new Benchmark;
print $result_text . "($count): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
......
......@@ -29,6 +29,7 @@
use DBI;
use Benchmark;
use Data::Dumper;
$opt_loop_count=100000; # number of rows/3
$small_loop_count=10; # Loop for full table retrieval
......@@ -132,6 +133,12 @@ else
$query="insert into bench1 (id,id2,id3,dummy1) values ";
}
if ($opt_fast && $server->{transactions})
{
$dbh->{AutoCommit} = 0;
print "Transactions enabled\n" if ($opt_debug);
}
if (($opt_fast || $opt_fast_insert) && $server->{'limits'}->{'insert_multi_value'})
{
$query_size=$server->{'limits'}->{'query_size'};
......@@ -209,6 +216,12 @@ else
}
}
if ($opt_fast && $server->{transactions})
{
$dbh->commit;
$dbh->{AutoCommit} = 1;
}
$end_time=new Benchmark;
print "Time for insert (" . ($total_rows) . "): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
......@@ -234,6 +247,12 @@ if ($limits->{'unique_index'})
{
print "Testing insert of duplicates\n";
$loop_time=new Benchmark;
if ($opt_fast && $server->{transactions})
{
$dbh->{AutoCommit} = 0;
}
for ($i=0 ; $i < $opt_loop_count ; $i++)
{
$tmpvar^= ((($tmpvar + 63) + $i)*3 % $opt_loop_count);
......@@ -244,6 +263,11 @@ if ($limits->{'unique_index'})
die "Didn't get an error when inserting duplicate record $tmp\n";
}
}
if ($opt_fast && $server->{transactions})
{
$dbh->commit;
$dbh->{AutoCommit} = 1;
}
$end_time=new Benchmark;
print "Time for insert_duplicates (" . ($opt_loop_count) . "): " .
......@@ -577,7 +601,6 @@ if ($limits->{'group_functions'})
}
$sth->finish;
$count++;
$sth=$dbh->prepare($query="select count(*),sum(id+0.0),min(id),max(id),avg(id-0.0) from bench1") or die $DBI::errstr;
$sth->execute or die $DBI::errstr;
......@@ -1250,6 +1273,11 @@ if ($server->small_rollback_segment())
}
$loop_time=new Benchmark;
if ($opt_fast && $server->{transactions})
{
$dbh->{AutoCommit} = 0;
}
$fields=$#fields;
if (($opt_fast || $opt_fast_insert) && $server->{'limits'}->{'insert_multi_value'})
{
......@@ -1297,6 +1325,13 @@ else
$dbh->do($query) or die "Got error $DBI::errstr with query: $query\n";
}
}
if ($opt_fast && $server->{transactions})
{
$dbh->commit;
$dbh->{AutoCommit} = 1;
}
$end_time=new Benchmark;
print "Time for insert_key ($many_keys_loop_count): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
......@@ -1325,11 +1360,24 @@ if ($opt_fast && defined($server->{vacuum}))
print "Testing update of keys\n";
$loop_time=new Benchmark;
if ($opt_fast && $server->{transactions})
{
$dbh->{AutoCommit} = 0;
}
for ($i=0 ; $i< 256; $i++)
{
$dbh->do("update bench1 set field5=1 where field_search=$i")
or die "Got error $DBI::errstr with query: update bench1 set field5=1 where field_search=$i\n";
}
if ($opt_fast && $server->{transactions})
{
$dbh->commit;
$dbh->{AutoCommit} = 1;
}
$end_time=new Benchmark;
print "Time for update_of_primary_key_many_keys (256): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
......@@ -1420,12 +1468,18 @@ if ($limits->{'insert_multi_value'})
"dummy1 char(30)"],
["primary key (id,id2)",
"index index_id3 (id3)"]));
$loop_time=new Benchmark;
if ($opt_lock_tables)
{
$sth = $dbh->do("LOCK TABLES bench1 write") || die $DBI::errstr;
}
if ($opt_fast && $server->{transactions})
{
$dbh->{AutoCommit} = 0;
}
$loop_time=new Benchmark;
print "Inserting $opt_loop_count rows with multiple values\n";
$query="insert into bench1 values ";
$res=$query;
......@@ -1448,6 +1502,11 @@ if ($limits->{'insert_multi_value'})
{
$sth = $dbh->do("UNLOCK TABLES ") || die $DBI::errstr;
}
if ($opt_fast && $server->{transactions})
{
$dbh->commit;
$dbh->{AutoCommit} = 1;
}
$end_time=new Benchmark;
print "Time for multiple_value_insert (" . ($opt_loop_count) . "): " .
......
......@@ -92,6 +92,12 @@ if ($opt_fast && defined($server->{vacuum}))
print "Inserting $opt_loop_count rows\n";
$loop_time=new Benchmark;
if ($opt_fast && $server->{transactions})
{
$dbh->{AutoCommit} = 0;
}
$query="insert into bench1 values (";
$half_done=$opt_loop_count/2;
for ($id=0,$rev_id=$opt_loop_count-1 ; $id < $opt_loop_count ; $id++,$rev_id--)
......@@ -105,6 +111,12 @@ for ($id=0,$rev_id=$opt_loop_count-1 ; $id < $opt_loop_count ; $id++,$rev_id--)
}
}
if ($opt_fast && $server->{transactions})
{
$dbh->commit;
$dbh->{AutoCommit} = 1;
}
$end_time=new Benchmark;
print "Time to insert ($opt_loop_count): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
......
......@@ -109,6 +109,11 @@ if ($opt_fast && $server->{'limits'}->{'load_data_infile'})
}
else
{
if ($opt_fast && $server->{transactions})
{
$dbh->{AutoCommit} = 0;
}
for ($ti = 0; $ti <= $#table_names; $ti++)
{
my $table_name = $table_names[$ti];
......@@ -133,10 +138,17 @@ else
}
close(DATA);
}
if ($opt_lock_tables)
{
do_query($dbh,"UNLOCK TABLES");
}
if ($opt_fast && $server->{transactions})
{
$dbh->commit;
$dbh->{AutoCommit} = 1;
}
$end_time=new Benchmark;
print "Time to insert ($row_count): " .
timestr(timediff($end_time, $loop_time),"all") . "\n";
......
......@@ -1626,8 +1626,7 @@ mysql_execute_command(void)
if (!(res=open_and_lock_tables(thd, tables)))
{
if ((result=new select_insert(tables->table,&lex->field_list,
lex->sql_command == SQLCOM_REPLACE_SELECT ?
DUP_REPLACE : DUP_IGNORE)))
lex->duplicates)))
res=handle_select(thd,lex,result);
}
else
......
......@@ -148,7 +148,7 @@ int mysql_update(THD *thd,
used_key_is_modified=check_if_key_used(table, used_index, fields);
else
used_key_is_modified=0;
if (used_key_is_modified)
if (used_key_is_modified || order)
{
/*
** We can't update table directly; We must first search after all
......
......@@ -2188,7 +2188,13 @@ insert:
INSERT { Lex->sql_command = SQLCOM_INSERT; } insert_lock_option opt_ignore insert2 insert_field_spec
replace:
REPLACE { Lex->sql_command = SQLCOM_REPLACE; } replace_lock_option insert2 insert_field_spec
REPLACE
{
LEX *lex=Lex;
lex->sql_command = SQLCOM_REPLACE;
lex->duplicates= DUP_REPLACE;
}
replace_lock_option insert2 insert_field_spec
insert_lock_option:
/* empty */ { Lex->lock_option= TL_WRITE_CONCURRENT_INSERT; }
......@@ -2299,10 +2305,6 @@ values:
update:
UPDATE_SYM opt_low_priority opt_ignore table_name
SET update_list
where_clause
opt_order_clause
delete_limit_clause
{
LEX *lex=Lex;
lex->sql_command = SQLCOM_UPDATE;
......@@ -2310,6 +2312,10 @@ update:
lex->select->order_list.first=0;
lex->select->order_list.next= (byte**) &lex->select->order_list.first;
}
SET update_list
where_clause
opt_order_clause
delete_limit_clause
update_list:
update_list ',' simple_ident equal expr
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment