diff options
84 files changed, 2502 insertions, 1619 deletions
diff --git a/.bzrignore b/.bzrignore index 3b9576a47f0..6a02b58dca9 100644 --- a/.bzrignore +++ b/.bzrignore @@ -479,3 +479,4 @@ vio/test-sslclient vio/test-sslserver vio/viotest-ssl tests/client_test +mysys/charset2html diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 0ed14928cdb..31c8d0a3253 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -68,3 +68,9 @@ worm@altair.is.lan zak@balfor.local zak@linux.local venu@myvenu.com +walrus@mysql.com +ram@ram.(none) +WAX@sergbook.mysql.com +bar@bar.udmsearch.izhnet.ru +nick@mysql.com +bar@bar.mysql.r18.ru diff --git a/Docs/manual.texi b/Docs/manual.texi index 97a63abd8c5..b11cbc8faba 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -23136,7 +23136,7 @@ you start using MySQL in a production environment, you can remove the @code{-l} option from @code{mysql.server} or change it to @code{--log-bin}. -The entries in this log are written as @code{mysqld} receives the questions. +The entries in this log are written as @code{mysqld} receives the queries. This may be different from the order in which the statements are executed. This is in contrast to the update log and the binary log which are written after the query is executed, but before any locks are released. @@ -23149,7 +23149,7 @@ after the query is executed, but before any locks are released. @cindex files, update log @strong{Note}: the update log is replaced by the binary -log. @xref{Binary log}. With this you can do anything that you can do +log. @xref{Binary log}. You can do anything with the binary log that you can do with the update log. When started with the @code{--log-update[=file_name]} option, @@ -23164,7 +23164,7 @@ flush-logs}, execute the @code{FLUSH LOGS} statement, or restart the server. @strong{Note}: for the above scheme to work, you must not create your own files with the same filename as the update log + some extensions -that may be regarded as a number, in the directory used by the update log! +that may be regarded as a number in the directory used by the update log! If you use the @code{--log} or @code{-l} options, @code{mysqld} writes a general log with a filename of @file{hostname.log}, and restarts and @@ -23208,8 +23208,8 @@ and the crash. @cindex binary log @cindex files, binary log -The intention is that the binary log should replace the update log, so -we recommend you to switch to this log format as soon as possible! +The binary log will replace the now deprecated update log, so +we recommend you to switch to this log format as soon as possible. The binary log contains all information that is available in the update log in a more efficient format. It also contains information about how long @@ -23218,10 +23218,10 @@ every query that updated the database took. The binary log is also used when you are replicating a slave from a master. @xref{Replication}. -When started with the @code{--log-bin[=file_name]} option, @code{mysqld} +When started with the @code{--log-bin[=file_name]} option @code{mysqld} writes a log file containing all SQL commands that update data. If no -file name is given, it defaults to the name of the host machine followed -by @code{-bin}. If file name is given, but it doesn't contain a path, the +file name is given it defaults to the name of the host machine followed +by @code{-bin}. If a file name is given, but doesn't contain a path, the file is written in the data directory. If you supply an extension to @code{--log-bin=filename.extension}, the @@ -23241,14 +23241,9 @@ to the binary log: @multitable @columnfractions .38 .62 @item @strong{Option} @tab @strong{Description} -@item @code{binlog-do-db=database_name} @tab -Tells the master it should log updates for the specified database, and -exclude all others not explicitly mentioned. -(Example: @code{binlog-do-db=some_database}) +@item @code{binlog-do-db=database_name} @tab Tells the master it should log updates for the specified database, and exclude all others not explicitly mentioned. (Example: @code{binlog-do-db=some_database}) -@item @code{binlog-ignore-db=database_name} @tab -Tells the master that updates to the given database should not be logged -to the binary log (Example: @code{binlog-ignore-db=some_database}) +@item @code{binlog-ignore-db=database_name} @tab Tells the master that updates to the given database should not be logged to the binary log (Example: @code{binlog-ignore-db=some_database}) @end multitable To be able to know which different binary log files have been used, @@ -23272,10 +23267,10 @@ mysqlbinlog log-file | mysql -h server_name @end example You can also use the @code{mysqlbinlog} program to read the binary log -directly from a remote MySQL server! +directly from a remote MySQL server. @code{mysqlbinlog --help} will give you more information of how to use -this program! +this program. If you are using @code{BEGIN [WORK]} or @code{SET AUTOCOMMIT=0}, you must use the MySQL binary log for backups instead of the old update log. @@ -23284,10 +23279,10 @@ The binary logging is done immediately after a query completes but before any locks are released or any commit is done. This ensures that the log will be logged in the execution order. -All updates (@code{UPDATE}, @code{DELETE} or @code{INSERT}) that change -a transactional table (like BDB tables) are cached until a @code{COMMIT}. Any updates to a non-transactional table are stored in the binary log at -once. Every thread will, on start, allocate a buffer of +once. All updates (@code{UPDATE}, @code{DELETE} or @code{INSERT}) that change +a transactional table (like BDB tables) are cached until a @code{COMMIT}. +Every thread will, on start, allocate a buffer of @code{binlog_cache_size} to buffer queries. If a query is bigger than this, the thread will open a temporary file to handle the bigger cache. The temporary file will be deleted when the thread ends. @@ -23313,10 +23308,10 @@ more than @code{long_query_time} to execute. The time to get the initial table locks are not counted as execution time. The slow query log is logged after the query is executed and after all -locks has been released. This may be different from the order in which +locks have been released. This may be different from the order in which the statements are executed. -If no file name is given, it defaults to the name of the host machine +If no filename is given, it defaults to the name of the host machine suffixed with @code{-slow.log}. If a filename is given, but doesn't contain a path, the file is written in the data directory. @@ -23326,8 +23321,8 @@ can become a difficult task. You can pipe the slow query log through the @code{mysqldumpslow} command to get a summary of the queries which appear in the log. -You are using @code{--log-long-format} then also queries that are not -using indexes are printed. @xref{Command-line options}. +If you use @code{--log-long-format} also, then queries that do not +use indexes are logged as well. @xref{Command-line options}. @node Log file maintenance, , Slow query log, Log Files @@ -23337,22 +23332,19 @@ using indexes are printed. @xref{Command-line options}. @cindex maintaining, log files @cindex log files, maintaining -MySQL has a lot of log files which make it easy to see what is -going. @xref{Log Files}. One must however from time to time clean up -after @code{MysQL} to ensure that the logs don't take up too much disk -space. - -When using MySQL with log files, you will, from time to time, -want to remove/backup old log files and tell MySQL to start -logging on new files. @xref{Backup}. +MySQL has many log files which makes it easy to see what is going on. +@xref{Log Files}. One must, however, occasionally clean up +after @code{MySQL} to ensure that the logs don't take up too much disk +space by either removing or backing up old log files and then telling MySQL +to start logging to new files. @xref{Backup}. -On a Linux (@code{Redhat}) installation, you can use the +On a Linux (@code{Redhat}) installation you can use the @code{mysql-log-rotate} script for this. If you installed MySQL -from an RPM distribution, the script should have been installed -automatically. Note that you should be careful with this if you are using -the log for replication! +from an RPM distribution the script should have been installed +automatically. @strong{Note}: you should be careful with this if you are +using the logs for replication. -On other systems you must install a short script yourself that you +On other systems you must install a short script yourself that you can start from @code{cron} to handle log files. You can force MySQL to start using new log files by using @@ -35442,8 +35434,10 @@ mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT, This will create a @code{MyISAM} table with three columns, a, b, and c. Notice that the columns from the @code{SELECT} statement are appended to -the right side of the table, not overlapped onto it. Take the following -example: +the right side of the table, not overlapped onto it. +Still, the column from the @code{SELECT} will overlap the column from +the @code{CREATE} clause if they both have the same name. Take the following +examples: @example mysql> SELECT * FROM foo; @@ -35464,6 +35458,18 @@ mysql> SELECT * FROM bar; | NULL | 1 | +------+---+ 1 row in set (0.00 sec) + +mysql> CREATE TABLE foobar (n FLOAT(3,2), m INT) SELECT n FROM foo; +Query OK, 1 row affected (0.02 sec) +Records: 1 Duplicates: 0 Warnings: 0 + +mysql> SELECT * FROM foobar; ++------+------+ +| n | m | ++------+------+ +| 1.00 | NULL | ++------+------+ +1 row in set (0.00 sec) @end example For each row in table @code{foo}, a row is inserted in @code{bar} with diff --git a/SSL/cacert.pem b/SSL/cacert.pem index 862e07114c5..698784b49f9 100644 --- a/SSL/cacert.pem +++ b/SSL/cacert.pem @@ -1,21 +1,20 @@ -----BEGIN CERTIFICATE----- -MIIDaDCCAtGgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBhTELMAkGA1UEBhMCRkkx -EzARBgNVBAgTClNvbWUtU3RhdGUxETAPBgNVBAcTCEhlbHNpbmtpMRkwFwYDVQQK -ExBNeVNRTCBGaW5sYW5kIEFCMRQwEgYDVQQDEwtUb251IFNhbXVlbDEdMBsGCSqG -SIb3DQEJARYOdG9udUBteXNxbC5jb20wHhcNMDEwNjI0MTU0MzE4WhcNMDIwNjI0 -MTU0MzE4WjCBhTELMAkGA1UEBhMCRkkxEzARBgNVBAgTClNvbWUtU3RhdGUxETAP -BgNVBAcTCEhlbHNpbmtpMRkwFwYDVQQKExBNeVNRTCBGaW5sYW5kIEFCMRQwEgYD -VQQDEwtUb251IFNhbXVlbDEdMBsGCSqGSIb3DQEJARYOdG9udUBteXNxbC5jb20w -gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJz9FCvWX8c+Xr6mxzfZvPainIPT -ODNsQ0f2kAs0epP+peUn4LHxLybp2dkUHTtJLXyUyk7cXfnUd+0fRazK2/Vz48bZ -swGwg9Rhg3P02Ku+CMWYulHzN6uVRzfrDUSkDoky2DGL3A6B8P4JRc2qcr+kjhh5 -6r1VJlXs9N3DqeEdAgMBAAGjgeUwgeIwHQYDVR0OBBYEFKUK1nK13+TCK3sHXtNN -Ugfhg2t/MIGyBgNVHSMEgaowgaeAFKUK1nK13+TCK3sHXtNNUgfhg2t/oYGLpIGI -MIGFMQswCQYDVQQGEwJGSTETMBEGA1UECBMKU29tZS1TdGF0ZTERMA8GA1UEBxMI -SGVsc2lua2kxGTAXBgNVBAoTEE15U1FMIEZpbmxhbmQgQUIxFDASBgNVBAMTC1Rv -bnUgU2FtdWVsMR0wGwYJKoZIhvcNAQkBFg50b251QG15c3FsLmNvbYIBADAMBgNV -HRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4GBAI+YJKoa+IP3WYr8iLcVk5j7lZ9D -GS8reuALafnE7VX1xMlXP5EnJjT7YYYmtiB2tYj7+eQ+ajRXWWyY5NtO5ob+dm8z -OBX43v08C5vNSAFpwZWTutzb0nSd8kOABGJ04MBDJZk8QNkTfU6C7c3ZJ/gW8Guv -I+cxfz6oCYEfKLBN +MIIDQjCCAqugAwIBAgIBADANBgkqhkiG9w0BAQQFADB6MQswCQYDVQQGEwJSVTET +MBEGA1UECBMKU29tZS1TdGF0ZTERMA8GA1UEBxMIT3JlbmJ1cmcxETAPBgNVBAoT +CE15U1FMIEFCMQ8wDQYDVQQDEwZXYWxydXMxHzAdBgkqhkiG9w0BCQEWEHdhbHJ1 +c0BteXNxbC5jb20wHhcNMDIwODAyMjE1NTUzWhcNMDMwODAyMjE1NTUzWjB6MQsw +CQYDVQQGEwJSVTETMBEGA1UECBMKU29tZS1TdGF0ZTERMA8GA1UEBxMIT3JlbmJ1 +cmcxETAPBgNVBAoTCE15U1FMIEFCMQ8wDQYDVQQDEwZXYWxydXMxHzAdBgkqhkiG +9w0BCQEWEHdhbHJ1c0BteXNxbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ +AoGBALFLPDNDeq213XvhBP3TxhC0NcGKJ/sWzaHkNmunQ8sTbV8AfdFafvP7cSHk +O3jh7smpVWnxmcIbq1dpsbb7X5vQVc8ru07Z8VhCJWx6H8kgI95Am6wbm2ho2Lok +9ODG8f/lA4kLv8Vo0hqtfV5T1mnZpSzkh6G4b0yPzHu8gtObAgMBAAGjgdcwgdQw +HQYDVR0OBBYEFNnYan2rzhBiGhb86Wr03PFmrNC5MIGkBgNVHSMEgZwwgZmAFNnY +an2rzhBiGhb86Wr03PFmrNC5oX6kfDB6MQswCQYDVQQGEwJSVTETMBEGA1UECBMK +U29tZS1TdGF0ZTERMA8GA1UEBxMIT3JlbmJ1cmcxETAPBgNVBAoTCE15U1FMIEFC +MQ8wDQYDVQQDEwZXYWxydXMxHzAdBgkqhkiG9w0BCQEWEHdhbHJ1c0BteXNxbC5j +b22CAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQADeMZEA5Rh4PDq +DmS9cYyogjb9gkuLHeo/pqfU8iSZVsSaf6Uqh6TWKQOuK3I4R1K8iMo4cW6LhxxH +HLFrVIQn6xhLvfC0T6Zl7G0w6rAY2+QlbEhjnsgHtLGrB5xjSYLq6Uz3gAMbEsA4 +rCpQJECDe2PzoUXZj9mE2sdljiGcvQ== -----END CERTIFICATE----- diff --git a/SSL/client-cert.pem b/SSL/client-cert.pem index cab2a635d9f..729379babdc 100644 --- a/SSL/client-cert.pem +++ b/SSL/client-cert.pem @@ -1,26 +1,26 @@ Certificate: Data: Version: 3 (0x2) - Serial Number: 3 (0x3) + Serial Number: 2 (0x2) Signature Algorithm: md5WithRSAEncryption - Issuer: C=FI, ST=Some-State, L=Helsinki, O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu@mysql.com + Issuer: C=RU, ST=Some-State, L=Orenburg, O=MySQL AB, CN=Walrus/Email=walrus@mysql.com Validity - Not Before: Jun 24 16:03:20 2001 GMT - Not After : Jun 24 16:03:20 2002 GMT - Subject: C=EE, ST=Some-State, L=Tallinn, O=MySQL demo client certificate, CN=Tonu Samuel/Email=tonu@mysql.com + Not Before: Aug 2 22:08:07 2002 GMT + Not After : Aug 2 22:08:07 2003 GMT + Subject: C=RU, L=orenburg, O=MySQL AB, OU=client, CN=walrus/Email=walrus@mysql.com Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): - 00:e8:d4:52:cd:4e:bb:96:16:3a:f0:89:6b:90:4c: - db:e0:30:75:5a:02:72:62:bf:ed:da:be:09:e8:80: - db:80:54:30:d6:75:ed:e3:10:a5:15:44:5b:29:91: - 12:fe:0c:b7:76:4d:e9:5f:56:5c:45:3c:ad:b2:71: - 2d:6a:7a:cb:bc:04:80:08:74:d6:7d:f6:7c:5c:76: - db:35:c4:f6:f5:d8:d4:89:9f:9d:cc:3f:4e:3f:73: - c1:3e:41:7e:4e:09:bf:ea:1a:d9:a2:13:0d:d1:0c: - da:d8:f4:9b:b8:54:21:17:ae:d7:b3:02:61:87:a9: - 01:ff:f4:fe:9c:7a:fc:67:43 + 00:ab:27:e4:1e:f0:34:8b:a9:50:df:0a:b0:55:20: + b3:1f:0f:cf:f1:51:1e:66:48:a6:f8:4e:0d:d4:49: + f4:ea:d3:41:6b:7e:06:78:3c:29:9d:8e:d3:33:4d: + 0b:fc:34:4d:18:88:48:61:af:11:da:db:84:c0:92: + 91:81:6a:b6:21:d5:8e:9b:f2:6f:d8:06:ad:d6:77: + f6:8b:bd:07:d5:b7:fb:c6:f0:64:e6:3f:58:f0:6a: + 1e:81:73:97:6d:9d:c6:ec:b0:5e:1e:c6:57:82:b0: + 98:9c:ae:26:84:43:0d:98:6c:b4:d8:52:13:70:15: + 79:61:40:84:19:ea:f6:63:3f Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: @@ -28,40 +28,39 @@ Certificate: Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: - BC:FB:BB:8F:C4:85:BA:5F:A8:F2:C3:3D:C9:0F:DB:16:E7:13:BC:B2 + A6:D9:70:92:AC:2B:F6:48:A5:FB:29:CF:78:4A:57:B5:3B:43:97:EE X509v3 Authority Key Identifier: - keyid:A5:0A:D6:72:B5:DF:E4:C2:2B:7B:07:5E:D3:4D:52:07:E1:83:6B:7F - DirName:/C=FI/ST=Some-State/L=Helsinki/O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@mysql.com + keyid:D9:D8:6A:7D:AB:CE:10:62:1A:16:FC:E9:6A:F4:DC:F1:66:AC:D0:B9 + DirName:/C=RU/ST=Some-State/L=Orenburg/O=MySQL AB/CN=Walrus/Email=walrus@mysql.com serial:00 Signature Algorithm: md5WithRSAEncryption - 1c:e0:87:2c:2f:b3:a4:39:44:7f:96:7b:2f:c9:1f:91:84:0b: - 9f:d0:0a:f8:40:70:d0:dd:bd:91:0a:c6:d5:ac:8f:51:77:9c: - 35:28:e8:b6:5f:57:9e:5c:b5:9b:ae:5d:3d:7c:05:45:2e:89: - 3a:03:e1:f2:00:cb:c1:ed:3e:48:3b:5f:4e:50:d2:b4:a5:36: - 0f:1a:dc:79:49:1e:03:2f:27:c1:e4:62:d6:ef:3f:ab:2e:ab: - dd:e5:bc:cb:20:a3:dd:ab:81:69:26:9c:03:42:1b:4c:b7:aa: - 57:6d:2a:de:c0:5e:6e:74:d0:83:90:ec:ad:bb:ba:f0:cc:cf: - 41:3d + 15:96:43:10:89:e0:a6:82:a4:91:0f:7e:2e:d8:80:54:ba:63: + e2:8f:b0:aa:ea:be:35:2c:8f:0d:03:a9:86:2e:32:51:33:8a: + cc:b2:5e:b3:12:cb:b7:42:06:40:89:ce:92:87:40:f1:6a:79: + 0c:3e:00:1d:06:bf:3c:c1:da:f6:3b:e1:42:e6:55:4c:31:e1: + b9:79:f3:99:14:f6:68:9e:67:2b:e3:71:88:6b:2b:e2:08:bd: + 67:79:ea:0e:7d:34:0d:41:22:3a:f4:8f:4d:51:07:6f:5a:44: + 34:05:d1:b3:ca:cf:09:2b:43:25:a1:7f:ac:f4:54:f1:e3:93: + 47:44 -----BEGIN CERTIFICATE----- -MIIDoTCCAwqgAwIBAgIBAzANBgkqhkiG9w0BAQQFADCBhTELMAkGA1UEBhMCRkkx -EzARBgNVBAgTClNvbWUtU3RhdGUxETAPBgNVBAcTCEhlbHNpbmtpMRkwFwYDVQQK -ExBNeVNRTCBGaW5sYW5kIEFCMRQwEgYDVQQDEwtUb251IFNhbXVlbDEdMBsGCSqG -SIb3DQEJARYOdG9udUBteXNxbC5jb20wHhcNMDEwNjI0MTYwMzIwWhcNMDIwNjI0 -MTYwMzIwWjCBkTELMAkGA1UEBhMCRUUxEzARBgNVBAgTClNvbWUtU3RhdGUxEDAO -BgNVBAcTB1RhbGxpbm4xJjAkBgNVBAoTHU15U1FMIGRlbW8gY2xpZW50IGNlcnRp -ZmljYXRlMRQwEgYDVQQDEwtUb251IFNhbXVlbDEdMBsGCSqGSIb3DQEJARYOdG9u -dUBteXNxbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOjUUs1Ou5YW -OvCJa5BM2+AwdVoCcmK/7dq+CeiA24BUMNZ17eMQpRVEWymREv4Mt3ZN6V9WXEU8 -rbJxLWp6y7wEgAh01n32fFx22zXE9vXY1Imfncw/Tj9zwT5Bfk4Jv+oa2aITDdEM -2tj0m7hUIReu17MCYYepAf/0/px6/GdDAgMBAAGjggERMIIBDTAJBgNVHRMEAjAA -MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd -BgNVHQ4EFgQUvPu7j8SFul+o8sM9yQ/bFucTvLIwgbIGA1UdIwSBqjCBp4AUpQrW -crXf5MIrewde001SB+GDa3+hgYukgYgwgYUxCzAJBgNVBAYTAkZJMRMwEQYDVQQI -EwpTb21lLVN0YXRlMREwDwYDVQQHEwhIZWxzaW5raTEZMBcGA1UEChMQTXlTUUwg -RmlubGFuZCBBQjEUMBIGA1UEAxMLVG9udSBTYW11ZWwxHTAbBgkqhkiG9w0BCQEW -DnRvbnVAbXlzcWwuY29tggEAMA0GCSqGSIb3DQEBBAUAA4GBABzghywvs6Q5RH+W -ey/JH5GEC5/QCvhAcNDdvZEKxtWsj1F3nDUo6LZfV55ctZuuXT18BUUuiToD4fIA -y8HtPkg7X05Q0rSlNg8a3HlJHgMvJ8HkYtbvP6suq93lvMsgo92rgWkmnANCG0y3 -qldtKt7AXm500IOQ7K27uvDMz0E9 +MIIDajCCAtOgAwIBAgIBAjANBgkqhkiG9w0BAQQFADB6MQswCQYDVQQGEwJSVTET +MBEGA1UECBMKU29tZS1TdGF0ZTERMA8GA1UEBxMIT3JlbmJ1cmcxETAPBgNVBAoT +CE15U1FMIEFCMQ8wDQYDVQQDEwZXYWxydXMxHzAdBgkqhkiG9w0BCQEWEHdhbHJ1 +c0BteXNxbC5jb20wHhcNMDIwODAyMjIwODA3WhcNMDMwODAyMjIwODA3WjB2MQsw +CQYDVQQGEwJSVTERMA8GA1UEBxMIb3JlbmJ1cmcxETAPBgNVBAoTCE15U1FMIEFC +MQ8wDQYDVQQLEwZjbGllbnQxDzANBgNVBAMTBndhbHJ1czEfMB0GCSqGSIb3DQEJ +ARYQd2FscnVzQG15c3FsLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA +qyfkHvA0i6lQ3wqwVSCzHw/P8VEeZkim+E4N1En06tNBa34GeDwpnY7TM00L/DRN +GIhIYa8R2tuEwJKRgWq2IdWOm/Jv2Aat1nf2i70H1bf7xvBk5j9Y8GoegXOXbZ3G +7LBeHsZXgrCYnK4mhEMNmGy02FITcBV5YUCEGer2Yz8CAwEAAaOCAQIwgf8wCQYD +VR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlm +aWNhdGUwHQYDVR0OBBYEFKbZcJKsK/ZIpfspz3hKV7U7Q5fuMIGkBgNVHSMEgZww +gZmAFNnYan2rzhBiGhb86Wr03PFmrNC5oX6kfDB6MQswCQYDVQQGEwJSVTETMBEG +A1UECBMKU29tZS1TdGF0ZTERMA8GA1UEBxMIT3JlbmJ1cmcxETAPBgNVBAoTCE15 +U1FMIEFCMQ8wDQYDVQQDEwZXYWxydXMxHzAdBgkqhkiG9w0BCQEWEHdhbHJ1c0Bt +eXNxbC5jb22CAQAwDQYJKoZIhvcNAQEEBQADgYEAFZZDEIngpoKkkQ9+LtiAVLpj +4o+wquq+NSyPDQOphi4yUTOKzLJesxLLt0IGQInOkodA8Wp5DD4AHQa/PMHa9jvh +QuZVTDHhuXnzmRT2aJ5nK+NxiGsr4gi9Z3nqDn00DUEiOvSPTVEHb1pENAXRs8rP +CStDJaF/rPRU8eOTR0Q= -----END CERTIFICATE----- diff --git a/SSL/client-key.pem b/SSL/client-key.pem index 7672939b60a..feff11bfdb7 100644 --- a/SSL/client-key.pem +++ b/SSL/client-key.pem @@ -1,15 +1,15 @@ -----BEGIN RSA PRIVATE KEY----- -MIICXgIBAAKBgQDo1FLNTruWFjrwiWuQTNvgMHVaAnJiv+3avgnogNuAVDDWde3j -EKUVRFspkRL+DLd2TelfVlxFPK2ycS1qesu8BIAIdNZ99nxcdts1xPb12NSJn53M -P04/c8E+QX5OCb/qGtmiEw3RDNrY9Ju4VCEXrtezAmGHqQH/9P6cevxnQwIDAQAB -AoGBANxd4cUaaOfkQILbvigE5vMpSlkYCcW3XNv1lJEwLREoHlVNpwuL/IPFf/c2 -rWAxDw/1LBYlOg36IXjMMC0g7mRHHoJhdJaFLGdlfclYQvqQ+8JAsAv6UNC63+pn -B5sZOxOuoj7lYN+D9mFVD4qTo3eTUYEOvvmS1j3hCsD2nNNBAkEA+lJUs7Y3KjCF -COZ7XQCkC47rVzkdZ5ey1Z+vVw5SrnUvj6n9i0NEax1jX6JPIhPU7+x90KFkt0ki -pKHd7UQ04wJBAO4caWNnYvmIorCRDy9Q/iAAow5WC6fQlkSlBIe3lRme6Ne8Yxaq -BzlSGYu1ndPkTGEa9PFNNCJm7RtvCBFx8iECQQCkdUzi2Rc7J69vnoV0H8SnN1mU -75hLBBZhVU1MY8OcjK8XsvY59ZLQ0PkFzswwtljS3Ev4suBJrsoM4a+9f29DAkEA -5NTrN3vZc6SrbXLLHBcDUrAqBBIPe4SLlYbdVqzInunILeS/eb2H2b+cC1dMSaHj -AYONmQUwMEuoXTAUmede4QJARK6jEslg/ev8BtMvITP2b6pRCb1w8lOtT5u5Bwnc -NpI3suqSQSQPtRSWQYcdyxrKr2TQEZU7h8R9bVB4b0qAmQ== +MIICXQIBAAKBgQCrJ+Qe8DSLqVDfCrBVILMfD8/xUR5mSKb4Tg3USfTq00FrfgZ4 +PCmdjtMzTQv8NE0YiEhhrxHa24TAkpGBarYh1Y6b8m/YBq3Wd/aLvQfVt/vG8GTm +P1jwah6Bc5dtncbssF4exleCsJicriaEQw2YbLTYUhNwFXlhQIQZ6vZjPwIDAQAB +AoGAChyxPaKzeAzo2kSnZmAoNQ2aG4fPY/um4cS6zHASKE2S7+biOvhS/RwTHlTP +AHeWlnx2yk6tn2CY10fRkPPdDsnyj7FpuZmjhmFtprOn+1Mwft7gNTMdKN2EV46/ +hMQxm8/Wu9ejm6IhOeg3Q7lBFwE9tY0kgMzU4zDI3A0HDQECQQDUcxFgxIrOi4Gw +EGxmJgopL+NjG7/4PdT2FM5z1bbwOtfsD1fHKWSiODbfpK8eMwBReI4wfDQ7ViND +xmuDykFDAkEAzj3QH9s8Ej3Vgt88326OhY1W5jTH6M0XkuZ0YatELz3MvLwFhIF4 +puouLJQVo3pQBLV+Tmnh2LQqkii7xA7oVQJBALZxzvW0M6QmyAvEPuMGPema94KQ +PS7ZIr7lpVpyqTTqw600i+Q8VvC8p9stmTmtANP2XN2kfFKMqaI1jvVRxvMCQDJE +8sOxBjVUCQS7MPUs12RKDRJTbx6ZTtOphFiCDD6Pi6W9FoMzo5rbnaGT/qo4F+Tt +7/lg6YGOeInjj9C76XkCQQC2m6j8NeX9E4Pimp1GDE93N2JJ+biJxLI8yFqruv7N +B2M/28JKLGLjam6YVJy4eSA9clXVqwWNxii3fb8qQ7u6 -----END RSA PRIVATE KEY----- diff --git a/SSL/server-cert.pem b/SSL/server-cert.pem index 069063a9de9..b15bd04a25c 100644 --- a/SSL/server-cert.pem +++ b/SSL/server-cert.pem @@ -1,26 +1,26 @@ Certificate: Data: Version: 3 (0x2) - Serial Number: 2 (0x2) + Serial Number: 1 (0x1) Signature Algorithm: md5WithRSAEncryption - Issuer: C=FI, ST=Some-State, L=Helsinki, O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu@mysql.com + Issuer: C=RU, ST=Some-State, L=Orenburg, O=MySQL AB, CN=Walrus/Email=walrus@mysql.com Validity - Not Before: Jun 24 16:02:28 2001 GMT - Not After : Jun 24 16:02:28 2002 GMT - Subject: C=EE, ST=Some-State, L=Tallinn, O=MySQL server demo certificate, CN=Tonu Samuel/Email=tonu@mysql.com + Not Before: Aug 2 21:59:26 2002 GMT + Not After : Aug 2 21:59:26 2003 GMT + Subject: C=RU, L=Orenburg, O=MySQL AB, CN=server/Email=walrus@mysql.com Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit) Modulus (1024 bit): - 00:9e:ac:8d:d8:1d:9c:b2:fd:88:96:2c:ba:42:53: - fa:5d:bd:85:8a:e5:ca:d3:0f:c0:01:3c:f2:92:46: - 4f:d9:80:ae:2a:89:cf:ef:e8:d4:65:fc:f6:f5:3a: - 26:4c:29:db:06:fa:34:a1:87:f3:97:b5:3c:94:f1: - 84:05:ac:ad:57:25:d9:02:db:00:71:e0:a9:aa:b4: - 1d:29:36:5e:a9:a4:0d:f2:45:b9:83:74:2b:45:f3: - e2:23:bc:e7:5c:e6:11:b6:f6:dd:c4:ac:ed:65:42: - 2c:39:47:2a:c9:eb:5f:45:03:10:ab:23:bc:ca:5c: - 82:9a:b7:b3:6d:67:18:d2:c7 + 00:bd:7d:f1:91:51:38:fe:4b:79:b5:ff:e0:41:ae: + 0e:a8:bb:7b:60:42:95:01:75:e7:22:74:55:7d:74: + 4d:50:51:0c:5e:09:4b:2b:0c:8e:3f:9f:14:3f:5e: + d9:25:36:9b:cc:77:35:30:e9:8c:bf:3b:bd:da:62: + 85:4c:90:c8:de:71:2c:0a:7b:dc:e6:85:fd:b4:24: + 88:a7:8f:03:3d:15:7c:59:3d:f8:73:f0:36:2a:b8: + 80:7c:d8:c7:d6:1f:6d:b2:b7:b7:48:9f:24:56:81: + 2c:2e:9c:b9:95:48:50:56:9f:1a:60:96:c4:c0:eb: + 8d:2d:55:38:3f:6b:82:bc:b3 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: @@ -28,40 +28,38 @@ Certificate: Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: - 94:68:BF:DA:F6:E2:09:EF:3A:C8:27:AE:D7:B7:02:F0:DC:4B:C1:3B + C9:D0:D2:F7:17:79:27:1C:4B:C9:E7:92:D5:5E:8C:7E:F2:FE:A7:B7 X509v3 Authority Key Identifier: - keyid:A5:0A:D6:72:B5:DF:E4:C2:2B:7B:07:5E:D3:4D:52:07:E1:83:6B:7F - DirName:/C=FI/ST=Some-State/L=Helsinki/O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@mysql.com + keyid:D9:D8:6A:7D:AB:CE:10:62:1A:16:FC:E9:6A:F4:DC:F1:66:AC:D0:B9 + DirName:/C=RU/ST=Some-State/L=Orenburg/O=MySQL AB/CN=Walrus/Email=walrus@mysql.com serial:00 Signature Algorithm: md5WithRSAEncryption - 8c:1a:90:70:f6:1a:70:0e:c9:28:93:74:e2:2b:b8:2a:d0:ce: - 40:15:e8:af:44:f8:89:16:20:f5:c2:b9:ed:aa:4e:3c:40:e2: - 9c:62:aa:48:98:ac:17:84:ef:35:72:59:43:09:35:17:c5:9a: - 3e:3d:ef:97:bf:57:f2:2a:f6:56:5d:a4:7c:68:58:b9:d6:9b: - 0f:57:0e:55:22:17:b0:b7:77:27:4f:da:b3:88:c1:6d:d6:8f: - 31:ec:0d:a2:25:60:66:2f:0f:86:8a:d6:08:b8:71:b1:b5:70: - 60:04:56:96:ff:bd:5e:ed:94:bc:44:bd:24:e0:2f:90:e5:23: - 51:4e + 62:77:bc:16:dc:4c:70:63:4d:03:ce:19:5e:c4:6c:31:0e:57: + 26:d8:6e:25:08:f2:01:ae:98:59:0a:ba:b7:32:c0:39:69:b8: + 4b:aa:59:7c:97:72:4e:50:02:ee:ef:d6:d6:62:b8:25:36:91: + b6:3b:8f:6f:2f:3c:d8:9d:b7:cf:8f:f6:29:50:e9:31:54:77: + 2b:7b:21:72:0f:60:4c:d4:1c:bb:c4:46:e5:fd:a7:5f:ea:46: + e4:df:e9:95:77:2d:91:f8:3b:33:78:83:5d:10:de:98:7c:38: + 91:27:f6:52:8a:b6:54:f1:0f:7a:f0:1d:da:a5:22:d2:75:cc: + 4c:c3 -----BEGIN CERTIFICATE----- -MIIDoTCCAwqgAwIBAgIBAjANBgkqhkiG9w0BAQQFADCBhTELMAkGA1UEBhMCRkkx -EzARBgNVBAgTClNvbWUtU3RhdGUxETAPBgNVBAcTCEhlbHNpbmtpMRkwFwYDVQQK -ExBNeVNRTCBGaW5sYW5kIEFCMRQwEgYDVQQDEwtUb251IFNhbXVlbDEdMBsGCSqG -SIb3DQEJARYOdG9udUBteXNxbC5jb20wHhcNMDEwNjI0MTYwMjI4WhcNMDIwNjI0 -MTYwMjI4WjCBkTELMAkGA1UEBhMCRUUxEzARBgNVBAgTClNvbWUtU3RhdGUxEDAO -BgNVBAcTB1RhbGxpbm4xJjAkBgNVBAoTHU15U1FMIHNlcnZlciBkZW1vIGNlcnRp -ZmljYXRlMRQwEgYDVQQDEwtUb251IFNhbXVlbDEdMBsGCSqGSIb3DQEJARYOdG9u -dUBteXNxbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJ6sjdgdnLL9 -iJYsukJT+l29hYrlytMPwAE88pJGT9mAriqJz+/o1GX89vU6Jkwp2wb6NKGH85e1 -PJTxhAWsrVcl2QLbAHHgqaq0HSk2XqmkDfJFuYN0K0Xz4iO851zmEbb23cSs7WVC -LDlHKsnrX0UDEKsjvMpcgpq3s21nGNLHAgMBAAGjggERMIIBDTAJBgNVHRMEAjAA -MCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAd -BgNVHQ4EFgQUlGi/2vbiCe86yCeu17cC8NxLwTswgbIGA1UdIwSBqjCBp4AUpQrW -crXf5MIrewde001SB+GDa3+hgYukgYgwgYUxCzAJBgNVBAYTAkZJMRMwEQYDVQQI -EwpTb21lLVN0YXRlMREwDwYDVQQHEwhIZWxzaW5raTEZMBcGA1UEChMQTXlTUUwg -RmlubGFuZCBBQjEUMBIGA1UEAxMLVG9udSBTYW11ZWwxHTAbBgkqhkiG9w0BCQEW -DnRvbnVAbXlzcWwuY29tggEAMA0GCSqGSIb3DQEBBAUAA4GBAIwakHD2GnAOySiT -dOIruCrQzkAV6K9E+IkWIPXCue2qTjxA4pxiqkiYrBeE7zVyWUMJNRfFmj4975e/ -V/Iq9lZdpHxoWLnWmw9XDlUiF7C3dydP2rOIwW3WjzHsDaIlYGYvD4aK1gi4cbG1 -cGAEVpb/vV7tlLxEvSTgL5DlI1FO +MIIDWTCCAsKgAwIBAgIBATANBgkqhkiG9w0BAQQFADB6MQswCQYDVQQGEwJSVTET +MBEGA1UECBMKU29tZS1TdGF0ZTERMA8GA1UEBxMIT3JlbmJ1cmcxETAPBgNVBAoT +CE15U1FMIEFCMQ8wDQYDVQQDEwZXYWxydXMxHzAdBgkqhkiG9w0BCQEWEHdhbHJ1 +c0BteXNxbC5jb20wHhcNMDIwODAyMjE1OTI2WhcNMDMwODAyMjE1OTI2WjBlMQsw +CQYDVQQGEwJSVTERMA8GA1UEBxMIT3JlbmJ1cmcxETAPBgNVBAoTCE15U1FMIEFC +MQ8wDQYDVQQDEwZzZXJ2ZXIxHzAdBgkqhkiG9w0BCQEWEHdhbHJ1c0BteXNxbC5j +b20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAL198ZFROP5LebX/4EGuDqi7 +e2BClQF15yJ0VX10TVBRDF4JSysMjj+fFD9e2SU2m8x3NTDpjL87vdpihUyQyN5x +LAp73OaF/bQkiKePAz0VfFk9+HPwNiq4gHzYx9YfbbK3t0ifJFaBLC6cuZVIUFaf +GmCWxMDrjS1VOD9rgryzAgMBAAGjggECMIH/MAkGA1UdEwQCMAAwLAYJYIZIAYb4 +QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBTJ +0NL3F3knHEvJ55LVXox+8v6ntzCBpAYDVR0jBIGcMIGZgBTZ2Gp9q84QYhoW/Olq +9NzxZqzQuaF+pHwwejELMAkGA1UEBhMCUlUxEzARBgNVBAgTClNvbWUtU3RhdGUx +ETAPBgNVBAcTCE9yZW5idXJnMREwDwYDVQQKEwhNeVNRTCBBQjEPMA0GA1UEAxMG +V2FscnVzMR8wHQYJKoZIhvcNAQkBFhB3YWxydXNAbXlzcWwuY29tggEAMA0GCSqG +SIb3DQEBBAUAA4GBAGJ3vBbcTHBjTQPOGV7EbDEOVybYbiUI8gGumFkKurcywDlp +uEuqWXyXck5QAu7v1tZiuCU2kbY7j28vPNidt8+P9ilQ6TFUdyt7IXIPYEzUHLvE +RuX9p1/qRuTf6ZV3LZH4OzN4g10Q3ph8OJEn9lKKtlTxD3rwHdqlItJ1zEzD -----END CERTIFICATE----- diff --git a/SSL/server-key.pem b/SSL/server-key.pem index 44137ca1c94..5afd717e07c 100644 --- a/SSL/server-key.pem +++ b/SSL/server-key.pem @@ -1,15 +1,15 @@ -----BEGIN RSA PRIVATE KEY----- -MIICXAIBAAKBgQCerI3YHZyy/YiWLLpCU/pdvYWK5crTD8ABPPKSRk/ZgK4qic/v -6NRl/Pb1OiZMKdsG+jShh/OXtTyU8YQFrK1XJdkC2wBx4KmqtB0pNl6ppA3yRbmD -dCtF8+IjvOdc5hG29t3ErO1lQiw5RyrJ619FAxCrI7zKXIKat7NtZxjSxwIDAQAB -AoGAA51gudyq1jUKaIlqUNqC6KHJqglkHnzMXfrad9ScOxNAZH2xPADs3cnuglWp -y7BkaftHOarUNM+PKsF5xXtSk5F9UUV+7h2FtPZYUshUgn5hkGZP12otxJMP0cpg -Yt6brQxuOIe/r/Kt5r3nKpp4pyFLX2fGWQq7pSjdkgSZSOECQQDJ9MgbCXd81yde -eo3+YmUPBEQ9d7mivQsyPHMOHLPJKR42N4npdR1zLDBYK5lFzJeQH1y0Uce3O8eL -hM8hkA1XAkEAySKvNTaosbLhShkRazQyQQJYJg0F/93lkQ33ou4crru7Mvi2OZK9 -B3BGAmNpSv6ZOZYjM0aE8lGlTaoYJ9GQEQJAGJDyFnfcVQ9G9rMpupv1dxIpyuBZ -cHZWelHoHPtY00txJV80I3Xfkzb42oDTMC5m8V0fRb/870kSSOJq38ZKGQJBAIgq -wxLzfiFPSNYxQmmhXKRGQgcAqh8eylv5aL0VFrX0wjcvya4QeYifqcXUJ2RuGK2z -xwDfrQGf5Jk/njrW1QECQAUofd1l9DLDifRP1j9sjUdwz0fvqQ0o6sbt39PBl1ot -IHdc3nf9z0ft+KOG1CT/M9jYo9SzE9Z6IfwmHxxpY0s= +MIICXAIBAAKBgQC9ffGRUTj+S3m1/+BBrg6ou3tgQpUBdecidFV9dE1QUQxeCUsr +DI4/nxQ/XtklNpvMdzUw6Yy/O73aYoVMkMjecSwKe9zmhf20JIinjwM9FXxZPfhz +8DYquIB82MfWH22yt7dInyRWgSwunLmVSFBWnxpglsTA640tVTg/a4K8swIDAQAB +AoGARciG2NRHn+aduPe1V5rJDTyWD/oVM8d+ykJ7ZUsaWdSvMEZN51mlXSqxYzED +2N+GesL/1LZ9vcM7hJw5qNu9DQOc7CtMT4k/bmhPJsT226roKKVbw/ocOEY5dK8+ +T9/x8qgo7zC3Qk/bKgjj61m8cQ7Mz/J7ZCEMmDNNrORCzRECQQDrcvJlsBTALilr +MaAqNyaa0tykEabzg2mUFx5uvmzlwNx9ApSidoU5Xop9c6u00zgCDpsDlcwjhOs1 +jcqRkBTrAkEAzggY7BeN3FnW8tsV0Wq4LL6vK30pe0JIylxrKsFjY4LTo9t/8TKK +6ZOEETVtM7sepIkxECw5RCBi9sxi3NClWQJAbrA5WKjw+HA7NJO98lq/IWYkKFXM +IQsUpXRA8FtBormKbpK6Aa6qbxANF3E7teTencj0Azl3IPOqCCFCrDAKRQJAc6bv +9ncyVqLHmgOJN8ikIdnYEp1rj5khqxY9wf5UgCOMEcrBAu/QMlVwKQjIh+VdyhaI +x/9LFgboBomsZS9p4QJBAIXaX/WoqL/wgBGS2UroianFFXL6/Bt//CUoGpYgKQYQ ++x+8heMRppmM0to2J7j9nGE83ikMWfPUwMi4TbyWH3Q= -----END RSA PRIVATE KEY----- diff --git a/heap/hp_create.c b/heap/hp_create.c index 99f4cb0146d..4163f5b0217 100644 --- a/heap/hp_create.c +++ b/heap/hp_create.c @@ -14,29 +14,156 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* - Create is done by simply remove the database from memory if it exists. - Open creates the database when neaded -*/ - #include "heapdef.h" -int heap_create(const char *name) +static int keys_compare(heap_rb_param *param, uchar *key1, uchar *key2); +static void init_block(HP_BLOCK *block,uint reclength,ulong min_records, + ulong max_records); + +int heap_create(const char *name, uint keys, HP_KEYDEF *keydef, + uint reclength, ulong max_records, ulong min_records) { - reg1 HP_SHARE *share; + uint i, j, key_segs, max_length, length; + HP_SHARE *share; + HA_KEYSEG *keyseg; + DBUG_ENTER("heap_create"); pthread_mutex_lock(&THR_LOCK_heap); - if ((share=hp_find_named_heap(name))) + + if ((share= hp_find_named_heap(name)) && share->open_count == 0) { - if (share->open_count == 0) - hp_free(share); + hp_free(share); + share= NULL; } - else + + if (!share) { - my_errno=ENOENT; + HP_KEYDEF *keyinfo; + DBUG_PRINT("info",("Initializing new table")); + for (i= key_segs= max_length= 0, keyinfo= keydef; i < keys; i++, keyinfo++) + { + bzero((char*) &keyinfo->block,sizeof(keyinfo->block)); + bzero((char*) &keyinfo->rb_tree ,sizeof(keyinfo->rb_tree)); + for (j= length= 0; j < keyinfo->keysegs; j++) + { + length+= keyinfo->seg[j].length; + if (keyinfo->seg[j].null_bit) + { + if (!(keyinfo->flag & HA_NULL_ARE_EQUAL)) + keyinfo->flag|= HA_NULL_PART_KEY; + if (keyinfo->algorithm == HA_KEY_ALG_BTREE) + keyinfo->rb_tree.size_of_element++; + } + } + keyinfo->length= length; + length+= keyinfo->rb_tree.size_of_element + + ((keyinfo->algorithm == HA_KEY_ALG_BTREE) ? sizeof(byte*) : 0); + if (length > max_length) + max_length= length; + key_segs+= keyinfo->keysegs; + if (keyinfo->algorithm == HA_KEY_ALG_BTREE) + { + key_segs++; /* additional HA_KEYTYPE_END segment */ + if (keyinfo->flag & HA_NULL_PART_KEY) + keyinfo->get_key_length= hp_rb_null_key_length; + else + keyinfo->get_key_length= hp_rb_key_length; + } + } + if (!(share= (HP_SHARE*) my_malloc((uint) sizeof(HP_SHARE)+ + keys*sizeof(HP_KEYDEF)+ + key_segs*sizeof(HA_KEYSEG), + MYF(MY_ZEROFILL)))) + { + pthread_mutex_unlock(&THR_LOCK_heap); + DBUG_RETURN(1); + } + share->keydef= (HP_KEYDEF*) (share + 1); + keyseg= (HA_KEYSEG*) (share->keydef + keys); + init_block(&share->block, reclength + 1, min_records, max_records); + /* Fix keys */ + memcpy(share->keydef, keydef, (size_t) (sizeof(keydef[0]) * keys)); + for (i= 0, keyinfo= share->keydef; i < keys; i++, keyinfo++) + { + uint nsegs= keydef[i].keysegs; + + if (keydef[i].algorithm == HA_KEY_ALG_BTREE) + { + init_tree(&keyinfo->rb_tree, 0, 0, sizeof(byte*), + (qsort_cmp2)keys_compare, 1, NULL, NULL); + keyinfo->delete_key= hp_rb_delete_key; + keyinfo->write_key= hp_rb_write_key; + nsegs++; + } + else + { + init_block(&keyinfo->block, sizeof(HASH_INFO), min_records, + max_records); + keyinfo->delete_key= hp_delete_key; + keyinfo->write_key= hp_write_key; + } + keyinfo->seg= keyseg; + memcpy(keyseg, keydef[i].seg, + (size_t) (sizeof(keyseg[0]) * nsegs)); + keyseg+= nsegs; + } + + share->min_records= min_records; + share->max_records= max_records; + share->data_length= share->index_length= 0; + share->reclength= reclength; + share->blength= 1; + share->keys= keys; + share->max_key_length= max_length; + share->changed= 0; + if (!(share->name= my_strdup(name,MYF(0)))) + { + my_free((gptr) share,MYF(0)); + pthread_mutex_unlock(&THR_LOCK_heap); + DBUG_RETURN(1); + } +#ifdef THREAD + thr_lock_init(&share->lock); + VOID(pthread_mutex_init(&share->intern_lock,MY_MUTEX_INIT_FAST)); +#endif + share->open_list.data= (void*) share; + heap_share_list= list_add(heap_share_list,&share->open_list); } pthread_mutex_unlock(&THR_LOCK_heap); DBUG_RETURN(0); +} /* heap_create */ + +static int keys_compare(heap_rb_param *param, uchar *key1, uchar *key2) +{ + uint not_used; + return ha_key_cmp(param->keyseg, key1, key2, param->key_length, + param->search_flag, ¬_used); +} + +static void init_block(HP_BLOCK *block, uint reclength, ulong min_records, + ulong max_records) +{ + uint i,recbuffer,records_in_block; + + max_records= max(min_records,max_records); + if (!max_records) + max_records= 1000; /* As good as quess as anything */ + recbuffer= (uint) (reclength + sizeof(byte**) - 1) & ~(sizeof(byte**) - 1); + records_in_block= max_records / 10; + if (records_in_block < 10 && max_records) + records_in_block= 10; + if (!records_in_block || records_in_block*recbuffer > + (my_default_record_cache_size-sizeof(HP_PTRS)*HP_MAX_LEVELS)) + records_in_block= (my_default_record_cache_size - sizeof(HP_PTRS) * + HP_MAX_LEVELS) / recbuffer + 1; + block->records_in_block= records_in_block; + block->recbuffer= recbuffer; + block->last_allocated= 0L; + + for (i= 0; i <= HP_MAX_LEVELS; i++) + block->level_info[i].records_under_level= + (!i ? 1 : i == 1 ? records_in_block : + HP_PTRS_IN_NOD * block->level_info[i - 1].records_under_level); } int heap_delete_table(const char *name) @@ -46,32 +173,31 @@ int heap_delete_table(const char *name) DBUG_ENTER("heap_delete_table"); pthread_mutex_lock(&THR_LOCK_heap); - if ((share = hp_find_named_heap(name))) + if ((share= hp_find_named_heap(name))) { if (share->open_count == 0) hp_free(share); else - share->delete_on_close=1; - result=0; + share->delete_on_close= 1; + result= 0; } else { - result=my_errno=ENOENT; + result= my_errno=ENOENT; } pthread_mutex_unlock(&THR_LOCK_heap); DBUG_RETURN(result); } - void hp_free(HP_SHARE *share) { - heap_share_list=list_delete(heap_share_list,&share->open_list); + heap_share_list= list_delete(heap_share_list, &share->open_list); hp_clear(share); /* Remove blocks from memory */ #ifdef THREAD thr_lock_delete(&share->lock); VOID(pthread_mutex_destroy(&share->intern_lock)); #endif - my_free((gptr) share->name,MYF(0)); - my_free((gptr) share,MYF(0)); + my_free((gptr) share->name, MYF(0)); + my_free((gptr) share, MYF(0)); return; } diff --git a/heap/hp_hash.c b/heap/hp_hash.c index 424322fd5e7..4f7dc956cba 100644 --- a/heap/hp_hash.c +++ b/heap/hp_hash.c @@ -217,11 +217,14 @@ ulong hp_hashnr(register HP_KEYDEF *keydef, register const byte *key) if (seg->charset->hash_sort) seg->charset->hash_sort(seg->charset,pos,((uchar*)key)-pos,&nr,&nr2); else - for (; pos < (uchar*) key ; pos++) { - nr^=(ulong) ((((uint) nr & 63)+nr2) * - ((uint) seg->charset->sort_order[(uint) *pos])) + (nr << 8); - nr2+=3; + register uchar *sort_order=seg->charset->sort_order; + for (; pos < (uchar*) key ; pos++) + { + nr^=(ulong) ((((uint) nr & 63)+nr2) * + ((uint) sort_order[(uint) *pos])) + (nr << 8); + nr2+=3; + } } } else @@ -260,11 +263,15 @@ ulong hp_rec_hashnr(register HP_KEYDEF *keydef, register const byte *rec) if (seg->charset->hash_sort) seg->charset->hash_sort(seg->charset,pos,end-pos,&nr,&nr2); else - for (; pos < end ; pos++) { - nr^=(ulong) ((((uint) nr & 63)+nr2)* - ((uint) seg->charset->sort_order[(uint) *pos]))+ (nr << 8); - nr2+=3; + register uchar *sort_order=seg->charset->sort_order; + + for (; pos < end ; pos++) + { + nr^=(ulong) ((((uint) nr & 63)+nr2)* + ((uint) sort_order[(uint) *pos]))+ (nr << 8); + nr2+=3; + } } } else diff --git a/heap/hp_open.c b/heap/hp_open.c index d48423c506a..1fa832208fb 100644 --- a/heap/hp_open.c +++ b/heap/hp_open.c @@ -23,130 +23,27 @@ #include "my_sys.h" -static int keys_compare(heap_rb_param *param, uchar *key1, uchar *key2) +HP_INFO *heap_open(const char *name, int mode) { - uint not_used; - return ha_key_cmp(param->keyseg, key1, key2, param->key_length, - param->search_flag, ¬_used); -} - -static void init_block(HP_BLOCK *block,uint reclength,ulong min_records, - ulong max_records); - - /* open a heap database. */ - -HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef, - uint reclength, ulong max_records, ulong min_records) -{ - uint i,j,key_segs,max_length,length; HP_INFO *info; HP_SHARE *share; - HA_KEYSEG *keyseg; DBUG_ENTER("heap_open"); - pthread_mutex_lock(&THR_LOCK_heap); - if (!(share = hp_find_named_heap(name))) + if (!(share= hp_find_named_heap(name))) { - HP_KEYDEF *keyinfo; - DBUG_PRINT("info",("Initializing new table")); - for (i=key_segs=max_length=0, keyinfo= keydef; i < keys; i++, keyinfo++) - { - bzero((char*) &keyinfo->block,sizeof(keyinfo->block)); - bzero((char*) &keyinfo->rb_tree ,sizeof(keyinfo->rb_tree)); - for (j=length=0 ; j < keyinfo->keysegs; j++) - { - length+=keyinfo->seg[j].length; - if (keyinfo->seg[j].null_bit) - { - if (!(keyinfo->flag & HA_NULL_ARE_EQUAL)) - keyinfo->flag |= HA_NULL_PART_KEY; - if (keyinfo->algorithm == HA_KEY_ALG_BTREE) - keyinfo->rb_tree.size_of_element++; - } - } - keyinfo->length= length; - length+= keyinfo->rb_tree.size_of_element + - ((keyinfo->algorithm == HA_KEY_ALG_BTREE) ? sizeof(byte*) : 0); - if (length > max_length) - max_length= length; - key_segs+= keyinfo->keysegs; - if (keyinfo->algorithm == HA_KEY_ALG_BTREE) - { - key_segs++; /* additional HA_KEYTYPE_END segment */ - if (keyinfo->flag & HA_NULL_PART_KEY) - keyinfo->get_key_length = hp_rb_null_key_length; - else - keyinfo->get_key_length = hp_rb_key_length; - } - } - if (!(share= (HP_SHARE*) my_malloc((uint) sizeof(HP_SHARE)+ - keys*sizeof(HP_KEYDEF)+ - key_segs*sizeof(HA_KEYSEG), - MYF(MY_ZEROFILL)))) - { - pthread_mutex_unlock(&THR_LOCK_heap); - DBUG_RETURN(0); - } - share->keydef= (HP_KEYDEF*) (share + 1); - keyseg= (HA_KEYSEG*) (share->keydef + keys); - init_block(&share->block, reclength + 1, min_records, max_records); - /* Fix keys */ - memcpy(share->keydef, keydef, (size_t) (sizeof(keydef[0]) * keys)); - for (i= 0, keyinfo= share->keydef; i < keys; i++, keyinfo++) - { - uint nsegs= keydef[i].keysegs; - - if (keydef[i].algorithm == HA_KEY_ALG_BTREE) - { - init_tree(&keyinfo->rb_tree, 0, 0, sizeof(byte*), - (qsort_cmp2)keys_compare, 1, NULL, NULL); - keyinfo->delete_key= hp_rb_delete_key; - keyinfo->write_key= hp_rb_write_key; - nsegs++; - } - else - { - init_block(&keyinfo->block, sizeof(HASH_INFO), min_records, - max_records); - keyinfo->delete_key= hp_delete_key; - keyinfo->write_key= hp_write_key; - } - keyinfo->seg= keyseg; - memcpy(keyseg, keydef[i].seg, - (size_t) (sizeof(keyseg[0]) * nsegs)); - keyseg+= nsegs; - } - - share->min_records= min_records; - share->max_records= max_records; - share->data_length= share->index_length= 0; - share->reclength= reclength; - share->blength= 1; - share->keys= keys; - share->max_key_length= max_length; - share->changed= 0; - if (!(share->name= my_strdup(name,MYF(0)))) - { - my_free((gptr) share,MYF(0)); - pthread_mutex_unlock(&THR_LOCK_heap); - DBUG_RETURN(0); - } -#ifdef THREAD - thr_lock_init(&share->lock); - VOID(pthread_mutex_init(&share->intern_lock,MY_MUTEX_INIT_FAST)); -#endif - share->open_list.data= (void*) share; - heap_share_list= list_add(heap_share_list,&share->open_list); + my_errno= ENOENT; + pthread_mutex_unlock(&THR_LOCK_heap); + DBUG_RETURN(0); } - if (!(info= (HP_INFO*) my_malloc((uint) sizeof(HP_INFO)+ + if (!(info= (HP_INFO*) my_malloc((uint) sizeof(HP_INFO) + 2 * share->max_key_length, MYF(MY_ZEROFILL)))) { pthread_mutex_unlock(&THR_LOCK_heap); DBUG_RETURN(0); } - share->open_count++; + share->open_count++; #ifdef THREAD thr_lock_data_init(&share->lock,&info->lock,NULL); #endif @@ -169,8 +66,7 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef, DBUG_PRINT("exit",("heap: %lx reclength: %d records_in_block: %d", info,share->reclength,share->block.records_in_block)); DBUG_RETURN(info); -} /* heap_open */ - +} /* map name to a heap-nr. If name isn't found return 0 */ @@ -181,41 +77,16 @@ HP_SHARE *hp_find_named_heap(const char *name) DBUG_ENTER("heap_find"); DBUG_PRINT("enter",("name: %s",name)); - for (pos=heap_share_list ; pos ; pos=pos->next) + for (pos= heap_share_list; pos; pos= pos->next) { - info=(HP_SHARE*) pos->data; - if (!strcmp(name,info->name)) + info= (HP_SHARE*) pos->data; + if (!strcmp(name, info->name)) { - DBUG_PRINT("exit",("Old heap_database: %lx",info)); + DBUG_PRINT("exit", ("Old heap_database: %lx",info)); DBUG_RETURN(info); } } - DBUG_RETURN((HP_SHARE *)0); + DBUG_RETURN((HP_SHARE *) 0); } -static void init_block(HP_BLOCK *block, uint reclength, ulong min_records, - ulong max_records) -{ - uint i,recbuffer,records_in_block; - - max_records=max(min_records,max_records); - if (!max_records) - max_records=1000; /* As good as quess as anything */ - recbuffer=(uint) (reclength+sizeof(byte**)-1) & ~(sizeof(byte**)-1); - records_in_block=max_records/10; - if (records_in_block < 10 && max_records) - records_in_block=10; - if (!records_in_block || records_in_block*recbuffer > - (my_default_record_cache_size-sizeof(HP_PTRS)*HP_MAX_LEVELS)) - records_in_block=(my_default_record_cache_size-sizeof(HP_PTRS)* - HP_MAX_LEVELS)/recbuffer+1; - block->records_in_block=records_in_block; - block->recbuffer=recbuffer; - block->last_allocated= 0L; - - for (i=0 ; i <= HP_MAX_LEVELS ; i++) - block->level_info[i].records_under_level= - (!i ? 1 : i == 1 ? records_in_block : - HP_PTRS_IN_NOD * block->level_info[i-1].records_under_level); -} diff --git a/heap/hp_rfirst.c b/heap/hp_rfirst.c index 39b0d4385f2..1668376ed1c 100644 --- a/heap/hp_rfirst.c +++ b/heap/hp_rfirst.c @@ -24,6 +24,7 @@ int heap_rfirst(HP_INFO *info, byte *record, int inx) HP_KEYDEF *keyinfo = share->keydef + inx; DBUG_ENTER("heap_rfirst"); + info->lastinx= inx; if (keyinfo->algorithm == HA_KEY_ALG_BTREE) { byte *pos; diff --git a/heap/hp_rlast.c b/heap/hp_rlast.c index e51a0e8a8f1..b1a49739108 100644 --- a/heap/hp_rlast.c +++ b/heap/hp_rlast.c @@ -25,6 +25,7 @@ int heap_rlast(HP_INFO *info, byte *record, int inx) HP_KEYDEF *keyinfo= share->keydef + inx; DBUG_ENTER("heap_rlast"); + info->lastinx= inx; if (keyinfo->algorithm == HA_KEY_ALG_BTREE) { byte *pos; diff --git a/heap/hp_test1.c b/heap/hp_test1.c index 79edfe2effc..58a13efc12f 100644 --- a/heap/hp_test1.c +++ b/heap/hp_test1.c @@ -44,17 +44,19 @@ int main(int argc, char **argv) keyinfo[0].keysegs=1; keyinfo[0].seg=keyseg; + keyinfo[0].algorithm= HA_KEY_ALG_HASH; keyinfo[0].seg[0].type=HA_KEYTYPE_BINARY; keyinfo[0].seg[0].start=1; keyinfo[0].seg[0].length=6; + keyinfo[0].seg[0].charset=default_charset_info; keyinfo[0].flag = HA_NOSAME; - + deleted=0; bzero((gptr) flags,sizeof(flags)); printf("- Creating heap-file\n"); - heap_create(filename); - if (!(file=heap_open(filename,2,1,keyinfo,30,(ulong) flag*100000l,10l))) + if (heap_create(filename,1,keyinfo,30,(ulong) flag*100000l,10l) || + !(file= heap_open(filename, 2))) goto err; printf("- Writing records:s\n"); strmov(record," ..... key "); @@ -77,7 +79,7 @@ int main(int argc, char **argv) if (heap_close(file)) goto err; printf("- Reopening file\n"); - if (!(file=heap_open(filename,2,1,keyinfo,30,(ulong) flag*100000l,10l))) + if (!(file=heap_open(filename, 2))) goto err; printf("- Removing records\n"); diff --git a/heap/hp_test2.c b/heap/hp_test2.c index a972e7073e0..3355c94727b 100644 --- a/heap/hp_test2.c +++ b/heap/hp_test2.c @@ -77,45 +77,53 @@ int main(int argc, char *argv[]) keyinfo[0].seg=keyseg; keyinfo[0].keysegs=1; keyinfo[0].flag= 0; + keyinfo[0].algorithm= HA_KEY_ALG_HASH; keyinfo[0].seg[0].type=HA_KEYTYPE_BINARY; keyinfo[0].seg[0].start=0; keyinfo[0].seg[0].length=6; keyinfo[0].seg[0].null_bit=0; + keyinfo[0].seg[0].charset=default_charset_info; keyinfo[1].seg=keyseg+1; keyinfo[1].keysegs=2; keyinfo[1].flag=0; + keyinfo[1].algorithm= HA_KEY_ALG_HASH; keyinfo[1].seg[0].type=HA_KEYTYPE_BINARY; keyinfo[1].seg[0].start=7; keyinfo[1].seg[0].length=6; keyinfo[1].seg[0].null_bit=0; + keyinfo[1].seg[0].charset=default_charset_info; keyinfo[1].seg[1].type=HA_KEYTYPE_TEXT; keyinfo[1].seg[1].start=0; /* key in two parts */ keyinfo[1].seg[1].length=6; keyinfo[1].seg[1].null_bit=0; + keyinfo[1].seg[1].charset=default_charset_info; keyinfo[2].seg=keyseg+3; keyinfo[2].keysegs=1; keyinfo[2].flag=HA_NOSAME; + keyinfo[2].algorithm= HA_KEY_ALG_HASH; keyinfo[2].seg[0].type=HA_KEYTYPE_BINARY; keyinfo[2].seg[0].start=12; keyinfo[2].seg[0].length=8; keyinfo[2].seg[0].null_bit=0; + keyinfo[2].seg[0].charset=default_charset_info; + keyinfo[3].seg=keyseg+4; keyinfo[3].keysegs=1; keyinfo[3].flag=HA_NOSAME; - keyinfo[3].seg=keyseg+4; + keyinfo[3].algorithm= HA_KEY_ALG_HASH; keyinfo[3].seg[0].type=HA_KEYTYPE_BINARY; keyinfo[3].seg[0].start=37; keyinfo[3].seg[0].length=1; keyinfo[3].seg[0].null_bit=1; keyinfo[3].seg[0].null_pos=38; + keyinfo[3].seg[0].charset=default_charset_info; bzero((char*) key1,sizeof(key1)); bzero((char*) key3,sizeof(key3)); printf("- Creating heap-file\n"); - if (heap_create(filename)) - goto err; - if (!(file=heap_open(filename,2,keys,keyinfo,reclength,(ulong) flag*100000L, - (ulong) recant/2))) + if (heap_create(filename,keys,keyinfo,reclength,(ulong) flag*100000L, + (ulong) recant/2) || + !(file= heap_open(filename, 2))) goto err; signal(SIGINT,endprog); @@ -530,7 +538,7 @@ int main(int argc, char *argv[]) if (testflag == 4) goto end; printf("- Reading through all rows through keys\n"); - if (!(file2=heap_open(filename,2,0,0,0,0,0))) + if (!(file2=heap_open(filename, 2))) goto err; if (heap_scan_init(file)) goto err; @@ -549,7 +557,8 @@ int main(int argc, char *argv[]) heap_close(file2); printf("- Creating output heap-file 2\n"); - if (!(file2=heap_open(filename2,2,1,keyinfo,reclength,0L,0L))) + if (heap_create(filename2,1,keyinfo,reclength,0L,0L) || + !(file2= heap_open(filename2, 2))) goto err; printf("- Copying and removing records\n"); diff --git a/include/Makefile.am b/include/Makefile.am index 85cd640a0a3..52a6d4fd758 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -29,7 +29,7 @@ noinst_HEADERS = config-win.h \ my_nosys.h my_alarm.h queues.h \ my_tree.h hash.h thr_alarm.h thr_lock.h \ t_ctype.h violite.h md5.h mysql_version.h.in \ - my_handler.h + my_handler.h my_getopt.h # mysql_version.h are generated SUPERCLEANFILES = mysql_version.h my_config.h diff --git a/include/getopt.h b/include/getopt.h deleted file mode 100644 index 94e73c03ff3..00000000000 --- a/include/getopt.h +++ /dev/null @@ -1,151 +0,0 @@ -/* Copyright (C) 2000 MySQL AB - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -/* Declarations for getopt. - Copyright (C) 1989, 90, 91, 92, 93, 94 Free Software Foundation, Inc. - -This file is part of the GNU C Library. Its master source is NOT part of -the C library, however. The master source lives in /gd/gnu/lib. - -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. - -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ - -#ifndef _GETOPT_H -#define _GETOPT_H 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -extern char *optarg; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns EOF, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -extern int optind; - -/* Callers store zero here to inhibit the error message `getopt' prints - for unrecognized options. */ - -extern int opterr; - -/* Set to an option character which was unrecognized. */ - -extern int optopt; - -/* Describe the long-named options requested by the application. - The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector - of `struct option' terminated by an element containing a name which is - zero. - - The field `has_arg' is: - no_argument (or 0) if the option does not take an argument, - required_argument (or 1) if the option requires an argument, - optional_argument (or 2) if the option takes an optional argument. - - If the field `flag' is not NULL, it points to a variable that is set - to the value given in the field `val' when the option is found, but - left unchanged if the option is not found. - - To have a long-named option do something other than set an `int' to - a compiled-in constant, such as set a value from `optarg', set the - option's `flag' field to zero and its `val' field to a nonzero - value (the equivalent single-letter option character, if there is - one). For long options that have a zero `flag' field, `getopt' - returns the contents of the `val' field. */ - -struct option -{ -#if defined (__STDC__) && __STDC__ || defined(__cplusplus) - const char *name; -#else - char *name; -#endif - /* has_arg can't be an enum because some compilers complain about - type mismatches in all the code that assumes it is an int. */ - int has_arg; - int *flag; - int val; -}; - -/* Names for the values of the `has_arg' field of `struct option'. */ - -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 - -#if ( defined (__STDC__) && __STDC__ ) || defined(__cplusplus) || defined(MSDOS) -#ifdef __EMX__ -int getopt (int, char **, __const__ char *); -#elif defined( __GNU_LIBRARY__) -/* Many other libraries have conflicting prototypes for getopt, with - differences in the consts, in stdlib.h. To avoid compilation - errors, only prototype getopt for the GNU C library. */ -extern int getopt (int argc, char *const *argv, const char *shortopts); -#else /* not __GNU_LIBRARY__ */ -extern int getopt (int argc, char *const *argv, const char *optstring); -#endif /* __GNU_LIBRARY__ */ -extern int getopt_long (int argc, char *const *argv, const char *shortopts, - const struct option *longopts, int *longind); -extern int getopt_long_only (int argc, char *const *argv, - const char *shortopts, - const struct option *longopts, int *longind); - -/* Internal only. Users should not call this directly. */ -extern int _getopt_internal (int argc, char *const *argv, - const char *shortopts, - const struct option *longopts, int *longind, - int long_only); -#else /* not __STDC__ */ -extern int getopt (); -extern int getopt_long (); -extern int getopt_long_only (); - -extern int _getopt_internal (); -#endif /* __STDC__ */ - -#ifdef __cplusplus -} -#endif - -#endif /* _GETOPT_H */ diff --git a/include/heap.h b/include/heap.h index 53757f51e73..359c4346a5d 100644 --- a/include/heap.h +++ b/include/heap.h @@ -142,9 +142,7 @@ typedef struct st_heap_info /* Prototypes for heap-functions */ -extern HP_INFO* heap_open(const char *name,int mode,uint keys, - HP_KEYDEF *keydef,uint reclength, - ulong max_records,ulong min_reloc); +extern HP_INFO *heap_open(const char *name, int mode); extern int heap_close(HP_INFO *info); extern int heap_write(HP_INFO *info,const byte *buff); extern int heap_update(HP_INFO *info,const byte *old,const byte *newdata); @@ -153,7 +151,8 @@ extern int heap_scan_init(HP_INFO *info); extern int heap_scan(register HP_INFO *info, byte *record); extern int heap_delete(HP_INFO *info,const byte *buff); extern int heap_info(HP_INFO *info,HEAPINFO *x,int flag); -extern int heap_create(const char *name); +extern int heap_create(const char *name, uint keys, HP_KEYDEF *keydef, + uint reclength, ulong max_records, ulong min_records); extern int heap_delete_table(const char *name); extern int heap_extra(HP_INFO *info,enum ha_extra_function function); extern int heap_rename(const char *old_name,const char *new_name); diff --git a/include/m_ctype.h b/include/m_ctype.h index 3715402b4f4..70acfcb3dec 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -42,6 +42,14 @@ typedef struct unicase_info_st { #define MY_CS_TOOSMALL -1 #define MY_CS_TOOFEW(n) (-1-(n)) + /* My charsets_list flags */ +#define MY_NO_SETS 0 +#define MY_CS_COMPILED 1 /* compiled-in sets */ +#define MY_CS_CONFIG 2 /* sets that have a *.conf file */ +#define MY_CS_INDEX 4 /* sets listed in the Index file */ +#define MY_CS_LOADED 8 /* sets that are currently loaded */ + + typedef struct my_uni_idx_st { uint16 from; uint16 to; @@ -52,14 +60,16 @@ typedef struct my_uni_idx_st { typedef struct charset_info_st { uint number; + uint state; const char *name; + const char *comment; uchar *ctype; uchar *to_lower; uchar *to_upper; uchar *sort_order; uint16 *tab_to_uni; MY_UNI_IDX *tab_from_uni; - + /* Collation routines */ uint strxfrm_multiply; int (*strnncoll)(struct charset_info_st *, @@ -107,6 +117,7 @@ extern CHARSET_INFO *system_charset_info; extern CHARSET_INFO *find_compiled_charset(uint cs_number); extern CHARSET_INFO *find_compiled_charset_by_name(const char *name); extern CHARSET_INFO compiled_charsets[]; +extern CHARSET_INFO all_charsets[256]; extern uint compiled_charset_number(const char *name); extern const char *compiled_charset_name(uint charset_number); diff --git a/include/my_sys.h b/include/my_sys.h index 54ed9110e95..ab7159a334b 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -105,13 +105,6 @@ extern int NEAR my_errno; /* Last error in mysys */ #define MY_SEEK_CUR 1 #define MY_SEEK_END 2 - /* My charsets_list flags */ -#define MY_NO_SETS 0 -#define MY_COMPILED_SETS 1 /* show compiled-in sets */ -#define MY_CONFIG_SETS 2 /* sets that have a *.conf file */ -#define MY_INDEX_SETS 4 /* all sets listed in the Index file */ -#define MY_LOADED_SETS 8 /* the sets that are currently loaded */ - /* Some constants */ #define MY_WAIT_FOR_USER_TO_FIX_PANIC 60 /* in seconds */ #define MY_WAIT_GIVE_USER_A_MESSAGE 10 /* Every 10 times of prev */ diff --git a/include/sslopt-case.h b/include/sslopt-case.h index e6e3a416bb0..d2799118973 100644 --- a/include/sslopt-case.h +++ b/include/sslopt-case.h @@ -22,25 +22,27 @@ opt_use_ssl = 1; /* true */ //QQ to be removed??? my_free(opt_ssl_key, MYF(MY_ALLOW_ZERO_PTR)); //QQ to be removed??? opt_ssl_key = my_strdup(optarg, MYF(0)); + my_free(opt_ssl_key, MYF(MY_ALLOW_ZERO_PTR)); + opt_ssl_key = my_strdup(argument, MYF(0)); break; case OPT_SSL_CERT: opt_use_ssl = 1; /* true */ my_free(opt_ssl_cert, MYF(MY_ALLOW_ZERO_PTR)); - opt_ssl_cert = my_strdup(optarg, MYF(0)); + opt_ssl_cert = my_strdup(argument, MYF(0)); break; case OPT_SSL_CA: opt_use_ssl = 1; /* true */ my_free(opt_ssl_ca, MYF(MY_ALLOW_ZERO_PTR)); - opt_ssl_ca = my_strdup(optarg, MYF(0)); + opt_ssl_ca = my_strdup(argument, MYF(0)); break; case OPT_SSL_CAPATH: opt_use_ssl = 1; /* true */ my_free(opt_ssl_capath, MYF(MY_ALLOW_ZERO_PTR)); - opt_ssl_capath = my_strdup(optarg, MYF(0)); + opt_ssl_capath = my_strdup(argument, MYF(0)); break; case OPT_SSL_CIPHER: opt_use_ssl = 1; /* true */ my_free(opt_ssl_cipher, MYF(MY_ALLOW_ZERO_PTR)); - opt_ssl_cipher = my_strdup(optarg, MYF(0)); + opt_ssl_cipher = my_strdup(argument, MYF(0)); break; #endif diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc index 1ef84607155..3616f1a44ca 100644 --- a/libmysqld/lib_sql.cc +++ b/libmysqld/lib_sql.cc @@ -413,7 +413,7 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups) mysql_server_end(); return 1; } - charsets_list = list_charsets(MYF(MY_COMPILED_SETS|MY_CONFIG_SETS)); + charsets_list = list_charsets(MYF(MY_CS_COMPILED|MY_CS_CONFIG)); /* Parameter for threads created for connections */ (void) pthread_attr_init(&connection_attrib); diff --git a/mysql-test/r/create.result b/mysql-test/r/create.result index c3438ae211a..f9a3ef487f0 100644 --- a/mysql-test/r/create.result +++ b/mysql-test/r/create.result @@ -94,6 +94,24 @@ d date 0000-00-00 t time 00:00:00 dt datetime 0000-00-00 00:00:00 drop table t1,t2; +create table t1 (a tinyint); +create table t2 (a int) select * from t1; +describe t1; +Field Type Null Key Default Extra +a tinyint(4) YES NULL +describe t2; +Field Type Null Key Default Extra +a int(11) YES NULL +drop table if exists t2; +create table t2 (a int, a float) select * from t1; +Duplicate column name 'a' +drop table if exists t2; +create table t2 (a int) select a as b, a+1 as b from t1; +Duplicate column name 'b' +drop table if exists t2; +create table t2 (b int) select a as b, a+1 as b from t1; +Duplicate column name 'b' +drop table if exists t1,t2; create table t1 (a int not null, b int, primary key(a), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b), key (b)); show create table t1; Table Create Table diff --git a/mysql-test/r/ctype_many.result b/mysql-test/r/ctype_many.result index b6c0f25853d..ddc3989282b 100644 --- a/mysql-test/r/ctype_many.result +++ b/mysql-test/r/ctype_many.result @@ -157,6 +157,65 @@ INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ø','CYR CAPIT SOFT SIGN'); INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ü','CYR CAPIT E'); INSERT INTO t1 (koi8_ru_f,comment) VALUES ('à','CYR CAPIT YU'); INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ñ','CYR CAPIT YA'); +SELECT CONVERT(koi8_ru_f USING utf8),MIN(comment),COUNT(*) FROM t1 GROUP BY 1; +CONVERT(koi8_ru_f USING utf8) MIN(comment) COUNT(*) +a LAT CAPIT A 2 +b LAT CAPIT B 2 +c LAT CAPIT C 2 +d LAT CAPIT D 2 +e LAT CAPIT E 2 +f LAT CAPIT F 2 +g LAT CAPIT G 2 +h LAT CAPIT H 2 +i LAT CAPIT I 2 +j LAT CAPIT J 2 +k LAT CAPIT K 2 +l LAT CAPIT L 2 +m LAT CAPIT M 2 +n LAT CAPIT N 2 +o LAT CAPIT O 2 +p LAT CAPIT P 2 +q LAT CAPIT Q 2 +r LAT CAPIT R 2 +s LAT CAPIT S 2 +t LAT CAPIT T 2 +u LAT CAPIT U 2 +v LAT CAPIT V 2 +w LAT CAPIT W 2 +x LAT CAPIT X 2 +y LAT CAPIT Y 2 +z LAT CAPIT Z 2 +а CYR CAPIT A 2 +б CYR CAPIT BE 2 +в CYR CAPIT VE 2 +г CYR CAPIT GE 2 +д CYR CAPIT DE 2 +е CYR CAPIT IE 4 +ж CYR CAPIT ZHE 2 +з CYR CAPIT ZE 2 +и CYR CAPIT I 2 +к CYR CAPIT KA 2 +л CYR CAPIT EL 2 +м CYR CAPIT EM 2 +н CYR CAPIT EN 2 +о CYR CAPIT O 2 +п CYR CAPIT PE 2 +Ñ€ CYR CAPIT ER 2 +Ñ CYR CAPIT ES 2 +Ñ‚ CYR CAPIT TE 2 +у CYR CAPIT U 2 +Ñ„ CYR CAPIT EF 2 +Ñ… CYR CAPIT HA 2 +ц CYR CAPIT TSE 2 +ч CYR CAPIT CHE 2 +ш CYR CAPIT SHA 2 +щ CYR CAPIT SCHA 2 +ÑŠ CYR CAPIT HARD SIGN 2 +Ñ‹ CYR CAPIT YERU 2 +ÑŒ CYR CAPIT SOFT SIGN 2 +Ñ CYR CAPIT E 2 +ÑŽ CYR CAPIT YU 2 +Ñ CYR CAPIT YA 2 ALTER TABLE t1 ADD utf8_f CHAR(32) CHARACTER SET utf8 NOT NULL; UPDATE t1 SET utf8_f=CONVERT(koi8_ru_f USING utf8); SELECT * FROM t1; @@ -753,485 +812,485 @@ a a SELECT t11.comment,t12.comment FROM t1 t11,t1 t12 WHERE CONVERT(t11.koi8_ru_f USING utf8)=t12.utf8_f -ORDER BY t11.koi8_ru_f; +ORDER BY t11.koi8_ru_f,t11.comment,t12.comment; comment comment -LAT SMALL A LAT SMALL A -LAT SMALL A LAT CAPIT A -LAT CAPIT A LAT SMALL A LAT CAPIT A LAT CAPIT A -LAT SMALL B LAT CAPIT B -LAT CAPIT B LAT SMALL B +LAT CAPIT A LAT SMALL A +LAT SMALL A LAT CAPIT A +LAT SMALL A LAT SMALL A LAT CAPIT B LAT CAPIT B +LAT CAPIT B LAT SMALL B +LAT SMALL B LAT CAPIT B LAT SMALL B LAT SMALL B -LAT CAPIT C LAT SMALL C LAT CAPIT C LAT CAPIT C -LAT SMALL C LAT SMALL C +LAT CAPIT C LAT SMALL C LAT SMALL C LAT CAPIT C +LAT SMALL C LAT SMALL C LAT CAPIT D LAT CAPIT D -LAT SMALL D LAT SMALL D -LAT SMALL D LAT CAPIT D LAT CAPIT D LAT SMALL D -LAT SMALL E LAT SMALL E -LAT SMALL E LAT CAPIT E -LAT CAPIT E LAT SMALL E +LAT SMALL D LAT CAPIT D +LAT SMALL D LAT SMALL D LAT CAPIT E LAT CAPIT E -LAT SMALL F LAT SMALL F -LAT SMALL F LAT CAPIT F -LAT CAPIT F LAT SMALL F +LAT CAPIT E LAT SMALL E +LAT SMALL E LAT CAPIT E +LAT SMALL E LAT SMALL E LAT CAPIT F LAT CAPIT F -LAT SMALL G LAT CAPIT G -LAT CAPIT G LAT SMALL G +LAT CAPIT F LAT SMALL F +LAT SMALL F LAT CAPIT F +LAT SMALL F LAT SMALL F LAT CAPIT G LAT CAPIT G +LAT CAPIT G LAT SMALL G +LAT SMALL G LAT CAPIT G LAT SMALL G LAT SMALL G LAT CAPIT H LAT CAPIT H -LAT SMALL H LAT SMALL H -LAT SMALL H LAT CAPIT H LAT CAPIT H LAT SMALL H +LAT SMALL H LAT CAPIT H +LAT SMALL H LAT SMALL H LAT CAPIT I LAT CAPIT I -LAT SMALL I LAT SMALL I -LAT SMALL I LAT CAPIT I LAT CAPIT I LAT SMALL I -LAT SMALL J LAT SMALL J -LAT SMALL J LAT CAPIT J -LAT CAPIT J LAT SMALL J +LAT SMALL I LAT CAPIT I +LAT SMALL I LAT SMALL I LAT CAPIT J LAT CAPIT J -LAT SMALL K LAT CAPIT K -LAT CAPIT K LAT SMALL K +LAT CAPIT J LAT SMALL J +LAT SMALL J LAT CAPIT J +LAT SMALL J LAT SMALL J LAT CAPIT K LAT CAPIT K +LAT CAPIT K LAT SMALL K +LAT SMALL K LAT CAPIT K LAT SMALL K LAT SMALL K -LAT SMALL L LAT CAPIT L -LAT CAPIT L LAT SMALL L LAT CAPIT L LAT CAPIT L +LAT CAPIT L LAT SMALL L +LAT SMALL L LAT CAPIT L LAT SMALL L LAT SMALL L LAT CAPIT M LAT CAPIT M -LAT SMALL M LAT SMALL M -LAT SMALL M LAT CAPIT M LAT CAPIT M LAT SMALL M -LAT SMALL N LAT SMALL N -LAT SMALL N LAT CAPIT N -LAT CAPIT N LAT SMALL N +LAT SMALL M LAT CAPIT M +LAT SMALL M LAT SMALL M LAT CAPIT N LAT CAPIT N -LAT SMALL O LAT SMALL O -LAT SMALL O LAT CAPIT O -LAT CAPIT O LAT SMALL O +LAT CAPIT N LAT SMALL N +LAT SMALL N LAT CAPIT N +LAT SMALL N LAT SMALL N LAT CAPIT O LAT CAPIT O -LAT SMALL P LAT CAPIT P -LAT CAPIT P LAT SMALL P +LAT CAPIT O LAT SMALL O +LAT SMALL O LAT CAPIT O +LAT SMALL O LAT SMALL O LAT CAPIT P LAT CAPIT P +LAT CAPIT P LAT SMALL P +LAT SMALL P LAT CAPIT P LAT SMALL P LAT SMALL P -LAT CAPIT Q LAT SMALL Q LAT CAPIT Q LAT CAPIT Q -LAT SMALL Q LAT SMALL Q +LAT CAPIT Q LAT SMALL Q LAT SMALL Q LAT CAPIT Q +LAT SMALL Q LAT SMALL Q LAT CAPIT R LAT CAPIT R -LAT SMALL R LAT SMALL R -LAT SMALL R LAT CAPIT R LAT CAPIT R LAT SMALL R -LAT SMALL S LAT SMALL S -LAT SMALL S LAT CAPIT S -LAT CAPIT S LAT SMALL S +LAT SMALL R LAT CAPIT R +LAT SMALL R LAT SMALL R LAT CAPIT S LAT CAPIT S -LAT SMALL T LAT CAPIT T -LAT CAPIT T LAT SMALL T +LAT CAPIT S LAT SMALL S +LAT SMALL S LAT CAPIT S +LAT SMALL S LAT SMALL S LAT CAPIT T LAT CAPIT T +LAT CAPIT T LAT SMALL T +LAT SMALL T LAT CAPIT T LAT SMALL T LAT SMALL T -LAT SMALL U LAT CAPIT U -LAT CAPIT U LAT SMALL U LAT CAPIT U LAT CAPIT U +LAT CAPIT U LAT SMALL U +LAT SMALL U LAT CAPIT U LAT SMALL U LAT SMALL U LAT CAPIT V LAT CAPIT V -LAT SMALL V LAT SMALL V -LAT SMALL V LAT CAPIT V LAT CAPIT V LAT SMALL V +LAT SMALL V LAT CAPIT V +LAT SMALL V LAT SMALL V LAT CAPIT W LAT CAPIT W -LAT SMALL W LAT SMALL W -LAT SMALL W LAT CAPIT W LAT CAPIT W LAT SMALL W -LAT SMALL X LAT SMALL X -LAT SMALL X LAT CAPIT X -LAT CAPIT X LAT SMALL X +LAT SMALL W LAT CAPIT W +LAT SMALL W LAT SMALL W LAT CAPIT X LAT CAPIT X -LAT SMALL Y LAT CAPIT Y -LAT CAPIT Y LAT SMALL Y +LAT CAPIT X LAT SMALL X +LAT SMALL X LAT CAPIT X +LAT SMALL X LAT SMALL X LAT CAPIT Y LAT CAPIT Y +LAT CAPIT Y LAT SMALL Y +LAT SMALL Y LAT CAPIT Y LAT SMALL Y LAT SMALL Y -LAT CAPIT Z LAT SMALL Z LAT CAPIT Z LAT CAPIT Z -LAT SMALL Z LAT SMALL Z +LAT CAPIT Z LAT SMALL Z LAT SMALL Z LAT CAPIT Z +LAT SMALL Z LAT SMALL Z +CYR CAPIT A CYR CAPIT A CYR CAPIT A CYR SMALL A CYR SMALL A CYR CAPIT A -CYR CAPIT A CYR CAPIT A CYR SMALL A CYR SMALL A -CYR SMALL BE CYR CAPIT BE CYR CAPIT BE CYR CAPIT BE -CYR SMALL BE CYR SMALL BE CYR CAPIT BE CYR SMALL BE +CYR SMALL BE CYR CAPIT BE +CYR SMALL BE CYR SMALL BE CYR CAPIT VE CYR CAPIT VE -CYR SMALL VE CYR SMALL VE CYR CAPIT VE CYR SMALL VE CYR SMALL VE CYR CAPIT VE +CYR SMALL VE CYR SMALL VE CYR CAPIT GE CYR CAPIT GE -CYR SMALL GE CYR SMALL GE CYR CAPIT GE CYR SMALL GE CYR SMALL GE CYR CAPIT GE +CYR SMALL GE CYR SMALL GE +CYR CAPIT DE CYR CAPIT DE CYR CAPIT DE CYR SMALL DE CYR SMALL DE CYR CAPIT DE -CYR CAPIT DE CYR CAPIT DE CYR SMALL DE CYR SMALL DE -CYR SMALL IE CYR SMALL IO -CYR SMALL IE CYR CAPIT IE -CYR CAPIT IE CYR SMALL IE +CYR CAPIT IE CYR CAPIT IE CYR CAPIT IE CYR CAPIT IO -CYR SMALL IE CYR SMALL IE -CYR SMALL IE CYR CAPIT IO +CYR CAPIT IE CYR SMALL IE CYR CAPIT IE CYR SMALL IO -CYR CAPIT IE CYR CAPIT IE -CYR SMALL IO CYR SMALL IE -CYR SMALL IO CYR CAPIT IO -CYR CAPIT IO CYR SMALL IO +CYR SMALL IE CYR CAPIT IE +CYR SMALL IE CYR CAPIT IO +CYR SMALL IE CYR SMALL IE +CYR SMALL IE CYR SMALL IO CYR CAPIT IO CYR CAPIT IE -CYR SMALL IO CYR SMALL IO -CYR SMALL IO CYR CAPIT IE -CYR CAPIT IO CYR SMALL IE CYR CAPIT IO CYR CAPIT IO +CYR CAPIT IO CYR SMALL IE +CYR CAPIT IO CYR SMALL IO +CYR SMALL IO CYR CAPIT IE +CYR SMALL IO CYR CAPIT IO +CYR SMALL IO CYR SMALL IE +CYR SMALL IO CYR SMALL IO +CYR CAPIT ZHE CYR CAPIT ZHE CYR CAPIT ZHE CYR SMALL ZHE CYR SMALL ZHE CYR CAPIT ZHE -CYR CAPIT ZHE CYR CAPIT ZHE CYR SMALL ZHE CYR SMALL ZHE -CYR SMALL ZE CYR CAPIT ZE CYR CAPIT ZE CYR CAPIT ZE -CYR SMALL ZE CYR SMALL ZE CYR CAPIT ZE CYR SMALL ZE +CYR SMALL ZE CYR CAPIT ZE +CYR SMALL ZE CYR SMALL ZE CYR CAPIT I CYR CAPIT I -CYR SMALL I CYR SMALL I CYR CAPIT I CYR SMALL I CYR SMALL I CYR CAPIT I +CYR SMALL I CYR SMALL I CYR CAPIT KA CYR CAPIT KA -CYR SMALL KA CYR SMALL KA CYR CAPIT KA CYR SMALL KA CYR SMALL KA CYR CAPIT KA +CYR SMALL KA CYR SMALL KA +CYR CAPIT EL CYR CAPIT EL CYR CAPIT EL CYR SMALL EL CYR SMALL EL CYR CAPIT EL -CYR CAPIT EL CYR CAPIT EL CYR SMALL EL CYR SMALL EL +CYR CAPIT EM CYR CAPIT EM CYR CAPIT EM CYR SMALL EM CYR SMALL EM CYR CAPIT EM -CYR CAPIT EM CYR CAPIT EM CYR SMALL EM CYR SMALL EM -CYR SMALL EN CYR CAPIT EN CYR CAPIT EN CYR CAPIT EN -CYR SMALL EN CYR SMALL EN CYR CAPIT EN CYR SMALL EN +CYR SMALL EN CYR CAPIT EN +CYR SMALL EN CYR SMALL EN CYR CAPIT O CYR CAPIT O -CYR SMALL O CYR SMALL O CYR CAPIT O CYR SMALL O CYR SMALL O CYR CAPIT O -CYR SMALL PE CYR SMALL PE +CYR SMALL O CYR SMALL O +CYR CAPIT PE CYR CAPIT PE CYR CAPIT PE CYR SMALL PE CYR SMALL PE CYR CAPIT PE -CYR CAPIT PE CYR CAPIT PE +CYR SMALL PE CYR SMALL PE +CYR CAPIT ER CYR CAPIT ER CYR CAPIT ER CYR SMALL ER CYR SMALL ER CYR CAPIT ER -CYR CAPIT ER CYR CAPIT ER CYR SMALL ER CYR SMALL ER -CYR SMALL ES CYR CAPIT ES CYR CAPIT ES CYR CAPIT ES -CYR SMALL ES CYR SMALL ES CYR CAPIT ES CYR SMALL ES +CYR SMALL ES CYR CAPIT ES +CYR SMALL ES CYR SMALL ES CYR CAPIT TE CYR CAPIT TE -CYR SMALL TE CYR SMALL TE CYR CAPIT TE CYR SMALL TE CYR SMALL TE CYR CAPIT TE +CYR SMALL TE CYR SMALL TE CYR CAPIT U CYR CAPIT U -CYR SMALL U CYR SMALL U CYR CAPIT U CYR SMALL U CYR SMALL U CYR CAPIT U +CYR SMALL U CYR SMALL U +CYR CAPIT EF CYR CAPIT EF CYR CAPIT EF CYR SMALL EF CYR SMALL EF CYR CAPIT EF -CYR CAPIT EF CYR CAPIT EF CYR SMALL EF CYR SMALL EF +CYR CAPIT HA CYR CAPIT HA CYR CAPIT HA CYR SMALL HA CYR SMALL HA CYR CAPIT HA -CYR CAPIT HA CYR CAPIT HA CYR SMALL HA CYR SMALL HA -CYR SMALL TSE CYR CAPIT TSE CYR CAPIT TSE CYR CAPIT TSE -CYR SMALL TSE CYR SMALL TSE CYR CAPIT TSE CYR SMALL TSE +CYR SMALL TSE CYR CAPIT TSE +CYR SMALL TSE CYR SMALL TSE CYR CAPIT CHE CYR CAPIT CHE -CYR SMALL CHE CYR SMALL CHE CYR CAPIT CHE CYR SMALL CHE CYR SMALL CHE CYR CAPIT CHE +CYR SMALL CHE CYR SMALL CHE CYR CAPIT SHA CYR CAPIT SHA -CYR SMALL SHA CYR SMALL SHA CYR CAPIT SHA CYR SMALL SHA CYR SMALL SHA CYR CAPIT SHA +CYR SMALL SHA CYR SMALL SHA +CYR CAPIT SCHA CYR CAPIT SCHA CYR CAPIT SCHA CYR SMALL SCHA CYR SMALL SCHA CYR CAPIT SCHA -CYR CAPIT SCHA CYR CAPIT SCHA CYR SMALL SCHA CYR SMALL SCHA +CYR CAPIT HARD SIGN CYR CAPIT HARD SIGN CYR CAPIT HARD SIGN CYR SMALL HARD SIGN CYR SMALL HARD SIGN CYR CAPIT HARD SIGN -CYR CAPIT HARD SIGN CYR CAPIT HARD SIGN CYR SMALL HARD SIGN CYR SMALL HARD SIGN CYR CAPIT YERU CYR CAPIT YERU -CYR SMALL YERU CYR SMALL YERU CYR CAPIT YERU CYR SMALL YERU CYR SMALL YERU CYR CAPIT YERU +CYR SMALL YERU CYR SMALL YERU CYR CAPIT SOFT SIGN CYR CAPIT SOFT SIGN -CYR SMALL SOFT SIGN CYR SMALL SOFT SIGN CYR CAPIT SOFT SIGN CYR SMALL SOFT SIGN CYR SMALL SOFT SIGN CYR CAPIT SOFT SIGN +CYR SMALL SOFT SIGN CYR SMALL SOFT SIGN +CYR CAPIT E CYR CAPIT E CYR CAPIT E CYR SMALL E CYR SMALL E CYR CAPIT E -CYR CAPIT E CYR CAPIT E CYR SMALL E CYR SMALL E +CYR CAPIT YU CYR CAPIT YU CYR CAPIT YU CYR SMALL YU CYR SMALL YU CYR CAPIT YU -CYR CAPIT YU CYR CAPIT YU CYR SMALL YU CYR SMALL YU -CYR SMALL YA CYR CAPIT YA CYR CAPIT YA CYR CAPIT YA -CYR SMALL YA CYR SMALL YA CYR CAPIT YA CYR SMALL YA +CYR SMALL YA CYR CAPIT YA +CYR SMALL YA CYR SMALL YA SELECT t11.comment,t12.comment FROM t1 t11,t1 t12 WHERE t11.koi8_ru_f=CONVERT(t12.utf8_f USING koi8_ru) -ORDER BY t12.utf8_f; +ORDER BY t12.utf8_f,t11.comment,t12.comment; comment comment -LAT SMALL A LAT SMALL A -LAT SMALL A LAT CAPIT A -LAT CAPIT A LAT SMALL A LAT CAPIT A LAT CAPIT A -LAT SMALL B LAT CAPIT B -LAT CAPIT B LAT SMALL B +LAT CAPIT A LAT SMALL A +LAT SMALL A LAT CAPIT A +LAT SMALL A LAT SMALL A LAT CAPIT B LAT CAPIT B +LAT CAPIT B LAT SMALL B +LAT SMALL B LAT CAPIT B LAT SMALL B LAT SMALL B -LAT CAPIT C LAT SMALL C LAT CAPIT C LAT CAPIT C -LAT SMALL C LAT SMALL C +LAT CAPIT C LAT SMALL C LAT SMALL C LAT CAPIT C +LAT SMALL C LAT SMALL C LAT CAPIT D LAT CAPIT D -LAT SMALL D LAT SMALL D -LAT SMALL D LAT CAPIT D LAT CAPIT D LAT SMALL D -LAT SMALL E LAT SMALL E -LAT SMALL E LAT CAPIT E -LAT CAPIT E LAT SMALL E +LAT SMALL D LAT CAPIT D +LAT SMALL D LAT SMALL D LAT CAPIT E LAT CAPIT E -LAT SMALL F LAT SMALL F -LAT SMALL F LAT CAPIT F -LAT CAPIT F LAT SMALL F +LAT CAPIT E LAT SMALL E +LAT SMALL E LAT CAPIT E +LAT SMALL E LAT SMALL E LAT CAPIT F LAT CAPIT F -LAT SMALL G LAT CAPIT G -LAT CAPIT G LAT SMALL G +LAT CAPIT F LAT SMALL F +LAT SMALL F LAT CAPIT F +LAT SMALL F LAT SMALL F LAT CAPIT G LAT CAPIT G +LAT CAPIT G LAT SMALL G +LAT SMALL G LAT CAPIT G LAT SMALL G LAT SMALL G LAT CAPIT H LAT CAPIT H -LAT SMALL H LAT SMALL H -LAT SMALL H LAT CAPIT H LAT CAPIT H LAT SMALL H +LAT SMALL H LAT CAPIT H +LAT SMALL H LAT SMALL H LAT CAPIT I LAT CAPIT I -LAT SMALL I LAT SMALL I -LAT SMALL I LAT CAPIT I LAT CAPIT I LAT SMALL I -LAT SMALL J LAT SMALL J -LAT SMALL J LAT CAPIT J -LAT CAPIT J LAT SMALL J +LAT SMALL I LAT CAPIT I +LAT SMALL I LAT SMALL I LAT CAPIT J LAT CAPIT J -LAT SMALL K LAT CAPIT K -LAT CAPIT K LAT SMALL K +LAT CAPIT J LAT SMALL J +LAT SMALL J LAT CAPIT J +LAT SMALL J LAT SMALL J LAT CAPIT K LAT CAPIT K +LAT CAPIT K LAT SMALL K +LAT SMALL K LAT CAPIT K LAT SMALL K LAT SMALL K -LAT SMALL L LAT CAPIT L -LAT CAPIT L LAT SMALL L LAT CAPIT L LAT CAPIT L +LAT CAPIT L LAT SMALL L +LAT SMALL L LAT CAPIT L LAT SMALL L LAT SMALL L LAT CAPIT M LAT CAPIT M -LAT SMALL M LAT SMALL M -LAT SMALL M LAT CAPIT M LAT CAPIT M LAT SMALL M -LAT SMALL N LAT SMALL N -LAT SMALL N LAT CAPIT N -LAT CAPIT N LAT SMALL N +LAT SMALL M LAT CAPIT M +LAT SMALL M LAT SMALL M LAT CAPIT N LAT CAPIT N -LAT SMALL O LAT SMALL O -LAT SMALL O LAT CAPIT O -LAT CAPIT O LAT SMALL O +LAT CAPIT N LAT SMALL N +LAT SMALL N LAT CAPIT N +LAT SMALL N LAT SMALL N LAT CAPIT O LAT CAPIT O -LAT SMALL P LAT CAPIT P -LAT CAPIT P LAT SMALL P +LAT CAPIT O LAT SMALL O +LAT SMALL O LAT CAPIT O +LAT SMALL O LAT SMALL O LAT CAPIT P LAT CAPIT P +LAT CAPIT P LAT SMALL P +LAT SMALL P LAT CAPIT P LAT SMALL P LAT SMALL P -LAT CAPIT Q LAT SMALL Q LAT CAPIT Q LAT CAPIT Q -LAT SMALL Q LAT SMALL Q +LAT CAPIT Q LAT SMALL Q LAT SMALL Q LAT CAPIT Q +LAT SMALL Q LAT SMALL Q LAT CAPIT R LAT CAPIT R -LAT SMALL R LAT SMALL R -LAT SMALL R LAT CAPIT R LAT CAPIT R LAT SMALL R -LAT SMALL S LAT SMALL S -LAT SMALL S LAT CAPIT S -LAT CAPIT S LAT SMALL S +LAT SMALL R LAT CAPIT R +LAT SMALL R LAT SMALL R LAT CAPIT S LAT CAPIT S -LAT SMALL T LAT CAPIT T -LAT CAPIT T LAT SMALL T +LAT CAPIT S LAT SMALL S +LAT SMALL S LAT CAPIT S +LAT SMALL S LAT SMALL S LAT CAPIT T LAT CAPIT T +LAT CAPIT T LAT SMALL T +LAT SMALL T LAT CAPIT T LAT SMALL T LAT SMALL T -LAT SMALL U LAT CAPIT U -LAT CAPIT U LAT SMALL U LAT CAPIT U LAT CAPIT U +LAT CAPIT U LAT SMALL U +LAT SMALL U LAT CAPIT U LAT SMALL U LAT SMALL U LAT CAPIT V LAT CAPIT V -LAT SMALL V LAT SMALL V -LAT SMALL V LAT CAPIT V LAT CAPIT V LAT SMALL V +LAT SMALL V LAT CAPIT V +LAT SMALL V LAT SMALL V LAT CAPIT W LAT CAPIT W -LAT SMALL W LAT SMALL W -LAT SMALL W LAT CAPIT W LAT CAPIT W LAT SMALL W -LAT SMALL X LAT SMALL X -LAT SMALL X LAT CAPIT X -LAT CAPIT X LAT SMALL X +LAT SMALL W LAT CAPIT W +LAT SMALL W LAT SMALL W LAT CAPIT X LAT CAPIT X -LAT SMALL Y LAT CAPIT Y -LAT CAPIT Y LAT SMALL Y +LAT CAPIT X LAT SMALL X +LAT SMALL X LAT CAPIT X +LAT SMALL X LAT SMALL X LAT CAPIT Y LAT CAPIT Y +LAT CAPIT Y LAT SMALL Y +LAT SMALL Y LAT CAPIT Y LAT SMALL Y LAT SMALL Y -LAT CAPIT Z LAT SMALL Z LAT CAPIT Z LAT CAPIT Z -LAT SMALL Z LAT SMALL Z +LAT CAPIT Z LAT SMALL Z LAT SMALL Z LAT CAPIT Z -CYR CAPIT A CYR SMALL A +LAT SMALL Z LAT SMALL Z CYR CAPIT A CYR CAPIT A -CYR SMALL A CYR SMALL A +CYR CAPIT A CYR SMALL A CYR SMALL A CYR CAPIT A -CYR SMALL BE CYR SMALL BE -CYR SMALL BE CYR CAPIT BE -CYR CAPIT BE CYR SMALL BE +CYR SMALL A CYR SMALL A CYR CAPIT BE CYR CAPIT BE -CYR SMALL VE CYR SMALL VE -CYR SMALL VE CYR CAPIT VE -CYR CAPIT VE CYR SMALL VE +CYR CAPIT BE CYR SMALL BE +CYR SMALL BE CYR CAPIT BE +CYR SMALL BE CYR SMALL BE CYR CAPIT VE CYR CAPIT VE -CYR SMALL GE CYR SMALL GE -CYR SMALL GE CYR CAPIT GE -CYR CAPIT GE CYR SMALL GE +CYR CAPIT VE CYR SMALL VE +CYR SMALL VE CYR CAPIT VE +CYR SMALL VE CYR SMALL VE CYR CAPIT GE CYR CAPIT GE -CYR CAPIT DE CYR SMALL DE +CYR CAPIT GE CYR SMALL GE +CYR SMALL GE CYR CAPIT GE +CYR SMALL GE CYR SMALL GE CYR CAPIT DE CYR CAPIT DE -CYR SMALL DE CYR SMALL DE +CYR CAPIT DE CYR SMALL DE CYR SMALL DE CYR CAPIT DE -CYR CAPIT IE CYR SMALL IE +CYR SMALL DE CYR SMALL DE CYR CAPIT IE CYR CAPIT IE -CYR SMALL IO CYR SMALL IO -CYR SMALL IO CYR CAPIT IO -CYR SMALL IE CYR SMALL IE -CYR SMALL IE CYR CAPIT IE -CYR CAPIT IO CYR SMALL IO +CYR CAPIT IE CYR SMALL IE CYR CAPIT IO CYR CAPIT IO -CYR SMALL ZHE CYR SMALL ZHE -CYR SMALL ZHE CYR CAPIT ZHE -CYR CAPIT ZHE CYR SMALL ZHE +CYR CAPIT IO CYR SMALL IO +CYR SMALL IE CYR CAPIT IE +CYR SMALL IE CYR SMALL IE +CYR SMALL IO CYR CAPIT IO +CYR SMALL IO CYR SMALL IO CYR CAPIT ZHE CYR CAPIT ZHE -CYR CAPIT ZE CYR SMALL ZE +CYR CAPIT ZHE CYR SMALL ZHE +CYR SMALL ZHE CYR CAPIT ZHE +CYR SMALL ZHE CYR SMALL ZHE CYR CAPIT ZE CYR CAPIT ZE -CYR SMALL ZE CYR SMALL ZE +CYR CAPIT ZE CYR SMALL ZE CYR SMALL ZE CYR CAPIT ZE -CYR CAPIT I CYR SMALL I +CYR SMALL ZE CYR SMALL ZE CYR CAPIT I CYR CAPIT I -CYR SMALL I CYR SMALL I +CYR CAPIT I CYR SMALL I CYR SMALL I CYR CAPIT I -CYR SMALL KA CYR SMALL KA -CYR SMALL KA CYR CAPIT KA -CYR CAPIT KA CYR SMALL KA +CYR SMALL I CYR SMALL I CYR CAPIT KA CYR CAPIT KA -CYR SMALL EL CYR SMALL EL -CYR SMALL EL CYR CAPIT EL -CYR CAPIT EL CYR SMALL EL +CYR CAPIT KA CYR SMALL KA +CYR SMALL KA CYR CAPIT KA +CYR SMALL KA CYR SMALL KA CYR CAPIT EL CYR CAPIT EL -CYR SMALL EM CYR SMALL EM -CYR SMALL EM CYR CAPIT EM -CYR CAPIT EM CYR SMALL EM +CYR CAPIT EL CYR SMALL EL +CYR SMALL EL CYR CAPIT EL +CYR SMALL EL CYR SMALL EL CYR CAPIT EM CYR CAPIT EM -CYR CAPIT EN CYR SMALL EN +CYR CAPIT EM CYR SMALL EM +CYR SMALL EM CYR CAPIT EM +CYR SMALL EM CYR SMALL EM CYR CAPIT EN CYR CAPIT EN -CYR SMALL EN CYR SMALL EN +CYR CAPIT EN CYR SMALL EN CYR SMALL EN CYR CAPIT EN -CYR CAPIT O CYR SMALL O +CYR SMALL EN CYR SMALL EN CYR CAPIT O CYR CAPIT O -CYR SMALL O CYR SMALL O +CYR CAPIT O CYR SMALL O CYR SMALL O CYR CAPIT O -CYR SMALL PE CYR SMALL PE -CYR SMALL PE CYR CAPIT PE -CYR CAPIT PE CYR SMALL PE +CYR SMALL O CYR SMALL O CYR CAPIT PE CYR CAPIT PE -CYR SMALL ER CYR SMALL ER -CYR SMALL ER CYR CAPIT ER -CYR CAPIT ER CYR SMALL ER +CYR CAPIT PE CYR SMALL PE +CYR SMALL PE CYR CAPIT PE +CYR SMALL PE CYR SMALL PE CYR CAPIT ER CYR CAPIT ER -CYR SMALL ES CYR SMALL ES -CYR SMALL ES CYR CAPIT ES -CYR CAPIT ES CYR SMALL ES +CYR CAPIT ER CYR SMALL ER +CYR SMALL ER CYR CAPIT ER +CYR SMALL ER CYR SMALL ER CYR CAPIT ES CYR CAPIT ES -CYR CAPIT TE CYR SMALL TE +CYR CAPIT ES CYR SMALL ES +CYR SMALL ES CYR CAPIT ES +CYR SMALL ES CYR SMALL ES CYR CAPIT TE CYR CAPIT TE -CYR SMALL TE CYR SMALL TE +CYR CAPIT TE CYR SMALL TE CYR SMALL TE CYR CAPIT TE -CYR SMALL U CYR SMALL U -CYR SMALL U CYR CAPIT U -CYR CAPIT U CYR SMALL U +CYR SMALL TE CYR SMALL TE CYR CAPIT U CYR CAPIT U -CYR SMALL EF CYR SMALL EF -CYR SMALL EF CYR CAPIT EF -CYR CAPIT EF CYR SMALL EF +CYR CAPIT U CYR SMALL U +CYR SMALL U CYR CAPIT U +CYR SMALL U CYR SMALL U CYR CAPIT EF CYR CAPIT EF -CYR SMALL HA CYR SMALL HA -CYR SMALL HA CYR CAPIT HA -CYR CAPIT HA CYR SMALL HA +CYR CAPIT EF CYR SMALL EF +CYR SMALL EF CYR CAPIT EF +CYR SMALL EF CYR SMALL EF CYR CAPIT HA CYR CAPIT HA -CYR CAPIT TSE CYR SMALL TSE +CYR CAPIT HA CYR SMALL HA +CYR SMALL HA CYR CAPIT HA +CYR SMALL HA CYR SMALL HA CYR CAPIT TSE CYR CAPIT TSE -CYR SMALL TSE CYR SMALL TSE +CYR CAPIT TSE CYR SMALL TSE CYR SMALL TSE CYR CAPIT TSE -CYR CAPIT CHE CYR SMALL CHE +CYR SMALL TSE CYR SMALL TSE CYR CAPIT CHE CYR CAPIT CHE -CYR SMALL CHE CYR SMALL CHE +CYR CAPIT CHE CYR SMALL CHE CYR SMALL CHE CYR CAPIT CHE -CYR SMALL SHA CYR SMALL SHA -CYR SMALL SHA CYR CAPIT SHA -CYR CAPIT SHA CYR SMALL SHA +CYR SMALL CHE CYR SMALL CHE CYR CAPIT SHA CYR CAPIT SHA -CYR SMALL SCHA CYR SMALL SCHA -CYR SMALL SCHA CYR CAPIT SCHA -CYR CAPIT SCHA CYR SMALL SCHA +CYR CAPIT SHA CYR SMALL SHA +CYR SMALL SHA CYR CAPIT SHA +CYR SMALL SHA CYR SMALL SHA CYR CAPIT SCHA CYR CAPIT SCHA -CYR SMALL HARD SIGN CYR SMALL HARD SIGN -CYR SMALL HARD SIGN CYR CAPIT HARD SIGN -CYR CAPIT HARD SIGN CYR SMALL HARD SIGN +CYR CAPIT SCHA CYR SMALL SCHA +CYR SMALL SCHA CYR CAPIT SCHA +CYR SMALL SCHA CYR SMALL SCHA CYR CAPIT HARD SIGN CYR CAPIT HARD SIGN -CYR CAPIT YERU CYR SMALL YERU +CYR CAPIT HARD SIGN CYR SMALL HARD SIGN +CYR SMALL HARD SIGN CYR CAPIT HARD SIGN +CYR SMALL HARD SIGN CYR SMALL HARD SIGN CYR CAPIT YERU CYR CAPIT YERU -CYR SMALL YERU CYR SMALL YERU +CYR CAPIT YERU CYR SMALL YERU CYR SMALL YERU CYR CAPIT YERU -CYR CAPIT SOFT SIGN CYR SMALL SOFT SIGN +CYR SMALL YERU CYR SMALL YERU CYR CAPIT SOFT SIGN CYR CAPIT SOFT SIGN -CYR SMALL SOFT SIGN CYR SMALL SOFT SIGN +CYR CAPIT SOFT SIGN CYR SMALL SOFT SIGN CYR SMALL SOFT SIGN CYR CAPIT SOFT SIGN -CYR SMALL E CYR SMALL E -CYR SMALL E CYR CAPIT E -CYR CAPIT E CYR SMALL E +CYR SMALL SOFT SIGN CYR SMALL SOFT SIGN CYR CAPIT E CYR CAPIT E -CYR SMALL YU CYR SMALL YU -CYR SMALL YU CYR CAPIT YU -CYR CAPIT YU CYR SMALL YU +CYR CAPIT E CYR SMALL E +CYR SMALL E CYR CAPIT E +CYR SMALL E CYR SMALL E CYR CAPIT YU CYR CAPIT YU -CYR CAPIT YA CYR SMALL YA +CYR CAPIT YU CYR SMALL YU +CYR SMALL YU CYR CAPIT YU +CYR SMALL YU CYR SMALL YU CYR CAPIT YA CYR CAPIT YA -CYR SMALL YA CYR SMALL YA +CYR CAPIT YA CYR SMALL YA CYR SMALL YA CYR CAPIT YA +CYR SMALL YA CYR SMALL YA ALTER TABLE t1 ADD ucs2_f CHAR(32) CHARACTER SET ucs2 NOT NULL; INSERT INTO t1 (ucs2_f,comment) VALUES (0x0391,'GREEK CAPIT ALPHA'); INSERT INTO t1 (ucs2_f,comment) VALUES (0x0392,'GREEK CAPIT BETA'); diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index e7cfa50d7f7..dada87803ad 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -1,7 +1,7 @@ select (select 2); (select 2) 2 -drop table if exists t1,t2,t3,t4,t5; +drop table if exists t1,t2,t3,t4,t5,attend,clinic; create table t1 (a int); create table t2 (a int, b int); create table t3 (a int); @@ -99,4 +99,13 @@ NULL 1 2 2 select (select a from t1 where t1.a=t2.a union all select a from t5 where t5.a=t2.a), a from t2; Subselect return more than 1 record -drop table t1,t2,t3,t4,t5; +create table attend (patient_uq int, clinic_uq int, index i1 (clinic_uq)); +create table clinic( uq int primary key, name char(25)); +insert into clinic values(1,"Oblastnaia bolnitsa"),(2,"Bolnitsa Krasnogo Kresta"); +insert into attend values (1,1),(1,2),(2,2),(1,3); +select * from attend where exists (select * from clinic where uq = clinic_uq); +patient_uq clinic_uq +1 1 +1 2 +2 2 +drop table t1,t2,t3,t4,t5,attend,clinic; diff --git a/mysql-test/t/create.test b/mysql-test/t/create.test index 99d4e5ae229..ac2f9cd5879 100644 --- a/mysql-test/t/create.test +++ b/mysql-test/t/create.test @@ -83,6 +83,22 @@ describe t2; drop table t1,t2; # +# Test of CREATE ... SELECT with duplicate fields +# + +create table t1 (a tinyint); +create table t2 (a int) select * from t1; +describe t1; +describe t2; +drop table if exists t2; +!$1060 create table t2 (a int, a float) select * from t1; +drop table if exists t2; +!$1060 create table t2 (a int) select a as b, a+1 as b from t1; +drop table if exists t2; +!$1060 create table t2 (b int) select a as b, a+1 as b from t1; +drop table if exists t1,t2; + +# # Test of primary key with 32 index # diff --git a/mysql-test/t/ctype_many.test b/mysql-test/t/ctype_many.test index 7db8f49919b..1e89b1419d2 100644 --- a/mysql-test/t/ctype_many.test +++ b/mysql-test/t/ctype_many.test @@ -133,6 +133,8 @@ INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ü','CYR CAPIT E'); INSERT INTO t1 (koi8_ru_f,comment) VALUES ('à','CYR CAPIT YU'); INSERT INTO t1 (koi8_ru_f,comment) VALUES ('ñ','CYR CAPIT YA'); +SELECT CONVERT(koi8_ru_f USING utf8),MIN(comment),COUNT(*) FROM t1 GROUP BY 1; + ALTER TABLE t1 ADD utf8_f CHAR(32) CHARACTER SET utf8 NOT NULL; UPDATE t1 SET utf8_f=CONVERT(koi8_ru_f USING utf8); @@ -147,12 +149,12 @@ SELECT lower(utf8_f) FROM t1 ORDER BY 1 DESC; SELECT t11.comment,t12.comment FROM t1 t11,t1 t12 WHERE CONVERT(t11.koi8_ru_f USING utf8)=t12.utf8_f -ORDER BY t11.koi8_ru_f; +ORDER BY t11.koi8_ru_f,t11.comment,t12.comment; SELECT t11.comment,t12.comment FROM t1 t11,t1 t12 WHERE t11.koi8_ru_f=CONVERT(t12.utf8_f USING koi8_ru) -ORDER BY t12.utf8_f; +ORDER BY t12.utf8_f,t11.comment,t12.comment; ALTER TABLE t1 ADD ucs2_f CHAR(32) CHARACTER SET ucs2 NOT NULL; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 224149900d2..8b9ed3b89c9 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -1,6 +1,6 @@ select (select 2); -drop table if exists t1,t2,t3,t4,t5; +drop table if exists t1,t2,t3,t4,t5,attend,clinic; create table t1 (a int); create table t2 (a int, b int); create table t3 (a int); @@ -41,4 +41,10 @@ insert into t5 values (2); select (select a from t1 where t1.a=t2.a union select a from t5 where t5.a=t2.a), a from t2; -- error 1230 select (select a from t1 where t1.a=t2.a union all select a from t5 where t5.a=t2.a), a from t2; -drop table t1,t2,t3,t4,t5; +create table attend (patient_uq int, clinic_uq int, index i1 (clinic_uq)); +create table clinic( uq int primary key, name char(25)); +insert into clinic values(1,"Oblastnaia bolnitsa"),(2,"Bolnitsa Krasnogo Kresta"); +insert into attend values (1,1),(1,2),(2,2),(1,3); +select * from attend where exists (select * from clinic where uq = clinic_uq); + +drop table t1,t2,t3,t4,t5,attend,clinic; diff --git a/mysys/Makefile.am b/mysys/Makefile.am index ec8a6b33224..4386a0cac76 100644 --- a/mysys/Makefile.am +++ b/mysys/Makefile.am @@ -53,10 +53,11 @@ EXTRA_DIST = thr_alarm.c thr_lock.c my_pthread.c my_thr_init.c \ thr_mutex.c thr_rwlock.c libmysys_a_LIBADD = @THREAD_LOBJECTS@ # test_fn removed 980815 since it not upp to date test_dir -noinst_PROGRAMS = test_charset @THREAD_LPROGRAMS@ +noinst_PROGRAMS = test_charset charset2html @THREAD_LPROGRAMS@ # test_dir_DEPENDENCIES= $(LIBRARIES) # testhash_DEPENDENCIES= $(LIBRARIES) test_charset_DEPENDENCIES= $(LIBRARIES) +charset2html_DEPENDENCIES= $(LIBRARIES) EXTRA_PROGRAMS = DEFS = -DDEFAULT_BASEDIR=\"$(prefix)\" \ -DDATADIR="\"$(MYSQLDATAdir)\"" \ @@ -109,6 +110,9 @@ test_dir: test_dir.c $(LIBRARIES) test_charset: test_charset.c $(LIBRARIES) $(LINK) $(FLAGS) -DMAIN $(srcdir)/test_charset.c $(LDADD) $(LIBS) +charset2html: charset2html.c $(LIBRARIES) + $(LINK) $(FLAGS) -DMAIN $(srcdir)/charset2html.c $(LDADD) $(LIBS) + testhash: testhash.c $(LIBRARIES) $(LINK) $(FLAGS) -DMAIN $(srcdir)/testhash.c $(LDADD) $(LIBS) diff --git a/mysys/charset.c b/mysys/charset.c index 94cd1d9f9f8..691a4233269 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -20,15 +20,10 @@ #include <m_string.h> #include <my_dir.h> -typedef struct cs_id_st { - char *name; - uint number; -} CS_ID; const char *charsets_dir = NULL; -static DYNAMIC_ARRAY cs_info_table; -static CS_ID **available_charsets; static int charset_initialized=0; +CHARSET_INFO all_charsets[256]; #define MAX_LINE 1024 @@ -44,24 +39,6 @@ struct simpleconfig_buf_st { char *p; }; -static uint num_from_csname(CS_ID **cs, const char *name) -{ - CS_ID **c; - for (c = cs; *c; ++c) - if (!strcmp((*c)->name, name)) - return (*c)->number; - return 0; /* this mimics find_type() */ -} - -static char *name_from_csnum(CS_ID **cs, uint number) -{ - CS_ID **c; - if(cs) - for (c = cs; *c; ++c) - if ((*c)->number == number) - return (*c)->name; - return (char*) "?"; /* this mimics find_type() */ -} static my_bool get_word(struct simpleconfig_buf_st *fb, char *buf) { @@ -109,13 +86,11 @@ char *get_charsets_dir(char *buf) } -static my_bool read_charset_index(CS_ID ***charsets, myf myflags) +static my_bool read_charset_index(myf myflags) { struct simpleconfig_buf_st fb; char buf[MAX_LINE], num_buf[MAX_LINE]; - DYNAMIC_ARRAY cs; - CS_ID *csid; - + strmov(get_charsets_dir(buf), "Index"); if ((fb.f = my_fopen(buf, O_RDONLY, myflags)) == NULL) @@ -123,13 +98,12 @@ static my_bool read_charset_index(CS_ID ***charsets, myf myflags) fb.buf[0] = '\0'; fb.p = fb.buf; - if (my_init_dynamic_array(&cs, sizeof(CS_ID *), 32, 32)) - return TRUE; - + while (!get_word(&fb, buf) && !get_word(&fb, num_buf)) { uint csnum; uint length; + CHARSET_INFO *cs; if (!(csnum = atoi(num_buf))) { @@ -138,64 +112,76 @@ static my_bool read_charset_index(CS_ID ***charsets, myf myflags) return TRUE; } - if (!(csid = (CS_ID*) my_once_alloc(sizeof(CS_ID), myflags)) || - !(csid->name= + cs=&all_charsets[csnum]; + + if (!(cs->name= (char*) my_once_alloc(length= (uint) strlen(buf)+1, myflags))) { my_fclose(fb.f,myflags); return TRUE; } - memcpy(csid->name,buf,length); - csid->number = csnum; - - insert_dynamic(&cs, (gptr) &csid); + memcpy((char*)cs->name,buf,length); + cs->number=csnum; } my_fclose(fb.f,myflags); - - if (!(*charsets = - (CS_ID **) my_once_alloc((cs.elements + 1) * sizeof(CS_ID *), myflags))) - return TRUE; - /* unwarranted chumminess with dynamic_array implementation? */ - memcpy((byte *) *charsets, cs.buffer, cs.elements * sizeof(CS_ID *)); - (*charsets)[cs.elements] = NULL; - delete_dynamic(&cs); - return FALSE; } +static void set_max_sort_char(CHARSET_INFO *cs) +{ + uchar max_char; + uint i; + + if (!cs->sort_order) + return; + + max_char=cs->sort_order[(uchar) cs->max_sort_char]; + for (i = 0; i < 256; i++) + { + if ((uchar) cs->sort_order[i] > max_char) + { + max_char=(uchar) cs->sort_order[i]; + cs->max_sort_char= (char) i; + } + } +} static my_bool init_available_charsets(myf myflags) { - my_bool error=0; + my_bool error=FALSE; /* We have to use charset_initialized to not lock on THR_LOCK_charset inside get_internal_charset... */ if (!charset_initialized) { + CHARSET_INFO *cs; /* To make things thread safe we are not allowing other threads to interfere while we may changing the cs_info_table */ pthread_mutex_lock(&THR_LOCK_charset); - if (!cs_info_table.buffer) /* If not initialized */ + + bzero(&all_charsets,sizeof(all_charsets)); + + /* Copy compiled charsets */ + + for (cs=compiled_charsets; cs->name; cs++) { - my_init_dynamic_array(&cs_info_table, sizeof(CHARSET_INFO*), 16, 8); - error = read_charset_index(&available_charsets, myflags); + all_charsets[cs->number]=cs[0]; + set_max_sort_char(&all_charsets[cs->number]); } + error = read_charset_index(myflags); charset_initialized=1; pthread_mutex_unlock(&THR_LOCK_charset); } - if(!available_charsets || !available_charsets[0]) - error = TRUE; return error; } void free_charsets(void) { - delete_dynamic(&cs_info_table); charset_initialized=0; } @@ -231,10 +217,9 @@ static my_bool fill_uint16_array(uint16 *array, int sz, struct simpleconfig_buf_ } -static void get_charset_conf_name(uint cs_number, char *buf) +static void get_charset_conf_name(const char *cs_name, char *buf) { - strxmov(get_charsets_dir(buf), - name_from_csnum(available_charsets, cs_number), ".conf", NullS); + strxmov(get_charsets_dir(buf), cs_name, ".conf", NullS); } typedef struct { @@ -323,19 +308,16 @@ static my_bool create_fromuni(CHARSET_INFO *cs){ } -static my_bool read_charset_file(uint cs_number, CHARSET_INFO *set, +static my_bool read_charset_file(const char *cs_name, CHARSET_INFO *set, myf myflags) { struct simpleconfig_buf_st fb; char buf[FN_REFLEN]; my_bool result; DBUG_ENTER("read_charset_file"); - DBUG_PRINT("enter",("cs_number: %d", cs_number)); - - if (cs_number <= 0) - DBUG_RETURN(TRUE); + DBUG_PRINT("enter",("cs_name: %s", cs_name)); - get_charset_conf_name(cs_number, buf); + get_charset_conf_name(cs_name, buf); DBUG_PRINT("info",("file name: %s", buf)); if ((fb.f = my_fopen(buf, O_RDONLY, myflags)) == NULL) @@ -353,83 +335,37 @@ static my_bool read_charset_file(uint cs_number, CHARSET_INFO *set, result=TRUE; my_fclose(fb.f, MYF(0)); - create_fromuni(set); DBUG_RETURN(result); } -uint get_charset_number(const char *charset_name) +static CHARSET_INFO *add_charset(uint cs_number, myf flags) { - uint number=compiled_charset_number(charset_name); - if (number) - return number; - if (init_available_charsets(MYF(0))) /* If it isn't initialized */ - return 0; - return num_from_csname(available_charsets, charset_name); -} - -const char *get_charset_name(uint charset_number) -{ - const char *name=compiled_charset_name(charset_number); - if (*name != '?') - return name; - if (init_available_charsets(MYF(0))) /* If it isn't initialized */ - return "?"; - return name_from_csnum(available_charsets, charset_number); -} - - -static CHARSET_INFO *find_charset(CHARSET_INFO **table, uint cs_number, - size_t tablesz) -{ - uint i; - for (i = 0; i < tablesz; ++i) - if (table[i]->number == cs_number) - return table[i]; - return NULL; -} - -static CHARSET_INFO *find_charset_by_name(CHARSET_INFO **table, - const char *name, size_t tablesz) -{ - uint i; - for (i = 0; i < tablesz; ++i) - if (!strcmp(table[i]->name,name)) - return table[i]; - return NULL; -} - -static CHARSET_INFO *add_charset(uint cs_number, const char *cs_name, myf flags) -{ - CHARSET_INFO tmp_cs,*cs; + CHARSET_INFO *cs; uchar tmp_ctype[CTYPE_TABLE_SIZE]; uchar tmp_to_lower[TO_LOWER_TABLE_SIZE]; uchar tmp_to_upper[TO_UPPER_TABLE_SIZE]; uchar tmp_sort_order[SORT_ORDER_TABLE_SIZE]; uint16 tmp_to_uni[TO_UNI_TABLE_SIZE]; - /* Don't allocate memory if we are not sure we can find the char set */ - cs= &tmp_cs; - bzero((char*) cs, sizeof(*cs)); + /* Note: cs->name is already initialized */ + + cs=&all_charsets[cs_number]; + cs->ctype=tmp_ctype; cs->to_lower=tmp_to_lower; cs->to_upper=tmp_to_upper; cs->sort_order=tmp_sort_order; cs->tab_to_uni=tmp_to_uni; - if (read_charset_file(cs_number, cs, flags)) + if (read_charset_file(cs->name, cs, flags)) return NULL; - cs = (CHARSET_INFO*) my_once_alloc(sizeof(CHARSET_INFO), - MYF(MY_WME)); - *cs=tmp_cs; - cs->name = (char *) my_once_alloc((uint) strlen(cs_name)+1, MYF(MY_WME)); cs->ctype = (uchar*) my_once_alloc(CTYPE_TABLE_SIZE, MYF(MY_WME)); cs->to_lower = (uchar*) my_once_alloc(TO_LOWER_TABLE_SIZE, MYF(MY_WME)); cs->to_upper = (uchar*) my_once_alloc(TO_UPPER_TABLE_SIZE, MYF(MY_WME)); cs->sort_order=(uchar*) my_once_alloc(SORT_ORDER_TABLE_SIZE, MYF(MY_WME)); cs->tab_to_uni=(uint16*)my_once_alloc(TO_UNI_TABLE_SIZE*sizeof(uint16), MYF(MY_WME)); cs->number = cs_number; - memcpy((char*) cs->name, (char*) cs_name, strlen(cs_name) + 1); memcpy((char*) cs->ctype, (char*) tmp_ctype, sizeof(tmp_ctype)); memcpy((char*) cs->to_lower, (char*) tmp_to_lower, sizeof(tmp_to_lower)); memcpy((char*) cs->to_upper, (char*) tmp_to_upper, sizeof(tmp_to_upper)); @@ -446,10 +382,41 @@ static CHARSET_INFO *add_charset(uint cs_number, const char *cs_name, myf flags) cs->mb_wc = my_mb_wc_8bit; cs->wc_mb = my_wc_mb_8bit; - insert_dynamic(&cs_info_table, (gptr) &cs); + set_max_sort_char(cs); + create_fromuni(cs); + return cs; } + +uint get_charset_number(const char *charset_name) +{ + CHARSET_INFO *cs; + if (init_available_charsets(MYF(0))) /* If it isn't initialized */ + return 0; + + for (cs = all_charsets; cs < all_charsets+255; ++cs) + if ( cs->name && !strcmp(cs->name, charset_name)) + return cs->number; + + return 0; /* this mimics find_type() */ +} + + +const char *get_charset_name(uint charset_number) +{ + CHARSET_INFO *cs; + if (init_available_charsets(MYF(0))) /* If it isn't initialized */ + return "?"; + + cs=&all_charsets[charset_number]; + if ( (cs->number==charset_number) && cs->name ) + return (char*) cs->name; + + return (char*) "?"; /* this mimics find_type() */ +} + + static CHARSET_INFO *get_internal_charset(uint cs_number, myf flags) { CHARSET_INFO *cs; @@ -458,10 +425,11 @@ static CHARSET_INFO *get_internal_charset(uint cs_number, myf flags) while we may changing the cs_info_table */ pthread_mutex_lock(&THR_LOCK_charset); - if (!(cs = find_charset((CHARSET_INFO**) cs_info_table.buffer, cs_number, - cs_info_table.elements))) - if (!(cs = find_compiled_charset(cs_number))) - cs=add_charset(cs_number, get_charset_name(cs_number), flags); + + cs = &all_charsets[cs_number]; + if (!(cs->state & (MY_CS_COMPILED | MY_CS_LOADED))) + cs=add_charset(cs_number, flags); + pthread_mutex_unlock(&THR_LOCK_charset); return cs; } @@ -469,25 +437,20 @@ static CHARSET_INFO *get_internal_charset(uint cs_number, myf flags) static CHARSET_INFO *get_internal_charset_by_name(const char *name, myf flags) { - CHARSET_INFO *cs; - /* - To make things thread safe we are not allowing other threads to interfere - while we may changing the cs_info_table - */ - pthread_mutex_lock(&THR_LOCK_charset); - if (!(cs = find_charset_by_name((CHARSET_INFO**) cs_info_table.buffer, name, - cs_info_table.elements))) - if (!(cs = find_compiled_charset_by_name(name))) - cs=add_charset(get_charset_number(name), name, flags); - pthread_mutex_unlock(&THR_LOCK_charset); - return cs; + uint cs_number=get_charset_number(name); + return cs_number ? get_internal_charset(cs_number,flags) : NULL; } + CHARSET_INFO *get_charset(uint cs_number, myf flags) { CHARSET_INFO *cs; (void) init_available_charsets(MYF(0)); /* If it isn't initialized */ + + if (!cs_number) + return NULL; + cs=get_internal_charset(cs_number, flags); if (!cs && (flags & MY_WME)) @@ -585,7 +548,7 @@ char * list_charsets(myf want_flags) (void)init_available_charsets(MYF(0)); init_dynamic_string(&s, NullS, 256, 1024); - if (want_flags & MY_COMPILED_SETS) + if (want_flags & MY_CS_COMPILED) { CHARSET_INFO *cs; for (cs = compiled_charsets; cs->number > 0; cs++) @@ -595,80 +558,42 @@ char * list_charsets(myf want_flags) } } - if (want_flags & MY_CONFIG_SETS) + if (want_flags & MY_CS_CONFIG) { - CS_ID **c; + CHARSET_INFO *cs; char buf[FN_REFLEN]; MY_STAT status; - if((c=available_charsets)) - for (; *c; ++c) - { - if (charset_in_string((*c)->name, &s)) - continue; - get_charset_conf_name((*c)->number, buf); - if (!my_stat(buf, &status, MYF(0))) - continue; /* conf file doesn't exist */ - dynstr_append(&s, (*c)->name); - dynstr_append(&s, " "); - } + for (cs=all_charsets; cs < all_charsets+255; cs++) + { + if (!cs->name || charset_in_string(cs->name, &s)) + continue; + get_charset_conf_name(cs->name, buf); + if (!my_stat(buf, &status, MYF(0))) + continue; /* conf file doesn't exist */ + dynstr_append(&s, cs->name); + dynstr_append(&s, " "); + } } - if (want_flags & MY_INDEX_SETS) + if (want_flags & (MY_CS_INDEX|MY_CS_LOADED)) { - CS_ID **c; - for (c = available_charsets; *c; ++c) - charset_append(&s, (*c)->name); + CHARSET_INFO *cs; + for (cs = all_charsets; cs < all_charsets + 255; cs++) + if (cs->name && (cs->state & want_flags) ) + charset_append(&s, cs->name); } - - if (want_flags & MY_LOADED_SETS) + + if (s.length) { - uint i; - for (i = 0; i < cs_info_table.elements; i++) - charset_append(&s, - dynamic_element(&cs_info_table, i, CHARSET_INFO *)->name); + s.str[s.length - 1] = '\0'; /* chop trailing space */ + p = my_strdup(s.str, MYF(MY_WME)); } - s.str[s.length - 1] = '\0'; /* chop trailing space */ - p = my_strdup(s.str, MYF(MY_WME)); - dynstr_free(&s); - - return p; -} - -/**************************************************************************** -* Code for debugging. -****************************************************************************/ - - -static void _print_array(uint8 *data, uint size) -{ - uint i; - for (i = 0; i < size; ++i) + else { - if (i == 0 || i % 16 == size % 16) printf(" "); - printf(" %02x", data[i]); - if ((i+1) % 16 == size % 16) printf("\n"); + p = my_strdup("", MYF(MY_WME)); } -} - -/* _print_csinfo is called from test_charset.c */ -void _print_csinfo(CHARSET_INFO *cs) -{ - printf("%s #%d\n", cs->name, cs->number); - printf("ctype:\n"); _print_array(cs->ctype, 257); - printf("to_lower:\n"); _print_array(cs->to_lower, 256); - printf("to_upper:\n"); _print_array(cs->to_upper, 256); - printf("sort_order:\n"); _print_array(cs->sort_order, 256); - printf("collate: %3s (%d, %p, %p, %p)\n", - cs->strxfrm_multiply ? "yes" : "no", - cs->strxfrm_multiply, - cs->strnncoll, - cs->strnxfrm, - cs->like_range); - printf("multi-byte: %3s (%d, %p, %p, %p)\n", - cs->mbmaxlen ? "yes" : "no", - cs->mbmaxlen, - cs->ismbchar, - cs->ismbhead, - cs->mbcharlen); + dynstr_free(&s); + + return p; } diff --git a/mysys/charset2html.c b/mysys/charset2html.c new file mode 100644 index 00000000000..0d6450a8116 --- /dev/null +++ b/mysys/charset2html.c @@ -0,0 +1,129 @@ +/* Copyright (C) 2000 MySQL AB + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + Written by Alexander Barkov to check what + a charset is in your favorite web browser +*/ + +#include <my_global.h> +#include <m_ctype.h> +#include <my_sys.h> +#include <mysql_version.h> + +#include <stdio.h> + +typedef struct char_info_st +{ + int cod; + int srt; + int uni; + int low; + int upp; + int ctp; +} MY_CH; + +static int chcmp(const void *vf, const void *vs) +{ + const MY_CH *f=vf; + const MY_CH *s=vs; + + return f->srt-s->srt ? f->srt-s->srt : f->uni-s->uni; +} + +static void print_cs(CHARSET_INFO *cs) +{ + uint i; + int srt; + int clr=0; + MY_CH ch[256]; + + printf("<HTML>\n"); + printf("<HEAD>\n"); + printf("</HEAD>\n"); + printf("<BODY><PRE>\n"); + printf("Charset %s\n",cs->name); + + printf("<TABLE>\n"); + printf("<TR><TH>Code<TH>Uni<TH>Sort<TH>Ctype<TH>Ch<TH>Lo<TH>Up</TR>"); + + for (i=0; i<256; i++) + { + ch[i].cod=i; + ch[i].srt=cs->sort_order[i]; + ch[i].uni=cs->tab_to_uni[i]; + ch[i].low=cs->tab_to_uni[cs->to_lower[i]]; + ch[i].upp=cs->tab_to_uni[cs->to_upper[i]]; + ch[i].ctp=cs->ctype[i+1]; + } + + qsort(ch,256,sizeof(MY_CH),&chcmp); + srt=ch[0].srt; + + for (i=0; i<256; i++) + { + clr = (srt!=ch[i].srt) ? !clr : clr; + + printf("<TR bgcolor=#%s>",clr ? "DDDDDD" : "EEEE99"); + printf("<TD>%02X",ch[i].cod); + printf("<TD>%04X",ch[i].uni); + printf("<TD>%d",ch[i].srt); + + printf("<TD>%s%s%s%s%s%s%s%s", + ch[i].ctp & _U ? "U" : "", + ch[i].ctp & _L ? "L" : "", + ch[i].ctp & _NMR ? "N" : "", + ch[i].ctp & _SPC ? "S" : "", + ch[i].ctp & _PNT ? "P" : "", + ch[i].ctp & _CTR ? "C" : "", + ch[i].ctp & _B ? "B" : "", + ch[i].ctp & _X ? "X" : ""); + + printf("<TD>&#%d;",ch[i].uni); + printf("<TD>&#%d;",ch[i].low); + printf("<TD>&#%d;",ch[i].upp); + printf("</TR>\n"); + srt=ch[i].srt; + } + printf("</TABLE>\n"); + printf("</PRE></BODY>\n"); + printf("</HTML>\n"); +} + + +int main(int argc, char **argv) { + const char *the_set = MYSQL_CHARSET; + int argcnt = 1; + + my_init(); + + if (argc > argcnt && argv[argcnt][0] == '-' && argv[argcnt][1] == '#') + DBUG_PUSH(argv[argcnt++]+2); + + if (argc > argcnt) + the_set = argv[argcnt++]; + + if (argc > argcnt) + charsets_dir = argv[argcnt++]; + + if (set_default_charset_by_name(the_set, MYF(MY_WME))) + return 1; + + print_cs(default_charset_info); + + return 0; +} diff --git a/mysys/hash.c b/mysys/hash.c index 0cbd14607f6..7fb634a05b9 100644 --- a/mysys/hash.c +++ b/mysys/hash.c @@ -136,10 +136,12 @@ static uint calc_hashnr(CHARSET_INFO *cs __attribute__((unused)), static uint calc_hashnr_caseup(CHARSET_INFO *cs, const byte *key,uint length) { register uint nr=1, nr2=4; + register uchar *map=cs->to_upper; + while (length--) { nr^= (((nr & 63)+nr2)* - ((uint) (uchar) my_toupper(cs, *key++)))+ (nr << 8); + ((uint) (uchar) map[(uchar)*key++])) + (nr << 8); nr2+=3; } return((uint) nr); diff --git a/mysys/mf_casecnv.c b/mysys/mf_casecnv.c index 510a9b08f76..631db18b1ed 100644 --- a/mysys/mf_casecnv.c +++ b/mysys/mf_casecnv.c @@ -33,8 +33,10 @@ void case_sort(CHARSET_INFO *cs, my_string str, uint length) { + register uchar *map=cs->sort_order; + for ( ; length>0 ; length--, str++) - *str= (char) cs->sort_order[(uchar) *str]; + *str= (char) map[(uchar) *str]; } /* case_sort */ @@ -46,11 +48,11 @@ int my_sortcmp(CHARSET_INFO *cs, const char *s, const char *t, uint len) else #endif { + register uchar *map=cs->sort_order; while (len--) { - if (cs->sort_order[(uchar) *s++] != cs->sort_order[(uchar) *t++]) - return ((int) cs->sort_order[(uchar) s[-1]] - - (int) cs->sort_order[(uchar) t[-1]]); + if (map[(uchar) *s++] != map[(uchar) *t++]) + return ((int) map[(uchar) s[-1]] - (int) map[(uchar) t[-1]]); } return 0; } @@ -67,11 +69,12 @@ int my_sortncmp(CHARSET_INFO *cs, #endif { uint len= min(s_len,t_len); + register uchar *map=cs->sort_order; + while (len--) { - if (cs->sort_order[(uchar) *s++] != cs->sort_order[(uchar) *t++]) - return ((int) cs->sort_order[(uchar) s[-1]] - - (int) cs->sort_order[(uchar) t[-1]]); + if (map[(uchar) *s++] != map[(uchar) *t++]) + return ((int) map[(uchar) s[-1]] - (int) map[(uchar) t[-1]]); } return (int) (s_len - t_len); } diff --git a/mysys/mf_soundex.c b/mysys/mf_soundex.c index 8ecd95137b0..459e304dfd7 100644 --- a/mysys/mf_soundex.c +++ b/mysys/mf_soundex.c @@ -44,13 +44,14 @@ void soundex(CHARSET_INFO * cs,register my_string out_pntr, my_string in_pntr, { char ch,last_ch; reg3 my_string end; + register uchar *map=cs->to_upper; if (remove_garbage) { while (*in_pntr && my_isspace(cs,*in_pntr)) /* Skipp pre-space */ in_pntr++; } - *out_pntr++ = my_toupper(cs,*in_pntr);/* Copy first letter */ + *out_pntr++ = map[(uchar)*in_pntr]; /* Copy first letter */ last_ch = get_scode(cs,&in_pntr,0); /* code of the first letter */ /* for the first 'double-letter */ /* check. */ diff --git a/mysys/my_handler.c b/mysys/my_handler.c index 1e7d8a702d2..5b68b427f3a 100644 --- a/mysys/my_handler.c +++ b/mysys/my_handler.c @@ -25,7 +25,8 @@ int mi_compare_text(CHARSET_INFO *charset_info, uchar *a, uint a_length, #ifdef USE_STRCOLL if (use_strcoll(charset_info)) { - /* QQ: This needs to work with part keys at some point */ + if (part_key && b_length < a_length) + a_length=b_length; return my_strnncoll(charset_info, a, a_length, b, b_length); } else diff --git a/mysys/test_charset.c b/mysys/test_charset.c index 224a4120614..47ed9062c05 100644 --- a/mysys/test_charset.c +++ b/mysys/test_charset.c @@ -21,7 +21,38 @@ #include <stdio.h> -extern void _print_csinfo(CHARSET_INFO *cs); +static void _print_array(uint8 *data, uint size) +{ + uint i; + for (i = 0; i < size; ++i) + { + if (i == 0 || i % 16 == size % 16) printf(" "); + printf(" %02x", data[i]); + if ((i+1) % 16 == size % 16) printf("\n"); + } +} + +static void _print_csinfo(CHARSET_INFO *cs) +{ + printf("%s #%d\n", cs->name, cs->number); + printf("ctype:\n"); _print_array(cs->ctype, 257); + printf("to_lower:\n"); _print_array(cs->to_lower, 256); + printf("to_upper:\n"); _print_array(cs->to_upper, 256); + printf("sort_order:\n"); _print_array(cs->sort_order, 256); + printf("collate: %3s (%d, %p, %p, %p)\n", + cs->strxfrm_multiply ? "yes" : "no", + cs->strxfrm_multiply, + cs->strnncoll, + cs->strnxfrm, + cs->like_range); + printf("multi-byte: %3s (%d, %p, %p, %p)\n", + cs->mbmaxlen ? "yes" : "no", + cs->mbmaxlen, + cs->ismbchar, + cs->ismbhead, + cs->mbcharlen); +} + int main(int argc, char **argv) { const char *the_set = MYSQL_CHARSET; @@ -46,11 +77,11 @@ int main(int argc, char **argv) { _print_csinfo(default_charset_info); fflush(stdout); - cs_list = list_charsets(MYF(MY_COMPILED_SETS | MY_CONFIG_SETS)); + cs_list = list_charsets(MYF(MY_CS_COMPILED | MY_CS_CONFIG)); printf("LIST OF CHARSETS (compiled + *.conf):\n%s\n", cs_list); my_free(cs_list,MYF(0)); - cs_list = list_charsets(MYF(MY_INDEX_SETS | MY_LOADED_SETS)); + cs_list = list_charsets(MYF(MY_CS_INDEX | MY_CS_LOADED)); printf("LIST OF CHARSETS (index + loaded):\n%s\n", cs_list); my_free(cs_list,MYF(0)); diff --git a/scripts/mysql_config.sh b/scripts/mysql_config.sh index 6a31db9a2b3..3cc5b3a5016 100644 --- a/scripts/mysql_config.sh +++ b/scripts/mysql_config.sh @@ -112,7 +112,7 @@ while test $# -gt 0; do --socket) echo "$socket" ;; --port) echo "$port" ;; --version) echo "$version" ;; - --embedded-libs | --embedded | libmysqld-libs) echo "$embedded_libs" ;; + --embedded-libs | --embedded | --libmysqld-libs) echo "$embedded_libs" ;; *) usage ;; esac diff --git a/sql-bench/server-cfg.sh b/sql-bench/server-cfg.sh index a4e74fcb4f9..e82fd5d5907 100644 --- a/sql-bench/server-cfg.sh +++ b/sql-bench/server-cfg.sh @@ -115,7 +115,6 @@ sub new $self->{'data_source'} = "DBI:mysql:database=$database;host=$host"; $self->{'data_source'} .= ";mysql_socket=$socket" if($socket); $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "blob"; $self->{'text'} = "text"; $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' @@ -168,25 +167,6 @@ sub new $limits{'working_all_fields'} = 1; $limits{'working_blobs'} = 1; # If big varchar/blobs works - $smds{'time'} = 1; - $smds{'q1'} = 'b'; # with time not supp by mysql ('') - $smds{'q2'} = 'b'; - $smds{'q3'} = 'b'; # with time ('') - $smds{'q4'} = 'c'; # with time not supp by mysql (d) - $smds{'q5'} = 'b'; # with time not supp by mysql ('') - $smds{'q6'} = 'c'; # with time not supp by mysql ('') - $smds{'q7'} = 'c'; - $smds{'q8'} = 'f'; - $smds{'q9'} = 'c'; - $smds{'q10'} = 'b'; - $smds{'q11'} = 'b'; - $smds{'q12'} = 'd'; - $smds{'q13'} = 'c'; - $smds{'q14'} = 'd'; - $smds{'q15'} = 'd'; - $smds{'q16'} = 'a'; - $smds{'q17'} = 'c'; - # Some fixes that depends on the environment if (defined($main::opt_create_options) && $main::opt_create_options =~ /type=heap/i) @@ -200,6 +180,11 @@ sub new $self->{'transactions'} = 1; # Transactions enabled } if (defined($main::opt_create_options) && + $main::opt_create_options =~ /type=bdb/i) + { + $self->{'transactions'} = 1; # Transactions enabled + } + if (defined($main::opt_create_options) && $main::opt_create_options =~ /type=gemini/i) { $limits{'working_blobs'} = 0; # Blobs not implemented yet @@ -266,7 +251,6 @@ sub create { $field =~ s/ decimal/ double(10,2)/i; $field =~ s/ big_decimal/ double(10,2)/i; - $field =~ s/ date/ int/i; # Because of tcp ? $query.= $field . ','; } foreach $index (@$index) @@ -575,7 +559,6 @@ sub new $self->{'cmp_name'} = "pg"; $self->{'data_source'} = "DBI:Pg:dbname=$database"; $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "text"; $self->{'text'} = "text"; $self->{'double_quotes'} = 1; @@ -626,27 +609,6 @@ sub new $limits{'working_all_fields'} = 1; $limits{'working_blobs'} = 1; # If big varchar/blobs works - # the different cases per query ... - $smds{'q1'} = 'b'; # with time - $smds{'q2'} = 'b'; - $smds{'q3'} = 'b'; # with time - $smds{'q4'} = 'c'; # with time - $smds{'q5'} = 'b'; # with time - $smds{'q6'} = 'c'; # strange error .... - $smds{'q7'} = 'c'; - $smds{'q8'} = 'f'; # needs 128M to execute - can't do insert ...group by - $smds{'q9'} = 'c'; - $smds{'q10'} = 'b'; - $smds{'q11'} = 'b'; # can't do float8 * int4 - create operator - $smds{'q12'} = 'd'; # strange error??? - $smds{'q13'} = 'c'; - $smds{'q14'} = 'd'; # strange error??? - $smds{'q15'} = 'd'; # strange error??? - $smds{'q16'} = 'a'; - $smds{'q17'} = 'c'; - $smds{'time'} = 1; # the use of the time table -> 1 is on. - # when 0 then the date field must be a - # date field not a int field!!! return $self; } @@ -871,7 +833,6 @@ sub new $self->{'cmp_name'} = "solid"; $self->{'data_source'} = "DBI:Solid:"; $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "long varchar"; $self->{'text'} = "long varchar"; $self->{'double_quotes'} = 1; @@ -922,28 +883,6 @@ sub new $limits{'order_by_unused'} = 1; $limits{'working_all_fields'} = 1; - # for the smds small benchmark test .... - # the different cases per query ... - $smds{'q1'} = 'a'; - $smds{'q2'} = ''; - $smds{'q3'} = 'b'; #doesn't work -> strange error about column -fixed - $smds{'q4'} = 'a'; - $smds{'q5'} = 'b'; - $smds{'q6'} = 'c'; - $smds{'q7'} = 'b'; - $smds{'q8'} = 'f'; - $smds{'q9'} = 'b'; - $smds{'q10'} = 'b'; - $smds{'q11'} = ''; - $smds{'q12'} = 'd'; - $smds{'q13'} = 'b'; - $smds{'q14'} = 'd'; - $smds{'q15'} = 'd'; - $smds{'q16'} = ''; - $smds{'q17'} = ''; - $smds{'time'} = 1; # the use of the time table -> 1 is on. - # when 0 then the date field must be a - # date field not a int field!!! return $self; } @@ -1119,7 +1058,6 @@ sub new $self->{'cmp_name'} = "empress"; $self->{'data_source'} = "DBI:EmpressNet:SERVER=$host;Database=/usr/local/empress/rdbms/bin/$database"; $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "text"; $self->{'text'} = "text"; $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' @@ -1172,28 +1110,6 @@ sub new $limits{'order_by_unused'} = 1; $limits{'working_all_fields'} = 1; - # for the smds small benchmark test .... - # the different cases per query ... EMPRESS - $smds{'q1'} = 'a'; - $smds{'q2'} = ''; - $smds{'q3'} = 'a'; - $smds{'q4'} = 'a'; - $smds{'q5'} = 'a'; - $smds{'q6'} = 'a'; - $smds{'q7'} = 'b'; - $smds{'q8'} = 'd'; - $smds{'q9'} = 'b'; - $smds{'q10'} = 'a'; - $smds{'q11'} = ''; - $smds{'q12'} = 'd'; - $smds{'q13'} = 'b'; - $smds{'q14'} = 'b'; - $smds{'q15'} = 'a'; - $smds{'q16'} = ''; - $smds{'q17'} = ''; - $smds{'time'} = 1; # the use of the time table -> 1 is on. - # when 0 then the date field must be a - # date field not a int field!!! return $self; } @@ -1410,7 +1326,6 @@ sub new $self->{'cmp_name'} = "Oracle"; $self->{'data_source'} = "DBI:Oracle:$database"; $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "long"; $self->{'text'} = "long"; $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' @@ -1464,24 +1379,6 @@ sub new $limits{'order_by_unused'} = 1; $limits{'working_all_fields'} = 1; - $smds{'time'} = 1; - $smds{'q1'} = 'b'; # with time not supp by mysql ('') - $smds{'q2'} = 'b'; - $smds{'q3'} = 'b'; # with time ('') - $smds{'q4'} = 'c'; # with time not supp by mysql (d) - $smds{'q5'} = 'b'; # with time not supp by mysql ('') - $smds{'q6'} = 'c'; # with time not supp by mysql ('') - $smds{'q7'} = 'c'; - $smds{'q8'} = 'f'; - $smds{'q9'} = 'c'; - $smds{'q10'} = 'b'; - $smds{'q11'} = 'b'; - $smds{'q12'} = 'd'; - $smds{'q13'} = 'c'; - $smds{'q14'} = 'd'; - $smds{'q15'} = 'd'; - $smds{'q16'} = 'a'; - $smds{'q17'} = 'c'; return $self; } @@ -1675,7 +1572,6 @@ sub new $self->{'cmp_name'} = "Informix"; $self->{'data_source'} = "DBI:Informix:$database"; $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "byte in table"; $self->{'text'} = "byte in table"; $self->{'double_quotes'} = 0; # Can handle: 'Walker''s' @@ -1888,7 +1784,6 @@ sub new $self->{'data_source'} .= ":$host"; } $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "blob"; $self->{'text'} = "blob"; # text ? $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' @@ -2071,7 +1966,6 @@ sub new $self->{'data_source'} .= ":$host"; } $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "text"; $self->{'text'} = "text"; $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' @@ -2264,7 +2158,6 @@ sub new $self->{'data_source'} .= ";hostname=$host"; } $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "text"; $self->{'text'} = "text"; $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' @@ -2497,7 +2390,6 @@ sub new $self->{'cmp_name'} = "Adabas"; $self->{'data_source'} = "DBI:Adabas:$database"; $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "long"; $self->{'text'} = "long"; $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' @@ -2549,24 +2441,6 @@ sub new $limits{'order_by_unused'} = 1; $limits{'working_all_fields'} = 1; - $smds{'time'} = 1; - $smds{'q1'} = 'b'; # with time not supp by mysql ('') - $smds{'q2'} = 'b'; - $smds{'q3'} = 'b'; # with time ('') - $smds{'q4'} = 'c'; # with time not supp by mysql (d) - $smds{'q5'} = 'b'; # with time not supp by mysql ('') - $smds{'q6'} = 'c'; # with time not supp by mysql ('') - $smds{'q7'} = 'c'; - $smds{'q8'} = 'f'; - $smds{'q9'} = 'c'; - $smds{'q10'} = 'b'; - $smds{'q11'} = 'b'; - $smds{'q12'} = 'd'; - $smds{'q13'} = 'c'; - $smds{'q14'} = 'd'; - $smds{'q15'} = 'd'; - $smds{'q16'} = 'a'; - $smds{'q17'} = 'c'; return $self; } @@ -2718,7 +2592,6 @@ sub new $self->{'data_source'} .= ":$host"; } $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "varchar(255)"; $self->{'text'} = "varchar(255)"; $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' @@ -2894,7 +2767,6 @@ sub new $self->{'cmp_name'} = "mimer"; $self->{'data_source'} = "DBI:mimer:$database:$host"; $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "binary varying(15000)"; $self->{'text'} = "character varying(15000)"; $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' @@ -2950,24 +2822,6 @@ sub new $limits{'order_by_unused'} = 1; $limits{'working_all_fields'} = 1; - $smds{'time'} = 1; - $smds{'q1'} = 'b'; # with time not supp by mysql ('') - $smds{'q2'} = 'b'; - $smds{'q3'} = 'b'; # with time ('') - $smds{'q4'} = 'c'; # with time not supp by mysql (d) - $smds{'q5'} = 'b'; # with time not supp by mysql ('') - $smds{'q6'} = 'c'; # with time not supp by mysql ('') - $smds{'q7'} = 'c'; - $smds{'q8'} = 'f'; - $smds{'q9'} = 'c'; - $smds{'q10'} = 'b'; - $smds{'q11'} = 'b'; - $smds{'q12'} = 'd'; - $smds{'q13'} = 'c'; - $smds{'q14'} = 'd'; - $smds{'q15'} = 'd'; - $smds{'q16'} = 'a'; - $smds{'q17'} = 'c'; return $self; } @@ -3112,7 +2966,6 @@ sub new $self->{'cmp_name'} = "interbase"; $self->{'data_source'} = "DBI:InterBase:database=$database:ib_dialect=3"; $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "blob"; $self->{'text'} = ""; $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' @@ -3166,24 +3019,6 @@ sub new $limits{'order_by_unused'} = 1; $limits{'working_all_fields'} = 1; - $smds{'time'} = 1; - $smds{'q1'} = 'b'; # with time not supp by mysql ('') - $smds{'q2'} = 'b'; - $smds{'q3'} = 'b'; # with time ('') - $smds{'q4'} = 'c'; # with time not supp by mysql (d) - $smds{'q5'} = 'b'; # with time not supp by mysql ('') - $smds{'q6'} = 'c'; # with time not supp by mysql ('') - $smds{'q7'} = 'c'; - $smds{'q8'} = 'f'; - $smds{'q9'} = 'c'; - $smds{'q10'} = 'b'; - $smds{'q11'} = 'b'; - $smds{'q12'} = 'd'; - $smds{'q13'} = 'c'; - $smds{'q14'} = 'd'; - $smds{'q15'} = 'd'; - $smds{'q16'} = 'a'; - $smds{'q17'} = 'c'; return $self; } @@ -3331,7 +3166,6 @@ sub new $self->{'cmp_name'} = "FrontBase"; $self->{'data_source'} = "DBI:FB:dbname=$database;host=$host"; $self->{'limits'} = \%limits; - $self->{'smds'} = \%smds; $self->{'blob'} = "varchar(8000000)"; $self->{'text'} = "varchar(8000000)"; $self->{'double_quotes'} = 1; # Can handle: 'Walker''s' diff --git a/sql/Makefile.am b/sql/Makefile.am index 81fe927ce5a..9cfdf4c4d9b 100644 --- a/sql/Makefile.am +++ b/sql/Makefile.am @@ -56,7 +56,7 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \ sql_select.h structs.h table.h sql_udf.h hash_filo.h\ lex.h lex_symbol.h sql_acl.h sql_crypt.h \ log_event.h mini_client.h sql_repl.h slave.h \ - stacktrace.h sql_sort.h sql_cache.h + stacktrace.h sql_sort.h sql_cache.h spatial.h gstream.h mysqld_SOURCES = sql_lex.cc sql_handler.cc \ item.cc item_sum.cc item_buff.cc item_func.cc \ item_cmpfunc.cc item_strfunc.cc item_timefunc.cc \ diff --git a/sql/field.cc b/sql/field.cc index a475612fbb0..462088d26a6 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -424,7 +424,7 @@ void Field_decimal::overflow(bool negative) } -void Field_decimal::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_decimal::store(const char *from,uint len,CHARSET_INFO *cs) { reg3 int i; uint tmp_dec; @@ -459,7 +459,7 @@ void Field_decimal::store(const char *from,uint len,CHARSET_INFO *cs) if (!error) current_thd->cuted_fields++; Field_decimal::overflow(1); - return; + return 1; } } } @@ -485,7 +485,7 @@ void Field_decimal::store(const char *from,uint len,CHARSET_INFO *cs) current_thd->cuted_fields++; // too big number, change to max or min number Field_decimal::overflow(decstr.sign && decstr.sign_char == '-'); - return; + return 1; } char *to=ptr; for (i=(int) (field_length-tmp_dec-decstr.nr_length-decstr.extra - decstr.sign) ; @@ -520,16 +520,17 @@ void Field_decimal::store(const char *from,uint len,CHARSET_INFO *cs) } } } + return (error) ? 1 : 0; } -void Field_decimal::store(double nr) +int Field_decimal::store(double nr) { if (unsigned_flag && nr < 0) { overflow(1); current_thd->cuted_fields++; - return; + return 1; } reg4 uint i,length; char fyllchar,*to; @@ -548,6 +549,7 @@ void Field_decimal::store(double nr) { overflow(nr < 0.0); current_thd->cuted_fields++; + return 1; } else { @@ -555,17 +557,18 @@ void Field_decimal::store(double nr) for (i=field_length-length ; i-- > 0 ;) *to++ = fyllchar; memcpy(to,buff,length); + return 0; } } -void Field_decimal::store(longlong nr) +int Field_decimal::store(longlong nr) { if (unsigned_flag && nr < 0) { overflow(1); current_thd->cuted_fields++; - return; + return 1; } char buff[22]; uint length=(uint) (longlong10_to_str(nr,buff,-10)-buff); @@ -575,6 +578,7 @@ void Field_decimal::store(longlong nr) { overflow(test(nr < 0L)); /* purecov: inspected */ current_thd->cuted_fields++; /* purecov: inspected */ + return 1; } else { @@ -588,6 +592,7 @@ void Field_decimal::store(longlong nr) to[length]='.'; bfill(to+length+1,dec,'0'); } + return 0; } } @@ -704,10 +709,11 @@ void Field_decimal::sql_type(String &res) const ** tiny int ****************************************************************************/ -void Field_tiny::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_tiny::store(const char *from,uint len,CHARSET_INFO *cs) { String tmp_str(from,len,default_charset_info); long tmp= strtol(tmp_str.c_ptr(),NULL,10); + int error=0; if (unsigned_flag) { @@ -715,14 +721,19 @@ void Field_tiny::store(const char *from,uint len,CHARSET_INFO *cs) { tmp=0; /* purecov: inspected */ current_thd->cuted_fields++; /* purecov: inspected */ + error = 1; } else if (tmp > 255) { tmp= 255; current_thd->cuted_fields++; + error = 1; } else if (current_thd->count_cuted_fields && !test_if_int(from,len)) + { current_thd->cuted_fields++; + error = 1; + } } else { @@ -730,21 +741,28 @@ void Field_tiny::store(const char *from,uint len,CHARSET_INFO *cs) { tmp= -128; current_thd->cuted_fields++; + error = 1; } else if (tmp >= 128) { tmp= 127; current_thd->cuted_fields++; + error = 1; } else if (current_thd->count_cuted_fields && !test_if_int(from,len)) + { current_thd->cuted_fields++; + error = 1; + } } ptr[0]= (char) tmp; + return error; } -void Field_tiny::store(double nr) +int Field_tiny::store(double nr) { + int error=0; nr=rint(nr); if (unsigned_flag) { @@ -752,11 +770,13 @@ void Field_tiny::store(double nr) { *ptr=0; current_thd->cuted_fields++; + error = 1; } else if (nr > 255.0) { *ptr=(char) 255; current_thd->cuted_fields++; + error = 1; } else *ptr=(char) nr; @@ -767,30 +787,36 @@ void Field_tiny::store(double nr) { *ptr= (char) -128; current_thd->cuted_fields++; + error = 1; } else if (nr > 127.0) { *ptr=127; current_thd->cuted_fields++; + error = 1; } else *ptr=(char) nr; } + return error; } -void Field_tiny::store(longlong nr) +int Field_tiny::store(longlong nr) { + int error=0; if (unsigned_flag) { if (nr < 0L) { *ptr=0; current_thd->cuted_fields++; + error = 1; } else if (nr > 255L) { *ptr= (char) 255; current_thd->cuted_fields++; + error = 1; } else *ptr=(char) nr; @@ -801,15 +827,18 @@ void Field_tiny::store(longlong nr) { *ptr= (char) -128; current_thd->cuted_fields++; + error = 1; } else if (nr > 127L) { *ptr=127; current_thd->cuted_fields++; + error = 1; } else *ptr=(char) nr; } + return error; } @@ -875,24 +904,30 @@ void Field_tiny::sql_type(String &res) const // Note: Sometimes this should be fixed to use one strtol() to use // len and check for garbage after number. -void Field_short::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_short::store(const char *from,uint len,CHARSET_INFO *cs) { String tmp_str(from,len,default_charset_info); long tmp= strtol(tmp_str.c_ptr(),NULL,10); + int error=0; if (unsigned_flag) { if (tmp < 0) { tmp=0; current_thd->cuted_fields++; + error = 1; } else if (tmp > (uint16) ~0) { tmp=(uint16) ~0; current_thd->cuted_fields++; + error = 1; } else if (current_thd->count_cuted_fields && !test_if_int(from,len)) + { current_thd->cuted_fields++; + error = 1; + } } else { @@ -900,14 +935,19 @@ void Field_short::store(const char *from,uint len,CHARSET_INFO *cs) { tmp= INT_MIN16; current_thd->cuted_fields++; + error = 1; } else if (tmp > INT_MAX16) { tmp=INT_MAX16; current_thd->cuted_fields++; + error = 1; } else if (current_thd->count_cuted_fields && !test_if_int(from,len)) + { current_thd->cuted_fields++; + error = 1; + } } #ifdef WORDS_BIGENDIAN if (table->db_low_byte_first) @@ -917,11 +957,13 @@ void Field_short::store(const char *from,uint len,CHARSET_INFO *cs) else #endif shortstore(ptr,(short) tmp); + return error; } -void Field_short::store(double nr) +int Field_short::store(double nr) { + int error=0; int16 res; nr=rint(nr); if (unsigned_flag) @@ -930,11 +972,13 @@ void Field_short::store(double nr) { res=0; current_thd->cuted_fields++; + error = 1; } else if (nr > (double) (uint16) ~0) { res=(int16) (uint16) ~0; current_thd->cuted_fields++; + error = 1; } else res=(int16) (uint16) nr; @@ -945,11 +989,13 @@ void Field_short::store(double nr) { res=INT_MIN16; current_thd->cuted_fields++; + error = 1; } else if (nr > (double) INT_MAX16) { res=INT_MAX16; current_thd->cuted_fields++; + error = 1; } else res=(int16) nr; @@ -962,10 +1008,12 @@ void Field_short::store(double nr) else #endif shortstore(ptr,res); + return error; } -void Field_short::store(longlong nr) +int Field_short::store(longlong nr) { + int error=0; int16 res; if (unsigned_flag) { @@ -973,11 +1021,13 @@ void Field_short::store(longlong nr) { res=0; current_thd->cuted_fields++; + error = 1; } else if (nr > (longlong) (uint16) ~0) { res=(int16) (uint16) ~0; current_thd->cuted_fields++; + error = 1; } else res=(int16) (uint16) nr; @@ -988,11 +1038,13 @@ void Field_short::store(longlong nr) { res=INT_MIN16; current_thd->cuted_fields++; + error = 1; } else if (nr > INT_MAX16) { res=INT_MAX16; current_thd->cuted_fields++; + error = 1; } else res=(int16) nr; @@ -1005,6 +1057,7 @@ void Field_short::store(longlong nr) else #endif shortstore(ptr,res); + return error; } @@ -1115,10 +1168,11 @@ void Field_short::sql_type(String &res) const // Note: Sometimes this should be fixed to use one strtol() to use // len and check for garbage after number. -void Field_medium::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_medium::store(const char *from,uint len,CHARSET_INFO *cs) { String tmp_str(from,len,default_charset_info); long tmp= strtol(tmp_str.c_ptr(),NULL,10); + int error=0; if (unsigned_flag) { @@ -1126,14 +1180,19 @@ void Field_medium::store(const char *from,uint len,CHARSET_INFO *cs) { tmp=0; current_thd->cuted_fields++; + error = 1; } else if (tmp >= (long) (1L << 24)) { tmp=(long) (1L << 24)-1L; current_thd->cuted_fields++; + error = 1; } else if (current_thd->count_cuted_fields && !test_if_int(from,len)) + { current_thd->cuted_fields++; + error = 1; + } } else { @@ -1141,22 +1200,29 @@ void Field_medium::store(const char *from,uint len,CHARSET_INFO *cs) { tmp= INT_MIN24; current_thd->cuted_fields++; + error = 1; } else if (tmp > INT_MAX24) { tmp=INT_MAX24; current_thd->cuted_fields++; + error = 1; } else if (current_thd->count_cuted_fields && !test_if_int(from,len)) + { current_thd->cuted_fields++; + error = 1; + } } int3store(ptr,tmp); + return error; } -void Field_medium::store(double nr) +int Field_medium::store(double nr) { + int error=0; nr=rint(nr); if (unsigned_flag) { @@ -1164,12 +1230,14 @@ void Field_medium::store(double nr) { int3store(ptr,0); current_thd->cuted_fields++; + error = 1; } else if (nr >= (double) (long) (1L << 24)) { uint32 tmp=(uint32) (1L << 24)-1L; int3store(ptr,tmp); current_thd->cuted_fields++; + error = 1; } else int3store(ptr,(uint32) nr); @@ -1181,32 +1249,38 @@ void Field_medium::store(double nr) long tmp=(long) INT_MIN24; int3store(ptr,tmp); current_thd->cuted_fields++; + error = 1; } else if (nr > (double) INT_MAX24) { long tmp=(long) INT_MAX24; int3store(ptr,tmp); current_thd->cuted_fields++; + error = 1; } else int3store(ptr,(long) nr); } + return error; } -void Field_medium::store(longlong nr) +int Field_medium::store(longlong nr) { + int error=0; if (unsigned_flag) { if (nr < 0L) { int3store(ptr,0); current_thd->cuted_fields++; + error = 1; } else if (nr >= (longlong) (long) (1L << 24)) { long tmp=(long) (1L << 24)-1L;; int3store(ptr,tmp); current_thd->cuted_fields++; + error = 1; } else int3store(ptr,(uint32) nr); @@ -1218,16 +1292,19 @@ void Field_medium::store(longlong nr) long tmp=(long) INT_MIN24; int3store(ptr,tmp); current_thd->cuted_fields++; + error = 1; } else if (nr > (longlong) INT_MAX24) { long tmp=(long) INT_MAX24; int3store(ptr,tmp); current_thd->cuted_fields++; + error = 1; } else int3store(ptr,(long) nr); } + return error; } @@ -1300,13 +1377,14 @@ void Field_medium::sql_type(String &res) const // Note: Sometimes this should be fixed to use one strtol() to use // len and check for garbage after number. -void Field_long::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_long::store(const char *from,uint len,CHARSET_INFO *cs) { while (len && my_isspace(system_charset_info,*from)) { len--; from++; } long tmp; + int error=0; String tmp_str(from,len,default_charset_info); errno=0; if (unsigned_flag) @@ -1315,6 +1393,7 @@ void Field_long::store(const char *from,uint len,CHARSET_INFO *cs) { tmp=0; // Set negative to 0 errno=ERANGE; + error = 1; } else tmp=(long) strtoul(tmp_str.c_ptr(),NULL,10); @@ -1322,7 +1401,10 @@ void Field_long::store(const char *from,uint len,CHARSET_INFO *cs) else tmp=strtol(tmp_str.c_ptr(),NULL,10); if (errno || current_thd->count_cuted_fields && !test_if_int(from,len)) + { current_thd->cuted_fields++; + error = 1; + } #ifdef WORDS_BIGENDIAN if (table->db_low_byte_first) { @@ -1331,11 +1413,13 @@ void Field_long::store(const char *from,uint len,CHARSET_INFO *cs) else #endif longstore(ptr,tmp); + return error; } -void Field_long::store(double nr) +int Field_long::store(double nr) { + int error=0; int32 res; nr=rint(nr); if (unsigned_flag) @@ -1344,11 +1428,13 @@ void Field_long::store(double nr) { res=0; current_thd->cuted_fields++; + error = 1; } else if (nr > (double) (ulong) ~0L) { res=(int32) (uint32) ~0L; current_thd->cuted_fields++; + error = 1; } else res=(int32) (ulong) nr; @@ -1359,11 +1445,13 @@ void Field_long::store(double nr) { res=(int32) INT_MIN32; current_thd->cuted_fields++; + error = 1; } else if (nr > (double) INT_MAX32) { res=(int32) INT_MAX32; current_thd->cuted_fields++; + error = 1; } else res=(int32) nr; @@ -1376,11 +1464,13 @@ void Field_long::store(double nr) else #endif longstore(ptr,res); + return error; } -void Field_long::store(longlong nr) +int Field_long::store(longlong nr) { + int error=0; int32 res; if (unsigned_flag) { @@ -1388,11 +1478,13 @@ void Field_long::store(longlong nr) { res=0; current_thd->cuted_fields++; + error = 1; } else if (nr >= (LL(1) << 32)) { res=(int32) (uint32) ~0L; current_thd->cuted_fields++; + error = 1; } else res=(int32) (uint32) nr; @@ -1403,11 +1495,13 @@ void Field_long::store(longlong nr) { res=(int32) INT_MIN32; current_thd->cuted_fields++; + error = 1; } else if (nr > (longlong) INT_MAX32) { res=(int32) INT_MAX32; current_thd->cuted_fields++; + error = 1; } else res=(int32) nr; @@ -1420,6 +1514,7 @@ void Field_long::store(longlong nr) else #endif longstore(ptr,res); + return error; } @@ -1528,7 +1623,7 @@ void Field_long::sql_type(String &res) const ** longlong int ****************************************************************************/ -void Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) { while (len && my_isspace(system_charset_info,*from)) { // For easy error check @@ -1536,6 +1631,7 @@ void Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) } longlong tmp; String tmp_str(from,len,default_charset_info); + int error=0; errno=0; if (unsigned_flag) { @@ -1543,6 +1639,7 @@ void Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) { tmp=0; // Set negative to 0 errno=ERANGE; + error = 1; } else tmp=(longlong) strtoull(tmp_str.c_ptr(),NULL,10); @@ -1550,7 +1647,10 @@ void Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) else tmp=strtoll(tmp_str.c_ptr(),NULL,10); if (errno || current_thd->count_cuted_fields && !test_if_int(from,len)) + { current_thd->cuted_fields++; + error = 1; + } #ifdef WORDS_BIGENDIAN if (table->db_low_byte_first) { @@ -1559,11 +1659,13 @@ void Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs) else #endif longlongstore(ptr,tmp); + return error; } -void Field_longlong::store(double nr) +int Field_longlong::store(double nr) { + int error=0; longlong res; nr=rint(nr); if (unsigned_flag) @@ -1572,11 +1674,13 @@ void Field_longlong::store(double nr) { res=0; current_thd->cuted_fields++; + error = 1; } else if (nr >= (double) ~ (ulonglong) 0) { res= ~(longlong) 0; current_thd->cuted_fields++; + error = 1; } else res=(longlong) (ulonglong) nr; @@ -1587,11 +1691,13 @@ void Field_longlong::store(double nr) { res=(longlong) LONGLONG_MIN; current_thd->cuted_fields++; + error = 1; } else if (nr >= (double) LONGLONG_MAX) { res=(longlong) LONGLONG_MAX; current_thd->cuted_fields++; + error = 1; } else res=(longlong) nr; @@ -1604,10 +1710,11 @@ void Field_longlong::store(double nr) else #endif longlongstore(ptr,res); + return error; } -void Field_longlong::store(longlong nr) +int Field_longlong::store(longlong nr) { #ifdef WORDS_BIGENDIAN if (table->db_low_byte_first) @@ -1617,6 +1724,7 @@ void Field_longlong::store(longlong nr) else #endif longlongstore(ptr,nr); + return 0; } @@ -1735,35 +1843,43 @@ void Field_longlong::sql_type(String &res) const ** single precision float ****************************************************************************/ -void Field_float::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_float::store(const char *from,uint len,CHARSET_INFO *cs) { String tmp_str(from,len,default_charset_info); errno=0; Field_float::store(atof(tmp_str.c_ptr())); if (errno || current_thd->count_cuted_fields && !test_if_real(from,len)) + { current_thd->cuted_fields++; + return 1; + } + return (errno) ? 1 : 0; } -void Field_float::store(double nr) +int Field_float::store(double nr) { float j; + int error=0; if (dec < NOT_FIXED_DEC) nr=floor(nr*log_10[dec]+0.5)/log_10[dec]; // To fixed point if (unsigned_flag && nr < 0) { current_thd->cuted_fields++; nr=0; + error = 1; } if (nr < -FLT_MAX) { j= -FLT_MAX; current_thd->cuted_fields++; + error = 1; } else if (nr > FLT_MAX) { j=FLT_MAX; current_thd->cuted_fields++; + error = 1; } else j= (float) nr; @@ -1775,16 +1891,19 @@ void Field_float::store(double nr) else #endif memcpy_fixed(ptr,(byte*) &j,sizeof(j)); + return error; } -void Field_float::store(longlong nr) +int Field_float::store(longlong nr) { + int error=0; float j= (float) nr; if (unsigned_flag && j < 0) { current_thd->cuted_fields++; j=0; + error = 1; } #ifdef WORDS_BIGENDIAN if (table->db_low_byte_first) @@ -1794,6 +1913,7 @@ void Field_float::store(longlong nr) else #endif memcpy_fixed(ptr,(byte*) &j,sizeof(j)); + return error; } @@ -1985,17 +2105,22 @@ void Field_float::sql_type(String &res) const ** double precision floating point numbers ****************************************************************************/ -void Field_double::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_double::store(const char *from,uint len,CHARSET_INFO *cs) { String tmp_str(from,len,default_charset_info); errno=0; + int error=0; double j= atof(tmp_str.c_ptr()); if (errno || current_thd->count_cuted_fields && !test_if_real(from,len)) + { current_thd->cuted_fields++; + error = 1; + } if (unsigned_flag && j < 0) { current_thd->cuted_fields++; j=0; + error = 1; } #ifdef WORDS_BIGENDIAN if (table->db_low_byte_first) @@ -2005,17 +2130,20 @@ void Field_double::store(const char *from,uint len,CHARSET_INFO *cs) else #endif doublestore(ptr,j); + return error; } -void Field_double::store(double nr) +int Field_double::store(double nr) { + int error=0; if (dec < NOT_FIXED_DEC) nr=floor(nr*log_10[dec]+0.5)/log_10[dec]; // To fixed point if (unsigned_flag && nr < 0) { current_thd->cuted_fields++; nr=0; + error = 1; } #ifdef WORDS_BIGENDIAN if (table->db_low_byte_first) @@ -2025,15 +2153,18 @@ void Field_double::store(double nr) else #endif doublestore(ptr,nr); + return error; } -void Field_double::store(longlong nr) +int Field_double::store(longlong nr) { double j= (double) nr; + int error=0; if (unsigned_flag && j < 0) { current_thd->cuted_fields++; + error = 1; j=0; } #ifdef WORDS_BIGENDIAN @@ -2044,6 +2175,7 @@ void Field_double::store(longlong nr) else #endif doublestore(ptr,j); + return error; } @@ -2241,7 +2373,7 @@ Field_timestamp::Field_timestamp(char *ptr_arg, uint32 len_arg, } -void Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs) { long tmp=(long) str_to_timestamp(from,len); #ifdef WORDS_BIGENDIAN @@ -2252,9 +2384,10 @@ void Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs) else #endif longstore(ptr,tmp); + return 0; } -void Field_timestamp::fill_and_store(char *from,uint len) +void Field_timestamp::fill_and_store(char *from,uint len) { uint res_length; if (len <= field_length) @@ -2283,14 +2416,17 @@ void Field_timestamp::fill_and_store(char *from,uint len) } -void Field_timestamp::store(double nr) +int Field_timestamp::store(double nr) { + int error=0; if (nr < 0 || nr > 99991231235959.0) { nr=0; // Avoid overflow on buff current_thd->cuted_fields++; + error = 1; } - Field_timestamp::store((longlong) rint(nr)); + error |= Field_timestamp::store((longlong) rint(nr)); + return error; } @@ -2331,7 +2467,7 @@ static longlong fix_datetime(longlong nr) } -void Field_timestamp::store(longlong nr) +int Field_timestamp::store(longlong nr) { TIME l_time; time_t timestamp; @@ -2359,6 +2495,7 @@ void Field_timestamp::store(longlong nr) else #endif longstore(ptr,(uint32) timestamp); + return 0; } @@ -2580,12 +2717,16 @@ void Field_timestamp::set_time() ** Stored as a 3 byte unsigned int ****************************************************************************/ -void Field_time::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_time::store(const char *from,uint len,CHARSET_INFO *cs) { TIME ltime; long tmp; + int error=0; if (str_to_time(from,len,<ime)) + { tmp=0L; + error = 1; + } else { if (ltime.month) @@ -2595,26 +2736,31 @@ void Field_time::store(const char *from,uint len,CHARSET_INFO *cs) { tmp=8385959; current_thd->cuted_fields++; + error = 1; } } if (ltime.neg) tmp= -tmp; - Field_time::store((longlong) tmp); + error |= Field_time::store((longlong) tmp); + return error; } -void Field_time::store(double nr) +int Field_time::store(double nr) { long tmp; + int error=0; if (nr > 8385959.0) { tmp=8385959L; current_thd->cuted_fields++; + error = 1; } else if (nr < -8385959.0) { tmp= -8385959L; current_thd->cuted_fields++; + error = 1; } else { @@ -2625,24 +2771,29 @@ void Field_time::store(double nr) { tmp=0; current_thd->cuted_fields++; + error = 1; } } int3store(ptr,tmp); + return error; } -void Field_time::store(longlong nr) +int Field_time::store(longlong nr) { long tmp; + int error=0; if (nr > (longlong) 8385959L) { tmp=8385959L; current_thd->cuted_fields++; + error = 1; } else if (nr < (longlong) -8385959L) { tmp= -8385959L; current_thd->cuted_fields++; + error = 1; } else { @@ -2651,9 +2802,11 @@ void Field_time::store(longlong nr) { tmp=0; current_thd->cuted_fields++; + error = 1; } } int3store(ptr,tmp); + return error; } @@ -2729,7 +2882,7 @@ void Field_time::sql_type(String &res) const ** Can handle 2 byte or 4 byte years! ****************************************************************************/ -void Field_year::store(const char *from, uint len,CHARSET_INFO *cs) +int Field_year::store(const char *from, uint len,CHARSET_INFO *cs) { String tmp_str(from,len,default_charset_info); long nr= strtol(tmp_str.c_ptr(),NULL,10); @@ -2738,7 +2891,7 @@ void Field_year::store(const char *from, uint len,CHARSET_INFO *cs) { *ptr=0; current_thd->cuted_fields++; - return; + return 1; } else if (current_thd->count_cuted_fields && !test_if_int(from,len)) current_thd->cuted_fields++; @@ -2750,23 +2903,27 @@ void Field_year::store(const char *from, uint len,CHARSET_INFO *cs) nr-= 1900; } *ptr= (char) (unsigned char) nr; + return 0; } -void Field_year::store(double nr) +int Field_year::store(double nr) { if (nr < 0.0 || nr >= 2155.0) - Field_year::store((longlong) -1); + { + (void) Field_year::store((longlong) -1); + return 1; + } else - Field_year::store((longlong) nr); + return Field_year::store((longlong) nr); } -void Field_year::store(longlong nr) +int Field_year::store(longlong nr) { if (nr < 0 || nr >= 100 && nr <= 1900 || nr > 2155) { *ptr=0; current_thd->cuted_fields++; - return; + return 1; } if (nr != 0 || field_length != 4) // 0000 -> 0; 00 -> 2000 { @@ -2776,6 +2933,7 @@ void Field_year::store(longlong nr) nr-= 1900; } *ptr= (char) (unsigned char) nr; + return 0; } @@ -2818,12 +2976,16 @@ void Field_year::sql_type(String &res) const ** Stored as a 4 byte unsigned int ****************************************************************************/ -void Field_date::store(const char *from, uint len,CHARSET_INFO *cs) +int Field_date::store(const char *from, uint len,CHARSET_INFO *cs) { TIME l_time; uint32 tmp; + int error=0; if (str_to_TIME(from,len,&l_time,1) == TIMESTAMP_NONE) + { tmp=0; + error = 1; + } else tmp=(uint32) l_time.year*10000L + (uint32) (l_time.month*100+l_time.day); #ifdef WORDS_BIGENDIAN @@ -2834,18 +2996,21 @@ void Field_date::store(const char *from, uint len,CHARSET_INFO *cs) else #endif longstore(ptr,tmp); + return error; } -void Field_date::store(double nr) +int Field_date::store(double nr) { long tmp; + int error=0; if (nr >= 19000000000000.0 && nr <= 99991231235959.0) nr=floor(nr/1000000.0); // Timestamp to date if (nr < 0.0 || nr > 99991231.0) { tmp=0L; current_thd->cuted_fields++; + error = 1; } else tmp=(long) rint(nr); @@ -2857,18 +3022,21 @@ void Field_date::store(double nr) else #endif longstore(ptr,tmp); + return error; } -void Field_date::store(longlong nr) +int Field_date::store(longlong nr) { long tmp; + int error=0; if (nr >= LL(19000000000000) && nr < LL(99991231235959)) nr=nr/LL(1000000); // Timestamp to date if (nr < 0 || nr > LL(99991231)) { tmp=0L; current_thd->cuted_fields++; + error = 1; } else tmp=(long) nr; @@ -2880,6 +3048,7 @@ void Field_date::store(longlong nr) else #endif longstore(ptr,tmp); + return error; } @@ -2975,35 +3144,45 @@ void Field_date::sql_type(String &res) const ** In number context: YYYYMMDD ****************************************************************************/ -void Field_newdate::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_newdate::store(const char *from,uint len,CHARSET_INFO *cs) { TIME l_time; long tmp; + int error=0; if (str_to_TIME(from,len,&l_time,1) == TIMESTAMP_NONE) + { tmp=0L; + error = 1; + } else tmp= l_time.day + l_time.month*32 + l_time.year*16*32; int3store(ptr,tmp); + return error; } -void Field_newdate::store(double nr) +int Field_newdate::store(double nr) { if (nr < 0.0 || nr > 99991231235959.0) - Field_newdate::store((longlong) -1); + { + (void) Field_newdate::store((longlong) -1); + return 1; + } else - Field_newdate::store((longlong) rint(nr)); + return Field_newdate::store((longlong) rint(nr)); } -void Field_newdate::store(longlong nr) +int Field_newdate::store(longlong nr) { int32 tmp; + int error=0; if (nr >= LL(100000000) && nr <= LL(99991231235959)) nr=nr/LL(1000000); // Timestamp to date if (nr < 0L || nr > 99991231L) { tmp=0; current_thd->cuted_fields++; + error = 1; } else { @@ -3021,11 +3200,13 @@ void Field_newdate::store(longlong nr) { tmp=0L; // Don't allow date to change current_thd->cuted_fields++; + error = 1; } else tmp= day + month*32 + (tmp/10000)*16*32; } int3store(ptr,(int32) tmp); + return error; } void Field_newdate::store_time(TIME *ltime,timestamp_type type) @@ -3128,7 +3309,7 @@ void Field_newdate::sql_type(String &res) const ** Stored as a 8 byte unsigned int. Should sometimes be change to a 6 byte int. ****************************************************************************/ -void Field_datetime::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_datetime::store(const char *from,uint len,CHARSET_INFO *cs) { longlong tmp=str_to_datetime(from,len,1); #ifdef WORDS_BIGENDIAN @@ -3139,26 +3320,32 @@ void Field_datetime::store(const char *from,uint len,CHARSET_INFO *cs) else #endif longlongstore(ptr,tmp); + return 0; } -void Field_datetime::store(double nr) +int Field_datetime::store(double nr) { + int error=0; if (nr < 0.0 || nr > 99991231235959.0) { nr=0.0; current_thd->cuted_fields++; + error = 1; } - Field_datetime::store((longlong) rint(nr)); + error |= Field_datetime::store((longlong) rint(nr)); + return error; } -void Field_datetime::store(longlong nr) +int Field_datetime::store(longlong nr) { + int error=0; if (nr < 0 || nr > LL(99991231235959)) { nr=0; current_thd->cuted_fields++; + error = 1; } else nr=fix_datetime(nr); @@ -3170,6 +3357,7 @@ void Field_datetime::store(longlong nr) else #endif longlongstore(ptr,nr); + return error; } void Field_datetime::store_time(TIME *ltime,timestamp_type type) @@ -3344,9 +3532,10 @@ void Field_datetime::sql_type(String &res) const /* Copy a string and fill with space */ -void Field_string::store(const char *from,uint length,CHARSET_INFO *cs) +int Field_string::store(const char *from,uint length,CHARSET_INFO *cs) { field_charset=cs; + int error=0; #ifdef USE_TIS620 if(!binary_flag) { ThNormalize((uchar *)ptr, field_length, (uchar *)from, length); @@ -3372,30 +3561,32 @@ void Field_string::store(const char *from,uint length,CHARSET_INFO *cs) if (!my_isspace(field_charset,*from)) { current_thd->cuted_fields++; + error=1; break; } } } } #endif /* USE_TIS620 */ + return error; } -void Field_string::store(double nr) +int Field_string::store(double nr) { char buff[MAX_FIELD_WIDTH],*end; int width=min(field_length,DBL_DIG+5); sprintf(buff,"%-*.*g",width,max(width-5,0),nr); end=strcend(buff,' '); - Field_string::store(buff,(uint) (end - buff), default_charset_info); + return Field_string::store(buff,(uint) (end - buff), default_charset_info); } -void Field_string::store(longlong nr) +int Field_string::store(longlong nr) { char buff[22]; char *end=longlong10_to_str(nr,buff,-10); - Field_string::store(buff,(uint) (end-buff), default_charset_info); + return Field_string::store(buff,(uint) (end-buff), default_charset_info); } @@ -3554,8 +3745,9 @@ uint Field_string::max_packed_col_length(uint max_length) ****************************************************************************/ -void Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs) +int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs) { + int error=0; field_charset=cs; #ifdef USE_TIS620 if(!binary_flag) @@ -3572,27 +3764,29 @@ void Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs) length=field_length; memcpy(ptr+2,from,field_length); current_thd->cuted_fields++; + error = 1; } #endif /* USE_TIS620 */ int2store(ptr,length); + return error; } -void Field_varstring::store(double nr) +int Field_varstring::store(double nr) { char buff[MAX_FIELD_WIDTH],*end; int width=min(field_length,DBL_DIG+5); sprintf(buff,"%-*.*g",width,max(width-5,0),nr); end=strcend(buff,' '); - Field_varstring::store(buff,(uint) (end - buff), default_charset_info); + return Field_varstring::store(buff,(uint) (end - buff), default_charset_info); } -void Field_varstring::store(longlong nr) +int Field_varstring::store(longlong nr) { char buff[22]; char *end=longlong10_to_str(nr,buff,-10); - Field_varstring::store(buff,(uint) (end-buff), default_charset_info); + return Field_varstring::store(buff,(uint) (end-buff), default_charset_info); } @@ -3877,7 +4071,7 @@ uint32 Field_blob::get_length(const char *pos) } -void Field_blob::store(const char *from,uint len,CHARSET_INFO *cs) +int Field_blob::store(const char *from,uint len,CHARSET_INFO *cs) { field_charset=cs; if (!len) @@ -3911,20 +4105,21 @@ void Field_blob::store(const char *from,uint len,CHARSET_INFO *cs) } bmove(ptr+packlength,(char*) &from,sizeof(char*)); } + return 0; } -void Field_blob::store(double nr) +int Field_blob::store(double nr) { value.set(nr); - Field_blob::store(value.ptr(),(uint) value.length(), default_charset_info); + return Field_blob::store(value.ptr(),(uint) value.length(), default_charset_info); } -void Field_blob::store(longlong nr) +int Field_blob::store(longlong nr) { value.set(nr); - Field_blob::store(value.ptr(), (uint) value.length(), default_charset_info); + return Field_blob::store(value.ptr(), (uint) value.length(), default_charset_info); } @@ -4071,7 +4266,7 @@ void Field_blob::get_key_image(char *buff,uint length, imagetype type) void Field_blob::set_key_image(char *buff,uint length) { length=uint2korr(buff); - Field_blob::store(buff+2,length, default_charset_info); + (void) Field_blob::store(buff+2,length, default_charset_info); } void Field_geom::get_key_image(char *buff,uint length, imagetype type) @@ -4392,8 +4587,9 @@ uint find_enum(TYPELIB *lib,const char *x, uint length) ** (if there isn't a empty value in the enum) */ -void Field_enum::store(const char *from,uint length,CHARSET_INFO *cs) +int Field_enum::store(const char *from,uint length,CHARSET_INFO *cs) { + int error=0; uint tmp=find_enum(typelib,from,length); if (!tmp) { @@ -4413,29 +4609,34 @@ void Field_enum::store(const char *from,uint length,CHARSET_INFO *cs) { tmp=0; current_thd->cuted_fields++; + error=1; } } else current_thd->cuted_fields++; } store_type((ulonglong) tmp); + return error; } -void Field_enum::store(double nr) +int Field_enum::store(double nr) { - Field_enum::store((longlong) nr); + return Field_enum::store((longlong) nr); } -void Field_enum::store(longlong nr) +int Field_enum::store(longlong nr) { + int error=0; if ((uint) nr > typelib->count || nr == 0) { current_thd->cuted_fields++; nr=0; + error=1; } store_type((ulonglong) (uint) nr); + return error; } @@ -4583,8 +4784,9 @@ ulonglong find_set(TYPELIB *lib,const char *x,uint length) } -void Field_set::store(const char *from,uint length,CHARSET_INFO *cs) +int Field_set::store(const char *from,uint length,CHARSET_INFO *cs) { + int error=0; ulonglong tmp=find_set(typelib,from,length); if (!tmp && length && length < 22) { @@ -4600,23 +4802,30 @@ void Field_set::store(const char *from,uint length,CHARSET_INFO *cs) tmp=strtoull(conv,&end,10); if (my_errno || end != conv+length || tmp > (ulonglong) (((longlong) 1 << typelib->count) - (longlong) 1)) + { tmp=0; + error=1; + } else current_thd->cuted_fields--; // Remove warning from find_set } store_type(tmp); + return error; } -void Field_set::store(longlong nr) +int Field_set::store(longlong nr) { + int error=0; if ((ulonglong) nr > (ulonglong) (((longlong) 1 << typelib->count) - (longlong) 1)) { nr&= (longlong) (((longlong) 1 << typelib->count) - (longlong) 1); current_thd->cuted_fields++; + error=1; } store_type((ulonglong) nr); + return error; } diff --git a/sql/field.h b/sql/field.h index 5bc463af48d..88187b2b7aa 100644 --- a/sql/field.h +++ b/sql/field.h @@ -60,9 +60,9 @@ public: utype unireg_check_arg, const char *field_name_arg, struct st_table *table_arg); virtual ~Field() {} - virtual void store(const char *to,uint length,CHARSET_INFO *cs)=0; - virtual void store(double nr)=0; - virtual void store(longlong nr)=0; + virtual int store(const char *to,uint length,CHARSET_INFO *cs)=0; + virtual int store(double nr)=0; + virtual int store(longlong nr)=0; virtual void store_time(TIME *ltime,timestamp_type t_type); virtual double val_real(void)=0; virtual longlong val_int(void)=0; @@ -281,9 +281,9 @@ public: enum ha_base_keytype key_type() const { return zerofill ? HA_KEYTYPE_BINARY : HA_KEYTYPE_NUM; } void reset(void); - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); double val_real(void); longlong val_int(void); String *val_str(String*,String *); @@ -310,9 +310,9 @@ public: enum_field_types type() const { return FIELD_TYPE_TINY;} enum ha_base_keytype key_type() const { return unsigned_flag ? HA_KEYTYPE_BINARY : HA_KEYTYPE_INT8; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset(void) { ptr[0]=0; } double val_real(void); longlong val_int(void); @@ -339,9 +339,9 @@ public: enum_field_types type() const { return FIELD_TYPE_SHORT;} enum ha_base_keytype key_type() const { return unsigned_flag ? HA_KEYTYPE_USHORT_INT : HA_KEYTYPE_SHORT_INT;} - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset(void) { ptr[0]=ptr[1]=0; } double val_real(void); longlong val_int(void); @@ -368,9 +368,9 @@ public: enum_field_types type() const { return FIELD_TYPE_INT24;} enum ha_base_keytype key_type() const { return unsigned_flag ? HA_KEYTYPE_UINT24 : HA_KEYTYPE_INT24; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset(void) { ptr[0]=ptr[1]=ptr[2]=0; } double val_real(void); longlong val_int(void); @@ -402,9 +402,9 @@ public: enum_field_types type() const { return FIELD_TYPE_LONG;} enum ha_base_keytype key_type() const { return unsigned_flag ? HA_KEYTYPE_ULONG_INT : HA_KEYTYPE_LONG_INT; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; } double val_real(void); longlong val_int(void); @@ -438,9 +438,9 @@ public: enum_field_types type() const { return FIELD_TYPE_LONGLONG;} enum ha_base_keytype key_type() const { return unsigned_flag ? HA_KEYTYPE_ULONGLONG : HA_KEYTYPE_LONGLONG; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=ptr[4]=ptr[5]=ptr[6]=ptr[7]=0; } double val_real(void); longlong val_int(void); @@ -465,9 +465,9 @@ public: {} enum_field_types type() const { return FIELD_TYPE_FLOAT;} enum ha_base_keytype key_type() const { return HA_KEYTYPE_FLOAT; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset(void) { bzero(ptr,sizeof(float)); } double val_real(void); longlong val_int(void); @@ -497,9 +497,9 @@ public: {} enum_field_types type() const { return FIELD_TYPE_DOUBLE;} enum ha_base_keytype key_type() const { return HA_KEYTYPE_DOUBLE; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset(void) { bzero(ptr,sizeof(double)); } double val_real(void); longlong val_int(void); @@ -523,9 +523,9 @@ public: unireg_check_arg, field_name_arg, table_arg, default_charset_info) {} enum_field_types type() const { return FIELD_TYPE_NULL;} - void store(const char *to, uint length, CHARSET_INFO *cs) { null[0]=1; } - void store(double nr) { null[0]=1; } - void store(longlong nr) { null[0]=1; } + int store(const char *to, uint length, CHARSET_INFO *cs) { null[0]=1; return 0; } + int store(double nr) { null[0]=1; return 0; } + int store(longlong nr) { null[0]=1; return 0; } void reset(void) {} double val_real(void) { return 0.0;} longlong val_int(void) { return 0;} @@ -547,9 +547,9 @@ public: enum Item_result result_type () const { return field_length == 8 || field_length == 14 ? INT_RESULT : STRING_RESULT; } enum_field_types type() const { return FIELD_TYPE_TIMESTAMP;} enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; } double val_real(void); longlong val_int(void); @@ -587,9 +587,9 @@ public: unireg_check_arg, field_name_arg, table_arg, 1, 1) {} enum_field_types type() const { return FIELD_TYPE_YEAR;} - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); double val_real(void); longlong val_int(void); String *val_str(String*,String *); @@ -612,9 +612,9 @@ public: enum_field_types type() const { return FIELD_TYPE_DATE;} enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONG_INT; } enum Item_result cmp_type () const { return INT_RESULT; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=0; } double val_real(void); longlong val_int(void); @@ -639,9 +639,9 @@ public: enum_field_types real_type() const { return FIELD_TYPE_NEWDATE; } enum ha_base_keytype key_type() const { return HA_KEYTYPE_UINT24; } enum Item_result cmp_type () const { return INT_RESULT; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void store_time(TIME *ltime,timestamp_type type); void reset(void) { ptr[0]=ptr[1]=ptr[2]=0; } double val_real(void); @@ -673,9 +673,9 @@ public: enum_field_types type() const { return FIELD_TYPE_TIME;} enum ha_base_keytype key_type() const { return HA_KEYTYPE_INT24; } enum Item_result cmp_type () const { return INT_RESULT; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset(void) { ptr[0]=ptr[1]=ptr[2]=0; } double val_real(void); longlong val_int(void); @@ -707,9 +707,9 @@ public: enum ha_base_keytype key_type() const { return HA_KEYTYPE_ULONGLONG; } #endif enum Item_result cmp_type () const { return INT_RESULT; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void store_time(TIME *ltime,timestamp_type type); void reset(void) { ptr[0]=ptr[1]=ptr[2]=ptr[3]=ptr[4]=ptr[5]=ptr[6]=ptr[7]=0; } double val_real(void); @@ -761,9 +761,9 @@ public: bool zero_pack() const { return 0; } bool binary() const { return binary_flag; } void reset(void) { bfill(ptr,field_length,' '); } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); double val_real(void); longlong val_int(void); String *val_str(String*,String *); @@ -813,9 +813,9 @@ public: void reset(void) { bzero(ptr,field_length+2); } uint32 pack_length() const { return (uint32) field_length+2; } uint32 key_length() const { return (uint32) field_length; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); double val_real(void); longlong val_int(void); String *val_str(String*,String *); @@ -856,9 +856,9 @@ public: enum_field_types type() const { return FIELD_TYPE_BLOB;} enum ha_base_keytype key_type() const { return binary_flag ? HA_KEYTYPE_VARBINARY : HA_KEYTYPE_VARTEXT; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); double val_real(void); longlong val_int(void); String *val_str(String*,String *); @@ -962,9 +962,9 @@ public: enum_field_types type() const { return FIELD_TYPE_STRING; } enum Item_result cmp_type () const { return INT_RESULT; } enum ha_base_keytype key_type() const; - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr); - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr); + int store(longlong nr); void reset() { bzero(ptr,packlength); } double val_real(void); longlong val_int(void); @@ -997,9 +997,9 @@ public: { flags=(flags & ~ENUM_FLAG) | SET_FLAG; } - void store(const char *to,uint length,CHARSET_INFO *charset); - void store(double nr) { Field_set::store((longlong) nr); } - void store(longlong nr); + int store(const char *to,uint length,CHARSET_INFO *charset); + int store(double nr) { return Field_set::store((longlong) nr); } + int store(longlong nr); virtual bool zero_pack() const { return 1; } String *val_str(String*,String *); void sql_type(String &str) const; diff --git a/sql/ha_heap.cc b/sql/ha_heap.cc index 70409be4e42..f56bfe74265 100644 --- a/sql/ha_heap.cc +++ b/sql/ha_heap.cc @@ -33,92 +33,12 @@ const char **ha_heap::bas_ext() const int ha_heap::open(const char *name, int mode, uint test_if_locked) { - uint key,parts,mem_per_row=0; - ulong max_rows; - HP_KEYDEF *keydef; - HA_KEYSEG *seg; - - for (key=parts=0 ; key < table->keys ; key++) + if (!(file= heap_open(name, mode)) && my_errno == ENOENT) { - parts+=table->key_info[key].key_parts; - if (table->key_info[key].algorithm == HA_KEY_ALG_BTREE) - parts++; /* additional HA_KEYTYPE_END keyseg */ + if (!create(name, table, NULL)) + file= heap_open(name, mode); } - - if (!(keydef=(HP_KEYDEF*) my_malloc(table->keys*sizeof(HP_KEYDEF)+ - parts*sizeof(HA_KEYSEG),MYF(MY_WME)))) - return my_errno; - seg=my_reinterpret_cast(HA_KEYSEG*) (keydef+table->keys); - for (key=0 ; key < table->keys ; key++) - { - KEY *pos=table->key_info+key; - KEY_PART_INFO *key_part= pos->key_part; - KEY_PART_INFO *key_part_end= key_part + pos->key_parts; - - mem_per_row+= (pos->key_length + (sizeof(char*) * 2)); - - keydef[key].keysegs= (uint) pos->key_parts; - keydef[key].flag= (pos->flags & (HA_NOSAME | HA_NULL_ARE_EQUAL)); - keydef[key].seg= seg; - keydef[key].algorithm= pos->algorithm == HA_KEY_ALG_UNDEF ? - HA_KEY_ALG_HASH : pos->algorithm; - - for (; key_part != key_part_end ; key_part++, seg++) - { - uint flag= key_part->key_type; - Field *field= key_part->field; - if (pos->algorithm == HA_KEY_ALG_BTREE) - { - seg->type= field->key_type(); - } - else - { - if (!f_is_packed(flag) && - f_packtype(flag) == (int) FIELD_TYPE_DECIMAL && - !(flag & FIELDFLAG_BINARY)) - seg->type= (int) HA_KEYTYPE_TEXT; - else - seg->type= (int) HA_KEYTYPE_BINARY; - } - seg->start= (uint) key_part->offset; - seg->length= (uint) key_part->length; - seg->flag = 0; - seg->charset= field->binary() ? NULL : ((Field_str*)field)->charset(); - if (field->null_ptr) - { - seg->null_bit= field->null_bit; - seg->null_pos= (uint) (field->null_ptr- - (uchar*) table->record[0]); - } - else - { - seg->null_bit= 0; - seg->null_pos= 0; - } - } - if (pos->algorithm == HA_KEY_ALG_BTREE) - { - /* additional HA_KEYTYPE_END keyseg */ - seg->type= HA_KEYTYPE_END; - seg->length= sizeof(byte*); - seg->flag= 0; - seg->null_bit= 0; - seg++; - } - } - mem_per_row += MY_ALIGN(table->reclength+1, sizeof(char*)); - max_rows = (ulong) (max_heap_table_size / mem_per_row); - file=heap_open(name,mode, - table->keys,keydef, - table->reclength, - ((table->max_rows < max_rows && table->max_rows) ? - table->max_rows : max_rows), - table->min_rows); - my_free((gptr) keydef,MYF(0)); - if (file) - info(HA_STATUS_NO_LOCK | HA_STATUS_CONST | HA_STATUS_VARIABLE); - ref_length=sizeof(HEAP_PTR); - return (!file ? errno : 0); + return (file ? 0 : 1); } int ha_heap::close(void) @@ -274,7 +194,6 @@ THR_LOCK_DATA **ha_heap::store_lock(THD *thd, return to; } - /* We have to ignore ENOENT entries as the HEAP table is created on open and not when doing a CREATE on the table. @@ -291,7 +210,6 @@ int ha_heap::rename_table(const char * from, const char * to) return heap_rename(from,to); } - ha_rows ha_heap::records_in_range(int inx, const byte *start_key,uint start_key_len, enum ha_rkey_function start_search_flag, @@ -315,10 +233,92 @@ ha_rows ha_heap::records_in_range(int inx, } } - -int ha_heap::create(const char *name, TABLE *form, HA_CREATE_INFO *create_info) - +int ha_heap::create(const char *name, TABLE *table, HA_CREATE_INFO *create_info) { + uint key, parts, mem_per_row= 0; + ulong max_rows; + HP_KEYDEF *keydef; + HA_KEYSEG *seg; char buff[FN_REFLEN]; - return heap_create(fn_format(buff,name,"","",4+2)); + int error; + + for (key= parts= 0; key < table->keys; key++) + { + parts+= table->key_info[key].key_parts; + if (table->key_info[key].algorithm == HA_KEY_ALG_BTREE) + parts++; /* additional HA_KEYTYPE_END keyseg */ + } + + if (!(keydef= (HP_KEYDEF*) my_malloc(table->keys * sizeof(HP_KEYDEF) + + parts * sizeof(HA_KEYSEG), MYF(MY_WME)))) + return my_errno; + seg= my_reinterpret_cast(HA_KEYSEG*) (keydef + table->keys); + for (key= 0; key < table->keys; key++) + { + KEY *pos= table->key_info+key; + KEY_PART_INFO *key_part= pos->key_part; + KEY_PART_INFO *key_part_end= key_part + pos->key_parts; + + mem_per_row+= (pos->key_length + (sizeof(char*) * 2)); + + keydef[key].keysegs= (uint) pos->key_parts; + keydef[key].flag= (pos->flags & (HA_NOSAME | HA_NULL_ARE_EQUAL)); + keydef[key].seg= seg; + keydef[key].algorithm= pos->algorithm == HA_KEY_ALG_UNDEF ? + HA_KEY_ALG_HASH : pos->algorithm; + + for (; key_part != key_part_end; key_part++, seg++) + { + uint flag= key_part->key_type; + Field *field= key_part->field; + if (pos->algorithm == HA_KEY_ALG_BTREE) + { + seg->type= field->key_type(); + } + else + { + if (!f_is_packed(flag) && + f_packtype(flag) == (int) FIELD_TYPE_DECIMAL && + !(flag & FIELDFLAG_BINARY)) + seg->type= (int) HA_KEYTYPE_TEXT; + else + seg->type= (int) HA_KEYTYPE_BINARY; + } + seg->start= (uint) key_part->offset; + seg->length= (uint) key_part->length; + seg->flag = 0; + seg->charset= field->binary() ? NULL : ((Field_str*)field)->charset(); + if (field->null_ptr) + { + seg->null_bit= field->null_bit; + seg->null_pos= (uint) (field->null_ptr - (uchar*) table->record[0]); + } + else + { + seg->null_bit= 0; + seg->null_pos= 0; + } + } + if (pos->algorithm == HA_KEY_ALG_BTREE) + { + /* additional HA_KEYTYPE_END keyseg */ + seg->type= HA_KEYTYPE_END; + seg->length= sizeof(byte*); + seg->flag= 0; + seg->null_bit= 0; + seg++; + } + } + mem_per_row+= MY_ALIGN(table->reclength + 1, sizeof(char*)); + max_rows= (ulong) (max_heap_table_size / mem_per_row); + error= heap_create(fn_format(buff,name,"","",4+2), + table->keys,keydef, table->reclength, + ((table->max_rows < max_rows && table->max_rows) ? + table->max_rows : max_rows), + table->min_rows); + my_free((gptr) keydef, MYF(0)); + if (file) + info(HA_STATUS_NO_LOCK | HA_STATUS_CONST | HA_STATUS_VARIABLE); + ref_length= sizeof(HEAP_PTR); + return (error); } diff --git a/sql/init.cc b/sql/init.cc index ac0ff701649..052ee16925e 100644 --- a/sql/init.cc +++ b/sql/init.cc @@ -53,23 +53,6 @@ void unireg_init(ulong options) } specialflag|=options; /* Set options from argv */ - // The following is needed because of like optimization in select.cc - - for (cs=compiled_charsets; cs->number; cs++) - { - uchar max_char; - if (!cs->sort_order) - continue; - max_char=cs->sort_order[(uchar) cs->max_sort_char]; - for (i = 0; i < 256; i++) - { - if ((uchar) cs->sort_order[i] > max_char) - { - max_char=(uchar) cs->sort_order[i]; - cs->max_sort_char= (char) i; - } - } - } thread_stack_min=thread_stack - STACK_MIN_SIZE; DBUG_VOID_RETURN; } diff --git a/sql/item.cc b/sql/item.cc index 47171206e3d..86ddbc0b6e0 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -340,7 +340,7 @@ void Item_param::set_long_end() item_result_type = STRING_RESULT; }; -bool Item_param::save_in_field(Field *field) +int Item_param::save_in_field(Field *field) { if (null_value) return set_field_to_null(field); @@ -349,20 +349,17 @@ bool Item_param::save_in_field(Field *field) if (item_result_type == INT_RESULT) { longlong nr=val_int(); - field->store(nr); - return 0; + return (field->store(nr)) ? -1 : 0; } if (item_result_type == REAL_RESULT) { double nr=val(); - field->store(nr); - return 0; + return (field->store(nr)) ? -1 : 0; } String *result; CHARSET_INFO *cs=default_charset_info;//fix this result=val_str(&str_value); - field->store(result->ptr(),result->length(),cs); - return 0; + return (field->store(result->ptr(),result->length(),cs)) ? -1 : 0; } void Item_param::make_field(Send_field *tmp_field) @@ -621,7 +618,7 @@ void Item_field::save_org_in_field(Field *to) } } -bool Item_field::save_in_field(Field *to) +int Item_field::save_in_field(Field *to) { if (result_field->is_null()) { @@ -638,14 +635,15 @@ bool Item_field::save_in_field(Field *to) } -bool Item_null::save_in_field(Field *field) +int Item_null::save_in_field(Field *field) { return set_field_to_null(field); } -bool Item::save_in_field(Field *field) +int Item::save_in_field(Field *field) { + int error; if (result_type() == STRING_RESULT || result_type() == REAL_RESULT && field->result_type() == STRING_RESULT) @@ -658,7 +656,7 @@ bool Item::save_in_field(Field *field) if (null_value) return set_field_to_null(field); field->set_notnull(); - field->store(result->ptr(),result->length(),cs); + error=field->store(result->ptr(),result->length(),cs); str_value.set_quick(0, 0, cs); } else if (result_type() == REAL_RESULT) @@ -667,7 +665,7 @@ bool Item::save_in_field(Field *field) if (null_value) return set_field_to_null(field); field->set_notnull(); - field->store(nr); + error=field->store(nr); } else { @@ -675,12 +673,12 @@ bool Item::save_in_field(Field *field) if (null_value) return set_field_to_null(field); field->set_notnull(); - field->store(nr); + error=field->store(nr); } - return 0; + return (error) ? -1 : 0; } -bool Item_string::save_in_field(Field *field) +int Item_string::save_in_field(Field *field) { String *result; CHARSET_INFO *cs=field->binary()?default_charset_info:((Field_str*)field)->charset(); @@ -688,28 +686,25 @@ bool Item_string::save_in_field(Field *field) if (null_value) return set_field_to_null(field); field->set_notnull(); - field->store(result->ptr(),result->length(),cs); - return 0; + return (field->store(result->ptr(),result->length(),cs)) ? -1 : 0; } -bool Item_int::save_in_field(Field *field) +int Item_int::save_in_field(Field *field) { longlong nr=val_int(); if (null_value) return set_field_to_null(field); field->set_notnull(); - field->store(nr); - return 0; + return (field->store(nr)) ? -1 : 0; } -bool Item_real::save_in_field(Field *field) +int Item_real::save_in_field(Field *field) { double nr=val(); if (null_value) return set_field_to_null(field); field->set_notnull(); - field->store(nr); - return 0; + return (field->store(nr)) ? -1 : 0; } /**************************************************************************** @@ -757,20 +752,21 @@ longlong Item_varbinary::val_int() } -bool Item_varbinary::save_in_field(Field *field) +int Item_varbinary::save_in_field(Field *field) { + int error; CHARSET_INFO *cs=field->binary()?default_charset_info:((Field_str*)field)->charset(); field->set_notnull(); if (field->result_type() == STRING_RESULT) { - field->store(str_value.ptr(),str_value.length(),cs); + error=field->store(str_value.ptr(),str_value.length(),cs); } else { longlong nr=val_int(); - field->store(nr); + error=field->store(nr); } - return 0; + return (error) ? -1 : 0; } diff --git a/sql/item.h b/sql/item.h index 187e3903b84..a0b637b6030 100644 --- a/sql/item.h +++ b/sql/item.h @@ -53,7 +53,7 @@ public: void set_name(char* str,uint length=0); void init_make_field(Send_field *tmp_field,enum enum_field_types type); virtual bool fix_fields(THD *, struct st_table_list *, Item **); - virtual bool save_in_field(Field *field); + virtual int save_in_field(Field *field); virtual void save_org_in_field(Field *field) { (void) save_in_field(field); } virtual bool send(THD *thd, String *str); @@ -124,7 +124,7 @@ public: bool send(THD *thd, String *str_arg) { return result_field->send(thd,str_arg); } void make_field(Send_field *field); bool fix_fields(THD *, struct st_table_list *, Item **); - bool save_in_field(Field *field); + int save_in_field(Field *field); void save_org_in_field(Field *field); table_map used_tables() const; enum Item_result result_type () const @@ -149,7 +149,7 @@ public: longlong val_int(); String *val_str(String *str); void make_field(Send_field *field); - bool save_in_field(Field *field); + int save_in_field(Field *field); enum Item_result result_type () const { return STRING_RESULT; } bool send(THD *thd, String *str); @@ -178,7 +178,7 @@ public: longlong val_int(); String *val_str(String*); void make_field(Send_field *field); - bool save_in_field(Field *field); + int save_in_field(Field *field); void set_null(); void set_int(longlong i); void set_double(float i); @@ -215,7 +215,7 @@ public: double val() { return (double) value; } String *val_str(String*); void make_field(Send_field *field); - bool save_in_field(Field *field); + int save_in_field(Field *field); bool basic_const_item() const { return 1; } Item *new_item() { return new Item_int(name,value,max_length); } void print(String *str); @@ -254,7 +254,7 @@ public: max_length=length; } Item_real(double value_par) :value(value_par) {} - bool save_in_field(Field *field); + int save_in_field(Field *field); enum Type type() const { return REAL_ITEM; } double val() { return value; } longlong val_int() { return (longlong) (value+(value > 0 ? 0.5 : -0.5));} @@ -297,7 +297,7 @@ public: double val() { return atof(str_value.ptr()); } longlong val_int() { return strtoll(str_value.ptr(),(char**) 0,10); } String *val_str(String*) { return (String*) &str_value; } - bool save_in_field(Field *field); + int save_in_field(Field *field); void make_field(Send_field *field); enum Item_result result_type () const { return STRING_RESULT; } bool basic_const_item() const { return 1; } @@ -334,7 +334,7 @@ public: double val() { return (double) Item_varbinary::val_int(); } longlong val_int(); String *val_str(String*) { return &str_value; } - bool save_in_field(Field *field); + int save_in_field(Field *field); void make_field(Send_field *field); enum Item_result result_type () const { return INT_RESULT; } }; @@ -394,7 +394,7 @@ public: bool send(THD *thd, String *tmp) { return (*ref)->send(thd, tmp); } void make_field(Send_field *field) { (*ref)->make_field(field); } bool fix_fields(THD *, struct st_table_list *, Item **); - bool save_in_field(Field *field) { return (*ref)->save_in_field(field); } + int save_in_field(Field *field) { return (*ref)->save_in_field(field); } void save_org_in_field(Field *field) { (*ref)->save_org_in_field(field); } enum Item_result result_type () const { return (*ref)->result_type(); } table_map used_tables() const { return (*ref)->used_tables(); } @@ -413,7 +413,7 @@ class Item_int_with_ref :public Item_int public: Item_int_with_ref(longlong i, Item *ref_arg) :Item_int(i), ref(ref_arg) {} - bool save_in_field(Field *field) + int save_in_field(Field *field) { return ref->save_in_field(field); } diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index d1a130aa12b..bc723801aba 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -43,7 +43,8 @@ static bool convert_constant_item(Field *field, Item **item) { if ((*item)->const_item()) { - (*item)->save_in_field(field); + if ((*item)->save_in_field(field)) + return 0; if (!((*item)->null_value)) { Item *tmp=new Item_int_with_ref(field->val_int(), *item); diff --git a/sql/item_create.cc b/sql/item_create.cc index 9204d23b8c2..a41ba1cc526 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -86,6 +86,11 @@ Item *create_func_cot(Item* a) new Item_func_tan(a)); } +Item *create_func_crc32(Item* a) +{ + return new Item_func_crc32(a); +} + Item *create_func_date_format(Item* a,Item *b) { return new Item_func_date_format(a,b,0); diff --git a/sql/item_create.h b/sql/item_create.h index 6f7e8ebf89a..fd9a856f283 100644 --- a/sql/item_create.h +++ b/sql/item_create.h @@ -29,6 +29,7 @@ Item *create_func_connection_id(void); Item *create_func_conv(Item* a, Item *b, Item *c); Item *create_func_cos(Item* a); Item *create_func_cot(Item* a); +Item *create_func_crc32(Item* a); Item *create_func_date_format(Item* a,Item *b); Item *create_func_dayname(Item* a); Item *create_func_dayofmonth(Item* a); diff --git a/sql/item_func.cc b/sql/item_func.cc index ae3fc7cb8f0..8728187718c 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -26,6 +26,7 @@ #include <hash.h> #include <time.h> #include <ft_global.h> +#include <zlib.h> #include "slave.h" // for wait_for_master_pos #include "gstream.h" @@ -801,6 +802,18 @@ longlong Item_func_min_max::val_int() return value; } +longlong Item_func_crc32::val_int() +{ + String *res=args[0]->val_str(&value); + if (!res) + { + null_value=1; + return 0; /* purecov: inspected */ + } + null_value=0; + return (longlong) crc32(0L, (Bytef*)res->ptr(), res->length()); +} + longlong Item_func_length::val_int() { diff --git a/sql/item_func.h b/sql/item_func.h index 86b2a17931d..2e61ed87c3c 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -518,6 +518,16 @@ public: const char *func_name() const { return "greatest"; } }; +class Item_func_crc32 :public Item_int_func +{ + String value; +public: + Item_func_crc32(Item *a) :Item_int_func(a) {} + longlong val_int(); + const char *func_name() const { return "crc32"; } + void fix_length_and_dec() { max_length=10; } +}; + class Item_func_length :public Item_int_func { diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 1aee4e7d553..dc9d57b1d9d 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1843,9 +1843,11 @@ outp: void Item_func_conv_charset::fix_length_and_dec() { max_length = args[0]->max_length*(conv_charset->mbmaxlen?conv_charset->mbmaxlen:1); + str_value.set_charset(conv_charset); } + String *Item_func_conv_charset3::val_str(String *str) { my_wc_t wc; @@ -1913,7 +1915,7 @@ outp: } -bool Item_func_conv_charset::fix_fields(THD *thd,struct st_table_list *tables) +bool Item_func_conv_charset::fix_fields(THD *thd,struct st_table_list *tables, Item **ref) { char buff[STACK_BUFF_ALLOC]; // Max argument in function binary=0; @@ -1938,6 +1940,53 @@ void Item_func_conv_charset3::fix_length_and_dec() max_length = args[0]->max_length; } +String *Item_func_set_collation::val_str(String *str) +{ + str=args[0]->val_str(str); + null_value=args[0]->null_value; + str->set_charset(set_collation); + return str; +} + +bool Item_func_set_collation::fix_fields(THD *thd,struct st_table_list *tables, Item **ref) +{ + char buff[STACK_BUFF_ALLOC]; // Max argument in function + binary=0; + used_tables_cache=0; + const_item_cache=1; + + if (thd && check_stack_overrun(thd,buff)) + return 0; // Fatal error if flag is set! + if (args[0]->fix_fields(thd, tables, args)) + return 1; + maybe_null=args[0]->maybe_null; + binary=args[0]->binary; + const_item_cache=args[0]->const_item(); + str_value.set_charset(set_collation); + fix_length_and_dec(); + return 0; +} + +bool Item_func_set_collation::eq(const Item *item, bool binary_cmp) const +{ + /* Assume we don't have rtti */ + if (this == item) + return 1; + if (item->type() != FUNC_ITEM) + return 0; + Item_func *item_func=(Item_func*) item; + if (arg_count != item_func->arg_count || + func_name() != item_func->func_name()) + return 0; + Item_func_set_collation *item_func_sc=(Item_func_set_collation*) item; + if (set_collation != item_func_sc->set_collation) + return 0; + for (uint i=0; i < arg_count ; i++) + if (!args[i]->eq(item_func_sc->args[i], binary_cmp)) + return 0; + return 1; +} + String *Item_func_charset::val_str(String *str) { diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 7b5bd7ae90b..997d9c8d834 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -472,7 +472,7 @@ class Item_func_export_set: public Item_str_func const char *func_name() const { return "export_set"; } }; - class Item_func_inet_ntoa : public Item_str_func +class Item_func_inet_ntoa : public Item_str_func { public: Item_func_inet_ntoa(Item *a) :Item_str_func(a) @@ -488,15 +488,30 @@ class Item_func_conv_charset :public Item_str_func CHARSET_INFO *conv_charset; public: Item_func_conv_charset(Item *a, CHARSET_INFO *cs) :Item_str_func(a) - { - conv_charset=cs; - } - bool fix_fields(THD *thd,struct st_table_list *tables); + { conv_charset=cs; } + bool fix_fields(THD *thd,struct st_table_list *tables,Item **ref); String *val_str(String *); void fix_length_and_dec(); const char *func_name() const { return "conv_charset"; } }; +class Item_func_set_collation :public Item_str_func +{ + CHARSET_INFO *set_collation; +public: + Item_func_set_collation(Item *a, CHARSET_INFO *cs) :Item_str_func(a) + { set_collation=cs; } + bool fix_fields(THD *thd,struct st_table_list *tables, Item **ref); + String *val_str(String *); + void fix_length_and_dec() + { + max_length = args[0]->max_length; + str_value.set_charset(set_collation); + } + bool eq(const Item *item, bool binary_cmp) const; + const char *func_name() const { return "set_collation"; } +}; + class Item_func_conv_charset3 :public Item_str_func { public: diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 18e9f51925a..29034549367 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -126,7 +126,7 @@ String *Item_singleval_subselect::val_str (String *str) Item_exists_subselect::Item_exists_subselect(THD *thd, st_select_lex *select_lex): - Item_subselect(thd, select_lex, new select_singleval_subselect(this)) + Item_subselect(thd, select_lex, new select_exists_subselect(this)) { max_columns= UINT_MAX; null_value= 0; //can't be NULL diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 9bbb9e4fe19..297ff30bd9c 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -410,7 +410,7 @@ String *Item_date::val_str(String *str) } -bool Item_date::save_in_field(Field *field) +int Item_date::save_in_field(Field *field) { TIME ltime; timestamp_type t_type=TIMESTAMP_FULL; @@ -525,7 +525,7 @@ bool Item_func_now::get_date(TIME *res, } -bool Item_func_now::save_in_field(Field *to) +int Item_func_now::save_in_field(Field *to) { to->set_notnull(); to->store_time(<ime,TIMESTAMP_FULL); diff --git a/sql/item_timefunc.h b/sql/item_timefunc.h index 53beb78e1d4..6d016df6eb7 100644 --- a/sql/item_timefunc.h +++ b/sql/item_timefunc.h @@ -228,7 +228,7 @@ public: double val() { return (double) val_int(); } const char *func_name() const { return "date"; } void fix_length_and_dec() { decimals=0; max_length=10; } - bool save_in_field(Field *to); + int save_in_field(Field *to); void make_field(Send_field *tmp_field) { init_make_field(tmp_field,FIELD_TYPE_DATE); @@ -311,7 +311,7 @@ public: enum Item_result result_type () const { return STRING_RESULT; } double val() { return (double) value; } longlong val_int() { return value; } - bool save_in_field(Field *to); + int save_in_field(Field *to); String *val_str(String *str) { str_value.set(buff,buff_length,default_charset_info); return &str_value; } const char *func_name() const { return "now"; } diff --git a/sql/lex.h b/sql/lex.h index 4af36df58af..cd25c3883fe 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -89,6 +89,7 @@ static SYMBOL symbols[] = { { "CHECKSUM", SYM(CHECKSUM_SYM),0,0}, { "CIPHER", SYM(CIPHER_SYM),0,0}, { "CLOSE", SYM(CLOSE_SYM),0,0}, + { "COLLATE", SYM(COLLATE_SYM),0,0}, { "COLUMN", SYM(COLUMN_SYM),0,0}, { "COLUMNS", SYM(COLUMNS),0,0}, { "COMMENT", SYM(COMMENT_SYM),0,0}, @@ -430,6 +431,7 @@ static SYMBOL sql_functions[] = { { "COUNT", SYM(COUNT_SYM),0,0}, { "COS", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_cos)}, { "COT", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_cot)}, + { "CRC32", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_crc32)}, { "CROSSES", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_crosses)}, { "CURDATE", SYM(CURDATE),0,0}, { "CURTIME", SYM(CURTIME),0,0}, diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 155d056db42..d3901770230 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -382,9 +382,13 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, int mysql_create_table(THD *thd,const char *db, const char *table_name, HA_CREATE_INFO *create_info, List<create_field> &fields, List<Key> &keys, - bool tmp_table, bool no_log); -// no_log is needed for the case of CREATE TABLE ... SELECT , as the logging -// will be done later in sql_insert.cc + bool tmp_table, bool no_log, uint select_field_count); +/* + no_log is needed for the case of CREATE ... SELECT, + as the logging will be done later in sql_insert.cc + select_field_count is also used for CREATE ... SELECT, + and must be zero for standart create of table +*/ TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info, const char *db, const char *name, diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 830c7324771..99099ff1bac 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -1841,7 +1841,7 @@ int main(int argc, char **argv) if (set_default_charset_by_name(default_charset, MYF(MY_WME))) exit( 1 ); - charsets_list = list_charsets(MYF(MY_COMPILED_SETS|MY_CONFIG_SETS)); + charsets_list = list_charsets(MYF(MY_CS_COMPILED|MY_CS_CONFIG)); #ifdef HAVE_OPENSSL if (opt_use_ssl) diff --git a/sql/opt_range.cc b/sql/opt_range.cc index ccee7192682..a99a701e4b4 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -1028,7 +1028,7 @@ get_mm_leaf(PARAM *param, Field *field, KEY_PART *key_part, field->cmp_type() != value->result_type()) DBUG_RETURN(0); - if (value->save_in_field(field)) + if (value->save_in_field(field) > 0) { if (type == Item_func::EQUAL_FUNC) { diff --git a/sql/share/charsets/Index b/sql/share/charsets/Index index 52cb6b99705..c8ae877887e 100644 --- a/sql/share/charsets/Index +++ b/sql/share/charsets/Index @@ -40,3 +40,10 @@ armscii8 32 utf8 33 win1250ch 34 ucs2 35 +cp866 36 +keybcs2 37 +macce 38 +macroman 39 +pclatin2 40 +latvian 41 +latvian1 42 diff --git a/sql/share/charsets/cp866.conf b/sql/share/charsets/cp866.conf new file mode 100644 index 00000000000..e6b5c064fd7 --- /dev/null +++ b/sql/share/charsets/cp866.conf @@ -0,0 +1,91 @@ +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 00 + 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 01 02 01 02 01 02 01 02 00 00 00 00 00 00 00 48 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + A0 A1 A2 A3 A4 A5 86 87 88 89 AA AB AC AD AE AF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + A0 A1 A2 A3 A4 A5 86 87 88 89 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F1 F1 F3 F3 F5 F5 F7 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + F0 F0 F2 F2 F4 F4 F6 F6 F8 F9 FA FB FC FD FE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 56 57 58 59 5A 5B 5C 5E 5F 62 + 67 68 69 6C 71 74 75 76 77 78 7B B0 B1 B2 B3 B4 + B5 41 42 43 44 45 56 57 58 59 5A 5B 5C 5E 5F 62 + 67 68 69 6C 71 74 75 76 77 78 7B B6 B7 B8 B9 BA + 80 81 82 83 84 85 88 89 8A 8C 8D 8E 8F 90 91 92 + 93 94 95 96 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 + 80 81 82 83 84 85 88 89 8A 8C 8D 8E 8F 90 91 92 + BB BD BE C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC + CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD + DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 F3 F4 F5 F6 F7 + 93 94 95 96 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 + 86 86 87 87 8B 8B 97 97 F8 F9 FA FB FC FD FE FF + +# Unicode mappping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 0410 0411 0412 0413 0414 0415 0416 0417 0418 0419 041A 041B 041C 041D 041E 041F + 0420 0421 0422 0423 0424 0425 0426 0427 0428 0429 042A 042B 042C 042D 042E 042F + 0430 0431 0432 0433 0434 0435 0436 0437 0438 0439 043A 043B 043C 043D 043E 043F + 2591 2592 2593 2502 2524 2561 2562 2556 2555 2563 2551 2557 255D 255C 255B 2510 + 2514 2534 252C 251C 2500 253C 255E 255F 255A 2554 2569 2566 2560 2550 256C 2567 + 2568 2564 2565 2559 2558 2552 2553 256B 256A 2518 250C 2588 2584 258C 2590 2580 + 0440 0441 0442 0443 0444 0445 0446 0447 0448 0449 044A 044B 044C 044D 044E 044F + 0401 0451 0404 0454 0407 0457 040E 045E 00B0 2219 00B7 221A 207F 00B2 25A0 00A0 + diff --git a/sql/share/charsets/dos.conf b/sql/share/charsets/dos.conf index fc4d4cee5c4..205202711b8 100644 --- a/sql/share/charsets/dos.conf +++ b/sql/share/charsets/dos.conf @@ -1,4 +1,4 @@ -# Configuration file for the dos character set +# Configuration file for the dos (aka cp437 DOSLatinUS) character set # ctype array (must have 257 elements) 00 diff --git a/sql/share/charsets/keybcs2.conf b/sql/share/charsets/keybcs2.conf new file mode 100644 index 00000000000..f272960b683 --- /dev/null +++ b/sql/share/charsets/keybcs2.conf @@ -0,0 +1,91 @@ +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 00 + 01 02 82 02 02 01 01 02 82 81 01 01 02 02 01 01 + 81 02 01 02 02 01 02 01 02 01 01 01 01 01 01 02 + 02 02 02 02 02 01 01 01 02 02 02 01 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 02 02 01 02 01 02 00 02 01 01 01 02 00 02 02 00 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 48 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 87 81 82 83 84 83 86 87 88 88 8D A1 8C 8D 84 A0 + 82 91 91 93 94 A2 96 A3 98 94 81 9B 8C 98 A9 9F + A0 A1 A2 A3 A4 A4 96 93 9B A9 AA AA AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E4 E5 E6 E7 ED E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 68 59 5A 7B 7C 7D 7E 7F + 87 9A 90 85 8E 85 86 80 89 89 8A 8B 9C 8A 8E 8F + 90 92 92 A7 99 95 A6 97 9D 99 9A A8 9C 9D 9E 9F + 8F 8B 95 97 A5 A5 A6 A7 A8 9E AB AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC E8 EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 44 45 47 49 50 51 52 53 54 55 56 57 58 5A + 5E 5F 60 63 66 68 6C 6D 6E 6F 72 90 91 92 93 94 + 95 41 44 45 47 49 50 51 52 53 54 55 56 57 58 5A + 5E 5F 60 63 66 68 6C 6D 6E 6F 72 96 97 98 99 9A + 45 68 49 47 41 47 66 45 49 49 56 53 56 56 41 41 + 49 72 72 5A 5A 5A 68 68 6F 5A 68 63 56 6F 60 66 + 41 53 5A 68 58 58 68 5A 63 60 60 60 A0 A1 A2 A3 + A4 A5 A6 B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC + BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC + CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC + 80 65 83 87 88 89 DD 8A 85 8B 84 81 DE 85 82 DF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# Unicode mappping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 010C 00FC 00E9 010F 00E4 010E 0164 010D 011B 011A 0139 00CD 013E 013A 00C4 00C1 + 00C9 017E 017D 00F4 00F6 00D3 016F 00DA 00FD 00D6 00DC 0160 013D 00DD 0158 0165 + 00E1 00ED 00F3 00FA 0148 0147 016E 00D4 0161 0159 0155 0154 00BC 00A1 00AB 00BB + 2591 2592 2593 2502 2524 2561 2562 2556 2555 2563 2551 2557 255D 255C 255B 2510 + 2514 2534 252C 251C 2500 253C 255E 255F 255A 2554 2569 2566 2560 2550 256C 2567 + 2568 2564 2565 2559 2558 2552 2553 256B 256A 2518 250C 2588 2584 258C 2590 2580 + 03B1 00DF 0393 03C0 03A3 03C3 00B5 03C4 03A6 0398 03A9 03B4 221E 03C6 03B5 2229 + 2261 00B1 2265 2264 2320 2321 00F7 2248 00B0 2219 00B7 221A 207F 00B2 25A0 00A0 + diff --git a/sql/share/charsets/latvian.conf b/sql/share/charsets/latvian.conf new file mode 100644 index 00000000000..c3dee95d55c --- /dev/null +++ b/sql/share/charsets/latvian.conf @@ -0,0 +1,95 @@ +# Configuration file for the latvian character set. +# Created for case-sensitive record search +# Created accord with windows-1257 (iso-8859-4) codepage +# Created by Andis Grasis & Rihards Grasis e-mail:andis@cata.lv + +# The ctype array must have 257 elements. + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 20 + 01 20 10 20 10 10 00 00 20 10 20 10 20 10 10 10 + 20 10 10 10 10 10 10 10 20 00 20 10 20 10 10 20 + 48 20 10 10 10 20 10 10 10 10 01 10 10 10 10 01 + 10 10 10 10 10 10 10 10 10 10 02 10 10 10 10 02 + 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 10 01 01 01 01 01 01 01 02 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 10 02 02 02 02 02 02 02 10 + +# The to_lower array must have 256 elements. + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 B8 A9 BA AB AC AD AE BF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 D7 F8 F9 FA FB FC FD FE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# The to_upper array must have 256 elements. + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 A8 B9 AA BB BC BD BE AF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 F7 D8 D9 DA DB DC DD DE FF + +# The sort_order array must have 256 elements. + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 30 32 33 34 35 36 37 2B 38 39 3A 5C 3B 2C 3C 3D + 76 7A 7C 7E 80 81 82 83 84 85 3E 3F 5D 5E 5F 40 + 41 86 92 94 9A 9C A6 A8 AC AE B4 B6 BA C0 C2 C8 + D4 D6 D8 DC E3 E6 EE F0 F2 F4 F6 42 43 44 45 46 + 47 87 93 95 9B 9D A7 A9 AD AF B5 B7 BB C1 C3 C9 + D5 D7 D9 DD E4 E7 EF F1 F3 F5 F7 48 49 4A 4B 20 + 75 21 56 22 59 73 70 71 23 74 24 5A 25 4D 51 50 + 26 54 55 57 58 72 2E 2F 27 E5 28 5B 29 4E 53 2A + 31 FE 65 66 67 FF 4C 68 D3 69 DA 61 6A 2D 6B 90 + 6C 60 7D 7F 4F 6D 6E 6F D2 7B DB 62 77 78 79 91 + 8E B2 8A 96 88 8C A4 A2 98 9E F8 A0 AA B8 B0 BE + E1 C4 C6 CA CE D0 CC 63 EC BC DE EA E8 FA FC E0 + 8F B3 8B 97 89 8D A5 A3 99 9F F9 A1 AB B9 B1 BF + E2 C5 C7 CB CF D1 CD 64 ED BD DF EB E9 FB FD 52 + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F +0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F +00A0 201D 00A2 00A3 00A4 201E 00A6 00A7 00D8 00A9 0156 00AB 00AC 00AD 00AE 00C6 +00B0 00B1 00B2 00B3 201C 00B5 00B6 00B7 00F8 00B9 0157 00BB 00BC 00BD 00BE 00E6 +0104 012E 0100 0106 00C4 00C5 0118 0112 010C 00C9 0179 0116 0122 0136 012A 013B +0160 0143 0145 00D3 014C 00D5 00D6 00D7 0172 0141 015A 016A 00DC 017B 017D 00DF +0105 012F 0101 0107 00E4 00E5 0119 0113 010D 00E9 017A 0117 0123 0137 012B 013C +0161 0144 0146 00F3 014D 00F5 00F6 00F7 0173 0142 015B 016B 00FC 017C 017E 2019 diff --git a/sql/share/charsets/latvian1.conf b/sql/share/charsets/latvian1.conf new file mode 100644 index 00000000000..3094525052d --- /dev/null +++ b/sql/share/charsets/latvian1.conf @@ -0,0 +1,94 @@ +# Configuration file for the latvian character set. +# Created for case-insensitive record search +# Created by Andis & Rihards + +# The ctype array must have 257 elements. + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 20 + 00 00 10 00 10 10 00 00 00 00 00 10 00 10 10 10 + 00 10 10 10 10 10 10 10 00 00 00 10 00 10 10 00 + 48 00 10 10 10 00 10 10 10 10 01 10 10 10 10 10 + 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 10 01 01 01 01 01 01 01 02 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 10 02 02 02 02 02 02 02 10 + +# The to_lower array must have 256 elements. + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 B8 A9 BA AB AC AD AE BF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 D7 F8 F9 FA FB FC FD FE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# The to_upper array must have 256 elements. + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 A8 B9 AA BB BC BD BE AF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 F7 D8 D9 DA DB DC DD DE FF + +# The sort_order array must have 256 elements. + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 30 32 33 34 35 36 37 2B 38 39 3A 5C 3B 2C 3C 3D + 76 7A 7C 7E 80 81 82 83 84 85 3E 3F 5D 5E 5F 40 + 41 86 92 94 9A 9C A6 A8 AC AE B4 B6 BA C0 C2 C8 + D4 D6 D8 DC E3 E6 EE F0 F2 F4 F6 42 43 44 45 46 + 47 86 92 94 9A 9C A6 A8 AC AE B4 B6 BA C0 C2 C8 + D4 D6 D8 DC E2 E6 EE F0 F2 F4 F6 48 49 4A 4B 20 + 75 21 56 22 59 73 70 71 23 74 24 5A 25 4D 51 50 + 26 54 55 57 58 72 2E 2F 27 E5 28 5B 29 4E 53 2A + 31 FE 65 66 67 FF 4C 68 2D 69 DA 61 6A 2D 6B 90 + 6C 60 7D 7F 4F 6D 6E 6F D3 7B DB 62 77 78 79 90 + 8E B2 8A 96 88 8C A4 A2 98 9E F8 A0 AA B8 B0 BE + E1 C4 C6 CA CE D0 CC 63 EC BC DE EA E8 FA FC E0 + 8E B2 8A 96 88 8C A4 A2 98 9E F8 A0 AA B8 B0 BE + E1 C4 C6 CA CE D0 CC 64 EC BC DE EA E8 FA FC 52 + +# Unicode mapping (256 elements) +0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F +0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F +0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F +0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F +0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F +0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F +0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F +0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F +0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 008A 008B 008C 008D 008E 008F +0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 009A 009B 009C 009D 009E 009F +00A0 201D 00A2 00A3 00A4 201E 00A6 00A7 00D8 00A9 0156 00AB 00AC 00AD 00AE 00C6 +00B0 00B1 00B2 00B3 201C 00B5 00B6 00B7 00F8 00B9 0157 00BB 00BC 00BD 00BE 00E6 +0104 012E 0100 0106 00C4 00C5 0118 0112 010C 00C9 0179 0116 0122 0136 012A 013B +0160 0143 0145 00D3 014C 00D5 00D6 00D7 0172 0141 015A 016A 00DC 017B 017D 00DF +0105 012F 0101 0107 00E4 00E5 0119 0113 010D 00E9 017A 0117 0123 0137 012B 013C +0161 0144 0146 00F3 014D 00F5 00F6 00F7 0173 0142 015B 016B 00FC 017C 017E 2019 diff --git a/sql/share/charsets/macce.conf b/sql/share/charsets/macce.conf new file mode 100644 index 00000000000..f3ac08df087 --- /dev/null +++ b/sql/share/charsets/macce.conf @@ -0,0 +1,91 @@ +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 00 + 01 01 02 01 01 01 01 02 02 01 02 02 01 02 02 01 + 02 01 02 02 01 02 01 02 02 02 02 02 02 01 02 02 + 00 00 01 00 00 00 00 02 00 00 00 02 00 00 02 01 + 02 01 00 00 02 01 00 00 02 01 02 01 02 01 02 01 + 02 01 00 00 02 01 00 00 00 00 00 02 01 01 02 01 + 00 00 00 00 00 00 00 00 02 01 02 01 00 00 02 01 + 02 01 00 00 02 01 02 01 01 02 01 01 02 01 01 01 + 02 01 01 02 01 02 01 02 01 02 02 01 01 02 01 00 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 54 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 54 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 8A 82 82 8E 88 9A 9F 87 88 8B 8A 8B 8D 8D 8E 90 + 90 93 92 93 95 95 98 97 98 99 9A 9B 9C 9E 9E 9F + A0 A1 AB A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE B0 + B0 B4 B2 B3 B4 FA B6 B7 B8 BA BA BC BC BE BE C0 + C0 C4 C2 C3 C4 CB C6 C7 C8 C9 CA CB CE 9B CE D8 + D0 D1 D2 D3 D4 D5 D6 D7 D8 DA DA DE DC DD DE E0 + E0 E4 E2 E3 E4 E6 E6 87 E9 E9 92 EC EC F0 97 99 + F0 F3 9C F3 F5 F5 F7 F7 F9 F9 FA FD B8 FD AE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 74 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 74 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 81 83 84 85 86 E7 84 89 80 89 8C 8C 83 8F + 8F 91 EA 91 94 94 96 EE 96 EF 85 CD F2 9D 9D 86 + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA A2 AC AD FE AF + AF B1 B2 B3 B1 B5 B6 B7 FC B9 B9 BB BB BD BD BF + BF C1 C2 C3 C1 C5 C6 C7 C8 C9 CA C5 CC CD CC CF + D0 D1 D2 D3 D4 D5 D6 D7 CF D9 D9 DB DC DD DB DF + DF E1 E2 E3 E1 E5 E5 E7 E8 E8 EA EB EB ED EE EF + ED F1 F2 F1 F4 F4 F6 F6 F8 F8 B5 FB FC FB FE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 46 47 4A 4C 52 53 55 56 5A 5B 5D 62 62 67 + 6F 70 71 75 79 81 88 89 8A 8B 8D 90 91 92 93 94 + 95 41 46 47 4A 4C 52 53 55 56 5A 5B 5D 62 62 67 + 6F 70 71 75 79 81 88 89 8A 8B 8D 96 97 98 99 9A + 41 41 41 4C 41 67 81 41 41 47 41 47 47 47 4C 8D + 8D 4A 56 4A 4C 4C 4C 67 4C 67 67 67 81 4C 4C 81 + A0 A1 4C A3 A4 A5 A6 75 A8 A9 AA 4C AC AD 53 56 + 56 56 B2 B3 56 5B B6 B7 5D 5D 5D 5D 5D 5D 5D 62 + 62 62 C2 C3 62 62 C6 C7 C8 C9 CA 62 67 67 67 67 + D0 D1 D2 D3 D4 D5 D6 D7 67 71 71 71 DC DD 71 71 + 71 75 E2 E3 75 75 75 41 79 79 56 8D 8D 81 67 67 + 81 81 81 81 81 81 81 81 8B 8B 5B 8D 5D 8D 53 FF + +# Unicode mappping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 00C4 0100 0101 00C9 0104 00D6 00DC 00E1 0105 010C 00E4 010D 0106 0107 00E9 0179 + 017A 010E 00ED 010F 0112 0113 0116 00F3 0117 00F4 00F6 00F5 00FA 011A 011B 00FC + 2020 00B0 0118 00A3 00A7 2022 00B6 00DF 00AE 00A9 2122 0119 00A8 2260 0123 012E + 012F 012A 2264 2265 012B 0136 2202 2211 0142 013B 013C 013D 013E 0139 013A 0145 + 0146 0143 00AC 221A 0144 0147 2206 00AB 00BB 2026 00A0 0148 0150 00D5 0151 014C + 2013 2014 201C 201D 2018 2019 00F7 25CA 014D 0154 0155 0158 2039 203A 0159 0156 + 0157 0160 201A 201E 0161 015A 015B 00C1 0164 0165 00CD 017D 017E 016A 00D3 00D4 + 016B 016E 00DA 016F 0170 0171 0172 0173 00DD 00FD 0137 017B 0141 017C 0122 02C7 + diff --git a/sql/share/charsets/macroman.conf b/sql/share/charsets/macroman.conf new file mode 100644 index 00000000000..11cbee40e94 --- /dev/null +++ b/sql/share/charsets/macroman.conf @@ -0,0 +1,91 @@ +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 10 + 20 01 01 01 01 01 01 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 + 00 00 00 00 00 00 00 02 00 00 00 00 00 00 01 01 + 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 02 + 00 00 00 00 02 00 00 00 00 00 00 20 01 01 00 00 + 00 00 00 00 00 00 00 00 02 01 00 00 00 00 00 00 + 00 00 00 00 00 20 01 01 01 01 01 01 01 01 01 01 + 00 01 01 01 01 02 00 00 00 00 00 00 00 00 00 00 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 8A 8C 8D 8E 96 9A 9F 87 88 89 8A 8B 8C 8D 8E 8F + 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD BE BF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA 88 8B 9B CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D8 D8 DA DB DC DD DE DF + E0 E1 E2 E3 E4 89 90 87 91 8F 92 94 95 93 97 99 + F0 98 9C 9E 9D F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 81 82 83 84 85 86 E7 CB E5 80 CC 81 82 83 E9 + E6 E8 EA ED EB EC 84 EE F1 EF 85 CD F2 F4 F3 86 + A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD AE AF + C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF + D0 D1 D2 D3 D4 D5 D6 D7 D9 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 49 50 52 53 57 59 60 61 67 68 69 70 71 72 + 79 80 81 82 84 85 90 91 92 93 95 A0 A1 A2 A3 A4 + A5 41 49 50 52 53 57 59 60 61 67 68 69 70 71 72 + 79 80 81 82 84 85 90 91 92 93 95 A6 A7 A8 A9 AA + 41 41 50 53 71 72 85 41 41 41 41 41 41 50 53 53 + 53 53 61 61 61 61 71 72 72 72 72 72 85 85 85 85 + AB AC AD AE AF B0 B1 82 B2 B3 B4 B5 B6 B7 48 72 + B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 48 72 + C6 C7 C8 C9 57 CA CB CC CD CE CF 41 41 72 D0 D1 + D2 D3 D4 D5 D6 D7 D8 D9 93 93 DA DB DC DD DE DF + E0 E1 E2 E3 E4 41 53 41 53 53 61 61 61 61 72 72 + F0 72 85 85 85 61 F6 F7 F8 F9 FA FB FC FD FE FF + +# Unicode mappping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 00C4 00C5 00C7 00C9 00D1 00D6 00DC 00E1 00E0 00E2 00E4 00E3 00E5 00E7 00E9 00E8 + 00EA 00EB 00ED 00EC 00EE 00EF 00F1 00F3 00F2 00F4 00F6 00F5 00FA 00F9 00FB 00FC + 2020 00B0 00A2 00A3 00A7 2022 00B6 00DF 00AE 00A9 2122 00B4 00A8 2260 00C6 00D8 + 221E 00B1 2264 2265 00A5 00B5 2202 2211 220F 03C0 222B 00AA 00BA 03A9 00E6 00F8 + 00BF 00A1 00AC 221A 0192 2248 2206 00AB 00BB 2026 00A0 00C0 00C3 00D5 0152 0153 + 2013 2014 201C 201D 2018 2019 00F7 25CA 00FF 0178 2044 20AC 2039 203A FB01 FB02 + 2021 00B7 201A 201E 2030 00C2 00CA 00C1 00CB 00C8 00CD 00CE 00CF 00CC 00D3 00D4 + F8FF 00D2 00DA 00DB 00D9 0131 02C6 02DC 00AF 02D8 02D9 02DA 00B8 02DD 02DB 02C7 + diff --git a/sql/share/charsets/pclatin2.conf b/sql/share/charsets/pclatin2.conf new file mode 100644 index 00000000000..dea8d085595 --- /dev/null +++ b/sql/share/charsets/pclatin2.conf @@ -0,0 +1,91 @@ +# ctype array (must be 257 elements) + 00 + 20 20 20 20 20 20 20 20 20 28 28 28 28 28 20 20 + 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 + 48 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 + 84 84 84 84 84 84 84 84 84 84 10 10 10 10 10 10 + 10 81 81 81 81 81 81 01 01 01 01 01 01 01 01 01 + 01 01 01 01 01 01 01 01 01 01 01 10 10 10 10 10 + 10 82 82 82 82 82 82 02 02 02 02 02 02 02 02 02 + 02 02 02 02 02 02 02 02 02 02 02 10 10 10 10 00 + 01 02 02 02 02 02 02 02 02 02 01 02 02 01 01 01 + 01 01 02 02 02 01 02 01 02 01 01 01 02 01 00 02 + 02 02 02 02 01 02 01 02 01 02 00 02 01 01 00 00 + 00 00 00 00 00 01 01 01 02 00 00 00 00 01 02 00 + 00 00 00 00 00 00 01 02 00 00 00 00 00 00 00 00 + 02 01 01 01 02 01 01 01 02 00 00 00 00 01 01 00 + 01 02 01 01 02 02 01 02 01 01 02 01 02 01 02 00 + 00 00 00 00 00 00 00 00 00 00 00 02 01 02 00 48 + +# to_lower array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 87 81 82 83 84 85 86 87 88 89 8B 8B 8C AB 84 86 + 82 92 92 93 94 96 96 98 98 94 81 9C 9C 88 9E 9F + A0 A1 A2 A3 A5 A5 A7 A7 A9 A9 AA AB 9F B8 AE AF + B0 B1 B2 B3 B4 A0 83 D8 B8 B9 BA BB BC BE BE BF + C0 C1 C2 C3 C4 C5 C7 C7 C8 C9 CA CB CC CD CE CF + D0 D0 D4 89 D4 E5 A1 8C D8 D9 DA DB DC EE 85 DF + A2 E1 93 E4 E4 E5 E7 E7 EA A3 E8 FB EC EC EE EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF + +# to_upper array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 80 9A 90 B6 8E DE 8F 80 9D D3 8A 8A D7 8D 8E 8F + 90 91 91 E2 99 95 95 97 97 99 9A 9B 9B 9D 9E AC + B5 D6 E0 E9 A4 A4 A6 A6 A8 A8 AA 8D AC AD AE AF + B0 B1 B2 B3 B4 B5 B6 B7 AD B9 BA BB BC BE BD BF + C0 C1 C2 C3 C4 C5 C6 C6 C8 C9 CA CB CC CD CE CF + D1 D1 D2 D3 D2 D5 D6 D7 B7 D9 DA DB DC DD DE DF + E0 E1 E2 E3 E3 D5 E6 E6 E8 E9 E8 EB ED ED DD EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA EB FC FC FE FF + +# sort_order array (must be 256 elements) + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F + 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F + 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F + 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F + 40 41 47 48 4C 4F 54 55 56 57 5A 5B 5C 5E 5F 62 + 67 68 69 6C 71 74 75 76 77 78 7B 90 91 92 93 94 + 95 41 47 48 4C 4F 54 55 56 57 5A 5B 5C 5E 5F 62 + 67 68 69 6C 71 74 75 76 77 78 7B 96 97 98 99 9A + 48 74 4F 41 41 74 48 48 5C 4F 62 62 57 7B 41 48 + 4F 5C 5C 62 62 5C 5C 6C 6C 62 74 71 71 5C 9E 48 + 41 57 62 74 41 41 7B 7B 4F 4F AA 7B 48 6C AE AF + B0 B1 B2 B3 B4 41 41 4F 6C B5 BA BB BC 7B 7B BF + C0 C1 C2 C3 C4 C5 41 41 C8 C9 CA CB CC CD CE CF + 4C 4C 4C 4F 4C 60 57 57 4F D9 DA DB DC 71 74 DF + 62 70 62 60 60 60 6C 6C 69 74 69 74 78 78 71 EF + F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA 74 69 69 FE FF + +# Unicode mappping (must be 256 elements) + 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F + 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D 001E 001F + 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F + 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F + 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 004A 004B 004C 004D 004E 004F + 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 005A 005B 005C 005D 005E 005F + 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 006A 006B 006C 006D 006E 006F + 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 007A 007B 007C 007D 007E 007F + 00C7 00FC 00E9 00E2 00E4 016F 0107 00E7 0142 00EB 0150 0151 00EE 0179 00C4 0106 + 00C9 0139 013A 00F4 00F6 013D 013E 015A 015B 00D6 00DC 0164 0165 0141 00D7 010D + 00E1 00ED 00F3 00FA 0104 0105 017D 017E 0118 0119 00AC 017A 010C 015F 00AB 00BB + 2591 2592 2593 2502 2524 00C1 00C2 011A 015E 2563 2551 2557 255D 017B 017C 2510 + 2514 2534 252C 251C 2500 253C 0102 0103 255A 2554 2569 2566 2560 2550 256C 00A4 + 0111 0110 010E 00CB 010F 0147 00CD 00CE 011B 2518 250C 2588 2584 0162 016E 2580 + 00D3 00DF 00D4 0143 0144 0148 0160 0161 0154 00DA 0155 0170 00FD 00DD 0163 00B4 + 00AD 02DD 02DB 02C7 02D8 00A7 00F7 00B8 00B0 00A8 02D9 0171 0158 0159 25A0 00A0 + diff --git a/sql/spatial.cc b/sql/spatial.cc index bb6e03c3c03..b21d30e4b53 100644 --- a/sql/spatial.cc +++ b/sql/spatial.cc @@ -285,7 +285,7 @@ int GLineString::get_mbr(MBR *mbr) const return 1; for (; n_points>0; --n_points) { - mbr->add_xy((double *)data, (double *)(data + 8)); + mbr->add_xy(data, data + 8); data += 8+8; } @@ -551,7 +551,7 @@ int GPolygon::get_mbr(MBR *mbr) const return 1; for (; n_points>0; --n_points) { - mbr->add_xy((double *)data, (double *)(data + 8)); + mbr->add_xy(data, data + 8); data += 8+8; } } @@ -838,8 +838,7 @@ int GMultiPoint::get_mbr(MBR *mbr) const return 1; for (; n_points>0; --n_points) { - mbr->add_xy((double *)(data + WKB_HEADER_SIZE), - (double *)(data + 8 + WKB_HEADER_SIZE)); + mbr->add_xy(data + WKB_HEADER_SIZE, data + 8 + WKB_HEADER_SIZE); data += (8+8+WKB_HEADER_SIZE); } return 0; @@ -963,7 +962,7 @@ int GMultiLineString::get_mbr(MBR *mbr) const for (; n_points>0; --n_points) { - mbr->add_xy((double *)data, (double *)(data + 8)); + mbr->add_xy(data, data + 8); data += 8+8; } } @@ -1156,7 +1155,7 @@ int GMultiPolygon::get_mbr(MBR *mbr) const for (; n_points>0; --n_points) { - mbr->add_xy((double *)data, (double *)(data + 8)); + mbr->add_xy(data, data + 8); data += 8+8; } } diff --git a/sql/spatial.h b/sql/spatial.h index 2daa8e856c9..c6e30a44fbf 100644 --- a/sql/spatial.h +++ b/sql/spatial.h @@ -71,7 +71,7 @@ struct MBR } } - void add_xy(double *px, double *py) + void add_xy(const char *px, const char *py) { /* Not using "else" for proper one point MBR calculation */ double x, y; float8get(x, px); diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 95f9e15331f..a15cb23fbee 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -2117,7 +2117,7 @@ fill_record(List<Item> &fields,List<Item> &values) while ((field=(Item_field*) f++)) { value=v++; - if (value->save_in_field(field->field)) + if (value->save_in_field(field->field) > 0) DBUG_RETURN(1); } DBUG_RETURN(0); @@ -2135,7 +2135,7 @@ fill_record(Field **ptr,List<Item> &values) while ((field = *ptr++)) { value=v++; - if (value->save_in_field(field)) + if (value->save_in_field(field) == 1) DBUG_RETURN(1); } DBUG_RETURN(0); diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc index a98012653b3..3668a817165 100644 --- a/sql/sql_handler.cc +++ b/sql/sql_handler.cc @@ -179,7 +179,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, Item *item; for (key_len=0 ; (item=it_ke++) ; key_part++) { - item->save_in_field(key_part->field); + (void) item->save_in_field(key_part->field); key_len+=key_part->store_length; } if (!(key= (byte*) sql_calloc(ALIGN_SIZE(key_len)))) diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 26b59207f5d..b75826663ca 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -260,7 +260,7 @@ private: bool create_total_list_n_last_return(THD *thd, st_lex *lex, TABLE_LIST ***result); }; -typedef struct st_select_lex_unit SELECT_LEX_UNIT; +typedef class st_select_lex_unit SELECT_LEX_UNIT; /* SELECT_LEX - store information of parsed SELECT_LEX statment @@ -312,7 +312,7 @@ public: friend void mysql_init_query(THD *thd); }; -typedef struct st_select_lex SELECT_LEX; +typedef class st_select_lex SELECT_LEX; class Set_option :public Sql_alloc { public: diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 49a961c1a78..9977eaad0ff 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1600,7 +1600,7 @@ mysql_execute_command(void) res = mysql_create_table(thd,tables->db ? tables->db : thd->db, tables->real_name, &lex->create_info, lex->create_list, - lex->key_list,0, 0); // do logging + lex->key_list,0,0,0); // do logging if (!res) send_ok(&thd->net); } diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 690270d6407..d071743aec4 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -2486,7 +2486,7 @@ store_val_in_field(Field *field,Item *item) THD *thd=current_thd; ulong cuted_fields=thd->cuted_fields; thd->count_cuted_fields=1; - item->save_in_field(field); + (void) item->save_in_field(field); thd->count_cuted_fields=0; return cuted_fields != thd->cuted_fields; } diff --git a/sql/sql_select.h b/sql/sql_select.h index 0f7e08d268e..495dd7f7ab7 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -340,7 +340,7 @@ public: {} bool copy() { - item->save_in_field(to_field); + (void) item->save_in_field(to_field); return err != 0; } const char *name() const { return "func"; } @@ -364,7 +364,7 @@ public: if (!inited) { inited=1; - item->save_in_field(to_field); + (void)item->save_in_field(to_field); } return err != 0; } diff --git a/sql/sql_select.h.rej b/sql/sql_select.h.rej deleted file mode 100644 index 07b1c4403f9..00000000000 --- a/sql/sql_select.h.rej +++ /dev/null @@ -1,96 +0,0 @@ -*************** -*** 173,178 **** - select_result *result; - TMP_TABLE_PARAM tmp_table_param; - MYSQL_LOCK *lock; - }; - - ---- 172,240 ---- - select_result *result; - TMP_TABLE_PARAM tmp_table_param; - MYSQL_LOCK *lock; -+ -+ bool select_distinct, //Is select distinct? -+ no_order, simple_order, simple_group, -+ skip_sort_order, need_tmp, -+ hidden_group_fields, -+ buffer_result; -+ DYNAMIC_ARRAY keyuse; -+ Item::cond_result cond_value; -+ List<Item> all_fields; -+ List<Item> & fields_list; // hold field list passed to mysql_select -+ int error; -+ -+ ORDER *order, *group_list, *proc_param; //hold parameters of mysql_select -+ COND *conds; // ---"--- -+ TABLE_LIST *tables_list; //hold 'tables' parameter of mysql_select -+ SQL_SELECT *select; //created in optimisation phase -+ TABLE *exec_tmp_table; //used in 'exec' to hold temporary table -+ SELECT_LEX *select_lex; //corresponding select_lex -+ -+ my_bool test_function_query; // need to return select items 1 row -+ const char *zero_result_cause; // not 0 if exec must return zero result -+ -+ JOIN(THD *thd, List<Item> &fields, -+ ulong select_options, select_result *result): -+ join_tab(0), -+ table(0), -+ tables(0), const_tables(0), -+ sort_and_group(0), first_record(0), -+ do_send_rows(1), -+ send_records(0), found_records(0), examined_rows(0), -+ thd(thd), -+ sum_funcs(0), -+ having(0), -+ select_options(select_options), -+ result(result), -+ lock(thd->lock), -+ select_distinct(test(select_options & SELECT_DISTINCT)), -+ no_order(0), simple_order(0), simple_group(0), skip_sort_order(0), -+ need_tmp(0), -+ hidden_group_fields (0), /*safety*/ -+ buffer_result(test(select_options & OPTION_BUFFER_RESULT) && -+ !test(select_options & OPTION_FOUND_ROWS)), -+ all_fields(fields), -+ fields_list(fields), -+ select(0), -+ exec_tmp_table(0), -+ select_lex(0), //for safety -+ test_function_query(0), -+ zero_result_cause(0) -+ { -+ fields_list = fields; -+ bzero((char*) &keyuse,sizeof(keyuse)); -+ tmp_table_param.copy_field=0; -+ tmp_table_param.end_write_records= HA_POS_ERROR; -+ } -+ -+ int prepare(TABLE_LIST *tables, -+ COND *conds, ORDER *order, ORDER *group, Item *having, -+ ORDER *proc_param, SELECT_LEX *select); -+ int optimize(); -+ int global_optimize(); -+ void exec(); -+ int cleanup(THD *thd); - }; - - -*************** -*** 187,193 **** - bool store_val_in_field(Field *field,Item *val); - TABLE *create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, - ORDER *group, bool distinct, bool save_sum_fields, -- bool allow_distinct_limit, ulong select_options); - void free_tmp_table(THD *thd, TABLE *entry); - void count_field_types(TMP_TABLE_PARAM *param, List<Item> &fields, - bool reset_with_sum_func); ---- 249,256 ---- - bool store_val_in_field(Field *field,Item *val); - TABLE *create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, - ORDER *group, bool distinct, bool save_sum_fields, -+ bool allow_distinct_limit, ulong select_options, -+ SELECT_LEX *first_select); - void free_tmp_table(THD *thd, TABLE *entry); - void count_field_types(TMP_TABLE_PARAM *param, List<Item> &fields, - bool reset_with_sum_func); diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 494607c7fff..e227a5bf5ca 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1381,8 +1381,10 @@ int mysqld_show_charsets(THD *thd, const char *wild) if (send_fields(thd,field_list,1)) DBUG_RETURN(1); - for (cs=compiled_charsets ; cs->name ; cs++ ) + for (cs=all_charsets ; cs < all_charsets+255 ; cs++ ) { + if (!cs->name) + continue; if (!(wild && wild[0] && wild_case_compare(system_charset_info,cs->name,wild))) { packet2.length(0); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index d8012c0c102..3652b2512f4 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -70,7 +70,7 @@ int mysql_rm_table(THD *thd,TABLE_LIST *tables, my_bool if_exists) } error=mysql_rm_table_part2(thd,tables,if_exists,0); - err: + err: VOID(pthread_cond_broadcast(&COND_refresh)); // Signal to refresh pthread_mutex_unlock(&LOCK_open); @@ -209,7 +209,6 @@ int quick_rm_table(enum db_type base,const char *db, PRIMARY keys are prioritized. */ - static int sort_keys(KEY *a, KEY *b) { if (a->flags & HA_NOSAME) @@ -251,7 +250,8 @@ static int sort_keys(KEY *a, KEY *b) int mysql_create_table(THD *thd,const char *db, const char *table_name, HA_CREATE_INFO *create_info, List<create_field> &fields, - List<Key> &keys,bool tmp_table,bool no_log) + List<Key> &keys,bool tmp_table,bool no_log, + uint select_field_count) { char path[FN_REFLEN]; const char *key_name; @@ -259,10 +259,11 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, int error= -1; uint db_options,field,null_fields,blob_columns; ulong pos; - KEY *key_info,*key_info_buffer; + KEY *key_info,*key_info_buffer; KEY_PART_INFO *key_part_info; int auto_increment=0; handler *file; + int field_no,dup_no; DBUG_ENTER("mysql_create_table"); /* @@ -275,6 +276,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, DBUG_RETURN(-1); } List_iterator<create_field> it(fields),it2(fields); + int select_field_pos=fields.elements - select_field_count; null_fields=blob_columns=0; db_options=create_info->table_options; if (create_info->row_type == ROW_TYPE_DYNAMIC) @@ -288,10 +290,10 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, DBUG_RETURN(-1); } - /* Don't pack keys in old tables if the user has requested this */ - while ((sql_field=it++)) + for(field_no=0; (sql_field=it++) ; field_no++) { + /* Don't pack keys in old tables if the user has requested this */ if ((sql_field->flags & BLOB_FLAG) || sql_field->sql_type == FIELD_TYPE_VAR_STRING && create_info->row_type != ROW_TYPE_FIXED) @@ -300,14 +302,29 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, } if (!(sql_field->flags & NOT_NULL_FLAG)) null_fields++; - while ((dup_field=it2++) != sql_field) + for(dup_no=0; (dup_field=it2++) != sql_field; dup_no++) { - if (my_strcasecmp(system_charset_info, - sql_field->field_name, + if (my_strcasecmp(system_charset_info, + sql_field->field_name, dup_field->field_name) == 0) { - my_error(ER_DUP_FIELDNAME,MYF(0),sql_field->field_name); - DBUG_RETURN(-1); + if (field_no<select_field_pos || dup_no>=select_field_pos) + { + my_error(ER_DUP_FIELDNAME,MYF(0),sql_field->field_name); + DBUG_RETURN(-1); + } + else + { + sql_field->length=dup_field->length; + sql_field->decimals=dup_field->decimals; + sql_field->flags=dup_field->flags; + sql_field->pack_length=dup_field->pack_length; + sql_field->unireg_check=dup_field->unireg_check; + sql_field->sql_type=dup_field->sql_type; + it2.remove(); + select_field_pos--; + break; + } } } it2.rewind(); @@ -793,6 +810,7 @@ TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info, TABLE tmp_table; // Used during 'create_field()' TABLE *table; tmp_table.table_name=0; + uint select_field_count=0; DBUG_ENTER("create_table_from_items"); /* Add selected items to field list */ @@ -826,11 +844,12 @@ TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info, (Field*) 0)))) DBUG_RETURN(0); extra_fields->push_back(cr_field); + select_field_count++; } /* create and lock table */ /* QQ: This should be done atomic ! */ if (mysql_create_table(thd,db,name,create_info,*extra_fields, - *keys,0,1)) // no logging + *keys,0,1,select_field_count)) // no logging DBUG_RETURN(0); if (!(table=open_table(thd,db,name,name,(bool*) 0))) { @@ -1719,7 +1738,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, if ((error=mysql_create_table(thd, new_db, tmp_name, create_info, - create_list,key_list,1,1))) // no logging + create_list,key_list,1,1,0))) // no logging DBUG_RETURN(error); if (table->tmp_table) diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index b762388d9be..e9eb5f67b0d 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -167,6 +167,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token CHECK_SYM %token CIPHER %token COMMITTED_SYM +%token COLLATE_SYM %token COLUMNS %token COLUMN_SYM %token CONCURRENT @@ -522,7 +523,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %left '*' '/' '%' %left NEG '~' %right NOT -%right BINARY +%right BINARY COLLATE_SYM %type <lex_str> IDENT TEXT_STRING REAL_NUM FLOAT_NUM NUM LONG_NUM HEX_NUM LEX_HOSTNAME @@ -1129,7 +1130,7 @@ charset: { if (!(Lex->charset=get_charset_by_name($1.str,MYF(0)))) { - net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$1); + net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$1.str); YYABORT; } }; @@ -1658,7 +1659,16 @@ expr_expr: | expr '+' INTERVAL_SYM expr interval { $$= new Item_date_add_interval($1,$4,$5,0); } | expr '-' INTERVAL_SYM expr interval - { $$= new Item_date_add_interval($1,$4,$5,1); }; + { $$= new Item_date_add_interval($1,$4,$5,1); } + | expr COLLATE_SYM ident + { + if (!(Lex->charset=get_charset_by_name($3.str,MYF(0)))) + { + net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3.str); + YYABORT; + } + $$= new Item_func_set_collation($1,Lex->charset); + }; /* expressions that begin with 'expr' that do NOT follow IN_SYM */ no_in_expr: @@ -3446,7 +3456,7 @@ option_value: CONVERT *tmp; if (!(tmp=get_convert_set($3.str))) { - net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3); + net_printf(¤t_thd->net,ER_UNKNOWN_CHARACTER_SET,$3.str); YYABORT; } current_thd->convert_set=tmp; diff --git a/sql/unireg.cc b/sql/unireg.cc index f2d8d6532a9..57a1407ea06 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -590,7 +590,7 @@ static bool make_empty_rec(File file,enum db_type table_type, if (field->def && (regfield->real_type() != FIELD_TYPE_YEAR || field->def->val_int() != 0)) - field->def->save_in_field(regfield); + (void) field->def->save_in_field(regfield); else if (regfield->real_type() == FIELD_TYPE_ENUM && (field->flags & NOT_NULL_FLAG)) { diff --git a/strings/ctype-mb.c b/strings/ctype-mb.c index d328ebb7a36..aa475e281d0 100644 --- a/strings/ctype-mb.c +++ b/strings/ctype-mb.c @@ -24,13 +24,15 @@ void my_caseup_str_mb(CHARSET_INFO * cs, char *str) { register uint32 l; register char *end=str+strlen(str); /* BAR TODO: remove strlen() call */ + register uchar *map=cs->to_upper; + while (*str) { if ((l=my_ismbchar(cs, str,end))) str+=l; else { - *str=(char)my_toupper(cs,(uchar)*str); + *str=(char) map[(uchar)*str]; str++; } } @@ -40,13 +42,15 @@ void my_casedn_str_mb(CHARSET_INFO * cs, char *str) { register uint32 l; register char *end=str+strlen(str); + register uchar *map=cs->to_lower; + while (*str) { if ((l=my_ismbchar(cs, str,end))) str+=l; else { - *str=(char)my_tolower(cs,(uchar)*str); + *str=(char) map[(uchar)*str]; str++; } } @@ -56,13 +60,15 @@ void my_caseup_mb(CHARSET_INFO * cs, char *str, uint length) { register uint32 l; register char *end=str+length; + register uchar *map=cs->to_upper; + while (str<end) { if ((l=my_ismbchar(cs, str,end))) str+=l; else { - *str=(char)my_toupper(cs,(uchar)*str); + *str=(char) map[(uchar)*str]; str++; } } @@ -72,13 +78,15 @@ void my_casedn_mb(CHARSET_INFO * cs, char *str, uint length) { register uint32 l; register char *end=str+length; + register uchar *map=cs->to_lower; + while (str<end) { if ((l=my_ismbchar(cs, str,end))) str+=l; else { - *str=(char)my_tolower(cs,(uchar)*str); + *str=(char) map[(uchar)*str]; str++; } } @@ -88,6 +96,8 @@ int my_strcasecmp_mb(CHARSET_INFO * cs,const char *s, const char *t) { register uint32 l; register const char *end=s+strlen(s); + register uchar *map=cs->to_upper; + while (s<end) { if ((l=my_ismbchar(cs, s,end))) @@ -98,7 +108,7 @@ int my_strcasecmp_mb(CHARSET_INFO * cs,const char *s, const char *t) } else if (my_ismbhead(cs, *t)) return 1; - else if (my_toupper(cs,(uchar) *s++) != my_toupper(cs,(uchar) *t++)) + else if (map[(uchar) *s++] != map[(uchar) *t++]) return 1; } return *t; @@ -110,6 +120,8 @@ int my_strncasecmp_mb(CHARSET_INFO * cs, { register uint32 l; register const char *end=s+len; + register uchar *map=cs->to_upper; + while (s<end) { if ((l=my_ismbchar(cs, s,end))) @@ -120,7 +132,7 @@ int my_strncasecmp_mb(CHARSET_INFO * cs, } else if (my_ismbhead(cs, *t)) return 1; - else if (my_toupper(cs,(uchar) *s++) != my_toupper(cs,(uchar) *t++)) + else if (map[(uchar) *s++] != map[(uchar) *t++]) return 1; } return 0; diff --git a/strings/ctype-simple.c b/strings/ctype-simple.c index 52c66f0ad4e..19989afea60 100644 --- a/strings/ctype-simple.c +++ b/strings/ctype-simple.c @@ -46,43 +46,49 @@ int my_strnncoll_simple(CHARSET_INFO * cs,const char *s, uint slen, void my_caseup_str_8bit(CHARSET_INFO * cs,char *str) { - while ((*str = (char) my_toupper(cs,(uchar) *str)) != 0) + register uchar *map=cs->to_upper; + while ((*str = (char) map[(uchar) *str]) != 0) str++; } void my_casedn_str_8bit(CHARSET_INFO * cs,char *str) { - while ((*str = (char) my_tolower(cs,(uchar)*str)) != 0) + register uchar *map=cs->to_lower; + while ((*str = (char) map[(uchar)*str]) != 0) str++; } void my_caseup_8bit(CHARSET_INFO * cs, char *str, uint length) { + register uchar *map=cs->to_upper; for ( ; length>0 ; length--, str++) - *str= (char) my_toupper(cs,(uchar)*str); + *str= (char) map[(uchar)*str]; } void my_casedn_8bit(CHARSET_INFO * cs, char *str, uint length) { + register uchar *map=cs->to_lower; for ( ; length>0 ; length--, str++) - *str= (char)my_tolower(cs,(uchar) *str); + *str= (char) map[(uchar) *str]; } int my_strcasecmp_8bit(CHARSET_INFO * cs,const char *s, const char *t) { - while (my_toupper(cs,(uchar) *s) == my_toupper(cs,(uchar) *t++)) + register uchar *map=cs->to_upper; + while (map[(uchar) *s] == map[(uchar) *t++]) if (!*s++) return 0; - return ((int) my_toupper(cs,(uchar) s[0]) - (int) my_toupper(cs,(uchar) t[-1])); + return ((int) map[(uchar) s[0]] - (int) map[(uchar) t[-1]]); } int my_strncasecmp_8bit(CHARSET_INFO * cs, const char *s, const char *t, uint len) { - while (len-- != 0 && my_toupper(cs,(uchar)*s++) == my_toupper(cs,(uchar)*t++)) ; + register uchar *map=cs->to_upper; + while (len-- != 0 && map[(uchar)*s++] == map[(uchar)*t++]) ; return (int) len+1; } diff --git a/strings/ctype.c b/strings/ctype.c index 7c37eeff986..f91c8985aee 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -2805,8 +2805,10 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_latin1 { - 8, /* number */ - "latin1", /* name */ + 8, /* number */ + MY_CS_COMPILED, /* state */ + "latin1", /* name */ + "", /* comment */ ctype_latin1, to_lower_latin1, to_upper_latin1, @@ -2838,7 +2840,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_big5 { 1, /* number */ + MY_CS_COMPILED, /* state */ "big5", /* name */ + "", /* comment */ ctype_big5, to_lower_big5, to_upper_big5, @@ -2870,7 +2874,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_cp1251 { 14, /* number */ + MY_CS_COMPILED, /* state */ "cp1251", /* name */ + "", /* comment */ ctype_cp1251, to_lower_cp1251, to_upper_cp1251, @@ -2902,7 +2908,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_cp1257 { 29, /* number */ + MY_CS_COMPILED, /* state */ "cp1257", /* name */ + "", /* comment */ ctype_cp1257, to_lower_cp1257, to_upper_cp1257, @@ -2934,7 +2942,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_croat { 27, /* number */ + MY_CS_COMPILED, /* state */ "croat", /* name */ + "", /* comment */ ctype_croat, to_lower_croat, to_upper_croat, @@ -2966,7 +2976,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_czech { 2, /* number */ + MY_CS_COMPILED, /* state */ "czech", /* name */ + "", /* comment */ ctype_czech, to_lower_czech, to_upper_czech, @@ -2998,7 +3010,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_danish { 15, /* number */ + MY_CS_COMPILED, /* state */ "danish", /* name */ + "", /* comment */ ctype_danish, to_lower_danish, to_upper_danish, @@ -3030,7 +3044,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_dec8 { 3, /* number */ + MY_CS_COMPILED, /* state */ "dec8", /* name */ + "", /* comment */ ctype_dec8, to_lower_dec8, to_upper_dec8, @@ -3062,7 +3078,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_dos { 4, /* number */ + MY_CS_COMPILED, /* state */ "dos", /* name */ + "", /* comment */ ctype_dos, to_lower_dos, to_upper_dos, @@ -3094,7 +3112,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_estonia { 20, /* number */ + MY_CS_COMPILED, /* state */ "estonia", /* name */ + "", /* comment */ ctype_estonia, to_lower_estonia, to_upper_estonia, @@ -3126,7 +3146,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_euc_kr { 19, /* number */ + MY_CS_COMPILED, /* state */ "euc_kr", /* name */ + "", /* comment */ ctype_euc_kr, to_lower_euc_kr, to_upper_euc_kr, @@ -3158,7 +3180,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_gb2312 { 24, /* number */ + MY_CS_COMPILED, /* state */ "gb2312", /* name */ + "", /* comment */ ctype_gb2312, to_lower_gb2312, to_upper_gb2312, @@ -3190,7 +3214,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_gbk { 28, /* number */ + MY_CS_COMPILED, /* state */ "gbk", /* name */ + "", /* comment */ ctype_gbk, to_lower_gbk, to_upper_gbk, @@ -3222,7 +3248,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_german1 { 5, /* number */ + MY_CS_COMPILED, /* state */ "german1", /* name */ + "", /* comment */ ctype_german1, to_lower_german1, to_upper_german1, @@ -3254,7 +3282,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_greek { 25, /* number */ + MY_CS_COMPILED, /* state */ "greek", /* name */ + "", /* comment */ ctype_greek, to_lower_greek, to_upper_greek, @@ -3286,7 +3316,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_hebrew { 16, /* number */ + MY_CS_COMPILED, /* state */ "hebrew", /* name */ + "", /* comment */ ctype_hebrew, to_lower_hebrew, to_upper_hebrew, @@ -3318,7 +3350,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_hp8 { 6, /* number */ + MY_CS_COMPILED, /* state */ "hp8", /* name */ + "", /* comment */ ctype_hp8, to_lower_hp8, to_upper_hp8, @@ -3350,7 +3384,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_hungarian { 21, /* number */ + MY_CS_COMPILED, /* state */ "hungarian", /* name */ + "", /* comment */ ctype_hungarian, to_lower_hungarian, to_upper_hungarian, @@ -3382,7 +3418,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_koi8_ru { 7, /* number */ + MY_CS_COMPILED, /* state */ "koi8_ru", /* name */ + "", /* comment */ ctype_koi8_ru, to_lower_koi8_ru, to_upper_koi8_ru, @@ -3414,7 +3452,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_koi8_ukr { 22, /* number */ + MY_CS_COMPILED, /* state */ "koi8_ukr", /* name */ + "", /* comment */ ctype_koi8_ukr, to_lower_koi8_ukr, to_upper_koi8_ukr, @@ -3446,7 +3486,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_latin1_de { 31, /* number */ + MY_CS_COMPILED, /* state */ "latin1_de", /* name */ + "", /* comment */ ctype_latin1_de, to_lower_latin1_de, to_upper_latin1_de, @@ -3478,7 +3520,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_latin2 { 9, /* number */ + MY_CS_COMPILED, /* state */ "latin2", /* name */ + "", /* comment */ ctype_latin2, to_lower_latin2, to_upper_latin2, @@ -3510,7 +3554,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_latin5 { 30, /* number */ + MY_CS_COMPILED, /* state */ "latin5", /* name */ + "", /* comment */ ctype_latin5, to_lower_latin5, to_upper_latin5, @@ -3542,7 +3588,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_sjis { 13, /* number */ + MY_CS_COMPILED, /* state */ "sjis", /* name */ + "", /* comment */ ctype_sjis, to_lower_sjis, to_upper_sjis, @@ -3574,7 +3622,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_swe7 { 10, /* number */ + MY_CS_COMPILED, /* state */ "swe7", /* name */ + "", /* comment */ ctype_swe7, to_lower_swe7, to_upper_swe7, @@ -3606,7 +3656,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_tis620 { 18, /* number */ + MY_CS_COMPILED, /* state */ "tis620", /* name */ + "", /* comment */ ctype_tis620, to_lower_tis620, to_upper_tis620, @@ -3638,7 +3690,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_ucs2 { 35, /* number */ + MY_CS_COMPILED, /* state */ "ucs2", /* name */ + "", /* comment */ ctype_ucs2, /* ctype */ to_lower_ucs2, /* to_lower */ to_upper_ucs2, /* to_upper */ @@ -3671,7 +3725,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_ujis { 12, /* number */ + MY_CS_COMPILED, /* state */ "ujis", /* name */ + "", /* comment */ ctype_ujis, to_lower_ujis, to_upper_ujis, @@ -3703,7 +3759,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_utf8 { 33, /* number */ + MY_CS_COMPILED, /* state */ "utf8", /* name */ + "", /* comment */ ctype_utf8, /* ctype */ to_lower_utf8, /* to_lower */ to_upper_utf8, /* to_upper */ @@ -3735,7 +3793,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_usa7 { 11, /* number */ + MY_CS_COMPILED, /* state */ "usa7", /* name */ + "", /* comment */ ctype_usa7, to_lower_usa7, to_upper_usa7, @@ -3767,7 +3827,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_win1250 { 26, /* number */ + MY_CS_COMPILED, /* state */ "win1250", /* name */ + "", /* comment */ ctype_win1250, to_lower_win1250, to_upper_win1250, @@ -3799,7 +3861,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_win1251ukr { 23, /* number */ + MY_CS_COMPILED, /* state */ "win1251ukr", /* name */ + "", /* comment */ ctype_win1251ukr, to_lower_win1251ukr, to_upper_win1251ukr, @@ -3831,7 +3895,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_armscii8 { 32, /* number */ + MY_CS_COMPILED, /* state */ "armscii8", /* name */ + "", /* comment */ ctype_armscii8, to_lower_armscii8, to_upper_armscii8, @@ -3863,7 +3929,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_win1251 { 17, /* number */ + MY_CS_COMPILED, /* state */ "win1251", /* name */ + "", /* comment */ ctype_win1251, to_lower_win1251, to_upper_win1251, @@ -3895,7 +3963,9 @@ CHARSET_INFO compiled_charsets[] = { #ifdef HAVE_CHARSET_win1250ch { 34, /* number */ + MY_CS_COMPILED, /* state */ "win1250ch", /* name */ + "", /* comment */ ctype_win1250ch, to_lower_win1250ch, to_upper_win1250ch, @@ -3926,7 +3996,9 @@ CHARSET_INFO compiled_charsets[] = { { 0, /* end-of-list marker */ - NullS, + 0, /* state */ + NullS, /* name */ + NullS, /* comment */ NULL, NULL, NULL, |