Commit b5dfa5b7 authored by unknown's avatar unknown

Lots of cleanups.

parent 8396f4d8
...@@ -3644,16 +3644,20 @@ differently: ...@@ -3644,16 +3644,20 @@ differently:
@item @item
@code{--} is only a comment if followed by a white space. @xref{Missing @code{--} is only a comment if followed by a white space. @xref{Missing
comments}. comments}.
@item @item
For @code{VARCHAR} columns, trailing spaces are removed when the value is For @code{VARCHAR} columns, trailing spaces are removed when the value is
stored. @xref{Bugs}. stored. @xref{Bugs}.
@item @item
In some cases, @code{CHAR} columns are silently changed to @code{VARCHAR} In some cases, @code{CHAR} columns are silently changed to @code{VARCHAR}
columns. @xref{Silent column changes}. columns. @xref{Silent column changes}.
@item @item
Privileges for a table are not automatically revoked when you delete a Privileges for a table are not automatically revoked when you delete a
table. You must explicitly issue a @code{REVOKE} to revoke privileges for table. You must explicitly issue a @code{REVOKE} to revoke privileges for
a table. @xref{GRANT, , @code{GRANT}}. a table. @xref{GRANT, , @code{GRANT}}.
@item @item
@code{NULL AND FALSE} will evaluate to @code{NULL} and not to @code{FALSE}. @code{NULL AND FALSE} will evaluate to @code{NULL} and not to @code{FALSE}.
This is because we don't think it's good to have to evaluate a lot of This is because we don't think it's good to have to evaluate a lot of
...@@ -3673,15 +3677,19 @@ behavior of MySQL changes: ...@@ -3673,15 +3677,19 @@ behavior of MySQL changes:
@itemize @bullet @itemize @bullet
@item @item
@code{||} is string concatenation instead of @code{OR}. @code{||} is string concatenation instead of @code{OR}.
@item @item
You can have any number of spaces between a function name and the @samp{(}. You can have any number of spaces between a function name and the @samp{(}.
This forces all function names to be treated as reserved words. This forces all function names to be treated as reserved words.
@item @item
@samp{"} will be an identifier quote character (like the MySQL @samp{"} will be an identifier quote character (like the MySQL
@samp{`} quote character) and not a string quote character. @samp{`} quote character) and not a string quote character.
@item @item
@code{REAL} will be a synonym for @code{FLOAT} instead of a synonym of @code{REAL} will be a synonym for @code{FLOAT} instead of a synonym of
@code{DOUBLE}. @code{DOUBLE}.
@item @item
The default transaction isolation level is @code{SERIALIZABLE}. The default transaction isolation level is @code{SERIALIZABLE}.
@xref{SET TRANSACTION}. @xref{SET TRANSACTION}.
...@@ -4315,17 +4323,21 @@ The following problems are known and will be fixed in due time: ...@@ -4315,17 +4323,21 @@ The following problems are known and will be fixed in due time:
@itemize @bullet @itemize @bullet
@item @item
For the moment @code{MATCH} only works with @code{SELECT} statements. For the moment @code{MATCH} only works with @code{SELECT} statements.
@item @item
When using @code{SET CHARACTER SET}, one can't use translated When using @code{SET CHARACTER SET}, one can't use translated
characters in database, table and column names. characters in database, table and column names.
@item @item
@code{DELETE FROM merge_table} used without a @code{WHERE} @code{DELETE FROM merge_table} used without a @code{WHERE}
will only clear the mapping for the table, not delete everything in the will only clear the mapping for the table, not delete everything in the
mapped tables mapped tables
@item @item
You cannot build in another directory when using You cannot build in another directory when using
MIT-pthreads. Because this requires changes to MIT-pthreads, we are not MIT-pthreads. Because this requires changes to MIT-pthreads, we are not
likely to fix this. likely to fix this.
@item @item
@code{BLOB} values can't ``reliably'' be used in @code{GROUP BY} or @code{BLOB} values can't ``reliably'' be used in @code{GROUP BY} or
@code{ORDER BY} or @code{DISTINCT}. Only the first @code{max_sort_length} @code{ORDER BY} or @code{DISTINCT}. Only the first @code{max_sort_length}
...@@ -4333,6 +4345,7 @@ bytes (default 1024) are used when comparing @code{BLOB}bs in these cases. ...@@ -4333,6 +4345,7 @@ bytes (default 1024) are used when comparing @code{BLOB}bs in these cases.
This can be changed with the @code{-O max_sort_length} option to This can be changed with the @code{-O max_sort_length} option to
@code{mysqld}. A workaround for most cases is to use a substring: @code{mysqld}. A workaround for most cases is to use a substring:
@code{SELECT DISTINCT LEFT(blob,2048) FROM tbl_name}. @code{SELECT DISTINCT LEFT(blob,2048) FROM tbl_name}.
@item @item
Calculation is done with @code{BIGINT} or @code{DOUBLE} (both are Calculation is done with @code{BIGINT} or @code{DOUBLE} (both are
normally 64 bits long). It depends on the function which precision one normally 64 bits long). It depends on the function which precision one
...@@ -4341,13 +4354,16 @@ precision, @code{IF}, and @code{ELT()} with @code{BIGINT} or @code{DOUBLE} ...@@ -4341,13 +4354,16 @@ precision, @code{IF}, and @code{ELT()} with @code{BIGINT} or @code{DOUBLE}
precision and the rest with @code{DOUBLE} precision. One should try to precision and the rest with @code{DOUBLE} precision. One should try to
avoid using bigger unsigned long long values than 63 bits avoid using bigger unsigned long long values than 63 bits
(9223372036854775807) for anything else than bit fields! (9223372036854775807) for anything else than bit fields!
@item @item
All string columns, except @code{BLOB} and @code{TEXT} columns, automatically All string columns, except @code{BLOB} and @code{TEXT} columns, automatically
have all trailing spaces removed when retrieved. For @code{CHAR} types this have all trailing spaces removed when retrieved. For @code{CHAR} types this
is okay, and may be regarded as a feature according to ANSI SQL92. The bug is is okay, and may be regarded as a feature according to ANSI SQL92. The bug is
that in MySQL, @code{VARCHAR} columns are treated the same way. that in MySQL, @code{VARCHAR} columns are treated the same way.
@item @item
You can only have up to 255 @code{ENUM} and @code{SET} columns in one table. You can only have up to 255 @code{ENUM} and @code{SET} columns in one table.
@item @item
@code{safe_mysqld} re-directs all messages from @code{mysqld} to the @code{safe_mysqld} re-directs all messages from @code{mysqld} to the
@code{mysqld} log. One problem with this is that if you execute @code{mysqld} log. One problem with this is that if you execute
...@@ -4357,14 +4373,18 @@ If you use @code{--log} extensively, you should edit @code{safe_mysqld} to ...@@ -4357,14 +4373,18 @@ If you use @code{--log} extensively, you should edit @code{safe_mysqld} to
log to @file{'hostname'.err} instead of @file{'hostname'.log} so you can log to @file{'hostname'.err} instead of @file{'hostname'.log} so you can
easily reclaim the space for the old log by deleting the old one and easily reclaim the space for the old log by deleting the old one and
executing @code{mysqladmin refresh}. executing @code{mysqladmin refresh}.
@item @item
In the @code{UPDATE} statement, columns are updated from left to right. In the @code{UPDATE} statement, columns are updated from left to right. If
If you refer to an updated column, you will get the updated value instead of the you refer to an updated column, you will get the updated value instead of the
original value. For example: original value. For example:
@example @example
mysql> UPDATE tbl_name SET KEY=KEY+1,KEY=KEY+1; mysql> UPDATE tbl_name SET KEY=KEY+1,KEY=KEY+1;
@end example @end example
will update @code{KEY} with @code{2} instead of with @code{1}.
This will update @code{KEY} with @code{2} instead of with @code{1}.
@item @item
You can't use temporary tables more than once in the same query. You can't use temporary tables more than once in the same query.
For example, the following doesn't work. For example, the following doesn't work.
...@@ -4389,9 +4409,11 @@ An example of this is: ...@@ -4389,9 +4409,11 @@ An example of this is:
@example @example
SELECT DISTINCT mp3id FROM band_downloads WHERE userid = 9 ORDER BY id SELECT DISTINCT mp3id FROM band_downloads WHERE userid = 9 ORDER BY id
DESC; DESC;
@end example
and and
@example
SELECT DISTINCT band_downloads.mp3id, FROM band_downloads,band_mp3 SELECT DISTINCT band_downloads.mp3id, FROM band_downloads,band_mp3
WHERE band_downloads.userid = 9 AND band_mp3.id = band_downloads.mp3id WHERE band_downloads.userid = 9 AND band_mp3.id = band_downloads.mp3id
ORDER BY band_downloads.id DESC; ORDER BY band_downloads.id DESC;
...@@ -4422,24 +4444,28 @@ optimizations that otherwise would be very hard to do. ...@@ -4422,24 +4444,28 @@ optimizations that otherwise would be very hard to do.
If you set a column to an incorrect value, MySQL will, instead of If you set a column to an incorrect value, MySQL will, instead of
doing a rollback, store the @code{best possible value} in the column: doing a rollback, store the @code{best possible value} in the column:
@itemize @bullet @itemize @minus
@item @item
If you try to store a value outside the range in a numerical column, If you try to store a value outside the range in a numerical column,
MySQL will instead store the smallest or biggest possible value in MySQL will instead store the smallest or biggest possible value in
the column. the column.
@item @item
If you try to store a string that doesn't start with a number into a If you try to store a string that doesn't start with a number into a
numerical column, MySQL will store 0 into it. numerical column, MySQL will store 0 into it.
@item @item
If you try to store @code{NULL} into a column that doesn't take If you try to store @code{NULL} into a column that doesn't take
@code{NULL} values, MySQL will store 0 or @code{''} (empty @code{NULL} values, MySQL will store 0 or @code{''} (empty
string) in it instead. (This behavior can, however, be changed with the string) in it instead. (This behavior can, however, be changed with the
-DDONT_USE_DEFAULT_FIELDS compile option). -DDONT_USE_DEFAULT_FIELDS compile option).
@item @item
MySQL allows you to store some wrong date values into MySQL allows you to store some wrong date values into
@code{DATE} and @code{DATETIME} columns. (Like 2000-02-31 or 2000-02-00). @code{DATE} and @code{DATETIME} columns. (Like 2000-02-31 or 2000-02-00).
If the date is totally wrong, MySQL will store the special If the date is totally wrong, MySQL will store the special
0000-00-00 date value in the column. 0000-00-00 date value in the column.
@item @item
If you set an @code{enum} to an unsupported value, it will be set to If you set an @code{enum} to an unsupported value, it will be set to
the error value 'empty string', with numeric value 0. the error value 'empty string', with numeric value 0.
...@@ -4448,15 +4474,18 @@ the error value 'empty string', with numeric value 0. ...@@ -4448,15 +4474,18 @@ the error value 'empty string', with numeric value 0.
@item @item
If you execute a @code{PROCEDURE} on a query that returns an empty set, If you execute a @code{PROCEDURE} on a query that returns an empty set,
in some cases the @code{PROCEDURE} will not transform the columns. in some cases the @code{PROCEDURE} will not transform the columns.
@item @item
Creation of a table of type @code{MERGE} doesn't check if the underlying Creation of a table of type @code{MERGE} doesn't check if the underlying
tables are of compatible types. tables are of compatible types.
@item @item
MySQL can't yet handle @code{NaN}, @code{-Inf} and @code{Inf} MySQL can't yet handle @code{NaN}, @code{-Inf} and @code{Inf}
values in double. Using these will cause problems when trying to export values in double. Using these will cause problems when trying to export
and import data. We should as an intermediate solution change @code{NaN} to and import data. We should as an intermediate solution change @code{NaN} to
@code{NULL} (if possible) and @code{-Inf} and @code{Inf} to the @code{NULL} (if possible) and @code{-Inf} and @code{Inf} to the
Minimum respective maximum possible @code{double} value. Minimum respective maximum possible @code{double} value.
@item @item
@code{LIMIT} on negative numbers are treated as big positive numbers. @code{LIMIT} on negative numbers are treated as big positive numbers.
@end itemize @end itemize
...@@ -4470,11 +4499,14 @@ one among many tables that is locked with @code{LOCK TABLES}. ...@@ -4470,11 +4499,14 @@ one among many tables that is locked with @code{LOCK TABLES}.
@item @item
In the following case you can get a core dump: In the following case you can get a core dump:
@enumerate
@itemize @minus
@item @item
Delayed insert handler has pending inserts to a table. Delayed insert handler has pending inserts to a table.
@item @item
@code{LOCK table} with @code{WRITE} @code{LOCK table} with @code{WRITE}
@item @item
@code{FLUSH TABLES} @code{FLUSH TABLES}
@end enumerate @end enumerate
...@@ -4496,6 +4528,7 @@ mysql> UPDATE tbl_name SET KEY=KEY+1 WHERE KEY+0 > 100; ...@@ -4496,6 +4528,7 @@ mysql> UPDATE tbl_name SET KEY=KEY+1 WHERE KEY+0 > 100;
This will work because MySQL will not use index on expressions in This will work because MySQL will not use index on expressions in
the @code{WHERE} clause. the @code{WHERE} clause.
@item @item
Before MySQL Version 3.23, all numeric types where treated as fixed-point Before MySQL Version 3.23, all numeric types where treated as fixed-point
fields. That means you had to specify how many decimals a floating-point fields. That means you had to specify how many decimals a floating-point
...@@ -4545,10 +4578,13 @@ simple security, @code{mSQL} should be quicker at: ...@@ -4545,10 +4578,13 @@ simple security, @code{mSQL} should be quicker at:
@item @item
Tests that perform repeated connects and disconnects, running a very simple Tests that perform repeated connects and disconnects, running a very simple
query during each connection. query during each connection.
@item @item
@code{INSERT} operations into very simple tables with few columns and keys. @code{INSERT} operations into very simple tables with few columns and keys.
@item @item
@code{CREATE TABLE} and @code{DROP TABLE}. @code{CREATE TABLE} and @code{DROP TABLE}.
@item @item
@code{SELECT} on something that isn't an index. (A table scan is very @code{SELECT} on something that isn't an index. (A table scan is very
easy.) easy.)
...@@ -4564,20 +4600,27 @@ most other SQL implementations) on the following: ...@@ -4564,20 +4600,27 @@ most other SQL implementations) on the following:
@itemize @bullet @itemize @bullet
@item @item
Complex @code{SELECT} operations. Complex @code{SELECT} operations.
@item @item
Retrieving large results (MySQL has a better, faster, and safer Retrieving large results (MySQL has a better, faster, and safer
protocol). protocol).
@item @item
Tables with variable-length strings, because MySQL has more efficient Tables with variable-length strings, because MySQL has more efficient
handling and can have indexes on @code{VARCHAR} columns. handling and can have indexes on @code{VARCHAR} columns.
@item @item
Handling tables with many columns. Handling tables with many columns.
@item @item
Handling tables with large record lengths. Handling tables with large record lengths.
@item @item
@code{SELECT} with many expressions. @code{SELECT} with many expressions.
@item @item
@code{SELECT} on large tables. @code{SELECT} on large tables.
@item @item
Handling many connections at the same time. MySQL is fully Handling many connections at the same time. MySQL is fully
multi-threaded. Each connection has its own thread, which means that multi-threaded. Each connection has its own thread, which means that
...@@ -4587,6 +4630,7 @@ is established, all others must wait until the first has finished, regardless ...@@ -4587,6 +4630,7 @@ 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 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 first connection terminates, the next can be served, while all the others wait
again, etc. again, etc.
@item @item
Joins. Joins.
@code{mSQL} can become pathologically slow if you change the order of tables @code{mSQL} can become pathologically slow if you change the order of tables
...@@ -4596,10 +4640,13 @@ join optimizer to order tables in the optimal order. However, if you put the ...@@ -4596,10 +4640,13 @@ join optimizer 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 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! simple and uses index columns, the join will be relatively fast!
@xref{MySQL Benchmarks}. @xref{MySQL Benchmarks}.
@item @item
@code{ORDER BY} and @code{GROUP BY}. @code{ORDER BY} and @code{GROUP BY}.
@item @item
@code{DISTINCT}. @code{DISTINCT}.
@item @item
Using @code{TEXT} or @code{BLOB} columns. Using @code{TEXT} or @code{BLOB} columns.
@end itemize @end itemize
...@@ -4619,6 +4666,7 @@ columns are retrieved, and there is no @code{WHERE} clause. @code{MIN()} and ...@@ -4619,6 +4666,7 @@ columns are retrieved, and there is no @code{WHERE} clause. @code{MIN()} and
@item @code{INSERT} and @code{UPDATE} with calculations. @item @code{INSERT} and @code{UPDATE} with calculations.
MySQL can do calculations in an @code{INSERT} or @code{UPDATE}. MySQL can do calculations in an @code{INSERT} or @code{UPDATE}.
For example: For example:
@example @example
mysql> UPDATE SET x=x*10+y WHERE x<20; mysql> UPDATE SET x=x*10+y WHERE x<20;
@end example @end example
...@@ -4645,6 +4693,7 @@ saving even one byte per record is very important. ...@@ -4645,6 +4693,7 @@ saving even one byte per record is very important.
@code{mSQL2} has a more limited set of column types, so it is @code{mSQL2} has a more limited set of column types, so it is
more difficult to get small tables. more difficult to get small tables.
@item Stability @item Stability
This is harder to judge objectively. For a discussion of MySQL This is harder to judge objectively. For a discussion of MySQL
stability, see @ref{Stability}. stability, see @ref{Stability}.
...@@ -4666,18 +4715,23 @@ some added features. ...@@ -4666,18 +4715,23 @@ some added features.
@item JDBC (Java) @item JDBC (Java)
MySQL currently has a lot of different JDBC drivers: MySQL currently has a lot of different JDBC drivers:
@itemize @bullet @itemize @bullet
@item @item
The mm driver: A type 4 JDBC driver by Mark Matthews The mm driver: A type 4 JDBC driver by Mark Matthews
@email{mmatthew@@ecn.purdue.edu}. This is released under the LGPL. @email{mmatthew@@ecn.purdue.edu}. This is released under the LGPL.
@item @item
The Resin driver. This is a commercial JDBC driver released under open The Resin driver. This is a commercial JDBC driver released under open
source. @uref{http://www.caucho.com/projects/jdbc-mysql/index.xtp} source. @uref{http://www.caucho.com/projects/jdbc-mysql/index.xtp}
@item @item
The gwe driver: A Java interface by GWE technologies (not supported anymore). The gwe driver: A Java interface by GWE technologies (not supported anymore).
@item @item
The jms driver: An improved gwe driver by Xiaokun Kelvin ZHU The jms driver: An improved gwe driver by Xiaokun Kelvin ZHU
@email{X.Zhu@@brad.ac.uk} (not supported anymore). @email{X.Zhu@@brad.ac.uk} (not supported anymore).
@item @item
The twz driver: A type 4 JDBC driver by Terrence W. Zellers The twz driver: A type 4 JDBC driver by Terrence W. Zellers
@email{zellert@@voicenet.com}. This is commercial but is free for private @email{zellert@@voicenet.com}. This is commercial but is free for private
...@@ -4739,29 +4793,35 @@ The conversion procedure is: ...@@ -4739,29 +4793,35 @@ The conversion procedure is:
@item @item
Run the shell script @code{msql2mysql} on the source. This requires the Run the shell script @code{msql2mysql} on the source. This requires the
@code{replace} program, which is distributed with MySQL. @code{replace} program, which is distributed with MySQL.
@item @item
Compile. Compile.
@item @item
Fix all compiler errors. Fix all compiler errors.
@end enumerate @end enumerate
Differences between the @code{mSQL} C API and the MySQL C API are: Differences between the @code{mSQL} C API and the MySQL C API are:
@itemize @bullet @itemize @bullet
@item @item
MySQL uses a @code{MYSQL} structure as a connection type (@code{mSQL} MySQL uses a @code{MYSQL} structure as a connection type (@code{mSQL}
uses an @code{int}). uses an @code{int}).
@item @item
@code{mysql_connect()} takes a pointer to a @code{MYSQL} structure as a @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 parameter. It is easy to define one globally or to use @code{malloc()} to get
one. one. @code{mysql_connect()} also takes two parameters for specifying the
@code{mysql_connect()} also takes two parameters for specifying the user and user and password. You may set these to @code{NULL, NULL} for default use.
password. You may set these to @code{NULL, NULL} for default use.
@item @item
@code{mysql_error()} takes the @code{MYSQL} structure as a parameter. Just add @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. the parameter to your old @code{msql_error()} code if you are porting old code.
@item @item
MySQL returns an error number and a text error message for all MySQL returns an error number and a text error message for all
errors. @code{mSQL} returns only a text error message. errors. @code{mSQL} returns only a text error message.
@item @item
Some incompatibilities exist as a result of MySQL supporting Some incompatibilities exist as a result of MySQL supporting
multiple connections to the server from the same process. multiple connections to the server from the same process.
...@@ -4783,21 +4843,27 @@ from the @code{mSQL} protocol are listed below: ...@@ -4783,21 +4843,27 @@ from the @code{mSQL} protocol are listed below:
@itemize @bullet @itemize @bullet
@item @item
A message buffer may contain many result rows. A message buffer may contain many result rows.
@item @item
The message buffers are dynamically enlarged if the query or the The message buffers are dynamically enlarged if the query or the
result is bigger than the current buffer, up to a configurable server and result is bigger than the current buffer, up to a configurable server and
client limit. client limit.
@item @item
All packets are numbered to catch duplicated or missing packets. All packets are numbered to catch duplicated or missing packets.
@item @item
All column values are sent in ASCII. The lengths of columns and rows are sent All column values are sent in ASCII. The lengths of columns and rows are sent
in packed binary coding (1, 2, or 3 bytes). in packed binary coding (1, 2, or 3 bytes).
@item @item
MySQL can read in the result unbuffered (without having to store the MySQL can read in the result unbuffered (without having to store the
full set in the client). full set in the client).
@item @item
If a single read/write takes more than 30 seconds, the server closes If a single read/write takes more than 30 seconds, the server closes
the connection. the connection.
@item @item
If a connection is idle for 8 hours, the server closes the connection. If a connection is idle for 8 hours, the server closes the connection.
@end itemize @end itemize
...@@ -5115,20 +5181,20 @@ existing programs than PostgreSQL. @xref{Contrib}. ...@@ -5115,20 +5181,20 @@ existing programs than PostgreSQL. @xref{Contrib}.
@item @item
MySQL works on 24/7 heavy duty systems. In most circumstances MySQL works on 24/7 heavy duty systems. In most circumstances
you never have to run any cleanups on @code{MySQL}. PostgreSQL doesn't you never have to run any cleanups on MySQL. PostgreSQL doesn't
yet support 24/7 systems because you have to run @code{vacuum()} 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} once in a while to reclaim space from @code{UPDATE} and @code{DELETE}
commands and to perform statistics analyzes that are critical to get commands and to perform statistics analyzes that are critical to get
good performance with PostgreSQL. Vacuum is also needed after adding good performance with PostgreSQL. @code{VACUUM()} is also needed after
a lot of new rows to a table. On a busy system with lots of changes, adding a lot of new rows to a table. On a busy system with lots of changes,
vacuum must be run very frequently, in the worst cases even many times a @code{VACUUM()} must be run very frequently, in the worst cases even
day. During the @code{vacuum()} run, which may take hours if the many times a day. During the @code{VACUUM()} run, which may take hours
database is big, the database is from a production standpoint, if the database is big, the database is from a production standpoint,
practically dead. The PostgreSQL team has fixing this on their TODO, practically dead. The PostgreSQL team has fixing this on their TODO,
but we assume that this is not an easy thing to fix permanently. but we assume that this is not an easy thing to fix permanently.
@item @item
A working, tested replication feature used by sites like A working, tested replication feature used by sites like:
@itemize @minus @itemize @minus
@item Yahoo Finance (@uref{http://finance.yahoo.com}) @item Yahoo Finance (@uref{http://finance.yahoo.com})
@item Mobile.de (@uref{http://www.mobile.de/}) @item Mobile.de (@uref{http://www.mobile.de/})
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