[Phpmyadmin-git] [SCM] phpMyAdmin branch, master, updated. RELEASE_3_4_4RC1-17209-gf678a45

Piotr Przybylski crackpl at users.sourceforge.net
Wed Aug 24 21:46:09 CEST 2011


The branch, master has been updated
       via  f678a45cd2315676f60f28f80f518fa60d8ca3e4 (commit)
       via  3e0af184341eca03f24bd75a2b0c3057c8fca327 (commit)
       via  b4f4a209c839f965e67b59ca4d9acfe811b0a444 (commit)
       via  710c7e2dd73209a10d994cd11c9b8ef19fc1f78c (commit)
       via  8cd8760256925aecc00de01cc0e5bfc987d128b1 (commit)
       via  4cf5fe79978bb4bbddfc0002c83926cead658587 (commit)
       via  92be06e6e9bb573addad7a2fcf49ed36e1f4e035 (commit)
       via  57bea0630acc3d36f7f771a96fb84aebbea1ab3d (commit)
       via  a31b30ba57c2351b44a9adb5289fea5ca13750b2 (commit)
       via  d2255fb9ae57a384e3888df9b9b268ef4f511d19 (commit)
       via  1c2dbf0cbb4793837701014b66a522727bda144d (commit)
       via  e5157838e52aecb9d8dfdd1a68be3c6049183634 (commit)
       via  dec6f85a06220ae41067a880dc656abe449dda83 (commit)
       via  41c18f611362d4fce75d3bbc90d3aa101736c47e (commit)
       via  11cd7afc7bfa67364ea3fd6a8d86f8c9aae85cbe (commit)
       via  5ce1db5f1ab3a5e2aba960ec082c3b3232d33641 (commit)
       via  b06a443307c46f7df1a7bfabe7f99816fd2c57ba (commit)
       via  e9158da8188ab070640b803610d04e6fe820fa1d (commit)
       via  38389841d7459abc2fa86d1799add7af432f054d (commit)
       via  0ca4a5f02e687ebaa1708f1378cdc16ab4f408a7 (commit)
       via  627e4133c35c120f4270efa2e0d087d6b6fb07c8 (commit)
       via  dd8116cc61e691c99e7462198cd72742bb763e02 (commit)
       via  99f52e1eddf89dec755c1ebf11189b12441432a9 (commit)
       via  1aa438539a4a057070270b02c6b2bbaed8a951d9 (commit)
       via  4073badee28f2af85bf51e22a756aee63bc81d3f (commit)
       via  b7f3d86a413b19b54d86e9aeb2a0a78a9781059c (commit)
       via  e72036b4b19905b011d753fb4b3a9c83a48ed290 (commit)
       via  f578d0dadc28a3f6266b06e34142d3b02de4b499 (commit)
       via  bcce8b276787d760a2a54260af98637c9da254bb (commit)
       via  a502f95af4df692827bb7da2bd2251e3570eb0bc (commit)
       via  970262c435ef788c44bfa80fe4a106ac49a23bd9 (commit)
       via  2cd6de464839381594438c08262af85ceeb2903f (commit)
       via  bdefd47ec129e796f2e0e212fe7dc7afab4dc16d (commit)
       via  a7c0c55c7fa9c0ee45cef59245e2572f3c2f1be1 (commit)
       via  64926ead73dadd10b323712304d72fa86c6a3982 (commit)
       via  021972892941ac9279e6272addce774779a09374 (commit)
       via  381e172fcc5913528b058e6af5d95c594bfa51e1 (commit)
       via  7f1fa1bab02e9b584a358b21fdc121de35a43810 (commit)
       via  ca8a30f7f8406b789489da3997162d0beaa75dba (commit)
       via  a5ff5e860d2b8763f4810199c63a56bb12cbc577 (commit)
       via  d5cb3b69970701eba27a7de98eebf01160bbe9d9 (commit)
       via  66665f326ae28740ea10939feebe223b702943b8 (commit)
       via  3fa5e89bb29bb481576a2cf81d3364402bef8dcf (commit)
       via  11f2c43f11126695b62acae06d7b4641fb068127 (commit)
       via  ce7e6feaf528cdba079f707670818c83e436645f (commit)
       via  b41976e5520c87a066c8da73b7972d8f7c6ff2c0 (commit)
       via  40a8e4639215fbb780a9df52f8e8fc20726ffa78 (commit)
       via  dfec5a47325d5682bbf5ea5fea2b2f7e176cfee7 (commit)
       via  997a5ea14c04519abedc1f98c07e6f0d66b35943 (commit)
       via  e116f1d8a9315439451778a75e42e8e60e242fc2 (commit)
       via  9ed51773204a3370474020a3a586ff6c8664540b (commit)
       via  d7bea4d4ee9d4f6af82528dd6b01ee8e5d2b59e4 (commit)
       via  e1799393f3231f716df17217eca1332441db0914 (commit)
       via  b57fda5b3dff95ba1e5dd396c347d7af50b9f776 (commit)
       via  7897967c761103cbdaf01c11b9ffcb203c50f27a (commit)
       via  bb8bd55ef6e191129df9bf2b5e286abc8415f4d8 (commit)
       via  7bc8d8348dbbc75dbd2099e9a1ad4fabf754433e (commit)
       via  c7dd3244c66937311d5c85db0fa4c9bd605cff46 (commit)
       via  c44f28a8289532b5288dcfe8b998581d007d9a77 (commit)
       via  d35ec740a0f2049b41682dff1d482d7f1d408242 (commit)
       via  f777dc3db53b90d9afe8cac02aea90ba3ce5a0ba (commit)
       via  eb18aeeeb291276991b992ce889ce53fd74a5f5e (commit)
       via  4e22743b379c43e6d26d3e19374f12f2a7a36004 (commit)
       via  abdf808dee7787719e0de139f1013c1301b8c4a1 (commit)
       via  11a86905415d0a37849221024b0f0a17d459afd2 (commit)
       via  f06cabeca71851821f9b82a7bdbe39be54f6d1d3 (commit)
       via  0eca09ffff331b7b2a5d9cd4a0fe24e05df6da2f (commit)
       via  487da6e7af675ff899194486a7d5e8aabbc1b87b (commit)
       via  f2935d56d989cf8b7dc5884e0097088509dafd5e (commit)
       via  e94e42fb73bb3b35ec3452264ee259efc78fcb38 (commit)
       via  13f0d7a5d57f737a04aa0203cdf4d9b3acd3996f (commit)
       via  a04f592a9258e86e86a337cd6223102e457a5e4c (commit)
       via  3586bb992f0e6c325207dc55bd01c1f3607f0b31 (commit)
       via  74a00a110f6d15d24b5b40c02ec8a3916a6acd15 (commit)
       via  b364cfd211f89b6be9abe1dda24d90b4ce590950 (commit)
       via  f36b2e54414baa52b19a591d47b070edca036160 (commit)
       via  a28beb9c1fb4c0bb432961034b90232b24b908f3 (commit)
       via  82675f778dce0736ddeb5953b4fe9277a6360df2 (commit)
       via  392d463a8848edb84e2bfb280a3645f458a0af04 (commit)
       via  6ab10cdf837b9fd24eb9df9404b559d127934167 (commit)
       via  c9e3e708090a02ea8ca6937538d8d077d4914f1c (commit)
       via  6dbcab261ef2d5e498846cda4cdbd538103a7380 (commit)
       via  738228a8d838c5d7dadcfcee676a81baa0c43200 (commit)
       via  08d4e5a5b8b06b5346f12799f8e0da116f65f639 (commit)
       via  a0a4628b11fa8fc89fc3e956fa5c4e5c863c729f (commit)
       via  f7591dd5631dbd2c201147bb7683982888f48a94 (commit)
       via  59e71a06c0e224d91a6e83ce5e6de2fde82a03b2 (commit)
       via  ab4cca24bcd80cbe61919fc4c288f969a8ef4acd (commit)
       via  fb01897f61cb0aa012da9e3db826684e40ca06f8 (commit)
       via  dd6f936731742582091aa8de9cc2306629d41f4e (commit)
       via  480fe9f78c92776a41f0e67d60c62947cf910ce3 (commit)
       via  beddd31ec3a0094ecd979e87fbe69418f6a4da50 (commit)
       via  c3d1a8b14a7b05c8afca8413fada57e59106277a (commit)
       via  7801d550180c2003862568e9ac706056544fe53e (commit)
       via  682ceb66c1b7e2fa6f60d541d35dbe7bbeb52277 (commit)
       via  bf9469ec189998671c27cb1717c6f5dd9c5a0df2 (commit)
       via  b57bc2ff5d4417a7affd4a8e9cef6041bdba57e1 (commit)
       via  1bf994d73f98500b34f9e701bb7f47f0d60bd682 (commit)
       via  024d4adc27c2b41faa66913ded839731c717783f (commit)
       via  382c020a85a24e6634ede3b07a1c6daefdcd2bd7 (commit)
       via  26038eb6b5263f34e542611d3b667079e81f4b91 (commit)
       via  e8a0602f7bf04d79ee28f8de87250c60fd5937b4 (commit)
       via  c3974ea3b616281937ea21b6d2af5606ffe4237b (commit)
       via  44907283fc3fef3e8fc5c2da5390767daf7b3b70 (commit)
       via  26483ccc19f14073882e28ccc81e9d24f626401a (commit)
       via  a445d94ee09d33fe9ab87851065b89bb664097e4 (commit)
       via  ff0081bb7a95782845fe81b72310194733d9b574 (commit)
       via  b1b4e6389d60e6ba588ac7fbbb7b91557e13aaa4 (commit)
       via  19ec26904b42f466ed18f64d915321374b9f9fec (commit)
       via  9ba2650bc636226bf7cee5558b5df1b82b52e49b (commit)
       via  35843439dfdabd7bb65ebafd2c832bcc60ff6140 (commit)
       via  0266ddd7bd66c4c0baf021e3b9bc0652f71dc51f (commit)
       via  da63d2cb1392008c8cc1dc03d44d41e024d6e698 (commit)
       via  e3a4f6d95aba63312c874bb499d61cd616be7d81 (commit)
       via  29070219a949e217936c8d1b69da0b4774e643e1 (commit)
       via  7ef98dc9a298c1ac90fbae9aa5f3221c33c2078f (commit)
       via  7255ec21004d6453d3fe0f9b7f6176fa321ac96e (commit)
       via  04fef01fd7aaca08511fed2600b539ef8c64825a (commit)
       via  7b1976d14dd6580d0ab660eeb2eeda557ac140c8 (commit)
       via  be6e21009453a1e08e1af0f693a5419c12a31802 (commit)
       via  96c5c6dbc6f20be109ff3551f2849b6feeec0310 (commit)
       via  a3b1000b43a2c2dc4df30ee02abe01475d516d69 (commit)
       via  713bf220791e9fec6526f821c4f25a2f97fd600a (commit)
       via  83117b18d715ae51e47bc988e5d2c40c88ee1dc8 (commit)
       via  3bde595666bf7cdcc8b28738d5396f8a8258af90 (commit)
       via  c734e1fd14094c2545c8305e35358e57cf485ab7 (commit)
       via  28ae930a71c02c3e05408b9aebd761a23399b567 (commit)
       via  14ab81248cd8eb4cff5de4d9a3b1d0f0755bd3f5 (commit)
       via  b00eb8f29c1616e71417c02582e081e679434548 (commit)
       via  3eaff6afb63246045bddd1977c93591b210932d6 (commit)
       via  6553cdd66307f85b99e37fa5b31218e872b0b633 (commit)
       via  d4d647e169202056886abb3591c7efb21c7f13cc (commit)
       via  7d99d57ccafc9be02f34def4b44de33da6731de5 (commit)
       via  e38b5cd4ffc534a19f7f339f96b0e2197b02363c (commit)
       via  9365825f52b3629820e11a963f83fe68925413f3 (commit)
       via  3aaaf33afa218f916e3259d306acb33f054d7cfb (commit)
       via  a7ba0fd74af1ca9d0aa73fd93cf23d8654a42dd5 (commit)
       via  c2b06f0a11522d5b61b30de932d018f979b87fad (commit)
       via  2977b7160998acff8cab236bf9a08b6fb60b9773 (commit)
       via  5951bd9373e4ee9ba2a48ac639fc2aae05fe8c98 (commit)
       via  53b29d25d24004d1bf7db146af61e3782316ae35 (commit)
       via  2e01d01b3227ffed9b5329b4320440e35ece04c7 (commit)
       via  2444ad6d20ea70f6ea03d0996ff5d3bfb204e13d (commit)
       via  4273c602c83d819af9e364b2d539eff05367e916 (commit)
       via  30b85be0a2d4d8b45ae386b2392e7c6e787729b8 (commit)
       via  6eb6a9930001f6d0c38102d2aec51b984a19a002 (commit)
       via  ae429136292a1b52a149b4d34409eae9af22f9dd (commit)
       via  693da24c95ea98ca8dd1908edab52f7c168ac362 (commit)
       via  12f70e8938cd9e3c76e878669d3de4bf4cb725ec (commit)
       via  d607fa3e5cca1bd9c8e1817db81e9a281cf68610 (commit)
       via  76dde71244cd0ea888feea902e217487a5d240f8 (commit)
       via  2c97f4b326c29aa07b6d87c62e796829fb5072d1 (commit)
       via  2ceb7588b52ad54a954d6fa137ad35073673fab0 (commit)
       via  a5342c70eabee89c27da6cf5b033b24125b235ba (commit)
       via  17f8e161413a00bc677f16425803109c3536db79 (commit)
       via  e8b144da1188af7cc1212dbaa97cf6723eb44b0a (commit)
       via  b35cd1b40fa6432600299a0c69f5620609db4791 (commit)
       via  6cca81e04d631aa880a3069f1931f685ca01ce81 (commit)
       via  f77886d1a0e030267813d557bd1927405c863681 (commit)
       via  50e0a41aa314c12059032d009512397e23f5781d (commit)
       via  4b344cb40ba4d9d55c82b9569cb8b85cecfd1f38 (commit)
       via  7737607582abef979f7a1c834b96114b2488cf65 (commit)
       via  681b61211035b98fe6cc28cef113ad1c3d777598 (commit)
       via  a515aed0fd3a17c4a314800077f8cdb5bdc5e102 (commit)
       via  96f3b37fc1d113c1ed17d06687333d6fdc785b36 (commit)
       via  a56d77fb675e7cb3813f689b860b88ce89a548fb (commit)
       via  26ec25b65e1cec25e680c9b53c715f4c890f3590 (commit)
       via  08da1557e2d95be41ef3d2821da3dc0bcfee214d (commit)
       via  cdaa1ff10125e57e12e9632c36364682317af52a (commit)
       via  1df2a890e15944c70d3c0afc7fa6337c38b30cf7 (commit)
       via  121cd6263bc64c09ff95bb72b917fbc20f410cf1 (commit)
       via  10c7353c3ce58b5dc1bee1ac03440050cd0536f9 (commit)
       via  52df66878c381fe2f2cb0883812ea3cf36105370 (commit)
       via  940042c6b37b4b93788256395df2c27824a271cb (commit)
       via  946cc6a5599d20133273bdd3846577b6d4817b8e (commit)
       via  56768f5f4c7c5379f277b3e17e607f1f163d21c2 (commit)
       via  33255a189cc532a5d7c4d1051e685816245f95db (commit)
       via  dc2a298b7a2ac5cf257b984191a0c92a192e1bff (commit)
       via  bd543f90e8d8488df6b03f55206c23e1cedda405 (commit)
       via  9f59de61673ae4472970862f75522e76b800dc14 (commit)
       via  add6c6325c238cdca23ce0212c77b474535080cb (commit)
       via  1220eafa89f1d801bdde4703a2bc20cb3077e1a9 (commit)
       via  e51a48a3fae101a51cbaa896ca06844f8b74d4ab (commit)
       via  97d5588d2b702bfe4070575cb5f639839982815e (commit)
       via  cafbefd51871dd52dfd4c7ed6ce9eef6daefa6f5 (commit)
       via  d5f3636a5da766c9d1ec75598453b430d56e6dc7 (commit)
       via  b7b76d6519b812198f1b892d0b4d602466e9608b (commit)
       via  8259510361555ffb14e24aa553f5c5618f659a03 (commit)
       via  d3ea25c159dcb4ea02d00d771d6b2e5ab8480369 (commit)
       via  2b202c04cebbd267ba97838c8dce091d6e7b1299 (commit)
       via  86d5ae26972a11c1a09c99b3bb3e5395cf24769b (commit)
       via  83b81dc242a54194779fdb8d5ac3bf41d6749709 (commit)
       via  dd5324c05a71f4ca9a8d1a35e7c88cb5e54acdca (commit)
       via  539e8b26b3b39ced278239f6fc7d31f2c3bafddb (commit)
       via  fb5d25221bed2d4c5222dcc56057a6c9b645ee78 (commit)
       via  3c9ef40d1e59549eea5d60094a4544479689dc3d (commit)
       via  5ef58661f1563b694320b0a7559b8093d11fcb9d (commit)
       via  e69c721789dd2f8b64407c600c454ed4c8d8f784 (commit)
       via  05c8dbee779b1fb4de656c4b1262bcc6eb65944c (commit)
       via  05b987cff0649e924d9f7aba633c01e3f05f48f7 (commit)
       via  e36a54ad27c1bcb19c4e9a981a2b4c4d699d0f50 (commit)
       via  b9d37f27d2f3eb70f6ef0d2fb50d6eb955a8a2ea (commit)
       via  4e090e16474e1bfed2dafe027eaefbaf0a7a788a (commit)
       via  ee72f556aa0fee258c2da0fbf9f35cf18d3ba578 (commit)
       via  0a89f07978b9f26286947c379883f686ce556126 (commit)
       via  8e24b87ad77f5218c2d2c1cdc1468bc6b4c021ec (commit)
       via  3c200767851be47ea5d3bccb6bdfc8a82c163020 (commit)
       via  9c170511179a721198527f063a58ab1b031b1b93 (commit)
       via  7d3cd879a496adc27e5e827ef3e35f7633a827de (commit)
       via  4700907a5bd21e22f69f6a4af91e9e6a86f6803c (commit)
       via  7fb709c215a0a7909baee4226f0c10b2b4052963 (commit)
       via  be748a7d84dd51edd1143c46baeeca7ab94863ba (commit)
       via  abd6b3b5cc53c4cb1f59d63c83dbdbf6c42a81d4 (commit)
       via  3ff9e701b1a2d872fff60f3febf330bcf94b05cf (commit)
       via  b4bfa7f155fce163557f726563908b238f32e005 (commit)
       via  602b5d03eee1c62b04d5b59c556cc0b73dcfe9c5 (commit)
       via  0f49267fd7204e8d40f025154e31bb377b491071 (commit)
       via  7e63fd4573d801985587ff55b22f17b79bae00b9 (commit)
       via  7ac599da262d16b1bd80b4e1ef8c7162c807053a (commit)
       via  423b45f6b22563b7e7b76ad48ca081ae578851ad (commit)
       via  397a44fee9e49e99ee00384c9ecccd4bd64f4cc6 (commit)
       via  52d44758eaabbfffae7ed6a32ece04b087c2e67f (commit)
       via  7bf17c184317f13f66c244700c4c6af8776b552f (commit)
       via  80485250f07a13224a59e7222afccee53d8cac7f (commit)
       via  ddcc47032058af7a7ed47b7e5e2a43b6f29d8dc0 (commit)
       via  315e35c077e1b21d0f9798a43ccdb2dfa5071500 (commit)
      from  e13aab10879ecf1af6541d8abd0ff9a1d2154537 (commit)


- Log -----------------------------------------------------------------
commit f678a45cd2315676f60f28f80f518fa60d8ca3e4
Merge: 3e0af18 e13aab1
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Aug 24 21:40:52 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	libraries/database_interface.lib.php

commit 3e0af184341eca03f24bd75a2b0c3057c8fca327
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Aug 24 13:24:21 2011 +0200

    Fix indentation broken by past merges

commit b4f4a209c839f965e67b59ca4d9acfe811b0a444
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Aug 24 12:58:40 2011 +0200

    PMA_getServerType() - recognize Percona Server

commit 710c7e2dd73209a10d994cd11c9b8ef19fc1f78c
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Aug 24 12:53:13 2011 +0200

    Print server_comment after server software version

commit 8cd8760256925aecc00de01cc0e5bfc987d128b1
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue Aug 23 22:48:14 2011 +0200

    Create PMA_is_system_schema() function which checks whether current database server treats it as a system schema

commit 4cf5fe79978bb4bbddfc0002c83926cead658587
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue Aug 23 22:37:24 2011 +0200

    Exclude data_dictionary from server synchronize (Drizzle)

commit 92be06e6e9bb573addad7a2fcf49ed36e1f4e035
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue Aug 23 22:25:14 2011 +0200

    Better comment

commit 57bea0630acc3d36f7f771a96fb84aebbea1ab3d
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue Aug 23 22:14:15 2011 +0200

    Use PMA_DBI_get_table_indexes_sql() only when really needed, in all other cases use PMA_DBI_get_table_indexes()

commit a31b30ba57c2351b44a9adb5289fea5ca13750b2
Merge: d2255fb cae0366
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue Aug 23 21:56:33 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit d2255fb9ae57a384e3888df9b9b268ef4f511d19
Merge: 1c2dbf0 98112c5
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Mon Aug 22 15:19:50 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit 1c2dbf0cbb4793837701014b66a522727bda144d
Merge: e515783 c5eb1f4
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Mon Aug 22 11:18:26 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	libraries/advisory_rules.txt

commit e5157838e52aecb9d8dfdd1a68be3c6049183634
Merge: dec6f85 9b2570b
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Aug 20 01:03:11 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit dec6f85a06220ae41067a880dc656abe449dda83
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Aug 20 00:49:22 2011 +0200

    Advisor: don't run 'MyISAM concurrent inserts' on Drizzle

commit 41c18f611362d4fce75d3bbc90d3aa101736c47e
Merge: 11cd7af 80daf34
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Aug 20 00:48:40 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	libraries/Table.class.php
    	libraries/Tracker.class.php

commit 11cd7afc7bfa67364ea3fd6a8d86f8c9aae85cbe
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Aug 20 00:39:52 2011 +0200

    Advisor: add exceptions for Drizzle

commit 5ce1db5f1ab3a5e2aba960ec082c3b3232d33641
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Aug 20 00:37:35 2011 +0200

    Advisor: add Com_* variables in Drizzle

commit b06a443307c46f7df1a7bfabe7f99816fd2c57ba
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Aug 20 00:37:02 2011 +0200

    Code indentation

commit e9158da8188ab070640b803610d04e6fe820fa1d
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Aug 20 00:36:41 2011 +0200

    Add MYSQLI_TYPE_VARCHAR to mysqli dbi (required for Drizzle)

commit 38389841d7459abc2fa86d1799add7af432f054d
Merge: 0ca4a5f 5e860f1
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Aug 19 19:37:34 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit 0ca4a5f02e687ebaa1708f1378cdc16ab4f408a7
Merge: 627e413 d7e4004
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Aug 19 15:56:26 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	db_search.php
    	libraries/Table.class.php
    	libraries/schema/Pdf_Relation_Schema.class.php
    	libraries/schema/User_Schema.class.php
    	libraries/tbl_select.lib.php
    	server_status.php
    	tbl_change.php

commit 627e4133c35c120f4270efa2e0d087d6b6fb07c8
Merge: dd8116c 07f3f59
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Aug 17 22:47:20 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	themes/original/css/theme_right.css.php

commit dd8116cc61e691c99e7462198cd72742bb763e02
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Aug 17 17:01:11 2011 +0200

    Two more fixes for Tracking in Drizzle

commit 99f52e1eddf89dec755c1ebf11189b12441432a9
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Aug 17 16:50:00 2011 +0200

    A few missing fixes for Tracking

commit 1aa438539a4a057070270b02c6b2bbaed8a951d9
Merge: 4073bad 79b5bd6
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Aug 17 16:39:43 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	libraries/common.lib.php
    	libraries/config.default.php
    	server_synchronize.php

commit 4073badee28f2af85bf51e22a756aee63bc81d3f
Merge: b7f3d86 8c4530e
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Aug 17 00:01:05 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit b7f3d86a413b19b54d86e9aeb2a0a78a9781059c
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue Aug 16 22:14:24 2011 +0200

    Make tracking compatible with Drizzle
    Simulate SET type by bit flags

commit e72036b4b19905b011d753fb4b3a9c83a48ed290
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue Aug 16 20:02:23 2011 +0200

    No need to use PMA_DBI_get_table_indexes_sql() here, use PMA_DBI_get_table_indexes()

commit f578d0dadc28a3f6266b06e34142d3b02de4b499
Merge: bcce8b2 7118468
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue Aug 16 19:58:16 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit bcce8b276787d760a2a54260af98637c9da254bb
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue Aug 16 16:13:52 2011 +0200

    Credits in docs

commit a502f95af4df692827bb7da2bd2251e3570eb0bc
Merge: 970262c 79f7461
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue Aug 16 16:11:43 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit 970262c435ef788c44bfa80fe4a106ac49a23bd9
Merge: 2cd6de4 e19d93a
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Mon Aug 15 12:03:04 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit 2cd6de464839381594438c08262af85ceeb2903f
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Aug 12 22:08:07 2011 +0200

    Update create_tables_drizzle.sql

commit bdefd47ec129e796f2e0e212fe7dc7afab4dc16d
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Aug 12 22:05:09 2011 +0200

    Use PMA_DBI_get_columns_sql (completes latest merge)

commit a7c0c55c7fa9c0ee45cef59245e2572f3c2f1be1
Merge: 64926ea 9147f30
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Aug 12 22:02:40 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	js/server_status.js
    	libraries/common.lib.php
    	tbl_printview.php
    	tbl_select.php
    	tbl_structure.php

commit 64926ead73dadd10b323712304d72fa86c6a3982
Merge: 0219728 db29c02
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Aug 6 13:10:25 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit 021972892941ac9279e6272addce774779a09374
Merge: 381e172 eb66564
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Aug 5 22:48:03 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit 381e172fcc5913528b058e6af5d95c594bfa51e1
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Aug 5 18:13:03 2011 +0200

    Synchronize:
    * Detect Drizzle servers
    * disallow connections with incompatible protocols, these can't work with DBI functions defined in global namespace

commit 7f1fa1bab02e9b584a358b21fdc121de35a43810
Merge: ca8a30f efa788d
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Aug 5 17:17:47 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	js/server_status.js
    	libraries/database_interface.lib.php
    	libraries/mysql_charsets.lib.php

commit ca8a30f7f8406b789489da3997162d0beaa75dba
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Aug 5 01:24:02 2011 +0200

    Fix usage of PMA_DBI_get_columns

commit a5ff5e860d2b8763f4810199c63a56bb12cbc577
Merge: d5cb3b6 4965898
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Aug 5 01:18:56 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	libraries/database_interface.lib.php
    	tbl_structure.php

commit d5cb3b69970701eba27a7de98eebf01160bbe9d9
Merge: 66665f3 c64564b
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Aug 5 00:52:47 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	libraries/server_synchronize.lib.php

commit 66665f326ae28740ea10939feebe223b702943b8
Merge: 3fa5e89 4c62a5f
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Aug 4 20:19:43 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	db_qbe.php
    	js/server_status.js
    	libraries/export/xml.php
    	libraries/schema/Pdf_Relation_Schema.class.php
    	tbl_printview.php
    	tbl_structure.php

commit 3fa5e89bb29bb481576a2cf81d3364402bef8dcf
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Aug 4 14:14:05 2011 +0200

    Drizzle DBI: default to fully buffered query, like in mysql and mysqli

commit 11f2c43f11126695b62acae06d7b4641fb068127
Merge: ce7e6fe 95e90bb
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Aug 3 23:58:48 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit ce7e6feaf528cdba079f707670818c83e436645f
Merge: b41976e 54fbcaa
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Aug 3 00:25:43 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	libraries/export/htmlword.php
    	libraries/export/latex.php
    	libraries/export/odt.php
    	libraries/export/sql.php
    	libraries/export/texytext.php
    	libraries/export/xml.php

commit b41976e5520c87a066c8da73b7972d8f7c6ff2c0
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue Aug 2 01:36:57 2011 +0200

    Drizzle: Respect MaxCharactersInDisplayedSQL in process list on Server Status page

commit 40a8e4639215fbb780a9df52f8e8fc20726ffa78
Merge: dfec5a4 3a373b4
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue Aug 2 01:29:22 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit dfec5a47325d5682bbf5ea5fea2b2f7e176cfee7
Merge: 997a5ea 19172fb
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Mon Aug 1 18:05:53 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit 997a5ea14c04519abedc1f98c07e6f0d66b35943
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Mon Aug 1 18:03:33 2011 +0200

    Comment change

commit e116f1d8a9315439451778a75e42e8e60e242fc2
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Mon Aug 1 13:38:14 2011 +0200

    Change wording on home page:
    * 'MySQL/Drizzle client version' to 'Database client version'
    * remove PHP extension version, mysqli and drizzle are still at 0.1 so it makes no sense
    * 'Server type' to 'Software', 'Server version' to 'Software version'

commit 9ed51773204a3370474020a3a586ff6c8664540b
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Mon Aug 1 13:35:30 2011 +0200

    Drizzle dbi - PMA_DBI_get_client_info should return Drizzle version it was built for

commit d7bea4d4ee9d4f6af82528dd6b01ee8e5d2b59e4
Merge: e179939 8824da9
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun Jul 31 17:26:18 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit e1799393f3231f716df17217eca1332441db0914
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun Jul 31 00:50:58 2011 +0200

    Validation for drizzle module in setup script
    Untested and currently unused, it's too unsafe to allow users to choose it

commit b57fda5b3dff95ba1e5dd396c347d7af50b9f776
Merge: 7897967 e3b91b7
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun Jul 31 00:46:49 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit 7897967c761103cbdaf01c11b9ffcb203c50f27a
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Jul 30 22:38:46 2011 +0200

    Drizzle dbi:
    * fix PMA_DrizzleResult::fetchRow with FETCH_BOTH
    * add method call logging

commit bb8bd55ef6e191129df9bf2b5e286abc8415f4d8
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Jul 30 22:02:25 2011 +0200

    Better strings on home page

commit 7bc8d8348dbbc75dbd2099e9a1ad4fabf754433e
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Jul 30 21:51:14 2011 +0200

    Drizzle dbi - segfault suddenly disappeared from there so use proper code

commit c7dd3244c66937311d5c85db0fa4c9bd605cff46
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Jul 30 21:45:23 2011 +0200

    Drizzle dbi - PMA_DBI_get_host_info - work around a segfault

commit c44f28a8289532b5288dcfe8b998581d007d9a77
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Jul 30 18:49:47 2011 +0200

    Fix affectedRows for drizzle dbi, circumvent a few drizzle module segfaults related to resource freeing

commit d35ec740a0f2049b41682dff1d482d7f1d408242
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Jul 30 18:47:02 2011 +0200

    Marked drizzle dbi as experimental

commit f777dc3db53b90d9afe8cac02aea90ba3ce5a0ba
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Jul 29 17:16:19 2011 +0200

    Work around some segfaults in drizzle extension, still some segfaults left
    Version 0.5 of PHP extension is definitely not production ready

commit eb18aeeeb291276991b992ce889ce53fd74a5f5e
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Jul 29 17:14:22 2011 +0200

    Remove debug code

commit 4e22743b379c43e6d26d3e19374f12f2a7a36004
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jul 28 22:46:40 2011 +0200

    A few bugfixes for drizzle dbi

commit abdf808dee7787719e0de139f1013c1301b8c4a1
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jul 28 22:46:19 2011 +0200

    Correctly detect drizzle extension

commit 11a86905415d0a37849221024b0f0a17d459afd2
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jul 28 19:21:18 2011 +0200

    database interface files for drizzle PHP extension

commit f06cabeca71851821f9b82a7bdbe39be54f6d1d3
Merge: 0eca09f c326cfe
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jul 28 13:33:44 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit 0eca09ffff331b7b2a5d9cd4a0fe24e05df6da2f
Merge: 487da6e e82682d
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jul 27 20:10:38 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	libraries/dbi/mysqli.dbi.lib.php

commit 487da6e7af675ff899194486a7d5e8aabbc1b87b
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Mon Jul 25 22:00:44 2011 +0200

    Use $logAnalyseDialog instead of multiple lookups for $('#logAnalyseDialog')

commit f2935d56d989cf8b7dc5884e0097088509dafd5e
Merge: e94e42f 489e8f1
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Mon Jul 25 21:55:16 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	js/server_status.js
    	server_status.php

commit e94e42fb73bb3b35ec3452264ee259efc78fcb38
Merge: 13f0d7a 7e197b6
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Jul 23 23:33:19 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit 13f0d7a5d57f737a04aa0203cdf4d9b3acd3996f
Merge: a04f592 2dee226
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Jul 22 14:13:11 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit a04f592a9258e86e86a337cd6223102e457a5e4c
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Jul 22 13:39:23 2011 +0200

    Don't use DEFAULT CHARACTER SET when creating tables during import (Drizzle)

commit 3586bb992f0e6c325207dc55bd01c1f3607f0b31
Merge: 74a00a1 d8f6e7d
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Jul 22 11:07:04 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	db_structure.php
    	libraries/database_interface.lib.php
    	libraries/server_synchronize.lib.php
    	server_status.php
    	sql.php

commit 74a00a110f6d15d24b5b40c02ec8a3916a6acd15
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jul 21 23:23:34 2011 +0200

    Drizzle has no usable query log, hide appropriate features in Server Status

commit b364cfd211f89b6be9abe1dda24d90b4ce590950
Merge: f36b2e5 49b2ca9
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jul 21 22:56:21 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit f36b2e54414baa52b19a591d47b070edca036160
Merge: a28beb9 ba395f5
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jul 21 16:21:16 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	libraries/db_links.inc.php
    	libraries/server_links.inc.php
    	tbl_structure.php
    	themes/pmahomme/css/theme_right.css.php

commit a28beb9c1fb4c0bb432961034b90232b24b908f3
Merge: 82675f7 938e807
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jul 21 15:25:52 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	libraries/server_synchronize.lib.php
    	server_status.php

commit 82675f778dce0736ddeb5953b4fe9277a6360df2
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jul 21 11:27:28 2011 +0200

    Server status: use Questions variable (Drizzle)

commit 392d463a8848edb84e2bfb280a3645f458a0af04
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jul 20 18:54:59 2011 +0200

    Fix merged file

commit 6ab10cdf837b9fd24eb9df9404b559d127934167
Merge: c9e3e70 75bb94f
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jul 20 18:53:14 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit c9e3e708090a02ea8ca6937538d8d077d4914f1c
Merge: 6dbcab2 e386d58
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jul 20 18:45:00 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	server_status.php

commit 6dbcab261ef2d5e498846cda4cdbd538103a7380
Merge: 738228a 4ee15be
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jul 20 18:23:21 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	server_status.php

commit 738228a8d838c5d7dadcfcee676a81baa0c43200
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Mon Jul 18 23:35:32 2011 +0200

    Import: don't use DEFAULT CHARACTER SET in db creation (Drizzle)

commit 08d4e5a5b8b06b5346f12799f8e0da116f65f639
Merge: a0a4628 1b56916
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Mon Jul 18 22:20:33 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	libraries/export/htmlword.php

commit a0a4628b11fa8fc89fc3e956fa5c4e5c863c729f
Merge: f7591dd 291e3b6
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jul 14 22:38:20 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	libraries/export/latex.php
    	libraries/export/odt.php
    	libraries/export/texytext.php
    	libraries/export/xml.php

commit f7591dd5631dbd2c201147bb7683982888f48a94
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jul 14 00:57:19 2011 +0200

    Fix SQL export

commit 59e71a06c0e224d91a6e83ce5e6de2fde82a03b2
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jul 14 00:40:15 2011 +0200

    Quick fixes for XML export

commit ab4cca24bcd80cbe61919fc4c288f969a8ef4acd
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jul 14 00:40:01 2011 +0200

    There are no triggers in Drizzle

commit fb01897f61cb0aa012da9e3db826684e40ca06f8
Merge: dd6f936 d84d51c
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jul 14 00:30:39 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit dd6f936731742582091aa8de9cc2306629d41f4e
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jul 13 20:57:05 2011 +0200

    Make PMA_DBI_get_triggers aware that Drizzle doesn't have triggers

commit 480fe9f78c92776a41f0e67d60c62947cf910ce3
Merge: beddd31 f57faf6
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jul 13 17:37:50 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit beddd31ec3a0094ecd979e87fbe69418f6a4da50
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jul 13 17:00:42 2011 +0200

    Make PMA_DBI_getCompatibilities() aware of Drizzle - it doesn't have SQL_MODE

commit c3d1a8b14a7b05c8afca8413fada57e59106277a
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jul 13 16:59:22 2011 +0200

    Ignore SkipLockedTables (Drizzle)

commit 7801d550180c2003862568e9ac706056544fe53e
Merge: 682ceb6 e7a4453
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jul 13 14:05:24 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit 682ceb66c1b7e2fa6f60d541d35dbe7bbeb52277
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jul 13 12:28:23 2011 +0200

    Removed SOUNDEX function (Drizzle)
    It's never been supported, Drizzle docs are wrong

commit bf9469ec189998671c27cb1717c6f5dd9c5a0df2
Merge: b57bc2f 0ebd961
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jul 13 12:25:06 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit b57bc2ff5d4417a7affd4a8e9cef6041bdba57e1
Merge: 1bf994d 4bb11fd
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Mon Jul 11 19:41:21 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit 1bf994d73f98500b34f9e701bb7f47f0d60bd682
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Jul 9 22:08:32 2011 +0200

    Try to cast default values for BOOLEAN columns to TRUE/FALSE
    Required for Drizzle, adds more correct values for MySQL

commit 024d4adc27c2b41faa66913ded839731c717783f
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Jul 9 21:52:33 2011 +0200

    UUID has no length

commit 382c020a85a24e6634ede3b07a1c6daefdcd2bd7
Merge: 26038eb 2c4c45a
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Jul 9 21:50:23 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit 26038eb6b5263f34e542611d3b667079e81f4b91
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Jul 9 17:59:49 2011 +0200

    Fix page height
    Optimize selector

commit e8a0602f7bf04d79ee28f8de87250c60fd5937b4
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Jul 9 17:33:45 2011 +0200

    Sortable columns in plugin list

commit c3974ea3b616281937ea21b6d2af5606ffe4237b
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Jul 8 19:55:35 2011 +0200

    Fix anchors in plugin list

commit 44907283fc3fef3e8fc5c2da5390767daf7b3b70
Merge: 26483cc 5ce96bc
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Jul 8 19:50:42 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit 26483ccc19f14073882e28ccc81e9d24f626401a
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Jul 8 19:46:19 2011 +0200

    Better plugin list

commit a445d94ee09d33fe9ab87851065b89bb664097e4
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jul 6 19:08:23 2011 +0200

    Function list and column types for Drizzle

commit ff0081bb7a95782845fe81b72310194733d9b574
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jul 6 19:06:51 2011 +0200

    Rename pk_char36 to FUNC_UUID

commit b1b4e6389d60e6ba588ac7fbbb7b91557e13aaa4
Merge: 19ec269 66158f6
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jul 6 18:31:38 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	libraries/server_synchronize.lib.php

commit 19ec26904b42f466ed18f64d915321374b9f9fec
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jul 6 18:22:55 2011 +0200

    Revert "Provide proper function list in Insert dropdowns and proper column types in field type dropdowns (Drizzle)"
    
    This reverts commit 35843439dfdabd7bb65ebafd2c832bcc60ff6140.

commit 9ba2650bc636226bf7cee5558b5df1b82b52e49b
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun Jul 3 01:48:32 2011 +0200

    Don't offer FULLTEXT in table creation form (Drizzle)

commit 35843439dfdabd7bb65ebafd2c832bcc60ff6140
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun Jul 3 01:47:03 2011 +0200

    Provide proper function list in Insert dropdowns and proper column types in field type dropdowns (Drizzle)

commit 0266ddd7bd66c4c0baf021e3b9bc0652f71dc51f
Merge: da63d2c 6d88345
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun Jul 3 00:41:31 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	libraries/database_interface.lib.php

commit da63d2cb1392008c8cc1dc03d44d41e024d6e698
Merge: e3a4f6d d5dd8a2
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Jul 1 20:52:25 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	libraries/database_interface.lib.php

commit e3a4f6d95aba63312c874bb499d61cd616be7d81
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jun 30 18:54:45 2011 +0200

    Fix PMA_DBI_get_columns when $column parameter is used and UNI key is promoted to PRI

commit 29070219a949e217936c8d1b69da0b4774e643e1
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jun 30 16:41:48 2011 +0200

    Fix comments

commit 7ef98dc9a298c1ac90fbae9aa5f3221c33c2078f
Merge: 7255ec2 cbf00bc
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jun 30 00:52:01 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit 7255ec21004d6453d3fe0f9b7f6176fa321ac96e
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jun 30 00:48:19 2011 +0200

    Change PMA_DBI_get_columns() to always return complex descriptions, never simple column list (it was needed for one case anyway)
    Bugfixes

commit 04fef01fd7aaca08511fed2600b539ef8c64825a
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue Jun 28 23:34:01 2011 +0200

    Properly compute 'Extra' in PMA_DBI_get_columns_sql (Drizzle)

commit 7b1976d14dd6580d0ab660eeb2eeda557ac140c8
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue Jun 28 23:33:09 2011 +0200

    Don't show "Propose table structure" link (Drizzle)

commit be6e21009453a1e08e1af0f693a5419c12a31802
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue Jun 28 23:13:05 2011 +0200

    Use new PMA_DBI_get_columns in column alter form

commit 96c5c6dbc6f20be109ff3551f2849b6feeec0310
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue Jun 28 23:07:52 2011 +0200

    Add $column parameter to PMA_DBI_get_columns

commit a3b1000b43a2c2dc4df30ee02abe01475d516d69
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue Jun 28 18:36:51 2011 +0200

    Fix database search

commit 713bf220791e9fec6526f821c4f25a2f97fd600a
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue Jun 28 17:47:47 2011 +0200

    Drizzle has no CONVERT and everything is utf-8

commit 83117b18d715ae51e47bc988e5d2c40c88ee1dc8
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Mon Jun 27 23:59:04 2011 +0200

    Use PMA_sqlAddSlashes from recent merge

commit 3bde595666bf7cdcc8b28738d5396f8a8258af90
Merge: c734e1f 49a3978
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Mon Jun 27 23:55:32 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit c734e1fd14094c2545c8305e35358e57cf485ab7
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun Jun 26 21:26:49 2011 +0200

    Workaround for brokwn ROW_FORMAT in SHOW CREATE TABLE (Drizzle)

commit 28ae930a71c02c3e05408b9aebd761a23399b567
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun Jun 26 21:25:24 2011 +0200

    sql_mode doesn't exist in Drizzle

commit 14ab81248cd8eb4cff5de4d9a3b1d0f0755bd3f5
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun Jun 26 20:46:30 2011 +0200

    Don't offer MyISAM engine in Drizzle
    It can be used only for temporary tables

commit b00eb8f29c1616e71417c02582e081e679434548
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun Jun 26 20:10:49 2011 +0200

    Show storage engine list in db/table operations (Drizzle)

commit 3eaff6afb63246045bddd1977c93591b210932d6
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun Jun 26 18:38:36 2011 +0200

    A few Drizzle-related changes to db operations tab

commit 6553cdd66307f85b99e37fa5b31218e872b0b633
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun Jun 26 18:37:24 2011 +0200

    Add information about query errors to debug output

commit d4d647e169202056886abb3591c7efb21c7f13cc
Merge: 7d99d57 3c55511
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun Jun 26 18:32:20 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit 7d99d57ccafc9be02f34def4b44de33da6731de5
Merge: e38b5cd 5403fc1
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Jun 25 01:00:00 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit e38b5cd4ffc534a19f7f339f96b0e2197b02363c
Merge: 9365825 5661c3e
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jun 23 14:02:58 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	db_structure.php
    	libraries/common.lib.php
    	libraries/database_interface.lib.php
    	tbl_structure.php

commit 9365825f52b3629820e11a963f83fe68925413f3
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jun 22 23:58:02 2011 +0200

    Hide connection collation select on home page when connected to Drizzle server

commit 3aaaf33afa218f916e3259d306acb33f054d7cfb
Merge: a7ba0fd 18513b3
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun Jun 19 23:35:08 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit a7ba0fd74af1ca9d0aa73fd93cf23d8654a42dd5
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun Jun 19 23:15:54 2011 +0200

    Extract server type detection from main.php and make it available in common.lib.php

commit c2b06f0a11522d5b61b30de932d018f979b87fad
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun Jun 19 21:10:42 2011 +0200

    Don't use OPTIMIZE TABLE and REPAIR TABLE with Drizzle

commit 2977b7160998acff8cab236bf9a08b6fb60b9773
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun Jun 19 20:01:15 2011 +0200

    Use DD views instead of SHOW PROCESSLIST (Drizzle)

commit 5951bd9373e4ee9ba2a48ac639fc2aae05fe8c98
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun Jun 19 14:46:49 2011 +0200

    Use concat() instead of ANSI string concatenation

commit 53b29d25d24004d1bf7db146af61e3782316ae35
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun Jun 19 14:38:41 2011 +0200

    Fix unique key detection in data dictionary

commit 2e01d01b3227ffed9b5329b4320440e35ece04c7
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Jun 18 00:15:43 2011 +0200

    Change all calls of SHOW KEYS/INDEX that use MySQL-specific fields to use query generation function

commit 2444ad6d20ea70f6ea03d0996ff5d3bfb204e13d
Merge: 4273c60 1f10c9b
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat Jun 18 00:12:43 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit 4273c602c83d819af9e364b2d539eff05367e916
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Jun 17 21:25:13 2011 +0200

    Bugfix for new PMA_DBI_get_columns

commit 30b85be0a2d4d8b45ae386b2392e7c6e787729b8
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Jun 17 21:03:02 2011 +0200

    Allow for null values in PMA_DBI_get_tables_full

commit 6eb6a9930001f6d0c38102d2aec51b984a19a002
Merge: ae42913 c4ae361
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Jun 17 20:49:28 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	server_status.php

commit ae429136292a1b52a149b4d34409eae9af22f9dd
Merge: 693da24 fc2b699
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Jun 17 20:41:42 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	server_status.php

commit 693da24c95ea98ca8dd1908edab52f7c168ac362
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Jun 17 19:26:50 2011 +0200

    [Drizzle] Don't show "Create view" button for query results

commit 12f70e8938cd9e3c76e878669d3de4bf4cb725ec
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Jun 17 00:22:25 2011 +0200

    Replace all SHOW FIELDS calls with PMA_DBI_get_columns() or PMA_DBI_get_columns_sql()
    Fix PMA_DBI_get_columns() in Drizzle when $full == false

commit d607fa3e5cca1bd9c8e1817db81e9a281cf68610
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jun 16 23:12:06 2011 +0200

    Make live query chart work in Drizzle

commit 76dde71244cd0ea888feea902e217487a5d240f8
Merge: 2c97f4b 163d929
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jun 15 23:30:21 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit 2c97f4b326c29aa07b6d87c62e796829fb5072d1
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jun 15 23:06:45 2011 +0200

    Server status: add a filter category for not-matched variable name prefixes (currently 10 variables in MySQL and Drizzle)

commit 2ceb7588b52ad54a954d6fa137ad35073673fab0
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jun 15 23:01:18 2011 +0200

    Status tab: hide unused categories in filter list

commit a5342c70eabee89c27da6cf5b033b24125b235ba
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jun 15 22:53:55 2011 +0200

    Server Status: remove warnings, make process list and query stats work (Drizzle)

commit 17f8e161413a00bc677f16425803109c3536db79
Merge: e8b144d f9550ae
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jun 15 15:38:04 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	server_processlist.php

commit e8b144da1188af7cc1212dbaa97cf6723eb44b0a
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Jun 10 21:09:50 2011 +0200

    File import - Drizzle has no SET NAMES so charset conversion without any PHP conversion library is impossible - throw an error

commit b35cd1b40fa6432600299a0c69f5620609db4791
Merge: 6cca81e 7db86a9
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jun 8 00:47:17 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	tbl_structure.php

commit 6cca81e04d631aa880a3069f1931f685ca01ce81
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jun 8 00:39:53 2011 +0200

    Don't load tbl_triggers.lib.php for Drizzle

commit f77886d1a0e030267813d557bd1927405c863681
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jun 8 00:37:31 2011 +0200

    Fix for I_S and D_D table data returned by PMA_DBI_get_tables_full

commit 50e0a41aa314c12059032d009512397e23f5781d
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jun 8 00:23:05 2011 +0200

    Don't load db_routines.inc.php and db_events.inc.php for Drizzle

commit 4b344cb40ba4d9d55c82b9569cb8b85cecfd1f38
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jun 8 00:18:40 2011 +0200

    Don't load replication.inc.php for Drizzle

commit 7737607582abef979f7a1c834b96114b2488cf65
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Mon Jun 6 17:23:43 2011 +0200

    Cache one more case for PBMS detection

commit 681b61211035b98fe6cc28cef113ad1c3d777598
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Mon Jun 6 17:18:59 2011 +0200

    It's enough to check for blobstreaming plugin once per session
    One (no pbms plugin loaded) or two (plugin loaded but no PHP library) queries less per displayed page

commit a515aed0fd3a17c4a314800077f8cdb5bdc5e102
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Mon Jun 6 17:01:00 2011 +0200

    Fix check for PBMS plugin in Drizzle

commit 96f3b37fc1d113c1ed17d06687333d6fdc785b36
Merge: a56d77f db07b65
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Mon Jun 6 16:42:04 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit a56d77fb675e7cb3813f689b860b88ce89a548fb
Merge: 26ec25b 3cf4830
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Mon Jun 6 12:12:42 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit 26ec25b65e1cec25e680c9b53c715f4c890f3590
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri Jun 3 21:34:26 2011 +0200

    Home page: display db server type inside box, not in box header

commit 08da1557e2d95be41ef3d2821da3dc0bcfee214d
Merge: cdaa1ff d6b26b2
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jun 2 22:32:22 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit cdaa1ff10125e57e12e9632c36364682317af52a
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jun 2 22:31:59 2011 +0200

    Three possible values for server info header on home page: MySQL (default), Drizzle, MariaDB

commit 1df2a890e15944c70d3c0afc7fa6337c38b30cf7
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jun 2 16:07:59 2011 +0200

    Add 'COLLATE utf8_bin' to configuration storage tables (Drizzle)

commit 121cd6263bc64c09ff95bb72b917fbc20f410cf1
Merge: 10c7353 12f1bb7
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jun 2 15:43:28 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit 10c7353c3ce58b5dc1bee1ac03440050cd0536f9
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jun 2 01:11:01 2011 +0200

    Add phpMyAdmin configuration storage schema for Drizzle

commit 52df66878c381fe2f2cb0883812ea3cf36105370
Merge: 940042c d489272
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu Jun 2 01:07:00 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	libraries/server_links.inc.php

commit 940042c6b37b4b93788256395df2c27824a271cb
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed Jun 1 13:19:10 2011 +0200

    Add Plugins server tab for Drizzle

commit 946cc6a5599d20133273bdd3846577b6d4817b8e
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue May 31 20:25:52 2011 +0200

    Change wording on home page

commit 56768f5f4c7c5379f277b3e17e607f1f163d21c2
Merge: 33255a1 78685cc
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun May 29 18:27:58 2011 +0200

    Merge branch 'master' into drizzle

commit 33255a189cc532a5d7c4d1051e685816245f95db
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat May 28 00:26:13 2011 +0200

    PMA_DBI_get_columns_full: works with Drizzle, uniform behavior with DisableIS true/false

commit dc2a298b7a2ac5cf257b984191a0c92a192e1bff
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri May 27 21:05:11 2011 +0200

    Add 'noclick' class for I_S and D_D in database list (Drizzle)

commit bd543f90e8d8488df6b03f55206c23e1cedda405
Merge: 9f59de6 0b5f441
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri May 27 20:25:47 2011 +0200

    Merge branch 'master' of ssh://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into drizzle
    
    Conflicts:
    	navigation.php

commit 9f59de61673ae4472970862f75522e76b800dc14
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri May 27 20:16:37 2011 +0200

    PMA_isSuperuser() and other privileges (Drizzle)

commit add6c6325c238cdca23ce0212c77b474535080cb
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri May 27 18:46:35 2011 +0200

    Fix wording on main page to be correct for MySQL and Drizzle

commit 1220eafa89f1d801bdde4703a2bc20cb3077e1a9
Merge: e51a48a 46ba122
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed May 25 23:31:17 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle

commit e51a48a3fae101a51cbaa896ca06844f8b74d4ab
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed May 25 20:01:59 2011 +0200

    Drizzle: hide Privileges tab in database links

commit 97d5588d2b702bfe4070575cb5f639839982815e
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed May 25 19:49:22 2011 +0200

    Allow to drop 'mysql' database in Drizzle

commit cafbefd51871dd52dfd4c7ed6ce9eef6daefa6f5
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed May 25 19:43:44 2011 +0200

    PMA_DBI_get_columns - add "on update ..." to Extra when possible (Drizzle)

commit d5f3636a5da766c9d1ec75598453b430d56e6dc7
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed May 25 19:12:27 2011 +0200

    server_common.php for Drizzle: don't select 'mysql' table, skip listing of master logs

commit b7b76d6519b812198f1b892d0b4d602466e9608b
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed May 25 19:09:32 2011 +0200

    Don't display Privileges, Engines and Replication for Drizzle

commit 8259510361555ffb14e24aa553f5c5618f659a03
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed May 25 18:49:02 2011 +0200

    Database list for Drizzle: treat 'mysql' as normal table, don't show 'Check Privileges' link

commit d3ea25c159dcb4ea02d00d771d6b2e5ab8480369
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed May 25 18:24:10 2011 +0200

    Make PMA_getDbCollation work with Drizzle

commit 2b202c04cebbd267ba97838c8dce091d6e7b1299
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed May 25 18:17:41 2011 +0200

    Drizzle has CHARACTER SET

commit 86d5ae26972a11c1a09c99b3bb3e5395cf24769b
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue May 24 19:35:57 2011 +0200

    Emulate relations for some data_dictionary tables

commit 83b81dc242a54194779fdb8d5ac3bf41d6749709
Merge: dd5324c 1835d93
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue May 24 15:13:41 2011 +0200

    Merge remote-tracking branch 'origin/master' into drizzle
    
    Conflicts:
    	libraries/common.lib.php

commit dd5324c05a71f4ca9a8d1a35e7c88cb5e54acdca
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue May 24 10:07:20 2011 +0200

    Rewrite PMA_DBI_get_databases_full to work with Drizzle
    For Drizzle the only extended stat that works are SCHEMA_TABLES (always) and SCHEMA_TABLE_ROWS (only for InnoDB/innobase tables)

commit 539e8b26b3b39ced278239f6fc7d31f2c3bafddb
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun May 22 16:23:38 2011 +0200

    Cast d_d.tables.auto_increment to NULL because currently (2011.03.13 GA) Drizzle doesn't provide correct value

commit fb5d25221bed2d4c5222dcc56057a6c9b645ee78
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun May 22 16:22:48 2011 +0200

    Return null when PMA_formatByteDown argument is null to prevent casting unavailable values to 0

commit 3c9ef40d1e59549eea5d60094a4544479689dc3d
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun May 22 15:03:30 2011 +0200

    Add table alias in PMA_DBI_get_tables_full to avoid ambiguous field names in filtered queries (broken by join with TABLE_CACHE)

commit 5ef58661f1563b694320b0a7559b8093d11fcb9d
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun May 22 14:50:59 2011 +0200

    Count rows for PBMS tables when PMA_DBI_get_tables_full returned NULL

commit e69c721789dd2f8b64407c600c454ed4c8d8f784
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun May 22 14:25:51 2011 +0200

    Try to get AVG_ROW_LENGTH from table cache

commit 05c8dbee779b1fb4de656c4b1262bcc6eb65944c
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sun May 22 14:20:04 2011 +0200

    Try to get table size from table cache

commit 05b987cff0649e924d9f7aba633c01e3f05f48f7
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri May 20 16:59:03 2011 +0200

    Fix notices for undefined $row_count_pre and $show_superscript when displaying database structure for I_S and D_D

commit e36a54ad27c1bcb19c4e9a981a2b4c4d699d0f50
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Fri May 20 16:54:53 2011 +0200

    Show username in processes (Drizzle)

commit b9d37f27d2f3eb70f6ef0d2fb50d6eb955a8a2ea
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu May 19 15:37:55 2011 +0200

    Replace broken ANSI string concatenation with concat() function

commit 4e090e16474e1bfed2dafe027eaefbaf0a7a788a
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu May 19 15:26:22 2011 +0200

    Read precision and scale for numeric columns, read enum definition for enums

commit ee72f556aa0fee258c2da0fbf9f35cf18d3ba578
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Thu May 19 15:08:55 2011 +0200

    Code formatting

commit 0a89f07978b9f26286947c379883f686ce556126
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed May 18 22:21:44 2011 +0200

    Don't display "Add FULLTEXT index" for Drizzle

commit 8e24b87ad77f5218c2d2c1cdc1468bc6b4c021ec
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed May 18 22:20:24 2011 +0200

    Remove SHOW FIELDS query from tbs_structure, use PMA_DBI_get_columns instead

commit 3c200767851be47ea5d3bccb6bdfc8a82c163020
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed May 18 22:19:26 2011 +0200

    Make PMA_DBI_get_columns work with Drizzle

commit 9c170511179a721198527f063a58ab1b031b1b93
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed May 18 20:49:04 2011 +0200

    Remove deprecated function PMA_DBI_get_fields

commit 7d3cd879a496adc27e5e827ef3e35f7633a827de
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed May 18 11:51:08 2011 +0200

    Enable exact row counts for views in I_S and D_D. They map to in-memory data, so this shouldn't pose a performance problem

commit 4700907a5bd21e22f69f6a4af91e9e6a86f6803c
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue May 17 23:23:40 2011 +0200

    Join with InnoDB stats only where InnoDB is provided by innobase library
    Fix notice

commit 7fb709c215a0a7909baee4226f0c10b2b4052963
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue May 17 10:42:19 2011 +0200

    Make $tbl_is_view to be used as intended - check TABLE_TYPE instead of doing 20-50 useless calls to PMA_DBI_get_tables_full to get just table types for views in I_S and D_D...

commit be748a7d84dd51edd1143c46baeeca7ab94863ba
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Tue May 17 00:00:21 2011 +0200

    Case insensitive comparisons to check for I_S, tread D_D as I_S

commit abd6b3b5cc53c4cb1f59d63c83dbdbf6c42a81d4
Merge: 3ff9e70 c74fad4
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Mon May 16 23:37:29 2011 +0200

    Merge branch 'master' into drizzle

commit 3ff9e701b1a2d872fff60f3febf330bcf94b05cf
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed May 11 12:59:54 2011 +0200

    Changed ternary operator to if/else

commit b4bfa7f155fce163557f726563908b238f32e005
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed May 11 12:56:43 2011 +0200

    Use lowercase comparisons for Drizzle database names

commit 602b5d03eee1c62b04d5b59c556cc0b73dcfe9c5
Merge: 0f49267 994606b
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Mon May 9 21:56:06 2011 +0200

    Merge branch 'master' of ssh://phpmyadmin.git.sourceforge.net/gitroot/phpmyadmin/phpmyadmin into drizzle

commit 0f49267fd7204e8d40f025154e31bb377b491071
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat May 7 22:25:55 2011 +0200

    Don't show "0 B" as InnoDB table size when DBMS doesn't provide this data (Drizzle)

commit 7e63fd4573d801985587ff55b22f17b79bae00b9
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat May 7 22:17:07 2011 +0200

    Better handling of columns in table structure tab (Drizzle)

commit 7ac599da262d16b1bd80b4e1ef8c7162c807053a
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat May 7 22:15:54 2011 +0200

    Make Browse and Search always active for views in db structure view

commit 423b45f6b22563b7e7b76ad48ca081ae578851ad
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat May 7 22:06:23 2011 +0200

    PMA_DBI_get_tables_full - row counts for InnoDB tables in Drizzle

commit 397a44fee9e49e99ee00384c9ecccd4bd64f4cc6
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat May 7 20:15:17 2011 +0200

    Properly detect Drizzle system views

commit 52d44758eaabbfffae7ed6a32ece04b087c2e67f
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Sat May 7 20:13:49 2011 +0200

    Removed deprecated defines
    Made sure that unknown field types are mapped to null

commit 7bf17c184317f13f66c244700c4c6af8776b552f
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed May 4 15:32:45 2011 +0200

    Fix for Drizzle collations

commit 80485250f07a13224a59e7222afccee53d8cac7f
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed May 4 15:05:09 2011 +0200

    Make sure I_S and D_D from Drizzle get the same treatment as MySQL I_S

commit ddcc47032058af7a7ed47b7e5e2a43b6f29d8dc0
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed May 4 15:03:56 2011 +0200

    Make PMA_DBI_get_tables_full work with Drizzle

commit 315e35c077e1b21d0f9798a43ccdb2dfa5071500
Author: Piotr Przybylski <piotrprz at gmail.com>
Date:   Wed May 4 14:57:58 2011 +0200

    Set DisableIS = false for Drizzle

-----------------------------------------------------------------------

Summary of changes:
 Documentation.html                                 |    6 +-
 db_create.php                                      |    4 +-
 db_datadict.php                                    |   12 +-
 db_operations.php                                  |   23 +-
 db_qbe.php                                         |    4 +-
 db_routines.php                                    |    6 +-
 db_search.php                                      |   19 +-
 db_structure.php                                   |   39 +-
 import.php                                         |   14 +-
 js/server_plugins.js                               |   30 +
 js/server_status_monitor.js                        |    2 +-
 libraries/Advisor.class.php                        |    6 +
 libraries/Index.class.php                          |    2 +-
 libraries/List.class.php                           |    3 +-
 libraries/List_Database.class.php                  |    2 +-
 libraries/StorageEngine.class.php                  |   24 +-
 libraries/Table.class.php                          |   43 +-
 libraries/Tracker.class.php                        |   87 +++-
 libraries/advisory_rules.txt                       |   51 +-
 libraries/blobstreaming.lib.php                    |   44 +-
 libraries/build_html_for_db.lib.php                |    5 +-
 libraries/check_user_privileges.lib.php            |   11 +-
 libraries/common.inc.php                           |    8 +
 libraries/common.lib.php                           |   34 +-
 libraries/config.default.php                       |    7 +-
 libraries/config/validate.lib.php                  |   30 +-
 libraries/data_dictionary_relations.lib.php        |  163 ++++++
 .../{data_mysql.inc.php => data_drizzle.inc.php}   |  131 ++---
 libraries/data_mysql.inc.php                       |    4 +-
 libraries/database_interface.lib.php               |  608 +++++++++++++++-----
 libraries/db_common.inc.php                        |    6 +-
 libraries/db_info.inc.php                          |    2 +-
 libraries/db_links.inc.php                         |    4 +-
 libraries/dbi/drizzle-wrappers.lib.php             |  442 ++++++++++++++
 libraries/dbi/drizzle.dbi.lib.php                  |  584 +++++++++++++++++++
 libraries/dbi/mysqli.dbi.lib.php                   |    6 +
 libraries/display_tbl.lib.php                      |    2 +-
 libraries/export/htmlword.php                      |    8 +-
 libraries/export/latex.php                         |    8 +-
 libraries/export/odt.php                           |    8 +-
 libraries/export/sql.php                           |  106 +++--
 libraries/export/texytext.php                      |    8 +-
 libraries/export/xml.php                           |   57 ++-
 libraries/import.lib.php                           |   10 +-
 libraries/mysql_charsets.lib.php                   |   22 +-
 libraries/pmd_common.php                           |    2 +-
 libraries/relation.lib.php                         |   26 +-
 libraries/replication.inc.php                      |    2 +-
 libraries/replication_gui.lib.php                  |    2 +-
 libraries/server_common.inc.php                    |    7 +-
 libraries/server_links.inc.php                     |   16 +-
 libraries/server_synchronize.lib.php               |   30 +-
 libraries/tbl_common.php                           |    6 +-
 libraries/tbl_properties.inc.php                   |   20 +-
 main.php                                           |   58 +-
 navigation.php                                     |    2 +-
 ...create_tables.sql => create_tables_drizzle.sql} |   93 ++--
 server_databases.php                               |   11 +-
 server_plugins.php                                 |  208 +++++++
 server_privileges.php                              |    2 +-
 server_replication.php                             |    2 +-
 server_status.php                                  |  108 +++-
 server_synchronize.php                             |   54 ++-
 sql.php                                            |    8 +-
 tbl_alter.php                                      |   11 +-
 tbl_change.php                                     |    6 +-
 tbl_operations.php                                 |    4 +-
 tbl_printview.php                                  |    4 +-
 tbl_structure.php                                  |   53 +-
 themes/original/css/theme_right.css.php            |    8 +-
 themes/pmahomme/css/theme_right.css.php            |    9 +-
 71 files changed, 2746 insertions(+), 701 deletions(-)
 create mode 100644 js/server_plugins.js
 create mode 100644 libraries/data_dictionary_relations.lib.php
 copy libraries/{data_mysql.inc.php => data_drizzle.inc.php} (62%)
 create mode 100644 libraries/dbi/drizzle-wrappers.lib.php
 create mode 100644 libraries/dbi/drizzle.dbi.lib.php
 copy scripts/{create_tables.sql => create_tables_drizzle.sql} (66%)
 create mode 100644 server_plugins.php

diff --git a/Documentation.html b/Documentation.html
index d590a6b..d746782 100644
--- a/Documentation.html
+++ b/Documentation.html
@@ -1787,7 +1787,8 @@ CREATE DATABASE,ALTER DATABASE,DROP DATABASE</pre>
     <dd>Defines the default connection collation to use, if not
         user-defined.<br />
         See the <a href="http://dev.mysql.com/doc/mysql/en/charset-charsets.html">MySQL
-        documentation</a> for list of possible values.</dd>
+        documentation</a> for list of possible values. This setting is ignored when
+		connected to Drizzle server.</dd>
 
     <dt id="cfg_Lang">$cfg['Lang'] string</dt>
     <dd>Force language to use.<br />
@@ -4923,10 +4924,11 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
   <li>BLOBstreaming support</li>
 </ul></li>
 
-<li>Piotr Przybylski (Google Summer of Code 2008 and 2010)
+<li>Piotr Przybylski (Google Summer of Code 2008, 2010 and 2011)
 <ul>
   <li>improved setup script</li>
   <li>user preferences</li>
+  <li>Drizzle support</li>
 </ul></li>
 
 <li>Derek Schaefer (Google Summer of Code 2009)
diff --git a/db_create.php b/db_create.php
index 2d7877a..84ef1a5 100644
--- a/db_create.php
+++ b/db_create.php
@@ -13,7 +13,9 @@ $GLOBALS['js_include'][] = 'functions.js';
 $GLOBALS['js_include'][] = 'jquery/jquery-ui-1.8.custom.js';
 
 require_once './libraries/mysql_charsets.lib.php';
-require './libraries/replication.inc.php';
+if (!PMA_DRIZZLE) {
+    require './libraries/replication.inc.php';
+}
 require './libraries/build_html_for_db.lib.php';
 
 PMA_checkParameters(array('new_db'));
diff --git a/db_datadict.php b/db_datadict.php
index 89b2bc5..f580e21 100644
--- a/db_datadict.php
+++ b/db_datadict.php
@@ -76,7 +76,7 @@ foreach($tables as $table) {
      */
 
     PMA_DBI_select_db($db);
-    $result       = PMA_DBI_query('SHOW KEYS FROM ' . PMA_backquote($table) . ';');
+    $indexes      = PMA_DBI_get_table_indexes($db, $table);
     $primary      = '';
     $indexes      = array();
     $lastIndex    = '';
@@ -84,7 +84,7 @@ foreach($tables as $table) {
     $indexes_data = array();
     $pk_array     = array(); // will be use to emphasis prim. keys in the table
                              // view
-    while ($row = PMA_DBI_fetch_assoc($result)) {
+    foreach ($indexes as $row) {
         // Backups the list of primary keys
         if ($row['Key_name'] == 'PRIMARY') {
             $primary   .= $row['Column_name'] . ', ';
@@ -111,10 +111,6 @@ foreach($tables as $table) {
         }
 
     } // end while
-    if ($result) {
-        PMA_DBI_free_result($result);
-    }
-
 
     /**
      * Gets columns properties
@@ -124,7 +120,7 @@ foreach($tables as $table) {
 
     if (PMA_MYSQL_INT_VERSION < 50025) {
         // We need this to correctly learn if a TIMESTAMP is NOT NULL, since
-        // SHOW FULL FIELDS or INFORMATION_SCHEMA incorrectly says NULL
+        // SHOW FULL COLUMNS or INFORMATION_SCHEMA incorrectly says NULL
         // and SHOW CREATE TABLE says NOT NULL
         // http://bugs.mysql.com/20910.
 
@@ -210,7 +206,7 @@ foreach($tables as $table) {
          && ! empty($analyzed_sql[0]['create_table_fields'][$field_name]['type'])
          && $analyzed_sql[0]['create_table_fields'][$field_name]['type'] == 'TIMESTAMP'
          && $analyzed_sql[0]['create_table_fields'][$field_name]['timestamp_not_null']) {
-            // here, we have a TIMESTAMP that SHOW FULL FIELDS reports as having the
+            // here, we have a TIMESTAMP that SHOW FULL COLUMNS reports as having the
             // NULL attribute, but SHOW CREATE TABLE says the contrary. Believe
             // the latter.
             /**
diff --git a/db_operations.php b/db_operations.php
index 6b40947..0bd9eef 100644
--- a/db_operations.php
+++ b/db_operations.php
@@ -42,12 +42,13 @@ if (strlen($db) && (! empty($db_rename) || ! empty($db_copy))) {
     } else {
         $sql_query = ''; // in case target db exists
         $_error = false;
-        if ($move ||
-         (isset($create_database_before_copying) && $create_database_before_copying)) {
+        if ($move || (isset($create_database_before_copying) && $create_database_before_copying)) {
             // lower_case_table_names=1 `DB` becomes `db`
-            $lower_case_table_names = PMA_DBI_fetch_value('SHOW VARIABLES LIKE "lower_case_table_names"', 0, 1);
-            if ($lower_case_table_names === '1') {
-                $newname = PMA_strtolower($newname);
+            if (!PMA_DRIZZLE) {
+                $lower_case_table_names = PMA_DBI_fetch_value('SHOW VARIABLES LIKE "lower_case_table_names"', 0, 1);
+                if ($lower_case_table_names === '1') {
+                    $newname = PMA_strtolower($newname);
+                }
             }
 
             $local_query = 'CREATE DATABASE ' . PMA_backquote($newname);
@@ -225,7 +226,7 @@ if (strlen($db) && (! empty($db_rename) || ! empty($db_copy))) {
             unset($GLOBALS['sql_constraints_query_full_db'], $one_query);
         }
 
-        if (PMA_MYSQL_INT_VERSION >= 50100) {
+        if (!PMA_DRIZZLE && PMA_MYSQL_INT_VERSION >= 50100) {
             // here DELIMITER is not used because it's not part of the
             // language; each statement is sent one by one
 
@@ -342,11 +343,7 @@ if (empty($is_info)) {
 }
 
 $db_collation = PMA_getDbCollation($db);
-if ($db == 'information_schema') {
-    $is_information_schema = true;
-} else {
-    $is_information_schema = false;
-}
+$is_information_schema = PMA_is_system_schema($db);
 
 if (!$is_information_schema) {
     if ($cfgRelation['commwork']) {
@@ -416,7 +413,9 @@ if ($db != 'mysql') {
 // Drop link if allowed
 // Don't even try to drop information_schema. You won't be able to. Believe me. You won't.
 // Don't allow to easily drop mysql database, RFE #1327514.
-if (($is_superuser || $GLOBALS['cfg']['AllowUserDropDatabase']) && ! $db_is_information_schema && ($db != 'mysql')) {
+if (($is_superuser || $GLOBALS['cfg']['AllowUserDropDatabase'])
+        && !$db_is_information_schema
+        && (PMA_DRIZZLE || $db != 'mysql')) {
 ?>
 <div class="operations_half_width">
 <fieldset class="caution">
diff --git a/db_qbe.php b/db_qbe.php
index fe1456e..66d670b 100644
--- a/db_qbe.php
+++ b/db_qbe.php
@@ -755,8 +755,8 @@ if (isset($Field) && count($Field) > 0) {
             PMA_DBI_select_db($db);
 
             foreach ($tab_all as $tab) {
-                $ind_rs   = PMA_DBI_query('SHOW INDEX FROM ' . PMA_backquote($tab) . ';');
-                while ($ind = PMA_DBI_fetch_assoc($ind_rs)) {
+                $indexes = PMA_DBI_get_table_indexes($db, $tab);
+                foreach ($indexes as $ind) {
                     $col1 = $tab . '.' . $ind['Column_name'];
                     if (isset($col_all[$col1])) {
                         if ($ind['Non_unique'] == 0) {
diff --git a/db_routines.php b/db_routines.php
index 745d1f9..6d22335 100644
--- a/db_routines.php
+++ b/db_routines.php
@@ -12,7 +12,11 @@
 require_once './libraries/common.inc.php';
 require_once './libraries/common.lib.php';
 require_once './libraries/mysql_charsets.lib.php';
-require_once './libraries/data_mysql.inc.php';
+if (PMA_DRIZZLE) {
+    require_once './libraries/data_drizzle.inc.php';
+} else {
+    require_once './libraries/data_mysql.inc.php';
+}
 
 /**
  * Include JavaScript libraries
diff --git a/db_search.php b/db_search.php
index 6242a53..c76e5d8 100644
--- a/db_search.php
+++ b/db_search.php
@@ -148,11 +148,20 @@ if (isset($_REQUEST['submit_search'])) {
             $thefieldlikevalue = array();
             foreach ($tblfields as $tblfield) {
                 if (! isset($field) || strlen($field) == 0 || $tblfield['Field'] == $field) {
-                    $thefieldlikevalue[] = 'CONVERT(' . PMA_backquote($tblfield['Field']) . ' USING utf8)'
-                                         . ' ' . $like_or_regex . ' '
-                                         . "'" . $automatic_wildcard
-                                         . $search_word
-                                         . $automatic_wildcard . "'";
+                    // Drizzle has no CONVERT and all text columns are UTF-8
+                    if (PMA_DRIZZLE) {
+                        $thefieldlikevalue[] = PMA_backquote($tblfield['Field'])
+                                            . ' ' . $like_or_regex . ' '
+                                            . "'" . $automatic_wildcard
+                                            . $search_word
+                                            . $automatic_wildcard . "'";
+                    } else {
+                        $thefieldlikevalue[] = 'CONVERT(' . PMA_backquote($tblfield['Field']) . ' USING utf8)'
+                                            . ' ' . $like_or_regex . ' '
+                                            . "'" . $automatic_wildcard
+                                            . $search_word
+                                            . $automatic_wildcard . "'";
+                    }
                 }
             } // end for
 
diff --git a/db_structure.php b/db_structure.php
index c0c1d33..a7e7a2b 100644
--- a/db_structure.php
+++ b/db_structure.php
@@ -44,7 +44,11 @@ if (empty($is_info)) {
     $sub_part = '_structure';
     require './libraries/db_info.inc.php';
 
-    require_once './libraries/replication.inc.php';
+    if (!PMA_DRIZZLE) {
+        require './libraries/replication.inc.php';
+    } else {
+        $server_slave_status = false;
+    }
 }
 
 require_once './libraries/bookmark.lib.php';
@@ -158,10 +162,12 @@ foreach ($tables as $keyname => $each_table) {
             }
             break;
         case 'InnoDB' :
-            // InnoDB table: Row count is not accurate but data and index
-            // sizes are.
+        case 'PBMS' :
+            // InnoDB table: Row count is not accurate but data and index sizes are.
+            // PBMS table in Drizzle: TABLE_ROWS is taken from table cache, so it may be unavailable
 
-            if ($each_table['TABLE_ROWS'] < $GLOBALS['cfg']['MaxExactCount']) {
+            if (($each_table['ENGINE'] == 'InnoDB' && $each_table['TABLE_ROWS'] < $GLOBALS['cfg']['MaxExactCount'])
+                    || !isset($each_table['TABLE_ROWS'])) {
                 $each_table['COUNTED'] = true;
                 $each_table['TABLE_ROWS'] = PMA_Table::countRecords($db,
                     $each_table['TABLE_NAME'], $force_exact = true,
@@ -170,7 +176,8 @@ foreach ($tables as $keyname => $each_table) {
                 $each_table['COUNTED'] = false;
             }
 
-            if ($is_show_stats) {
+            // Drizzle doesn't provide data and index length, check for null
+            if ($is_show_stats && $each_table['Data_length'] !== null) {
                 $tblsize                    =  $each_table['Data_length'] + $each_table['Index_length'];
                 $sum_size                   += $tblsize;
                 list($formatted_size, $unit) =  PMA_formatByteDown($tblsize, 3, ($tblsize > 0) ? 1 : 0);
@@ -193,6 +200,7 @@ foreach ($tables as $keyname => $each_table) {
             // or on some servers it's reported as "SYSTEM VIEW"
         case null :
         case 'SYSTEM VIEW' :
+        case 'FunctionEngine' :
             // if table is broken, Engine is reported as null, so one more test
             if ($each_table['TABLE_TYPE'] == 'VIEW') {
                 // countRecords() takes care of $cfg['MaxExactCountViews']
@@ -249,7 +257,7 @@ foreach ($tables as $keyname => $each_table) {
         $hidden_fields[] = '<input type="hidden" name="views[]" value="' .  htmlspecialchars($each_table['TABLE_NAME']) . '" />';
     }
 
-    if ($each_table['TABLE_ROWS'] > 0) {
+    if ($each_table['TABLE_ROWS'] > 0 || $table_is_view) {
         $browse_table = '<a href="sql.php?' . $tbl_url_query . '&pos=0">' . $titles['Browse'] . '</a>';
         $search_table = '<a href="tbl_select.php?' . $tbl_url_query . '">' . $titles['Search'] . '</a>';
         $browse_table_label = '<a href="sql.php?' . $tbl_url_query . '&pos=0">' . $truename . '</a>';
@@ -367,8 +375,12 @@ foreach ($tables as $keyname => $each_table) {
     //  so ensure that we'll display "in use" below for a table
     //  that needs to be repaired
     if (isset($each_table['TABLE_ROWS']) && ($each_table['ENGINE'] != null || $table_is_view)) {
+        $row_count_pre = '';
+        $show_superscript = '';
         if ($table_is_view) {
-            if ($each_table['TABLE_ROWS'] >= $GLOBALS['cfg']['MaxExactCountViews']) {
+            // Drizzle views use FunctionEngine, and the only place where they are available are I_S and D_D
+            // schemas, where we do exact counting
+            if ($each_table['TABLE_ROWS'] >= $GLOBALS['cfg']['MaxExactCountViews'] && $each_table['ENGINE'] != 'FunctionEngine') {
                 $row_count_pre = '~';
                 $sum_row_count_pre = '~';
                 $show_superscript = PMA_showHint(PMA_sanitize(sprintf(__('This view has at least this number of rows. Please refer to %sdocumentation%s.'), '[a at ./Documentation.html#cfg_MaxExactCountViews at _blank]', '[/a]')));
@@ -378,9 +390,6 @@ foreach ($tables as $keyname => $each_table) {
             $row_count_pre = '~';
             $sum_row_count_pre = '~';
             $show_superscript = '';
-        } else {
-            $row_count_pre = '';
-            $show_superscript = '';
         }
     ?>
     <td class="value tbl_rows"><?php echo $row_count_pre . PMA_formatNumber($each_table['TABLE_ROWS'], 0) . $show_superscript; ?></td>
@@ -506,10 +515,12 @@ if (!$db_is_information_schema && !$cfg['DisableMultiTableMaintenance']) {
          . __('Drop') . '</option>' . "\n";
     echo '    <option value="check_tbl" >'
          . __('Check table') . '</option>' . "\n";
-    echo '    <option value="optimize_tbl" >'
-         . __('Optimize table') . '</option>' . "\n";
-    echo '    <option value="repair_tbl" >'
-         . __('Repair table') . '</option>' . "\n";
+    if (!PMA_DRIZZLE) {
+        echo '    <option value="optimize_tbl" >'
+             . __('Optimize table') . '</option>' . "\n";
+        echo '    <option value="repair_tbl" >'
+             . __('Repair table') . '</option>' . "\n";
+    }
     echo '    <option value="analyze_tbl" >'
          . __('Analyze table') . '</option>' . "\n";
     echo '    <option value="add_prefix_tbl" >'
diff --git a/import.php b/import.php
index 56732ae..f305293 100644
--- a/import.php
+++ b/import.php
@@ -346,10 +346,16 @@ if ($GLOBALS['PMA_recoding_engine'] != PMA_CHARSET_NONE && isset($charset_of_fil
         $charset_conversion = true;
     }
 } elseif (isset($charset_of_file) && $charset_of_file != 'utf8') {
-    PMA_DBI_query('SET NAMES \'' . $charset_of_file . '\'');
-    // We can not show query in this case, it is in different charset
-    $sql_query_disabled = true;
-    $reset_charset = true;
+    if (PMA_DRIZZLE) {
+        // Drizzle doesn't support other character sets, so we can't fallback to SET NAMES - throw an error
+        $error = true;
+        $message = PMA_Message::error(__('Cannot convert file\'s character set without character set conversion library'));
+    } else {
+        PMA_DBI_query('SET NAMES \'' . $charset_of_file . '\'');
+        // We can not show query in this case, it is in different charset
+        $sql_query_disabled = true;
+        $reset_charset = true;
+    }
 }
 
 // Something to skip?
diff --git a/js/server_plugins.js b/js/server_plugins.js
new file mode 100644
index 0000000..9d20edb
--- /dev/null
+++ b/js/server_plugins.js
@@ -0,0 +1,30 @@
+/**
+ * Functions used in server plugins pages
+ */
+
+var pma_theme_image; // filled in server_plugins.php
+
+$(function() {
+    // Add tabs
+    $('#pluginsTabs').tabs({
+        // Tab persistence
+        cookie: { name: 'pma_serverStatusTabs', expires: 1 },
+        show: function(event, ui) {
+            // Fixes line break in the menu bar when the page overflows and scrollbar appears
+            menuResize();
+            // 'Plugins' tab is too high due to hiding of 'Modules' by negative left position,
+            // hide tabs by changing display to fix it
+            $(ui.panel).closest('.ui-tabs').find('> div').not(ui.panel).css('display', 'none');
+            $(ui.panel).css('display', 'block');
+        }
+    });
+
+    // Make columns sortable, but only for tables with more than 1 data row
+    var $tables = $('#plugins_plugins table:has(tbody tr + tr)');
+    $tables.tablesorter({
+        sortList: [[0,0]],
+        widgets: ['zebra']
+    });
+    $tables.find('thead th')
+        .append('<img class="sortableIcon" src="' + pma_theme_image + 'cleardot.gif" alt="">');
+});
\ No newline at end of file
diff --git a/js/server_status_monitor.js b/js/server_status_monitor.js
index e89f048..12a41d3 100644
--- a/js/server_status_monitor.js
+++ b/js/server_status_monitor.js
@@ -990,7 +990,7 @@ $(function() {
                 zoomType: 'x',
                 events: {
                     selection: function(event) {
-                        if (editMode) {
+                        if (editMode || $('#logAnalyseDialog').length == 0) {
                             return false;
                         }
 
diff --git a/libraries/Advisor.class.php b/libraries/Advisor.class.php
index 12fdcad..bf4e404 100644
--- a/libraries/Advisor.class.php
+++ b/libraries/Advisor.class.php
@@ -21,6 +21,12 @@ class Advisor
             PMA_DBI_fetch_result('SHOW GLOBAL STATUS', 0, 1),
             PMA_DBI_fetch_result('SHOW GLOBAL VARIABLES', 0, 1)
         );
+        if (PMA_DRIZZLE) {
+            $this->variables = array_merge($this->variables,
+                PMA_DBI_fetch_result(
+                    "SELECT concat('Com_', variable_name), variable_value
+                    FROM data_dictionary.GLOBAL_STATEMENTS", 0, 1));
+        }
         // Add total memory to variables as well
         require_once 'libraries/sysinfo.lib.php';
         $sysinfo = getSysInfo();
diff --git a/libraries/Index.class.php b/libraries/Index.class.php
index 25f613f..47c9950 100644
--- a/libraries/Index.class.php
+++ b/libraries/Index.class.php
@@ -157,7 +157,7 @@ class PMA_Index
             return true;
         }
 
-        $_raw_indexes = PMA_DBI_fetch_result('SHOW INDEX FROM ' . PMA_backquote($schema) . '.' . PMA_backquote($table));
+        $_raw_indexes = PMA_DBI_get_table_indexes($schema, $table);
         foreach ($_raw_indexes as $_each_index) {
             $_each_index['Schema'] = $schema;
             if (! isset(PMA_Index::$_registry[$schema][$table][$_each_index['Key_name']])) {
diff --git a/libraries/List.class.php b/libraries/List.class.php
index 694546a..8303227 100644
--- a/libraries/List.class.php
+++ b/libraries/List.class.php
@@ -82,7 +82,8 @@ abstract class PMA_List extends ArrayObject
 
         $options = '';
         foreach ($this as $each_item) {
-            if (false === $include_information_schema && 'information_schema' === $each_item) {
+            if (false === $include_information_schema
+                    && PMA_is_system_schema($each_item)) {
                 continue;
             }
             $options .= '<option value="' . htmlspecialchars($each_item) . '"';
diff --git a/libraries/List_Database.class.php b/libraries/List_Database.class.php
index e9907cf..1e1b31f 100644
--- a/libraries/List_Database.class.php
+++ b/libraries/List_Database.class.php
@@ -390,7 +390,7 @@ require_once './libraries/List.class.php';
             foreach ($dbs as $db) {
                 $return .= '<option value="' . htmlspecialchars($db['name']) . '"'
                     .' title="' . htmlspecialchars($db['comment']) . '"';
-                if ($db['name'] == $selected) {
+                if ($db['name'] == $selected || (PMA_DRIZZLE && strtolower($db['name']) == strtolower($selected))) {
                     $return .= ' selected="selected"';
                 }
                 $return .= '>' . htmlspecialchars($cut ? $db['disp_name_cut'] : $db['disp_name']);
diff --git a/libraries/StorageEngine.class.php b/libraries/StorageEngine.class.php
index e5c03b5..de30ad7 100644
--- a/libraries/StorageEngine.class.php
+++ b/libraries/StorageEngine.class.php
@@ -58,7 +58,22 @@ class PMA_StorageEngine
         static $storage_engines = null;
 
         if (null == $storage_engines) {
-            $storage_engines = PMA_DBI_fetch_result('SHOW STORAGE ENGINES', 'Engine');
+            if (PMA_DRIZZLE) {
+                $sql = "SELECT
+                        p.plugin_name            AS Engine,
+                        (CASE
+                            WHEN p.plugin_name = @@storage_engine THEN 'DEFAULT'
+                            WHEN p.is_active THEN 'YES'
+                            ELSE 'DISABLED' END) AS Support,
+                        m.module_description     AS Comment
+                    FROM data_dictionary.plugins p
+                        JOIN data_dictionary.modules m USING (module_name)
+                    WHERE p.plugin_type = 'StorageEngine'
+                        AND p.plugin_name NOT IN ('FunctionEngine', 'schema')";
+                $storage_engines = PMA_DBI_fetch_result($sql, 'Engine');
+            } else {
+                $storage_engines = PMA_DBI_fetch_result('SHOW STORAGE ENGINES', 'Engine');
+            }
         }
 
         return $storage_engines;
@@ -83,9 +98,12 @@ class PMA_StorageEngine
             . (empty($id) ? '' : ' id="' . $id . '"') . '>' . "\n";
 
         foreach (PMA_StorageEngine::getStorageEngines() as $key => $details) {
+            // Don't show PERFORMANCE_SCHEMA engine (MySQL 5.5)
+            // Don't show MyISAM for Drizzle (allowed only for temporary tables)
             if (!$offerUnavailableEngines
-                  && ($details['Support'] == 'NO' || $details['Support'] == 'DISABLED'
-                      || $details['Engine'] == 'PERFORMANCE_SCHEMA')) {
+                && ($details['Support'] == 'NO' || $details['Support'] == 'DISABLED'
+                    || $details['Engine'] == 'PERFORMANCE_SCHEMA')
+                    || (PMA_DRIZZLE && $details['Engine'] == 'MyISAM')) {
                 continue;
             }
 
diff --git a/libraries/Table.class.php b/libraries/Table.class.php
index ba7a12d..3816b9b 100644
--- a/libraries/Table.class.php
+++ b/libraries/Table.class.php
@@ -323,7 +323,8 @@ class PMA_Table
             return PMA_Table::$cache[$db][$table];
         }
 
-        if (! isset(PMA_Table::$cache[$db][$table][$info])) {
+        // array_key_exists allows for null values
+        if (!array_key_exists($info, PMA_Table::$cache[$db][$table])) {
             if (! $disable_error) {
                 trigger_error(__('unknown table status: ') . $info, E_USER_WARNING);
             }
@@ -367,9 +368,8 @@ class PMA_Table
         $query = PMA_backquote($name) . ' ' . $type;
 
         if ($length != ''
-            && ! preg_match('@^(DATE|DATETIME|TIME|TINYBLOB|TINYTEXT|BLOB|TEXT|'
-            . 'MEDIUMBLOB|MEDIUMTEXT|LONGBLOB|LONGTEXT|SERIAL|BOOLEAN)$@i', $type)
-        ) {
+            && !preg_match('@^(DATE|DATETIME|TIME|TINYBLOB|TINYTEXT|BLOB|TEXT|'
+                . 'MEDIUMBLOB|MEDIUMTEXT|LONGBLOB|LONGTEXT|SERIAL|BOOLEAN|UUID)$@i', $type)) {
             $query .= '(' . $length . ')';
         }
 
@@ -401,6 +401,15 @@ class PMA_Table
                 $query .= ' DEFAULT b\''
                         . preg_replace('/[^01]/', '0', $default_value)
                         . '\'';
+            } elseif ($type == 'BOOLEAN') {
+                if (preg_match('/^1|T|TRUE|YES$/i', $default_value)) {
+                    $query .= ' DEFAULT TRUE';
+                } elseif (preg_match('/^0|F|FALSE|NO$/i', $default_value)) {
+                    $query .= ' DEFAULT FALSE';
+                } else {
+                    // Invalid BOOLEAN value
+                    $query .= ' DEFAULT \'' . PMA_sqlAddSlashes($default_value) . '\'';
+                }
             } else {
                 $query .= ' DEFAULT \'' . PMA_sqlAddSlashes($default_value) . '\'';
             }
@@ -493,7 +502,9 @@ class PMA_Table
 
             // for a VIEW, $row_count is always false at this point
             if (false === $row_count || $row_count < $GLOBALS['cfg']['MaxExactCount']) {
-                if (! $is_view) {
+                // Make an exception for views in I_S and D_D schema in Drizzle, as these map to
+                // in-memory data and should execute fast enough
+                if (! $is_view || (PMA_DRIZZLE && PMA_is_system_schema($db))) {
                     $row_count = PMA_DBI_fetch_value(
                         'SELECT COUNT(*) FROM ' . PMA_backquote($db) . '.'
                         . PMA_backquote($table)
@@ -738,15 +749,19 @@ class PMA_Table
                 }
             }
             unset($analyzed_sql);
-            $server_sql_mode = PMA_DBI_fetch_value("SHOW VARIABLES LIKE 'sql_mode'", 0, 1);
-            // ANSI_QUOTES might be a subset of sql_mode, for example
-            // REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI
-            if (false !== strpos($server_sql_mode, 'ANSI_QUOTES')) {
-                $table_delimiter = 'quote_double';
-            } else {
+            if (PMA_DRIZZLE) {
                 $table_delimiter = 'quote_backtick';
+            } else {
+                $server_sql_mode = PMA_DBI_fetch_value("SHOW VARIABLES LIKE 'sql_mode'", 0, 1);
+                // ANSI_QUOTES might be a subset of sql_mode, for example
+                // REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI
+                if (false !== strpos($server_sql_mode, 'ANSI_QUOTES')) {
+                    $table_delimiter = 'quote_double';
+                } else {
+                    $table_delimiter = 'quote_backtick';
+                }
+                unset($server_sql_mode);
             }
-            unset($server_sql_mode);
 
             /* Find table name in query and replace it */
             while ($parsed_sql[$i]['type'] != $table_delimiter) {
@@ -1239,7 +1254,7 @@ class PMA_Table
      */
     public function getUniqueColumns($backquoted = true)
     {
-        $sql = 'SHOW INDEX FROM ' . $this->getFullName(true) . ' WHERE Non_unique = 0';
+        $sql = PMA_DBI_get_table_indexes_sql($this->getDbName(), $this->getName(), 'Non_unique = 0');
         $uniques = PMA_DBI_fetch_result($sql, array('Key_name', null), 'Column_name');
 
         $return = array();
@@ -1268,7 +1283,7 @@ class PMA_Table
      */
     public function getIndexedColumns($backquoted = true)
     {
-        $sql = 'SHOW INDEX FROM ' . $this->getFullName(true) . ' WHERE Seq_in_index = 1';
+        $sql = PMA_DBI_get_table_indexes_sql($this->getDbName(), $this->getName(), 'Seq_in_index = 1');
         $indexed = PMA_DBI_fetch_result($sql, 'Column_name', 'Column_name');
 
         $return = array();
diff --git a/libraries/Tracker.class.php b/libraries/Tracker.class.php
index e71b7d6..97f62f0 100644
--- a/libraries/Tracker.class.php
+++ b/libraries/Tracker.class.php
@@ -67,13 +67,23 @@ class PMA_Tracker
     static protected $default_tracking_set;
 
     /**
+     * Flags copied from `tracking` column definition in `pma_tracking` table.
+     * Used for column type conversion in Drizzle.
+     *
+     * @var array
+     */
+    static private $tracking_set_flags = array('UPDATE','REPLACE','INSERT','DELETE','TRUNCATE','CREATE DATABASE',
+            'ALTER DATABASE','DROP DATABASE','CREATE TABLE','ALTER TABLE','RENAME TABLE','DROP TABLE','CREATE INDEX',
+            'DROP INDEX','CREATE VIEW','ALTER VIEW','DROP VIEW');
+
+    /**
      * Initializes settings. See phpMyAdmin/Documentation.html.
      *
      * @static
      *
      * @return nothing
      */
-    static public function init()
+    static protected function init()
     {
         self::$pma_table = PMA_backquote($GLOBALS['cfg']['Server']['pmadb']) .".".
                            PMA_backquote($GLOBALS['cfg']['Server']['tracking']);
@@ -240,7 +250,7 @@ class PMA_Tracker
 
         // Get data definition snapshot of table
 
-        $columns = PMA_DBI_get_columns($dbname, $tablename, true);
+        $columns = PMA_DBI_get_columns($dbname, $tablename, null, true);
         // int indices to reduce size
         $columns = array_values($columns);
         // remove Privileges to reduce size
@@ -248,16 +258,7 @@ class PMA_Tracker
             unset($columns[$i]['Privileges']);
         }
 
-        $sql_query = '
-        SHOW INDEX FROM ' . PMA_backquote($dbname) . '.' . PMA_backquote($tablename);
-
-        $sql_result = PMA_DBI_query($sql_query);
-
-        $indexes = array();
-
-        while ($row = PMA_DBI_fetch_assoc($sql_result)) {
-            $indexes[] = $row;
-        }
+        $indexes = PMA_DBI_get_table_indexes($dbname, $tablename);
 
         $snapshot = array('COLUMNS' => $columns, 'INDEXES' => $indexes);
         $snapshot = serialize($snapshot);
@@ -304,7 +305,7 @@ class PMA_Tracker
         '" . PMA_sqlAddSlashes($snapshot) . "',
         '" . PMA_sqlAddSlashes($create_sql) . "',
         '" . PMA_sqlAddSlashes("\n") . "',
-        '" . PMA_sqlAddSlashes($tracking_set) . "' )";
+        '" . PMA_sqlAddSlashes(self::transformTrackingSet($tracking_set)) . "' )";
 
         $result = PMA_query_as_controluser($sql_query);
 
@@ -390,7 +391,7 @@ class PMA_Tracker
         '" . PMA_sqlAddSlashes('') . "',
         '" . PMA_sqlAddSlashes($create_sql) . "',
         '" . PMA_sqlAddSlashes("\n") . "',
-        '" . PMA_sqlAddSlashes($tracking_set) . "' )";
+        '" . PMA_sqlAddSlashes(self::transformTrackingSet($tracking_set)) . "' )";
 
         $result = PMA_query_as_controluser($sql_query);
 
@@ -522,7 +523,9 @@ class PMA_Tracker
         " AND `table_name` = '" . PMA_sqlAddSlashes($tablename) . "' ";
 
         if ($statement != "") {
-            $sql_query .= " AND FIND_IN_SET('" . $statement . "',tracking) > 0" ;
+            $sql_query .= PMA_DRIZZLE
+                ? ' AND tracking & ' . self::transformTrackingSet($statement) . ' <> 0'
+                : " AND FIND_IN_SET('" . $statement . "',tracking) > 0" ;
         }
         $row = PMA_DBI_fetch_array(PMA_query_as_controluser($sql_query));
         return isset($row[0])
@@ -625,7 +628,7 @@ class PMA_Tracker
         }
         $data['ddlog']           = $ddlog;
         $data['dmlog']           = $dmlog;
-        $data['tracking']        = $mixed['tracking'];
+        $data['tracking']        = self::transformTrackingSet($mixed['tracking']);
         $data['schema_snapshot'] = $mixed['schema_snapshot'];
 
         return $data;
@@ -940,5 +943,57 @@ class PMA_Tracker
             }
         }
     }
+
+    /**
+     * Transforms tracking set for Drizzle, which has no SET type
+     *
+     * Converts int<>string for Drizzle, does nothing for MySQL
+     *
+     * @param int|string $tracking_set
+     * @return int|string
+     */
+    static private function transformTrackingSet($tracking_set)
+    {
+        if (!PMA_DRIZZLE) {
+            return $tracking_set;
+        }
+
+        // init conversion array (key 3 doesn't exist in calculated array)
+        if (isset(self::$tracking_set_flags[3])) {
+            // initialize flags
+            $set = self::$tracking_set_flags;
+            $array = array();
+            for ($i = 0; $i < count($set); $i++) {
+                $flag = 1 << $i;
+                $array[$flag] = $set[$i];
+                $array[$set[$i]] = $flag;
+            }
+            self::$tracking_set_flags = $array;
+        }
+
+        if (is_numeric($tracking_set)) {
+            // int > string conversion
+            $aflags = array();
+            // count/2 - conversion table has both int > string and string > int values
+            for ($i = 0; $i < count(self::$tracking_set_flags)/2; $i++) {
+                $flag = 1 << $i;
+                if ($tracking_set & $flag) {
+                    $aflags[] = self::$tracking_set_flags[$flag];
+                }
+            }
+            $flags = implode(',', $aflags);
+        } else {
+            // string > int conversion
+            $flags = 0;
+            foreach (explode(',', $tracking_set) as $strflag) {
+                if ($strflag == '') {
+                    continue;
+                }
+                $flags |= self::$tracking_set_flags[$strflag];
+            }
+        }
+
+        return $flags;
+    }
 }
 ?>
diff --git a/libraries/advisory_rules.txt b/libraries/advisory_rules.txt
index 58c75d1..4295763 100644
--- a/libraries/advisory_rules.txt
+++ b/libraries/advisory_rules.txt
@@ -44,7 +44,7 @@ rule 'Questions below 1,000'
 	Let the server run for a longer time until it has executed a greater amount of queries.
 	Current amount of Questions: %s | Questions
 
-rule 'Percentage of slow queries' [Questions > 0]
+rule 'Percentage of slow queries' [Questions > 0 && !PMA_DRIZZLE]
 	Slow_queries / Questions * 100
 	value >= 5
 	There is a lot of slow queries compared to the overall amount of Queries.
@@ -58,14 +58,14 @@ rule 'Slow query rate' [Questions > 0]
 	You might want to increase {long_query_time} or optimize the queries listed in the slow query log
 	You have a slow query rate of %s per hour, you should have less than 1% per hour. | PMA_bytime(value,2)
 
-rule 'Long query time'
+rule 'Long query time' [!PMA_DRIZZLE]
 	long_query_time
 	value >= 10
 	long_query_time is set to 10 seconds or more, thus only slow queries that take above 10 seconds are logged.
 	It is suggested to set {long_query_time} to a lower value, depending on your environment. Usually a value of 1-5 seconds is suggested.
 	long_query_time is currently set to %ds. | value
 
-rule 'Slow query logging'
+rule 'Slow query logging' [!PMA_DRIZZLE]
 	log_slow_queries
 	value == 'OFF'
 	The slow query log is disabled.
@@ -109,6 +109,13 @@ rule 'Distribution'
 	Percona documentation is at http://www.percona.com/docs/wiki/
 	'percona' found in version_comment
 
+rule 'Distribution'
+	version
+	PMA_DRIZZLE
+	The MySQL manual only is accurate for official MySQL binaries.
+	Drizzle documentation is at http://docs.drizzle.org/
+	Version string (%s) matches Drizzle versioning scheme | value
+
 rule 'MySQL Architecture'
 	system_memory
 	value > 3072*1024 && !preg_match('/64/',version_compile_machine) && !preg_match('/64/',version_compile_os)
@@ -120,7 +127,7 @@ rule 'MySQL Architecture'
 # Query cache
 
 # Lame: 'ON' == 0 is true, so you need to compare 'ON' == '0'
-rule 'Query cache disabled'
+rule 'Query cache disabled' [!PMA_DRIZZLE]
 	query_cache_size
 	value == 0 || query_cache_type == 'OFF' || query_cache_type == '0'
 	The query cache is not enabled.
@@ -134,28 +141,28 @@ rule 'Query caching method' [!fired('Query cache disabled')]
 	You are using the MySQL Query cache with a fairly high traffic database. It might be worth considering to use <a href="http://dev.mysql.com/doc/refman/5.5/en/ha-memcached.html">memcached</a> instead of the MySQL Query cache, especially if you have multiple slaves.
 	The query cache is enabled and the server receives %d queries per second. This rule fires if there is more than 100 queries per second. | round(value,1)
 
-rule 'Query cache efficiency (%)' [Com_select + Qcache_hits > 0 && !fired('Query cache disabled')]
+rule 'Query cache efficiency (%)' [!PMA_DRIZZLE && Com_select + Qcache_hits > 0 && !fired('Query cache disabled')]
 	Qcache_hits / (Com_select + Qcache_hits) * 100
 	value  < 20
 	Query cache not running efficiently, it has a low hit rate.
 	Consider increasing {query_cache_limit}.
 	The current query cache hit rate of %s% is below 20% | round(value,1)
 
-rule 'Query cache usage' [!fired('Query cache disabled')]
+rule 'Query Cache usage' [!fired('Query cache disabled') && !PMA_DRIZZLE]
 	100 - Qcache_free_memory / query_cache_size * 100
 	value < 80
 	Less than 80% of the query cache is being utilized.
 	This might be caused by {query_cache_limit} being too low. Flushing the query cache might help as well.
 	The current ratio of free query cache memory to total query cache size is %s%. It should be above 80% | round(value,1)
 
-rule 'Query cache fragmentation' [!fired('Query cache disabled')]
+rule 'Query cache fragmentation' [!fired('Query cache disabled') && !PMA_DRIZZLE]
 	Qcache_free_blocks / (Qcache_total_blocks / 2) * 100
 	value > 20
 	The query cache is considerably fragmented.
 	Severe fragmentation is likely to (further) increase Qcache_lowmem_prunes. This might be caused by many Query cache low memory prunes due to {query_cache_size} being too small. For a immediate but short lived fix you can flush the query cache (might lock the query cache for a long time). Carefully adjusting {query_cache_min_res_unit} to a lower value might help too, e.g. you can set it to the average size of your queries in the cache using this formula: (query_cache_size - qcache_free_memory) / qcache_queries_in_cache
 	The cache is currently fragmented by %s% , with 100% fragmentation meaning that the query cache is an alternating pattern of free and used blocks. This value should be below 20%. | round(value,1)
 
-rule 'Query cache low memory prunes' [Qcache_inserts > 0 && !fired('Query cache disabled')]
+rule 'Query cache low memory prunes' [!PMA_DRIZZLE && Qcache_inserts > 0 && !fired('Query cache disabled')]
 	Qcache_lowmem_prunes / Qcache_inserts * 100
 	value > 0.1
 	Cached queries are removed due to low query cache memory from the query cache.
@@ -263,14 +270,14 @@ rule 'Temp disk rate'
 
 #
 # MyISAM index cache
-rule 'MyISAM key buffer size'
+rule 'MyISAM key buffer size' [!PMA_DRIZZLE]
 	key_buffer_size
 	value == 0
 	Key buffer is not initialized. No MyISAM indexes will be cached.
 	Set {key_buffer_size} depending on the size of your MyISAM indexes. 64M is a good start.
 	key_buffer_size is 0
 
-rule 'Max % MyISAM key buffer ever used' [key_buffer_size > 0]
+rule 'Max % MyISAM key buffer ever used' [!PMA_DRIZZLE && key_buffer_size > 0]
 	Key_blocks_used * key_cache_block_size / key_buffer_size * 100
 	value < 95
 	MyISAM key buffer (index cache) % used is low.
@@ -278,14 +285,14 @@ rule 'Max % MyISAM key buffer ever used' [key_buffer_size > 0]
 	max % MyISAM key buffer ever used: %s, this value should be above 95% | round(value,1)
 
 # Don't fire if above rule fired - we don't need the same advice twice
-rule 'Percentage of MyISAM key buffer used' [key_buffer_size > 0 && !fired('max % MyISAM key buffer ever used')]
+rule 'Percentage of MyISAM key buffer used' [!PMA_DRIZZLE && key_buffer_size > 0 && !fired('max % MyISAM key buffer ever used')]
 	( 1 - Key_blocks_unused * key_cache_block_size / key_buffer_size) * 100
 	value < 95
 	MyISAM key buffer (index cache) % used is low.
 	You may need to decrease the size of {key_buffer_size}, re-examine your tables to see if indexes have been removed, or examine queries and expectations about what indexes are being used.
 	% MyISAM key buffer used: %s, this value should be above 95% | round(value,1)
 
-rule 'Percentage of index reads from memory' [Key_read_requests > 0]
+rule 'Percentage of index reads from memory' [!PMA_DRIZZLE && Key_read_requests > 0]
 	100 - (Key_reads / Key_read_requests * 100)
 	value < 95
 	The % of indexes that use the MyISAM key buffer is low.
@@ -294,21 +301,21 @@ rule 'Percentage of index reads from memory' [Key_read_requests > 0]
 
 #
 # other caches
-rule 'Rate of table open'
+rule 'Rate of table open' [!PMA_DRIZZLE]
 	Opened_tables / Uptime
 	value*60*60 > 10
 	The rate of opening tables is high.
 	Opening tables requires disk I/O which is costly. Increasing {table_open_cache} might avoid this.
 	Opened table rate: %s, this value should be less than 10 per hour | PMA_bytime(value,2)
 
-rule 'Percentage of used open files limit'
+rule 'Percentage of used open files limit' [!PMA_DRIZZLE]
 	Open_files / open_files_limit * 100
 	value > 85
 	The number of open files is approaching the max number of open files.  You may get a "Too many open files" error.
 	Consider increasing {open_files_limit}, and check the error log when restarting after changing open_files_limit.
 	The number of opened files is at %s% of the limit. It should be below 85% | round(value,1)
 
-rule 'Rate of open files'
+rule 'Rate of open files' [!PMA_DRIZZLE]
 	Open_files / Uptime
 	value * 60 * 60 > 5
 	The rate of opening files is high.
@@ -329,28 +336,28 @@ rule 'Table lock wait rate'
 	Optimize queries and/or use InnoDB to reduce lock wait.
 	Table lock wait rate: %s, this value should be less than 1 per hour | PMA_bytime(value,2)
 
-rule 'Thread cache'
+rule 'Thread cache' [!PMA_DRIZZLE]
 	thread_cache_size
 	value < 1
 	Thread cache is disabled, resulting in more overhead from new connections to MySQL.
 	Enable the thread cache by setting {thread_cache_size} > 0.
 	The thread cache is set to 0
 
-rule 'Thread cache hit rate %' [thread_cache_size > 0]
+rule 'Thread cache hit rate %' [!PMA_DRIZZLE && thread_cache_size > 0]
 	100 - Threads_created / Connections
 	value < 80
 	Thread cache is not efficient.
 	Increase {thread_cache_size}.
 	Thread cache hitrate: %s%, this value should be above 80% | round(value,1)
 
-rule 'Threads that are slow to launch' [slow_launch_time > 0]
+rule 'Threads that are slow to launch' [!PMA_DRIZZLE && slow_launch_time > 0]
 	Slow_launch_threads
 	value > 0
 	There are too many threads that are slow to launch.
 	This generally happens in case of general system overload as it is pretty simple operations. You might want to monitor your system load carefully.
 	%s thread(s) took longer than %s seconds to start, it should be 0 | value, slow_launch_time
 
-rule 'Slow launch time'
+rule 'Slow launch time' [!PMA_DRIZZLE]
 	slow_launch_time
 	value > 2
 	Slow_launch_threads is above 2s
@@ -359,7 +366,7 @@ rule 'Slow launch time'
 
 #
 #Connections
-rule 'Percentage of used connections'
+rule 'Percentage of used connections' [!PMA_DRIZZLE]
 	Max_used_connections / max_connections * 100
 	value > 80
 	The maximum amount of used connections is getting close to the value of max_connections.
@@ -396,7 +403,7 @@ rule 'Rate of aborted clients'
 
 #
 # InnoDB
-rule 'Is InnoDB disabled?'
+rule 'Is InnoDB disabled?' [!PMA_DRIZZLE]
 	have_innodb
 	value != "YES"
 	You do not have InnoDB enabled.
@@ -426,7 +433,7 @@ rule 'InnoDB buffer pool size' [system_memory > 0]
 
 #
 # other
-rule 'MyISAM concurrent inserts'
+rule 'MyISAM concurrent inserts' [!PMA_DRIZZLE]
 	concurrent_insert
 	value === 0 || value === 'NEVER'
 	Enable concurrent_insert by setting it to 1
diff --git a/libraries/blobstreaming.lib.php b/libraries/blobstreaming.lib.php
index d3827f9..cdcbb0b 100644
--- a/libraries/blobstreaming.lib.php
+++ b/libraries/blobstreaming.lib.php
@@ -26,7 +26,7 @@ function initPBMSDatabase()
                 return true;
             }
             if ($target == "") {
-                if (($current_db != 'pbxt') && ($current_db != 'mysql')  && ($current_db != 'information_schema')) {
+                if ($current_db != 'pbxt' && !PMA_is_system_schema($current_db, true)) {
                     $target = $current_db;
                 }
             }
@@ -93,33 +93,50 @@ function checkBLOBStreamingPlugins()
         $serverCfg['socket'] = "";
     }
 
-    $has_blobstreaming = false;
-    if (PMA_MYSQL_INT_VERSION >= 50109) {
+    $has_blobstreaming = PMA_cacheGet('has_blobstreaming', true);
 
-        // Retrieve MySQL plugins
-        $existing_plugins = PMA_DBI_fetch_result('SHOW PLUGINS');
+    if ($has_blobstreaming === null) {
+        if (!PMA_DRIZZLE && PMA_MYSQL_INT_VERSION >= 50109) {
 
-        foreach ($existing_plugins as $one_existing_plugin) {
-            // check if required plugins exist
-            if ( strtolower($one_existing_plugin['Library']) == 'libpbms.so'
-                && $one_existing_plugin['Status'] == "ACTIVE") {
-                $has_blobstreaming = true;
-                break;
+            // Retrieve MySQL plugins
+            $existing_plugins = PMA_DBI_fetch_result('SHOW PLUGINS');
+
+            foreach ($existing_plugins as $one_existing_plugin) {
+                // check if required plugins exist
+                if ( strtolower($one_existing_plugin['Library']) == 'libpbms.so'
+                    && $one_existing_plugin['Status'] == "ACTIVE") {
+                    $has_blobstreaming = true;
+                    break;
+                }
             }
+            unset($existing_plugins, $one_existing_plugin);
+        } else if (PMA_DRIZZLE) {
+            $has_blobstreaming = (bool)PMA_DBI_fetch_result(
+                "SELECT 1
+                FROM data_dictionary.plugins
+                WHERE module_name = 'PBMS'
+                    AND is_active = true
+                LIMIT 1");
         }
-        unset($existing_plugins, $one_existing_plugin);
+        PMA_cacheSet('has_blobstreaming', $has_blobstreaming, true);
     }
 
     // set variable indicating BS plugin existence
     $PMA_Config->set('BLOBSTREAMING_PLUGINS_EXIST', $has_blobstreaming);
 
+    if (!$has_blobstreaming) {
+        PMA_cacheSet('skip_blobstreaming', true, true);
+        return false;
+    }
+
     if ($has_blobstreaming) {
         $bs_variables = PMA_BS_GetVariables();
 
        // if no BS variables exist, set plugin existence to false and return
-        if (count($bs_variables) <= 0) {
+        if (count($bs_variables) == 0) {
             $PMA_Config->set('BLOBSTREAMING_PLUGINS_EXIST', false);
             PMA_cacheSet('skip_blobstreaming', true, true);
+            PMA_cacheSet('has_blobstreaming', false, true);
             return false;
         } // end if (count($bs_variables) <= 0)
 
@@ -137,6 +154,7 @@ function checkBLOBStreamingPlugins()
             // the pbms client lib and PHP extension to make use of blob streaming.
             $PMA_Config->set('BLOBSTREAMING_PLUGINS_EXIST', false);
             PMA_cacheSet('skip_blobstreaming', true, true);
+            PMA_cacheSet('has_blobstreaming', false, true);
             return false;
         }
 
diff --git a/libraries/build_html_for_db.lib.php b/libraries/build_html_for_db.lib.php
index 8d64549..422beff 100644
--- a/libraries/build_html_for_db.lib.php
+++ b/libraries/build_html_for_db.lib.php
@@ -79,8 +79,7 @@ function PMA_buildHtmlForDb($current, $is_superuser, $checkall, $url_query, $col
         $out .= '<td class="tool">';
         $out .= '<input type="checkbox" name="selected_dbs[]" title="' . htmlspecialchars($current['SCHEMA_NAME']) . '" value="' . htmlspecialchars($current['SCHEMA_NAME']) . '" ';
 
-        if ($current['SCHEMA_NAME'] != 'mysql'
-         && $current['SCHEMA_NAME'] != 'information_schema') {
+        if (!PMA_is_system_schema($current['SCHEMA_NAME'], true)) {
             $out .= (empty($checkall) ? '' : 'checked="checked" ') . '/>';
         } else {
             $out .= ' disabled="disabled" />';
@@ -143,7 +142,7 @@ function PMA_buildHtmlForDb($current, $is_superuser, $checkall, $url_query, $col
         }
     }
 
-    if ($is_superuser) {
+    if ($is_superuser && !PMA_DRIZZLE) {
         $out .= '<td class="tool">'
                . '<a onclick="'
                . 'if (window.parent.setDb) window.parent.setDb(\'' . PMA_jsFormat($current['SCHEMA_NAME']) . '\');'
diff --git a/libraries/check_user_privileges.lib.php b/libraries/check_user_privileges.lib.php
index 376992c..726b4a6 100644
--- a/libraries/check_user_privileges.lib.php
+++ b/libraries/check_user_privileges.lib.php
@@ -134,6 +134,15 @@ function PMA_analyseShowGrant()
     PMA_cacheSet('dbs_where_create_table_allowed', $GLOBALS['dbs_where_create_table_allowed'], true);
 } // end function
 
-PMA_analyseShowGrant();
+if (!PMA_DRIZZLE) {
+    PMA_analyseShowGrant();
+} else {
+    // todo: for simple_user_policy only database with user's login can be created (unless logged in as root)
+    $GLOBALS['is_create_db_priv'] = $GLOBALS['is_superuser'];
+    $GLOBALS['is_process_priv']   = false;
+    $GLOBALS['is_reload_priv']    = false;
+    $GLOBALS['db_to_create']      = '';
+    $GLOBALS['dbs_where_create_table_allowed'] = array('*');
+}
 
 ?>
diff --git a/libraries/common.inc.php b/libraries/common.inc.php
index d40cd7b..26e7a01 100644
--- a/libraries/common.inc.php
+++ b/libraries/common.inc.php
@@ -943,6 +943,14 @@ if (! defined('PMA_MINIMUM_COMMON')) {
             PMA_fatalError(__('You should upgrade to %s %s or later.'), array('MySQL', '5.0.15'));
         }
 
+        if (PMA_DRIZZLE) {
+            // DisableIS must be set to false for Drizzle, it maps SHOW commands
+            // to INFORMATION_SCHEMA queries anyway so it's fast on large servers
+            $cfg['Server']['DisableIS'] = false;
+            // SHOW OPEN TABLES is not supported by Drizzle
+            $cfg['SkipLockedTables'] = false;
+        }
+
         /**
          * SQL Parser code
          */
diff --git a/libraries/common.lib.php b/libraries/common.lib.php
index 0a4bd5d..11f9f32 100644
--- a/libraries/common.lib.php
+++ b/libraries/common.lib.php
@@ -718,10 +718,10 @@ function PMA_getTableList($db, $tables = null, $limit_offset = 0, $limit_count =
             // in this case.
 
             // set this because PMA_Table::countRecords() can use it
-            $tbl_is_view = PMA_Table::isView($db, $table['Name']);
+            $tbl_is_view = $table['TABLE_TYPE'] == 'VIEW';
 
-            if ($tbl_is_view || 'information_schema' == $db) {
-                $table['Rows'] = PMA_Table::countRecords($db, $table['Name']);
+            if ($tbl_is_view || PMA_is_system_schema($db)) {
+                $table['Rows'] = PMA_Table::countRecords($db, $table['Name'], false, true);
             }
         }
 
@@ -953,7 +953,7 @@ function PMA_showMessage($message, $sql_query = null, $type = 'notice', $is_view
     if (strlen($GLOBALS['table'])
         && $GLOBALS['sql_query'] == 'TRUNCATE TABLE ' . PMA_backquote($GLOBALS['table'])
     ) {
-        if (PMA_Table::sGetStatusInfo($GLOBALS['db'], $GLOBALS['table'], 'Index_length') > 1024) {
+        if (PMA_Table::sGetStatusInfo($GLOBALS['db'], $GLOBALS['table'], 'Index_length') > 1024 && !PMA_DRIZZLE) {
             PMA_DBI_try_query('REPAIR TABLE ' . PMA_backquote($GLOBALS['table']));
         }
     }
@@ -1330,6 +1330,10 @@ function PMA_profilingCheckbox($sql_query)
  */
 function PMA_formatByteDown($value, $limes = 6, $comma = 0)
 {
+    if ($value === null) {
+        return null;
+    }
+
     $byteUnits = array(
         /* l10n: shortcuts for Byte */
         __('B'),
@@ -3542,7 +3546,7 @@ function PMA_getFunctionsForField($field, $insert_mode)
         && $field['Key'] == 'PRI'
         && ($field['Type'] == 'char(36)' || $field['Type'] == 'varchar(36)')
     ) {
-         $default_function = $cfg['DefaultFunctions']['pk_char36'];
+         $default_function = $cfg['DefaultFunctions']['FUNC_UUID'];
     }
     // this is set only when appropriate and is always true
     if (isset($field['display_binary_as_hex'])) {
@@ -3682,4 +3686,24 @@ function PMA_currentUserHasPrivilege($priv, $db = null, $tbl = null)
     return false;
 }
 
+/**
+ * Returns server type for current connection
+ *
+ * Known types are: Drizzle, MariaDB and MySQL (default)
+ *
+ * @return string
+ */
+function PMA_getServerType()
+{
+    $server_type = 'MySQL';
+    if (PMA_DRIZZLE) {
+        $server_type = 'Drizzle';
+    } else if (strpos(PMA_MYSQL_STR_VERSION, 'mariadb') !== false) {
+        $server_type = 'MariaDB';
+    } else if (stripos(PMA_MYSQL_VERSION_COMMENT, 'percona') !== false) {
+        $server_type = 'Percona Server';
+    }
+    return $server_type;
+}
+
 ?>
diff --git a/libraries/config.default.php b/libraries/config.default.php
index 9dea34a..0ee64f6 100644
--- a/libraries/config.default.php
+++ b/libraries/config.default.php
@@ -427,7 +427,7 @@ $cfg['Servers'][$i]['AllowDeny']['order'] = '';
 $cfg['Servers'][$i]['AllowDeny']['rules'] = array();
 
 /**
- * Disable use of INFORMATION_SCHEMA
+ * Disable use of INFORMATION_SCHEMA. Is always 'true' for Drizzle.
  *
  * @see http://sf.net/support/tracker.php?aid=1849494
  * @see http://bugs.mysql.com/19588
@@ -616,6 +616,7 @@ $cfg['MemoryLimit'] = '0';
 
 /**
  * mark used tables, make possible to show locked tables (since MySQL 3.23.30)
+ * Is ignored for Drizzle.
  *
  * @global boolean $cfg['SkipLockedTables']
  */
@@ -2806,9 +2807,9 @@ if ($cfg['ShowFunctionFields']) {
         'FUNC_CHAR' => '',
         'FUNC_DATE' => '',
         'FUNC_NUMBER' => '',
-        'FUNC_SPATIAL' => 'GeomFromText',
+		'FUNC_SPATIAL' => 'GeomFromText',
+        'FUNC_UUID' => 'UUID',
         'first_timestamp' => 'NOW',
-        'pk_char36' => 'UUID',
     );
 } // end if
 
diff --git a/libraries/config/validate.lib.php b/libraries/config/validate.lib.php
index 2b60725..989b324 100644
--- a/libraries/config/validate.lib.php
+++ b/libraries/config/validate.lib.php
@@ -175,7 +175,7 @@ function test_php_errormsg($start = true)
 /**
  * Test database connection
  *
- * @param string $extension     'mysql' or 'mysqli'
+ * @param string $extension     'drizzle', 'mysql' or 'mysqli'
  * @param string $connect_type  'tcp' or 'socket'
  * @param string $host
  * @param string $port
@@ -191,7 +191,33 @@ function test_db_connection($extension, $connect_type, $host, $port, $socket, $u
     $socket = empty($socket) || $connect_type == 'tcp' ? null : $socket;
     $port = empty($port) || $connect_type == 'socket' ? null : ':' . $port;
     $error = null;
-    if ($extension == 'mysql') {
+    if ($extension == 'drizzle') {
+        while (1) {
+            $drizzle = @drizzle_create();
+            if (!$drizzle) {
+                $error = __('Could not initialize Drizzle connection library');
+                break;
+            }
+            $conn = $socket
+                ? @drizzle_con_add_uds($socket, $user, $pass, null, 0)
+                : @drizzle_con_add_tcp($drizzle, $host, $port, $user, $pass, null, 0);
+            if (!$conn) {
+                $error = __('Could not connect to Drizzle server');
+                drizzle_free($drizzle);
+                break;
+            }
+            // connection object is set up but we have to send some query to actually connect
+            $res = @drizzle_query($conn, 'SELECT 1');
+            if (!$res) {
+                $error = __('Could not connect to Drizzle server');
+            } else {
+                drizzle_result_free($res);
+            }
+            drizzle_con_free($conn);
+            drizzle_free($drizzle);
+            break;
+        }
+    } else if ($extension == 'mysql') {
         $conn = @mysql_connect($host . $socket . $port, $user, $pass);
         if (!$conn) {
             $error = __('Could not connect to MySQL server');
diff --git a/libraries/data_dictionary_relations.lib.php b/libraries/data_dictionary_relations.lib.php
new file mode 100644
index 0000000..51e9dcc
--- /dev/null
+++ b/libraries/data_dictionary_relations.lib.php
@@ -0,0 +1,163 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ *
+ * @package phpMyAdmin
+ */
+
+/**
+ *
+ */
+$GLOBALS['data_dictionary_relations'] = array(
+    'CHARACTER_SETS' => array(
+        'DEFAULT_COLLATE_NAME' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'COLLATIONS',
+            'foreign_field' => 'COLLATION_NAME'
+        )
+    ),
+    'COLLATIONS' => array(
+        'CHARACTER_SET_NAME' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'CHARACTER_SETS',
+            'foreign_field' => 'CHARACTER_SET_NAME'
+        )
+    ),
+    'COLUMNS' => array(
+        'TABLE_SCHEMA' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'SCHEMAS',
+            'foreign_field' => 'SCHEMA_NAME'
+        ),
+        'COLLATION_NAME' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'COLLATIONS',
+            'foreign_field' => 'COLLATION_NAME'
+        )
+    ),
+    'INDEXES' => array(
+        'TABLE_SCHEMA' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'SCHEMAS',
+            'foreign_field' => 'SCHEMA_NAME'
+        )
+    ),
+    'INDEX_PARTS' => array(
+        'TABLE_SCHEMA' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'SCHEMAS',
+            'foreign_field' => 'SCHEMA_NAME'
+        )
+    ),
+    'INNODB_LOCKS' => array(
+        'LOCK_TRX_ID' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'INNODB_TRX',
+            'foreign_field' => 'TRX_ID'
+        )
+    ),
+    'INNODB_LOCK_WAITS' => array(
+        'REQUESTING_TRX_ID' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'INNODB_TRX',
+            'foreign_field' => 'TRX_ID'
+        ),
+        'REQUESTED_LOCK_ID' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'INNODB_LOCKS',
+            'foreign_field' => 'LOCK_ID'
+        ),
+        'BLOCKING_TRX_ID' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'INNODB_TRX',
+            'foreign_field' => 'TRX_ID'
+        ),
+        'BLOCKING_LOCK_ID' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'INNODB_LOCKS',
+            'foreign_field' => 'LOCK_ID'
+        )
+    ),
+    'INNODB_SYS_COLUMNS' => array(
+        'TABLE_ID' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'INNODB_SYS_TABLES',
+            'foreign_field' => 'TABLE_ID'
+        )
+    ),
+    'INNODB_SYS_FIELDS' => array(
+        'INDEX_ID' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'INNODB_SYS_INDEXES',
+            'foreign_field' => 'INDEX_ID'
+        )
+    ),
+    'INNODB_SYS_INDEXES' => array(
+        'TABLE_ID' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'INNODB_SYS_TABLES',
+            'foreign_field' => 'TABLE_ID'
+        )
+    ),
+    'INNODB_SYS_TABLESTATS' => array(
+        'TABLE_ID' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'INNODB_SYS_TABLES',
+            'foreign_field' => 'TABLE_ID'
+        )
+    ),
+    'PLUGINS' => array(
+        'MODULE_NAME' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'MODULES',
+            'foreign_field' => 'MODULE_NAME'
+        )
+    ),
+    'SCHEMAS' => array(
+        'DEFAULT_COLLATION_NAME' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'COLLATIONS',
+            'foreign_field' => 'COLLATION_NAME'
+        )
+    ),
+    'TABLES' => array(
+        'TABLE_SCHEMA' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'SCHEMAS',
+            'foreign_field' => 'SCHEMA_NAME'
+        ),
+        'TABLE_COLLATION' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'COLLATIONS',
+            'foreign_field' => 'COLLATION_NAME'
+        )
+    ),
+    'TABLE_CACHE' => array(
+        'TABLE_SCHEMA' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'SCHEMAS',
+            'foreign_field' => 'SCHEMA_NAME'
+        )
+    ),
+    'TABLE_CONSTRAINTS' => array(
+        'CONSTRAINT_SCHEMA' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'SCHEMAS',
+            'foreign_field' => 'SCHEMA_NAME'
+        ),
+        'TABLE_SCHEMA' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'SCHEMAS',
+            'foreign_field' => 'SCHEMA_NAME'
+        )
+    ),
+    'TABLE_DEFINITION_CACHE' => array(
+        'TABLE_SCHEMA' => array(
+            'foreign_db'    => 'data_dictionary',
+            'foreign_table' => 'SCHEMAS',
+            'foreign_field' => 'SCHEMA_NAME'
+        )
+    )
+);
+
+?>
\ No newline at end of file
diff --git a/libraries/data_mysql.inc.php b/libraries/data_drizzle.inc.php
similarity index 62%
copy from libraries/data_mysql.inc.php
copy to libraries/data_drizzle.inc.php
index d504d15..907aac7 100644
--- a/libraries/data_mysql.inc.php
+++ b/libraries/data_drizzle.inc.php
@@ -8,27 +8,22 @@
 // VARCHAR, TINYINT, TEXT and DATE are listed first, based on estimated popularity
 $cfg['ColumnTypes'] = !empty($cfg['ColumnTypes']) ? $cfg['ColumnTypes'] : array(
     // most used
-    'INT',
+    'INTEGER',
     'VARCHAR',
     'TEXT',
     'DATE',
 
     // numeric
     'NUMERIC' => array(
-        'TINYINT',
-        'SMALLINT',
-        'MEDIUMINT',
-        'INT',
+        'INTEGER',
         'BIGINT',
         '-',
         'DECIMAL',
-        'FLOAT',
         'DOUBLE',
-        'REAL',
         '-',
-        'BIT',
         'BOOLEAN',
         'SERIAL',
+        'UUID',
     ),
 
 
@@ -38,63 +33,29 @@ $cfg['ColumnTypes'] = !empty($cfg['ColumnTypes']) ? $cfg['ColumnTypes'] : array(
         'DATETIME',
         'TIMESTAMP',
         'TIME',
-        'YEAR',
     ),
 
     // Text
     'STRING' => array(
-        'CHAR',
         'VARCHAR',
-        '-',
-        'TINYTEXT',
         'TEXT',
-        'MEDIUMTEXT',
-        'LONGTEXT',
-        '-',
-        'BINARY',
         'VARBINARY',
-        '-',
-        'TINYBLOB',
-        'MEDIUMBLOB',
         'BLOB',
-        'LONGBLOB',
-        '-',
         'ENUM',
-        'SET',
-    ),
-
-    'SPATIAL' => array(
-        'GEOMETRY',
-        'POINT',
-        'LINESTRING',
-        'POLYGON',
-        'MULTIPOINT',
-        'MULTILINESTRING',
-        'MULTIPOLYGON',
-        'GEOMETRYCOLLECTION',
     ),
 );
 
 $cfg['AttributeTypes'] = !empty($cfg['AttributeTypes']) ? $cfg['AttributeTypes'] : array(
    '',
-   'BINARY',
-   'UNSIGNED',
-   'UNSIGNED ZEROFILL',
    'on update CURRENT_TIMESTAMP',
 );
 
 if ($cfg['ShowFunctionFields']) {
     $cfg['RestrictColumnTypes'] = !empty($cfg['RestrictColumnTypes']) ? $cfg['RestrictColumnTypes'] : array(
-        'TINYINT'   => 'FUNC_NUMBER',
-        'SMALLINT'  => 'FUNC_NUMBER',
-        'MEDIUMINT' => 'FUNC_NUMBER',
-        'INT'       => 'FUNC_NUMBER',
+        'INTEGER'   => 'FUNC_NUMBER',
         'BIGINT'    => 'FUNC_NUMBER',
         'DECIMAL'   => 'FUNC_NUMBER',
-        'FLOAT'     => 'FUNC_NUMBER',
         'DOUBLE'    => 'FUNC_NUMBER',
-        'REAL'      => 'FUNC_NUMBER',
-        'BIT'       => 'FUNC_NUMBER',
         'BOOLEAN'   => 'FUNC_NUMBER',
         'SERIAL'    => 'FUNC_NUMBER',
 
@@ -102,32 +63,13 @@ if ($cfg['ShowFunctionFields']) {
         'DATETIME'  => 'FUNC_DATE',
         'TIMESTAMP' => 'FUNC_DATE',
         'TIME'      => 'FUNC_DATE',
-        'YEAR'      => 'FUNC_DATE',
 
-        'CHAR'       => 'FUNC_CHAR',
         'VARCHAR'    => 'FUNC_CHAR',
-        'TINYTEXT'   => 'FUNC_CHAR',
         'TEXT'       => 'FUNC_CHAR',
-        'MEDIUMTEXT' => 'FUNC_CHAR',
-        'LONGTEXT'   => 'FUNC_CHAR',
-        'BINARY'     => 'FUNC_CHAR',
         'VARBINARY'  => 'FUNC_CHAR',
-        'TINYBLOB'   => 'FUNC_CHAR',
-        'MEDIUMBLOB' => 'FUNC_CHAR',
         'BLOB'       => 'FUNC_CHAR',
-        'LONGBLOB'   => 'FUNC_CHAR',
+        'UUID'       => 'FUNC_UUID',
         'ENUM'       => '',
-        'SET'        => '',
-
-        'GEOMETRY'           => 'FUNC_SPATIAL',
-        'POINT'              => 'FUNC_SPATIAL',
-        'LINESTRING'         => 'FUNC_SPATIAL',
-        'POLYGON'            => 'FUNC_SPATIAL',
-        'MULTIPOINT'         => 'FUNC_SPATIAL',
-        'MULTILINESTRING'    => 'FUNC_SPATIAL',
-        'MULTIPOLYGON'       => 'FUNC_SPATIAL',
-        'GEOMETRYCOLLECTION' => 'FUNC_SPATIAL',
-
     );
 
     $restrict_functions = array(
@@ -138,23 +80,15 @@ if ($cfg['ShowFunctionFields']) {
             'COMPRESS',
             'DATABASE',
             'DAYNAME',
-            'DES_DECRYPT',
-            'DES_ENCRYPT',
-            'ENCRYPT',
             'HEX',
-            'INET_NTOA',
             'LOAD_FILE',
             'LOWER',
             'LTRIM',
             'MD5',
             'MONTHNAME',
-            'OLD_PASSWORD',
-            'PASSWORD',
             'QUOTE',
             'REVERSE',
             'RTRIM',
-            'SHA1',
-            'SOUNDEX',
             'SPACE',
             'TRIM',
             'UNCOMPRESS',
@@ -165,17 +99,20 @@ if ($cfg['ShowFunctionFields']) {
             'VERSION',
         ),
 
+        'FUNC_UUID' => array(
+            'UUID',
+        ),
+
         'FUNC_DATE' => arr y(  howFunctionFields']) {  ColumnTypes']) ? $cfg['RestrictColumnTypes'] : array(  E) {   '" value="' . htmlspecialchars($current['SCHEMA_NAME']) . '" ';  used.  alue,1)  short lived fix you can flush the query cache (might lock the query cache for a long time). Carefully adjusting {query_cache_min_res_unit} to a lower value might help too, e.g. you can set it to the average size of your queries in the cache using this formula: (query_cache_size - qcache_free_memory) / qcache_queries_in_cache  à!     @d‡âÿ  °d‡âÿ  HÞjrI+          €[‡âÿ         ’BnqI+          †`nqI+  @d‡âÿ  `BnqI+  d‡âÿ  pd‡âÿ  hd‡âÿ  8kqI+  Œp˜        °d‡âÿ  uJnqI+  €joqI+                  €[‡âÿ         PZ‡âÿ  k`nqI+          G       H   I       J   K           M   N   O       P   @d‡âÿ  °d‡âÿ  H•ArI+           ]‡âÿ         ’BnqI+          †`nqI+  @d‡âÿ         0ïrI+  uJnqI+    ‹rI+   ÉrI+    ïrI+  ØïrI+  ¨	ïrI+  €joqI+          H•ArI+           ]‡âÿ         `[‡âÿ  k`nqI+  8•ArI+           ]‡âÿ         [‡âÿ  k`nqI+  (•ArI+           ]‡âÿ         À[‡âÿ  k`nqI+  •ArI+           ]‡âÿ         ð[‡âÿ  k`nqI+  	       ¨ïrI+  uJnqI+         ¨	ïrI+  pV‡âÿ          ŠrI+  eInqI+         ØïrI+  \‡âÿ          yrI+  eInqI+           ïrI+  À\‡âÿ          ZrI+  eInqI+  ØÄrI+    ‹rI+   ÉrI+    ïrI+  Ø$‹rI+  ØïrI+  ¨	ïrI+  €joqI+          8kqI+                        êqI+  °d‡âÿ  p[rI+          p^‡âÿ          @]‡âÿ  k`nqI+      5   6   7   8   :   <   =   >       ?       @   B   D       @d‡âÿ  °d‡âÿ  àçqI+                 °d‡âÿ  uJnqI+         eqI+  ð\‡âÿ          êqI+  eInqI+  eqI+          Õ_ at fÆS         Qöl±íÁ£¶qI+  °d‡âÿ  àçqI+          €_‡âÿ         P^‡âÿ  k`nqI+  u]ÞÓ	4Q ÷U^Qʉ§ ¶uª¹ñìò*Ä“v@d‡âÿ  °d‡âÿ  HÞ³qI+          $ðqI+          ðe‡âÿ  ¦0RsI+  ¦0RsI+         víqI+  d‡âÿ  °e‡âÿ  hd‡âÿ  Ð`‡âÿ  /‹rI+  uJnqI+  Ø$‹rI+  0g‡âÿ  ¢0RsI+   f‡âÿ          a‡âÿ                 ÿÿÿÿÿÿÿÿ¢0RsI+          ¸d‡âÿ                 ay(
-            'CURDATE',
-            'CURTIME',
+            'CURRENT_DATE',
+            'CURRENT_TIME',
             'DATE',
             'FROM_DAYS',
             'FROM_UNIXTIME',
             'LAST_DAY',
             'NOW',
-            'SEC_TO_TIME',
             'SYSDATE',
-            'TIME',
+            //'TIME', // https://bugs.launchpad.net/drizzle/+bug/804571
             'TIMESTAMP',
             'UTC_DATE',
             'UTC_TIME',
@@ -189,7 +126,6 @@ if ($cfg['ShowFunctionFields']) {
             'ASCII',
             'ASIN',
             'ATAN',
-            'BIT_LENGTH',
             'BIT_COUNT',
             'CEILING',
             'CHAR_LENGTH',
@@ -204,7 +140,6 @@ if ($cfg['ShowFunctionFields']) {
             'EXP',
             'FLOOR',
             'HOUR',
-            'INET_ATON',
             'LENGTH',
             'LN',
             'LOG',
@@ -226,12 +161,10 @@ if ($cfg['ShowFunctionFields']) {
             'SQRT',
             'TAN',
             'TO_DAYS',
-            'TO_SECONDS',
             'TIME_TO_SEC',
             'UNCOMPRESSED_LENGTH',
             'UNIX_TIMESTAMP',
-            'UUID_SHORT',
-            'WEEK',
+            //'WEEK', // same as TIME
             'WEEKDAY',
             'WEEKOFYEAR',
             'YEARWEEK',
@@ -258,15 +191,8 @@ if ($cfg['ShowFunctionFields']) {
             'MPolyFromWKB',
         ),
     );
-    // $restrict_functions holds all known functions, remove these that are unavailable on current server
-    if (PMA_MYSQL_INT_VERSION < 50500) {
-        $restrict_functions['FUNC_NUMBER'] = array_diff($restrict_functions['FUNC_NUMBER'], array('TO_SECONDS'));
-    }
-    if (PMA_MYSQL_INT_VERSION < 50120) {
-        $restrict_functions['FUNC_NUMBER'] = array_diff($restrict_functions['FUNC_NUMBER'], array('UUID_SHORT'));
-    }
-
-    if (empty($cfg['RestrictFunctions'])) {
+    $cfg_default_restrict_funcs = empty($cfg['RestrictFunctions']);
+    if ($cfg_default_restrict_funcs) {
         $cfg['RestrictFunctions'] = $restrict_functions;
     }
 
@@ -274,10 +200,33 @@ if ($cfg['ShowFunctionFields']) {
         // build a list of functions based on $restrict_functions
         $cfg['Functions'] = array();
         foreach ($restrict_functions as $cat => $functions) {
-            if ($cat != 'FUNC_SPATIAL') {
-                $cfg['Functions'] = array_merge($cfg['Functions'], $functions);
+            $cfg['Functions'] = array_merge($cfg['Functions'], $functions);
+        }
+
+        // check for some functions known to be in modules
+        $functions = array(
+            'MYSQL_PASSWORD' => 'FUNC_CHAR',
+            'ROT13' => 'FUNC_CHAR',
+        );
+        // add new functions
+        $sql = "SELECT upper(plugin_name) f
+            FROM data_dictionary.plugins
+            WHERE plugin_name IN ('" . implode("','", array_keys($functions)) . "')
+              AND plugin_type = 'Function'
+              AND is_active";
+        $drizzle_functions = PMA_DBI_fetch_result($sql, 'f', 'f');
+        $cfg['Functions'] = array_merge($cfg['Functions'], $drizzle_functions);
+        if ($cfg_default_restrict_funcs) {
+            foreach ($drizzle_functions as $function) {
+                $category = $functions[$function];
+                $cfg['RestrictFunctions'][$category][] = $function;
             }
+            foreach ($cfg['RestrictFunctions'] as &$v) {
+                sort($v);
+            }
+            unset($v);
         }
+
         sort($cfg['Functions']);
     }
     unset($restrict_functions);
diff --git a/libraries/data_mysql.inc.php b/libraries/data_mysql.inc.php
index d504d15..2571475 100644
--- a/libraries/data_mysql.inc.php
+++ b/libraries/data_mysql.inc.php
@@ -166,8 +166,8 @@ if ($cfg['ShowFunctionFields']) {
         ),
 
         'FUNC_DATE' => array(
-            'CURDATE',
-            'CURTIME',
+            'CURRENT_DATE',
+            'CURRENT_TIME',
             'DATE',
             'FROM_DAYS',
             'FROM_UNIXTIME',
diff --git a/libraries/database_interface.lib.php b/libraries/database_interface.lib.php
index 11823f7..c346111 100644
--- a/libraries/database_interface.lib.php
+++ b/libraries/database_interface.lib.php
@@ -20,24 +20,26 @@ define('PMA_DBI_GETVAR_SESSION',    1);
 define('PMA_DBI_GETVAR_GLOBAL',     2);
 
 /**
- * Checks one of the mysql extensions
+ * Checks whether database extension is loaded
  *
  * @param string  $extension  mysql extension to check
  * @return bool
  */
-function PMA_DBI_checkMysqlExtension($extension = 'mysql')
+function PMA_DBI_checkDbExtension($extension = 'mysql')
 {
-    if (! function_exists($extension . '_connect')) {
-        return false;
+    if ($extension == 'drizzle' && function_exists('drizzle_create')) {
+        return true;
+    } else if (function_exists($extension . '_connect')) {
+        return true;
     }
 
-    return true;
+    return false;
 }
 
 /**
  * check for requested extension
  */
-if (! PMA_DBI_checkMysqlExtension($GLOBALS['cfg']['Server']['extension'])) {
+if (! PMA_DBI_checkDbExtension($GLOBALS['cfg']['Server']['extension'])) {
 
     // if it fails try alternative extension ...
     // and display an error ...
@@ -54,7 +56,7 @@ if (! PMA_DBI_checkMysqlExtension($GLOBALS['cfg']['Server']['extension'])) {
         $alternativ_extension = 'mysql';
     }
 
-    if (! PMA_DBI_checkMysqlExtension($alternativ_extension)) {
+    if (! PMA_DBI_checkDbExtension($alternativ_extension)) {
         // if alternative fails too ...
         PMA_warnMissingExtension($GLOBALS['cfg']['Server']['extension'], true, PMA_showDocu('faqmysql'));
     }
@@ -122,6 +124,9 @@ function PMA_DBI_try_query($query, $link = null, $options = 0, $cache_affected_r
             $_SESSION['debug']['queries'][$hash]['count']++;
         } else {
             $_SESSION['debug']['queries'][$hash] = array();
+            if ($r == false) {
+                $_SESSION['debug']['queries'][$hash]['error'] = '<b style="color:red">'.mysqli_error($link).'</b>';
+            }
             $_SESSION['debug']['queries'][$hash]['count'] = 1;
             $_SESSION['debug']['queries'][$hash]['query'] = $query;
             $_SESSION['debug']['queries'][$hash]['time'] = $time;
@@ -312,13 +317,13 @@ function PMA_DBI_get_tables_full($database, $table = false, $tbl_is_group = fals
         // get table information from information_schema
         if ($table) {
             if (true === $tbl_is_group) {
-                $sql_where_table = 'AND `TABLE_NAME` LIKE \''
+                $sql_where_table = 'AND t.`TABLE_NAME` LIKE \''
                   . PMA_escape_mysql_wildcards(PMA_sqlAddSlashes($table)) . '%\'';
             } elseif ('comment' === $tbl_is_group) {
-                $sql_where_table = 'AND `TABLE_COMMENT` LIKE \''
+                $sql_where_table = 'AND t.`TABLE_COMMENT` LIKE \''
                   . PMA_escape_mysql_wildcards(PMA_sqlAddSlashes($table)) . '%\'';
             } else {
-                $sql_where_table = 'AND `TABLE_NAME` = \'' . PMA_sqlAddSlashes($table) . '\'';
+                $sql_where_table = 'AND t.`TABLE_NAME` = \'' . PMA_sqlAddSlashes($table) . '\'';
             }
         } else {
             $sql_where_table = '';
@@ -333,32 +338,75 @@ function PMA_DBI_get_tables_full($database, $table = false, $tbl_is_group = fals
         // to find the db aa)
         $this_databases = array_map('PMA_sqlAddSlashes', $databases);
 
-        $sql = '
-           SELECT *,
-                  `TABLE_SCHEMA`       AS `Db`,
-                  `TABLE_NAME`         AS `Name`,
-                  `TABLE_TYPE`         AS `TABLE_TYPE`,
-                  `ENGINE`             AS `Engine`,
-                  `ENGINE`             AS `Type`,
-                  `VERSION`            AS `Version`,
-                  `ROW_FORMAT`         AS `Row_format`,
-                  `TABLE_ROWS`         AS `Rows`,
-                  `AVG_ROW_LENGTH`     AS `Avg_row_length`,
-                  `DATA_LENGTH`        AS `Data_length`,
-                  `MAX_DATA_LENGTH`    AS `Max_data_length`,
-                  `INDEX_LENGTH`       AS `Index_length`,
-                  `DATA_FREE`          AS `Data_free`,
-                  `AUTO_INCREMENT`     AS `Auto_increment`,
-                  `CREATE_TIME`        AS `Create_time`,
-                  `UPDATE_TIME`        AS `Update_time`,
-                  `CHECK_TIME`         AS `Check_time`,
-                  `TABLE_COLLATION`    AS `Collation`,
-                  `CHECKSUM`           AS `Checksum`,
-                  `CREATE_OPTIONS`     AS `Create_options`,
-                  `TABLE_COMMENT`      AS `Comment`
-             FROM `information_schema`.`TABLES`
-            WHERE ' . (PMA_IS_WINDOWS ? '' : 'BINARY') . ' `TABLE_SCHEMA` IN (\'' . implode("', '", $this_databases) . '\')
-              ' . $sql_where_table;
+        if (PMA_DRIZZLE) {
+            $engine_info = PMA_cacheGet('drizzle_engines', true);
+            $stats_join = "LEFT JOIN (SELECT 0 NUM_ROWS) AS stat ON false";
+            if (isset($engine_info['InnoDB']) && $engine_info['InnoDB']['module_library'] == 'innobase') {
+                $stats_join = "LEFT JOIN data_dictionary.INNODB_SYS_TABLESTATS stat ON (t.ENGINE = 'InnoDB' AND stat.NAME = (t.TABLE_SCHEMA || '/') || t.TABLE_NAME)";
+            }
+
+            // data_dictionary.table_cache may not contain any data for some tables, it's just a table cache
+            // auto_increment == 0 is cast to NULL because currently (2011.03.13 GA) Drizzle doesn't provide correct value
+            $sql = "
+                SELECT t.*,
+                    t.TABLE_SCHEMA        AS `Db`,
+                    t.TABLE_NAME          AS `Name`,
+                    t.TABLE_TYPE          AS `TABLE_TYPE`,
+                    t.ENGINE              AS `Engine`,
+                    t.ENGINE              AS `Type`,
+                    t.TABLE_VERSION       AS `Version`,-- VERSION
+                    t.ROW_FORMAT          AS `Row_format`,
+                    coalesce(tc.ROWS, stat.NUM_ROWS)
+                                          AS `Rows`,-- TABLE_ROWS,
+                    coalesce(tc.ROWS, stat.NUM_ROWS)
+                                          AS `TABLE_ROWS`,
+                    tc.AVG_ROW_LENGTH     AS `Avg_row_length`, -- AVG_ROW_LENGTH
+                    tc.TABLE_SIZE         AS `Data_length`, -- DATA_LENGTH
+                    NULL                  AS `Max_data_length`, -- MAX_DATA_LENGTH
+                    NULL                  AS `Index_length`, -- INDEX_LENGTH
+                    NULL                  AS `Data_free`, -- DATA_FREE
+                    nullif(t.AUTO_INCREMENT, 0)
+                                          AS `Auto_increment`,
+                    t.TABLE_CREATION_TIME AS `Create_time`, -- CREATE_TIME
+                    t.TABLE_UPDATE_TIME   AS `Update_time`, -- UPDATE_TIME
+                    NULL                  AS `Check_time`, -- CHECK_TIME
+                    t.TABLE_COLLATION     AS `Collation`,
+                    NULL                  AS `Checksum`, -- CHECKSUM
+                    NULL                  AS `Create_options`, -- CREATE_OPTIONS
+                    t.TABLE_COMMENT       AS `Comment`
+                FROM data_dictionary.TABLES t
+                    LEFT JOIN data_dictionary.TABLE_CACHE tc ON tc.TABLE_SCHEMA = t.TABLE_SCHEMA AND tc.TABLE_NAME = t.TABLE_NAME
+                    $stats_join
+                WHERE t.TABLE_SCHEMA IN ('" . implode("', '", $this_databases) . "')
+                    " . $sql_where_table;
+        } else {
+            $sql = '
+                SELECT *,
+                    `TABLE_SCHEMA`       AS `Db`,
+                    `TABLE_NAME`         AS `Name`,
+                    `TABLE_TYPE`         AS `TABLE_TYPE`,
+                    `ENGINE`             AS `Engine`,
+                    `ENGINE`             AS `Type`,
+                    `VERSION`            AS `Version`,
+                    `ROW_FORMAT`         AS `Row_format`,
+                    `TABLE_ROWS`         AS `Rows`,
+                    `AVG_ROW_LENGTH`     AS `Avg_row_length`,
+                    `DATA_LENGTH`        AS `Data_length`,
+                    `MAX_DATA_LENGTH`    AS `Max_data_length`,
+                    `INDEX_LENGTH`       AS `Index_length`,
+                    `DATA_FREE`          AS `Data_free`,
+                    `AUTO_INCREMENT`     AS `Auto_increment`,
+                    `CREATE_TIME`        AS `Create_time`,
+                    `UPDATE_TIME`        AS `Update_time`,
+                    `CHECK_TIME`         AS `Check_time`,
+                    `TABLE_COLLATION`    AS `Collation`,
+                    `CHECKSUM`           AS `Checksum`,
+                    `CREATE_OPTIONS`     AS `Create_options`,
+                    `TABLE_COMMENT`      AS `Comment`
+                FROM `information_schema`.`TABLES` t
+                WHERE ' . (PMA_IS_WINDOWS ? '' : 'BINARY') . ' `TABLE_SCHEMA` IN (\'' . implode("', '", $this_databases) . '\')
+                    ' . $sql_where_table;
+        }
 
         // Sort the tables
         $sql .= " ORDER BY $sort_by $sort_order";
@@ -370,6 +418,19 @@ function PMA_DBI_get_tables_full($database, $table = false, $tbl_is_group = fals
         $tables = PMA_DBI_fetch_result($sql, array('TABLE_SCHEMA', 'TABLE_NAME'),
           null, $link);
         unset($sql_where_table, $sql);
+
+        if (PMA_DRIZZLE) {
+            // correct I_S and D_D names returned by D_D.TABLES - Drizzle generally uses lower case for them,
+            // but TABLES returns uppercase
+            foreach ((array)$database as $db) {
+                $db_upper = strtoupper($db);
+                if (!isset($tables[$db]) && isset($tables[$db_upper])) {
+                    $tables[$db] = $tables[$db_upper];
+                    unset($tables[$db_upper]);
+                }
+            }
+        }
+
         if ($sort_by == 'Name' && $GLOBALS['cfg']['NaturalOrder']) {
             // here, the array's first key is by schema name
             foreach ($tables as $one_database_name => $one_database_tables) {
@@ -386,7 +447,7 @@ function PMA_DBI_get_tables_full($database, $table = false, $tbl_is_group = fals
     // If permissions are wrong on even one database directory,
     // information_schema does not return any table info for any database
     // this is why we fall back to SHOW TABLE STATUS even for MySQL >= 50002
-    if (empty($tables)) {
+    if (empty($tables) && !PMA_DRIZZLE) {
         foreach ($databases as $each_database) {
             if ($table || (true === $tbl_is_group)) {
                 $sql = 'SHOW TABLE STATUS FROM '
@@ -523,6 +584,14 @@ function PMA_DBI_get_tables_full($database, $table = false, $tbl_is_group = fals
             // http://sf.net/support/tracker.php?aid=1436171
             return $tables[strtolower($database)];
         } else {
+            // one database but inexact letter case match
+            // as Drizzle is always case insensitive, we can safely return the only result
+            if (PMA_DRIZZLE && count($tables) == 1) {
+                $keys = array_keys($tables);
+                if (strlen(array_pop($keys)) == strlen($database)) {
+                    return array_pop($tables);
+                }
+            }
             return $tables;
         }
     } else {
@@ -580,41 +649,63 @@ function PMA_DBI_get_databases_full($database = null, $force_stats = false,
             $sql_where_schema = '';
         }
 
-        // for PMA bc:
-        // `SCHEMA_FIELD_NAME` AS `SHOW_TABLE_STATUS_FIELD_NAME`
-        $sql = '
-             SELECT `information_schema`.`SCHEMATA`.*';
-        if ($force_stats) {
-            $sql .= ',
-                    COUNT(`information_schema`.`TABLES`.`TABLE_SCHEMA`)
-                        AS `SCHEMA_TABLES`,
-                    SUM(`information_schema`.`TABLES`.`TABLE_ROWS`)
-                        AS `SCHEMA_TABLE_ROWS`,
-                    SUM(`information_schema`.`TABLES`.`DATA_LENGTH`)
-                        AS `SCHEMA_DATA_LENGTH`,
-                    SUM(`information_schema`.`TABLES`.`MAX_DATA_LENGTH`)
-                        AS `SCHEMA_MAX_DATA_LENGTH`,
-                    SUM(`information_schema`.`TABLES`.`INDEX_LENGTH`)
-                        AS `SCHEMA_INDEX_LENGTH`,
-                    SUM(`information_schema`.`TABLES`.`DATA_LENGTH`
-                      + `information_schema`.`TABLES`.`INDEX_LENGTH`)
-                        AS `SCHEMA_LENGTH`,
-                    SUM(`information_schema`.`TABLES`.`DATA_FREE`)
-                        AS `SCHEMA_DATA_FREE`';
-        }
-        $sql .= '
-               FROM `information_schema`.`SCHEMATA`';
-        if ($force_stats) {
+        if (PMA_DRIZZLE) {
+            // data_dictionary.table_cache may not contain any data for some tables, it's just a table cache
+            $sql = 'SELECT
+                s.SCHEMA_NAME,
+                s.DEFAULT_COLLATION_NAME';
+            if ($force_stats) {
+                // no TABLE_CACHE data, stable results are better than constantly changing
+                $sql .= ',
+                    COUNT(t.TABLE_SCHEMA) AS SCHEMA_TABLES,
+                    SUM(stat.NUM_ROWS)    AS SCHEMA_TABLE_ROWS';
+            }
             $sql .= '
-          LEFT JOIN `information_schema`.`TABLES`
-                 ON BINARY `information_schema`.`TABLES`.`TABLE_SCHEMA`
-                  = BINARY `information_schema`.`SCHEMATA`.`SCHEMA_NAME`';
+                   FROM data_dictionary.SCHEMAS s';
+            if ($force_stats) {
+                $engine_info = PMA_cacheGet('drizzle_engines', true);
+                $stats_join = "LEFT JOIN (SELECT 0 NUM_ROWS) AS stat ON false";
+                if (isset($engine_info['InnoDB']) && $engine_info['InnoDB']['module_library'] == 'innobase') {
+                    $stats_join = "LEFT JOIN data_dictionary.INNODB_SYS_TABLESTATS stat ON (t.ENGINE = 'InnoDB' AND stat.NAME = (t.TABLE_SCHEMA || '/') || t.TABLE_NAME)";
+                }
+
+                $sql .= "
+                    LEFT JOIN data_dictionary.TABLES t
+                        ON t.TABLE_SCHEMA = s.SCHEMA_NAME
+                    $stats_join";
+            }
+            $sql .= $sql_where_schema . '
+                    GROUP BY s.SCHEMA_NAME
+                    ORDER BY ' . PMA_backquote($sort_by) . ' ' . $sort_order
+                . $limit;
+        } else {
+            $sql = 'SELECT
+                s.SCHEMA_NAME,
+                s.DEFAULT_COLLATION_NAME';
+            if ($force_stats) {
+                $sql .= ',
+                    COUNT(t.TABLE_SCHEMA)  AS SCHEMA_TABLES,
+                    SUM(t.TABLE_ROWS)      AS SCHEMA_TABLE_ROWS,
+                    SUM(t.DATA_LENGTH)     AS SCHEMA_DATA_LENGTH,
+                    SUM(t.MAX_DATA_LENGTH) AS SCHEMA_MAX_DATA_LENGTH,
+                    SUM(t.INDEX_LENGTH)    AS SCHEMA_INDEX_LENGTH,
+                    SUM(t.DATA_LENGTH + t.INDEX_LENGTH)
+                                           AS SCHEMA_LENGTH,
+                    SUM(t.DATA_FREE)       AS SCHEMA_DATA_FREE';
+            }
+            $sql .= '
+                   FROM `information_schema`.SCHEMATA s';
+            if ($force_stats) {
+                $sql .= '
+                    LEFT JOIN `information_schema`.TABLES t
+                        ON BINARY t.TABLE_SCHEMA = BINARY s.SCHEMA_NAME';
+            }
+            $sql .= $sql_where_schema . '
+                    GROUP BY BINARY s.SCHEMA_NAME
+                    ORDER BY BINARY ' . PMA_backquote($sort_by) . ' ' . $sort_order
+                . $limit;
         }
-        $sql .= '
-              ' . $sql_where_schema . '
-           GROUP BY BINARY `information_schema`.`SCHEMATA`.`SCHEMA_NAME`
-           ORDER BY BINARY ' . PMA_backquote($sort_by) . ' ' . $sort_order
-           . $limit;
+
         $databases = PMA_DBI_fetch_result($sql, 'SCHEMA_NAME', null, $link);
 
         $mysql_error = PMA_DBI_getError($link);
@@ -740,18 +831,47 @@ function PMA_DBI_get_columns_full($database = null, $table = null,
 
         // for PMA bc:
         // `[SCHEMA_FIELD_NAME]` AS `[SHOW_FULL_COLUMNS_FIELD_NAME]`
-        $sql = '
-             SELECT *,
-                    `COLUMN_NAME`       AS `Field`,
-                    `COLUMN_TYPE`       AS `Type`,
-                    `COLLATION_NAME`    AS `Collation`,
-                    `IS_NULLABLE`       AS `Null`,
-                    `COLUMN_KEY`        AS `Key`,
-                    `COLUMN_DEFAULT`    AS `Default`,
-                    `EXTRA`             AS `Extra`,
-                    `PRIVILEGES`        AS `Privileges`,
-                    `COLUMN_COMMENT`    AS `Comment`
-               FROM `information_schema`.`COLUMNS`';
+        if (PMA_DRIZZLE) {
+            $sql = "SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME,
+                column_name        AS `Field`,
+                (CASE
+                    WHEN character_maximum_length > 0
+                        THEN concat(lower(data_type), '(', character_maximum_length, ')')
+                    WHEN numeric_precision > 0 OR numeric_scale > 0
+                        THEN concat(lower(data_type), '(', numeric_precision, ',', numeric_scale, ')')
+                    WHEN enum_values IS NOT NULL
+                        THEN concat(lower(data_type), '(', enum_values, ')')
+                    ELSE lower(data_type) END)
+                                   AS `Type`,
+                collation_name     AS `Collation`,
+                (CASE is_nullable
+                    WHEN 1 THEN 'YES'
+                    ELSE 'NO' END) AS `Null`,
+                (CASE
+                    WHEN is_used_in_primary THEN 'PRI'
+                    ELSE '' END)   AS `Key`,
+                column_default     AS `Default`,
+                (CASE
+                    WHEN is_auto_increment THEN 'auto_increment'
+                    WHEN column_default_update THEN 'on update ' || column_default_update
+                    ELSE '' END)   AS `Extra`,
+                NULL               AS `Privileges`,
+                column_comment     AS `Comment`
+            FROM data_dictionary.columns";
+        } else {
+            $sql = '
+                 SELECT *,
+                        `COLUMN_NAME`       AS `Field`,
+                        `COLUMN_TYPE`       AS `Type`,
+                        `COLLATION_NAME`    AS `Collation`,
+                        `IS_NULLABLE`       AS `Null`,
+                        `COLUMN_KEY`        AS `Key`,
+                        `COLUMN_DEFAULT`    AS `Default`,
+                        `EXTRA`             AS `Extra`,
+                        `PRIVILEGES`        AS `Privileges`,
+                        `COLUMN_COMMENT`    AS `Comment`
+                   FROM `information_schema`.`COLUMNS`';
+        }
         if (count($sql_wheres)) {
             $sql .= "\n" . ' WHERE ' . implode(' AND ', $sql_wheres);
         }
@@ -781,74 +901,225 @@ function PMA_DBI_get_columns_full($database = null, $table = null,
         }
 
         $columns = PMA_DBI_fetch_result($sql, 'Field', null, $link);
+    }
+    $ordinal_position = 1;
+    foreach ($columns as $column_name => $each_column) {
+
+        // MySQL forward compatibility
+        // so pma could use this array as if every server is of version >5.0
+        $columns[$column_name]['COLUMN_NAME']                 =& $columns[$column_name]['Field'];
+        $columns[$column_name]['COLUMN_TYPE']                 =& $columns[$column_name]['Type'];
+        $columns[$column_name]['COLLATION_NAME']              =& $columns[$column_name]['Collation'];
+        $columns[$column_name]['IS_NULLABLE']                 =& $columns[$column_name]['Null'];
+        $columns[$column_name]['COLUMN_KEY']                  =& $columns[$column_name]['Key'];
+        $columns[$column_name]['COLUMN_DEFAULT']              =& $columns[$column_name]['Default'];
+        $columns[$column_name]['EXTRA']                       =& $columns[$column_name]['Extra'];
+        $columns[$column_name]['PRIVILEGES']                  =& $columns[$column_name]['Privileges'];
+        $columns[$column_name]['COLUMN_COMMENT']              =& $columns[$column_name]['Comment'];
+
+        $columns[$column_name]['TABLE_CATALOG']               = null;
+        $columns[$column_name]['TABLE_SCHEMA']                = $database;
+        $columns[$column_name]['TABLE_NAME']                  = $table;
+        $columns[$column_name]['ORDINAL_POSITION']            = $ordinal_position;
+        $columns[$column_name]['DATA_TYPE']                   =
+            substr($columns[$column_name]['COLUMN_TYPE'], 0,
+                strpos($columns[$column_name]['COLUMN_TYPE'], '('));
+        /**
+         * @todo guess CHARACTER_MAXIMUM_LENGTH from COLUMN_TYPE
+         */
+        $columns[$column_name]['CHARACTER_MAXIMUM_LENGTH']    = null;
+        /**
+         * @todo guess CHARACTER_OCTET_LENGTH from CHARACTER_MAXIMUM_LENGTH
+         */
+        $columns[$column_name]['CHARACTER_OCTET_LENGTH']      = null;
+        $columns[$column_name]['NUMERIC_PRECISION']           = null;
+        $columns[$column_name]['NUMERIC_SCALE']               = null;
+        $columns[$column_name]['CHARACTER_SET_NAME']          =
+            substr($columns[$column_name]['COLLATION_NAME'], 0,
+                strpos($columns[$column_name]['COLLATION_NAME'], '_'));
+
+        $ordinal_position++;
+    }
 
-        $ordinal_position = 1;
-        foreach ($columns as $column_name => $each_column) {
-
-            // MySQL forward compatibility
-            // so pma could use this array as if every server is of version >5.0
-            $columns[$column_name]['COLUMN_NAME']                 =& $columns[$column_name]['Field'];
-            $columns[$column_name]['COLUMN_TYPE']                 =& $columns[$column_name]['Type'];
-            $columns[$column_name]['COLLATION_NAME']              =& $columns[$column_name]['Collation'];
-            $columns[$column_name]['IS_NULLABLE']                 =& $columns[$column_name]['Null'];
-            $columns[$column_name]['COLUMN_KEY']                  =& $columns[$column_name]['Key'];
-            $columns[$column_name]['COLUMN_DEFAULT']              =& $columns[$column_name]['Default'];
-            $columns[$column_name]['EXTRA']                       =& $columns[$column_name]['Extra'];
-            $columns[$column_name]['PRIVILEGES']                  =& $columns[$column_name]['Privileges'];
-            $columns[$column_name]['COLUMN_COMMENT']              =& $columns[$column_name]['Comment'];
-
-            $columns[$column_name]['TABLE_CATALOG']               = null;
-            $columns[$column_name]['TABLE_SCHEMA']                = $database;
-            $columns[$column_name]['TABLE_NAME']                  = $table;
-            $columns[$column_name]['ORDINAL_POSITION']            = $ordinal_position;
-            $columns[$column_name]['DATA_TYPE']                   =
-                substr($columns[$column_name]['COLUMN_TYPE'], 0,
-                    strpos($columns[$column_name]['COLUMN_TYPE'], '('));
-            /**
-             * @todo guess CHARACTER_MAXIMUM_LENGTH from COLUMN_TYPE
-             */
-            $columns[$column_name]['CHARACTER_MAXIMUM_LENGTH']    = null;
-            /**
-             * @todo guess CHARACTER_OCTET_LENGTH from CHARACTER_MAXIMUM_LENGTH
-             */
-            $columns[$column_name]['CHARACTER_OCTET_LENGTH']      = null;
-            $columns[$column_name]['NUMERIC_PRECISION']           = null;
-            $columns[$column_name]['NUMERIC_SCALE']               = null;
-            $columns[$column_name]['CHARACTER_SET_NAME']          =
-                substr($columns[$column_name]['COLLATION_NAME'], 0,
-                    strpos($columns[$column_name]['COLLATION_NAME'], '_'));
-
-            $ordinal_position++;
-        }
-
-        if (null !== $column) {
-            reset($columns);
-            $columns = current($columns);
-        }
+    if (null !== $column) {
+        reset($columns);
+        $columns = current($columns);
     }
 
     return $columns;
 }
 
 /**
- * array PMA_DBI_get_columns(string $database, string $table, bool $full = false, mysql db link $link = null)
+ * Returns SQL query for fetching columns for a table
+ *
+ * The 'Key' column is not calculated properly, use PMA_DBI_get_columns() to get correct values.
+ *
+ * @see PMA_DBI_get_columns()
+ * @param   string  $database   name of database
+ * @param   string  $table      name of table to retrieve columns from
+ * @param   string  $column     name of column, null to show all columns
+ * @param   boolean $full       whether to return full info or only column names
+ * @return  string
+ */
+function PMA_DBI_get_columns_sql($database, $table, $column = null, $full = false)
+{
+    if (PMA_DRIZZLE) {
+        // `Key` column:
+        // * used in primary key => PRI
+        // * unique one-column => UNI
+        // * indexed, one-column or first in multi-column => MUL
+        // Promotion of UNI to PRI in case no promary index exists is done after query is executed
+        $sql = "SELECT
+                column_name        AS `Field`,
+                (CASE
+                    WHEN character_maximum_length > 0
+                        THEN concat(lower(data_type), '(', character_maximum_length, ')')
+                    WHEN numeric_precision > 0 OR numeric_scale > 0
+                        THEN concat(lower(data_type), '(', numeric_precision, ',', numeric_scale, ')')
+                    WHEN enum_values IS NOT NULL
+                        THEN concat(lower(data_type), '(', enum_values, ')')
+                    ELSE lower(data_type) END)
+                                   AS `Type`,
+                " . ($full ? "
+                collation_name     AS `Collation`," : '') . "
+                (CASE is_nullable
+                    WHEN 1 THEN 'YES'
+                    ELSE 'NO' END) AS `Null`,
+                (CASE
+                    WHEN is_used_in_primary THEN 'PRI'
+                    WHEN is_unique AND NOT is_multi THEN 'UNI'
+                    WHEN is_indexed AND (NOT is_multi OR is_first_in_multi) THEN 'MUL'
+                    ELSE '' END)   AS `Key`,
+                column_default     AS `Default`,
+                (CASE
+                    WHEN is_auto_increment THEN 'auto_increment'
+                    WHEN column_default_update <> '' THEN 'on update ' || column_default_update
+                    ELSE '' END)   AS `Extra`
+                " . ($full ? " ,
+                NULL               AS `Privileges`,
+                column_comment     AS `Comment`" : '') . "
+            FROM data_dictionary.columns
+            WHERE table_schema = '" . PMA_sqlAddSlashes($database) . "'
+                AND table_name = '" . PMA_sqlAddSlashes($table) . "'
+                " . ($column ? "
+                AND column_name = '" . PMA_sqlAddSlashes($column) . "'" : '');
+        // ORDER BY ordinal_position
+    } else {
+        $sql = 'SHOW ' . ($full ? 'FULL' : '') . ' COLUMNS
+            FROM ' . PMA_backquote($database) . '.' . PMA_backquote($table)
+            . ($column ? "LIKE '" . PMA_sqlAddSlashes($column, true) . "'" : '');
+    }
+    return $sql;
+}
+
+/**
+ * Returns descriptions of columns in given table (all or given by $column)
  *
  * @param string  $database   name of database
  * @param string  $table      name of table to retrieve columns from
+ * @param string  $column     name of column, null to show all columns
  * @param boolean $full       whether to return full info or only column names
  * @param mixed   $link       mysql link resource
- * @return  array   column names
+ * @return  false|array   array indexed by column names or, if $column is given, flat array description
  */
-function PMA_DBI_get_columns($database, $table, $full = false, $link = null)
+function PMA_DBI_get_columns($database, $table, $column = null, $full = false, $link = null)
 {
-    $fields = PMA_DBI_fetch_result(
-        'SHOW ' . ($full ? 'FULL' : '') . ' COLUMNS
-        FROM ' . PMA_backquote($database) . '.' . PMA_backquote($table),
-        'Field', null, $link);
+    $sql = PMA_DBI_get_columns_sql($database, $table, $column, $full);
+    $fields = PMA_DBI_fetch_result($sql, 'Field', null, $link);
     if (! is_array($fields) || count($fields) == 0) {
         return null;
     }
-    return $fields;
+    if (PMA_DRIZZLE) {
+        // fix Key column, it's much simpler in PHP than in SQL
+        $has_pk = false;
+        $has_pk_candidates = false;
+        foreach ($fields as $f) {
+            if ($f['Key'] == 'PRI') {
+                $has_pk = true;
+                break;
+            } else if ($f['Null'] == 'NO' && ($f['Key'] == 'MUL' || $f['Key'] == 'UNI')) {
+                $has_pk_candidates = true;
+            }
+        }
+        if (!$has_pk && $has_pk_candidates) {
+            // check whether we can promote some unique index to PRI
+            $sql = "
+                SELECT i.index_name, p.column_name
+                FROM data_dictionary.indexes i
+                    JOIN data_dictionary.index_parts p USING (table_schema, table_name)
+                WHERE i.table_schema = '" . PMA_sqlAddSlashes($database) . "'
+                    AND i.table_name = '" . PMA_sqlAddSlashes($table) . "'
+                    AND i.is_unique
+                        AND NOT i.is_nullable";
+            $fs = PMA_DBI_fetch_result($sql, 'index_name', null, $link);
+            $fs = $fs ? array_shift($fs) : array();
+            foreach ($fs as $f) {
+                $fields[$f]['Key'] = 'PRI';
+            }
+        }
+    }
+
+    return $column ? array_shift($fields) : $fields;
+}
+
+/**
+* Returns SQL for fetching informatin on table indexes (SHOW INDEXES)
+*
+* @param    string  $database   name of database
+* @param    string  $table      name of the table whose indexes are to be retreived
+* @param    string  $where      additional conditions for WHERE
+* @return   array   $indexes
+*/
+function PMA_DBI_get_table_indexes_sql($database, $table, $where = null)
+{
+    if (PMA_DRIZZLE) {
+        $sql = "SELECT
+                ip.table_name          AS `Table`,
+                (NOT ip.is_unique)     AS Non_unique,
+                ip.index_name          AS Key_name,
+                ip.sequence_in_index+1 AS Seq_in_index,
+                ip.column_name         AS Column_name,
+                (CASE
+                    WHEN i.index_type = 'BTREE' THEN 'A'
+                    ELSE NULL END)     AS Collation,
+                NULL                   AS Cardinality,
+                compare_length         AS Sub_part,
+                NULL                   AS Packed,
+                ip.is_nullable         AS `Null`,
+                i.index_type           AS Index_type,
+                NULL                   AS Comment,
+                i.index_comment        AS Index_comment
+            FROM data_dictionary.index_parts ip
+                LEFT JOIN data_dictionary.indexes i USING (table_schema, table_name, index_name)
+            WHERE table_schema = '" . PMA_sqlAddSlashes($database) . "'
+                AND table_name = '" . PMA_sqlAddSlashes($table) . "'
+        ";
+    } else {
+        $sql = 'SHOW INDEXES FROM ' . PMA_backquote($database) . '.' . PMA_backquote($table);
+    }
+    if ($where) {
+        $sql .= (PMA_DRIZZLE ? ' AND (' : ' WHERE (') . $where . ')';
+    }
+    return $sql;
+}
+
+/**
+* Returns indexes od a table
+*
+* @param    string  $database   name of database
+* @param    string  $table      name of the table whose indexes are to be retreived
+* @param    mixed   $link       mysql link resource
+* @return   array   $indexes
+*/
+function PMA_DBI_get_table_indexes($database, $table, $link = null)
+{
+    $sql = PMA_DBI_get_table_indexes_sql($database, $table);
+    $indexes = PMA_DBI_fetch_result($sql, null, null, $link);
+
+    if (! is_array($indexes) || count($indexes) < 1) {
+        return array();
+    }
+    return $indexes;
 }
 
 /**
@@ -897,27 +1168,29 @@ function PMA_DBI_postConnect($link, $is_controluser = false)
             define('PMA_MYSQL_INT_VERSION', PMA_cacheGet('PMA_MYSQL_INT_VERSION', true));
             define('PMA_MYSQL_MAJOR_VERSION', PMA_cacheGet('PMA_MYSQL_MAJOR_VERSION', true));
             define('PMA_MYSQL_STR_VERSION', PMA_cacheGet('PMA_MYSQL_STR_VERSION', true));
+            define('PMA_MYSQL_VERSION_COMMENT', PMA_cacheGet('PMA_MYSQL_VERSION_COMMENT', true));
         } else {
-            $mysql_version = PMA_DBI_fetch_value(
-                'SELECT VERSION()', 0, 0, $link);
-            if ($mysql_version) {
-                $match = explode('.', $mysql_version);
+            $version = PMA_DBI_fetch_single_row('SELECT @@version, @@version_comment', 'ASSOC', $link);
+            if ($version) {
+                $match = explode('.', $version['@@version']);
                 define('PMA_MYSQL_MAJOR_VERSION', (int)$match[0]);
                 define('PMA_MYSQL_INT_VERSION',
                     (int) sprintf('%d%02d%02d', $match[0], $match[1],
                             intval($match[2])));
-                define('PMA_MYSQL_STR_VERSION', $mysql_version);
-                unset($mysql_version, $match);
+                define('PMA_MYSQL_STR_VERSION', $version['@@version']);
+                define('PMA_MYSQL_VERSION_COMMENT', $version['@@version_comment']);
             } else {
                 define('PMA_MYSQL_INT_VERSION', 50015);
                 define('PMA_MYSQL_MAJOR_VERSION', 5);
                 define('PMA_MYSQL_STR_VERSION', '5.00.15');
+                define('PMA_MYSQL_VERSION_COMMENT', '');
             }
             PMA_cacheSet('PMA_MYSQL_INT_VERSION', PMA_MYSQL_INT_VERSION, true);
             PMA_cacheSet('PMA_MYSQL_MAJOR_VERSION', PMA_MYSQL_MAJOR_VERSION, true);
             PMA_cacheSet('PMA_MYSQL_STR_VERSION', PMA_MYSQL_STR_VERSION, true);
+            PMA_cacheSet('PMA_MYSQL_VERSION_COMMENT', PMA_MYSQL_VERSION_COMMENT, true);
         }
-        // detect Drizzle by version number (year.month.day.?patch-version)
+        // detect Drizzle by version number - <year>.<month>.<build number>(.<patch rev)
         define('PMA_DRIZZLE', PMA_MYSQL_MAJOR_VERSION >= 2009);
     }
 
@@ -930,6 +1203,18 @@ function PMA_DBI_postConnect($link, $is_controluser = false)
             PMA_DBI_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci';", $link, PMA_DBI_QUERY_STORE);
         }
     }
+
+    // Cache plugin list for Drizzle
+    if (PMA_DRIZZLE && !PMA_cacheExists('drizzle_engines', true)) {
+        $sql = "SELECT p.plugin_name, m.module_library
+            FROM data_dictionary.plugins p
+                JOIN data_dictionary.modules m USING (module_name)
+            WHERE p.plugin_type = 'StorageEngine'
+                AND p.plugin_name NOT IN ('FunctionEngine', 'schema')
+                AND p.is_active = 'YES'";
+        $engines = PMA_DBI_fetch_result($sql, 'plugin_name', null, $link);
+        PMA_cacheSet('drizzle_engines', $engines, true);
+    }
 }
 
 /**
@@ -1179,6 +1464,11 @@ function PMA_DBI_fetch_result($result, $key = null, $value = null,
  */
 function PMA_DBI_getCompatibilities()
 {
+    // Drizzle doesn't support compatibility modes
+    if (PMA_DRIZZLE) {
+        return array();
+    }
+
     $compats = array('NONE');
     $compats[] = 'ANSI';
     $compats[] = 'DB2';
@@ -1226,10 +1516,17 @@ function PMA_isSuperuser()
         return PMA_cacheGet('is_superuser', true);
     }
 
-    // with mysql extension, when connection failed we don't have
-    // a $userlink
+    // when connection failed we don't have a $userlink
     if (isset($GLOBALS['userlink'])) {
-        $r = (bool) PMA_DBI_try_query('SELECT COUNT(*) FROM mysql.user', $GLOBALS['userlink'], PMA_DBI_QUERY_STORE);
+        if (PMA_DRIZZLE) {
+            // Drizzle has no authorization by default, so when no plugin is enabled everyone is a superuser
+            // Known authorization libraries: regex_policy, simple_user_policy
+            // Plugins limit object visibility (dbs, tables, processes), we can safely assume we always deal with superuser
+            $r = true;
+        } else {
+            // check access to mysql.user table
+            $r = (bool) PMA_DBI_try_query('SELECT COUNT(*) FROM mysql.user', $GLOBALS['userlink'], PMA_DBI_QUERY_STORE);
+        }
         PMA_cacheSet('is_superuser', $r, true);
     } else {
         PMA_cacheSet('is_superuser', false, true);
@@ -1249,6 +1546,10 @@ function PMA_isSuperuser()
  */
 function PMA_DBI_get_procedures_or_functions($db, $which, $link = null)
 {
+    if (PMA_DRIZZLE) {
+        // Drizzle doesn't support functions and procedures
+        return array();
+    }
     $shows = PMA_DBI_fetch_result('SHOW ' . $which . ' STATUS;', null, null, $link);
     $result = array();
     foreach ($shows as $one_show) {
@@ -1292,6 +1593,11 @@ function PMA_DBI_get_definition($db, $which, $name, $link = null)
  */
 function PMA_DBI_get_triggers($db, $table = '', $delimiter = '//')
 {
+    if (PMA_DRIZZLE) {
+        // Drizzle doesn't support triggers
+        return array();
+    }
+
     $result = array();
     if (! $GLOBALS['cfg']['Server']['DisableIS']) {
         // Note: in http://dev.mysql.com/doc/refman/5.0/en/faqs-triggers.html
@@ -1345,4 +1651,20 @@ function PMA_DBI_get_triggers($db, $table = '', $delimiter = '//')
 
     return($result);
 }
+
+/**
+ * Checks whether given schema is a system schema: information_schema (MySQL and Drizzle)
+ * or data_dictionary (Drizzle)
+ *
+ * @param string $schema_name
+ * @param bool   $test_for_mysql_schema Whether 'mysql' schema should be treated the same as IS and DD
+ * @return bool
+ */
+function PMA_is_system_schema($schema_name, $test_for_mysql_schema = false)
+{
+    return strtolower($schema_name) == 'information_schema'
+            || (PMA_DRIZZLE && strtolower($schema_name) == 'data_dictionary')
+            || ($test_for_mysql_schema && !PMA_DRIZZLE && $schema_name == 'mysql');
+}
+
 ?>
diff --git a/libraries/db_common.inc.php b/libraries/db_common.inc.php
index 290bcd1..05ee295 100644
--- a/libraries/db_common.inc.php
+++ b/libraries/db_common.inc.php
@@ -18,11 +18,9 @@ PMA_checkParameters(array('db'));
 
 $is_show_stats = $cfg['ShowStats'];
 
-if ($db == 'information_schema') {
+$db_is_information_schema = PMA_is_system_schema($db);
+if ($db_is_information_schema) {
     $is_show_stats = false;
-    $db_is_information_schema = true;
-} else {
-    $db_is_information_schema = false;
 }
 
 /**
diff --git a/libraries/db_info.inc.php b/libraries/db_info.inc.php
index dc82af4..9a92bad 100644
--- a/libraries/db_info.inc.php
+++ b/libraries/db_info.inc.php
@@ -85,7 +85,7 @@ $is_show_stats = $cfg['ShowStats'];
  */
 $db_is_information_schema = false;
 
-if ($db == 'information_schema') {
+if (PMA_is_system_schema($db)) {
     $is_show_stats = false;
     $db_is_information_schema = true;
 }
diff --git a/libraries/db_links.inc.php b/libraries/db_links.inc.php
index 2210899..d2cc823 100644
--- a/libraries/db_links.inc.php
+++ b/libraries/db_links.inc.php
@@ -85,7 +85,7 @@ if (! $db_is_information_schema) {
     $tab_operation['link']  = 'db_operations.php';
     $tab_operation['text']  = __('Operations');
     $tab_operation['icon']  = 'ic_b_tblops';
-    if ($is_superuser) {
+    if ($is_superuser && !PMA_DRIZZLE) {
         $tab_privileges['link'] = 'server_privileges.php';
         $tab_privileges['args']['checkprivs']       = $db;
         // stay on database view
@@ -118,7 +118,7 @@ $tabs[] =& $tab_export;
 if (! $db_is_information_schema) {
     $tabs[] =& $tab_import;
     $tabs[] =& $tab_operation;
-    if ($is_superuser) {
+    if ($is_superuser && !PMA_DRIZZLE) {
         $tabs[] =& $tab_privileges;
     }
     if (!PMA_DRIZZLE) {
diff --git a/libraries/dbi/drizzle-wrappers.lib.php b/libraries/dbi/drizzle-wrappers.lib.php
new file mode 100644
index 0000000..14f46a3
--- /dev/null
+++ b/libraries/dbi/drizzle-wrappers.lib.php
@@ -0,0 +1,442 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Wrappers for Drizzle extension classes
+ *
+ * Drizzle extension exposes libdrizzle functions and requires user to have it in mind while using them.
+ * This wrapper is not complete and hides a lot of original functionality, but allows for easy usage
+ * of the drizzle PHP extension.
+ *
+ * @package phpMyAdmin-DBI-Drizzle
+ */
+
+// TODO: drizzle module segfaults while freeing resources, often. This allows at least for some development
+function _drizzle_shutdown_flush() {
+    flush();
+}
+register_shutdown_function('_drizzle_shutdown_flush');
+
+function _dlog_argstr($args)
+{
+    $r = array();
+    foreach ($args as $arg) {
+        if (is_object($arg)) {
+            $r[] = get_class($arg);
+        } elseif (is_bool($arg)) {
+            $r[] = $arg ? 'true' : 'false';
+        } elseif (is_null($arg)) {
+            $r[] = 'null';
+        } else {
+            $r[] = $arg;
+        }
+    }
+    return implode(', ', $r);
+}
+
+function _dlog($end = false)
+{
+    /*
+    static $fp = null;
+
+    if (!$fp) {
+        $fp = fopen('./drizzle_log.log', 'a');
+        flock($fp, LOCK_EX);
+        fwrite($fp, "\r\n[" . date('H:i:s') . "]\t" . $_SERVER['REQUEST_URI'] . "\r\n");
+        register_shutdown_function(function() use ($fp) {
+            fwrite($fp, '[' . date('H:i:s') . "]\tEND\r\n\r\n");
+        });
+    }
+    if ($end) {
+        fwrite($fp, '[' . date('H:i:s') . "]\tok\r\n");
+    } else {
+        $bt = debug_backtrace(true);
+        $caller = (isset($bt[1]['class']) ? $bt[1]['class'] . '::' : '') . $bt[1]['function'];
+        if ($bt[1]['function'] == '__call') {
+            $caller .= '^' . $bt[1]['args'][0];
+            $args = _dlog_argstr($bt[1]['args'][1]);
+        } else {
+            $args = _dlog_argstr($bt[1]['args']);
+        }
+        fwrite($fp, '[' . date('H:i:s') . "]\t" . $caller . "\t" . $args . "\r\n");
+        for ($i = 2; $i <= count($bt)-1; $i++) {
+            if (!isset($bt[$i])) {
+                break;
+            }
+            $caller = (isset($bt[$i]['class']) ? $bt[$i]['class'] . '::' : '') . $bt[$i]['function'];
+            $caller .= ' (' . $bt[$i]['file'] . ':' . $bt[$i]['line'] .  ')';
+            fwrite($fp, str_repeat(' ', 20) . $caller . "\r\n");
+        }
+    }
+    //*/
+}
+
+/**
+ * Wrapper for Drizzle class
+ */
+class PMA_Drizzle extends Drizzle
+{
+    /**
+     * Fetch mode: result rows contain column names
+     */
+    const FETCH_ASSOC = 1;
+    /**
+     * Fetch mode: result rows contain only numeric indices
+     */
+    const FETCH_NUM = 2;
+    /**
+     * Fetch mode: result rows have both column names and numeric indices
+     */
+    const FETCH_BOTH = 3;
+
+    /**
+     * Result buffering: entire result set is buffered upon execution
+     */
+    const BUFFER_RESULT = 1;
+    /**
+     * Result buffering: buffering occurs only on row level
+     */
+    const BUFFER_ROW = 2;
+
+    /**
+     * Constructor
+     */
+    public function __construct()
+    {_dlog();
+        parent::__construct();
+    }
+
+    /**
+     * Creates a new database conection using TCP
+     *
+     * @param $host
+     * @param $port
+     * @param $user
+     * @param $password
+     * @param $db
+     * @param $options
+     * @return PMA_DrizzleCon
+     */
+    public function addTcp($host, $port, $user, $password, $db, $options)
+    {_dlog();
+        $dcon = parent::addTcp($host, $port, $user, $password, $db, $options);
+        return $dcon instanceof DrizzleCon
+            ? new PMA_DrizzleCon($dcon)
+            : $dcon;
+    }
+
+    /**
+     * Creates a new connection using unix domain socket
+     * 
+     * @param $uds
+     * @param $user
+     * @param $password
+     * @param $db
+     * @param $options
+     * @return PMA_DrizzleCon
+     */
+    public function addUds($uds, $user, $password, $db, $options)
+    {_dlog();
+        $dcon = parent::addUds($uds, $user, $password, $db, $options);
+        return $dcon instanceof DrizzleCon
+            ? new PMA_DrizzleCon($dcon)
+            : $dcon;
+    }
+}
+
+/**
+ * Wrapper around DrizzleCon class
+ *
+ * Its main task is to wrap results with PMA_DrizzleResult class
+ */
+class PMA_DrizzleCon
+{
+    /**
+     * Instance of DrizzleCon class
+     * @var DrizzleCon
+     */
+    private $dcon;
+
+    /**
+     * Result of the most recent query
+     * @var PMA_DrizzleResult
+     */
+    private $lastResult;
+
+    /**
+     * Constructor
+     *
+     * @param DrizzleCon $dcon
+     */
+    public function __construct(DrizzleCon $dcon)
+    {_dlog();
+        $this->dcon = $dcon;
+    }
+
+    /**
+     * Executes given query. Opens database connection if not already done.
+     *
+     * @param string $query
+     * @param int    $bufferMode  PMA_Drizzle::BUFFER_RESULT, PMA_Drizzle::BUFFER_ROW
+     * @param int    $fetchMode   PMA_Drizzle::FETCH_ASSOC, PMA_Drizzle::FETCH_NUM or PMA_Drizzle::FETCH_BOTH
+     * @return PMA_DrizzleResult
+     */
+    public function query($query, $bufferMode = PMA_Drizzle::BUFFER_RESULT, $fetchMode = PMA_Drizzle::FETCH_ASSOC)
+    {_dlog();
+        $result = $this->dcon->query($query);
+        if ($result instanceof DrizzleResult) {
+    _dlog(true);
+            $this->lastResult = new PMA_DrizzleResult($result, $bufferMode, $fetchMode);
+            return $this->lastResult;
+        }
+        return $result;
+    }
+
+    /**
+     * Returns the number of rows affected by last query
+     *
+     * @return int|false
+     */
+    public function affectedRows()
+    {
+        return $this->lastResult
+            ? $this->lastResult->affectedRows()
+            : false;
+    }
+
+    /**
+     * Pass calls of undefined methods to DrizzleCon object
+     * 
+     * @param $method
+     * @param $args
+     * @return mixed
+     */
+    public function __call($method, $args)
+    {_dlog();
+        return call_user_func_array(array($this->dcon, $method), $args);
+    }
+
+    /**
+     * Returns original Drizzle connection object
+     *
+     * @return DrizzleCon
+     */
+    public function getConnectionObject()
+    {_dlog();
+        return $this->dcon;
+    }
+}
+
+/**
+ * Wrapper around DrizzleResult. Allows for reading result rows as an associative array
+ * and hides complexity behind buffering.
+ */
+class PMA_DrizzleResult
+{
+    /**
+     * Instamce of DrizzleResult class
+     * @var DrizzleResult
+     */
+    private $dresult;
+    /**
+     * Fetch mode
+     * @var int
+     */
+    private $fetchMode;
+    /**
+     * Buffering mode
+     * @var int
+     */
+    private $bufferMode;
+
+    /**
+     * Cached column data
+     * @var DrizzleColumn[]
+     */
+    private $columns = null;
+    /**
+     * Cached column names
+     * @var string[]
+     */
+    private $columnNames = null;
+
+    /**
+     * Constructor
+     *
+     * @param DrizzleResult $dresult
+     * @param int           $bufferMode
+     * @param int           $fetchMode
+     */
+    public function __construct(DrizzleResult $dresult, $bufferMode, $fetchMode)
+    {_dlog();
+        $this->dresult = $dresult;
+        $this->bufferMode = $bufferMode;
+        $this->fetchMode = $fetchMode;
+
+        if ($this->bufferMode == PMA_Drizzle::BUFFER_RESULT) {
+            $this->dresult->buffer();
+        }
+    }
+
+    /**
+     * Sets fetch mode
+     *
+     * @param int $fetchMode
+     */
+    public function setFetchMode($fetchMode)
+    {_dlog();
+        $this->fetchMode = $fetchMode;
+    }
+
+    /**
+     * Reads information about columns contained in current result set into {@see $columns} and {@see $columnNames} arrays
+     */
+    private function _readColumns()
+    {_dlog();
+        $this->columns = array();
+        $this->columnNames = array();
+        if ($this->bufferMode == PMA_Drizzle::BUFFER_RESULT) {
+            while (($column = $this->dresult->columnNext()) !== null) {
+                $this->columns[] = $column;
+                $this->columnNames[] = $column->name();
+            }
+        } else {
+            while (($column = $this->dresult->columnRead()) !== null) {
+                $this->columns[] = $column;
+                $this->columnNames[] = $column->name();
+            }
+        }
+    }
+
+    /**
+     * Returns columns in current result
+     *
+     * @return DrizzleColumn[]
+     */
+    public function getColumns()
+    {_dlog();
+        if (!$this->columns) {
+            $this->_readColumns();
+        }
+        return $this->columns;
+    }
+
+    /**
+     * Returns number if columns in result
+     *
+     * @return int
+     */
+    public function numColumns()
+    {_dlog();
+        return $this->dresult->columnCount();
+    }
+
+    /**
+     * Transforms result row to conform to current fetch mode
+     *
+     * @param mixed &$row
+     * @param int   $fetchMode
+     */
+    private function _transformResultRow(&$row, $fetchMode)
+    {
+        if (!$row) {
+            return;
+        }
+
+        switch ($fetchMode) {
+            case PMA_Drizzle::FETCH_ASSOC:
+                $row = array_combine($this->columnNames, $row);
+                break;
+            case PMA_Drizzle::FETCH_BOTH:
+                $length = count($row);
+                for ($i = 0; $i < $length; $i++) {
+                    $row[$this->columnNames[$i]] = $row[$i];
+                }
+                break;
+            default:
+                break;
+        }
+    }
+
+    /**
+     * Fetches next for from this result set
+     *
+     * @param int $fetchMode  fetch mode to use, if none given the default one is used
+     * @return array|null
+     */
+    public function fetchRow($fetchMode = null)
+    {_dlog();
+        // read column names on first fetch, only buffered results allow for reading it later
+        if (!$this->columns) {
+            $this->_readColumns();
+        }
+        if ($fetchMode === null) {
+            $fetchMode = $this->fetchMode;
+        }
+        $row = null;
+        switch ($this->bufferMode) {
+            case PMA_Drizzle::BUFFER_RESULT:
+                $row = $this->dresult->rowNext();
+                break;
+            case PMA_Drizzle::BUFFER_ROW:
+                $row = $this->dresult->rowBuffer();
+                break;
+        }
+        $this->_transformResultRow($row, $fetchMode);
+        return $row;
+    }
+
+    /**
+     * Adjusts the result pointer to an arbitrary row in buffered result
+     *
+     * @param $row_index
+     * @return bool
+     */
+    public function seek($row_index)
+    {_dlog();
+        if ($this->bufferMode != PMA_Drizzle::BUFFER_RESULT) {
+            trigger_error("Can't seek in an unbuffered result set", E_USER_WARNING);
+            return false;
+        }
+        // rowSeek always returns NULL (drizzle extension v.0.5, API v.7)
+        if ($row_index >= 0 && $row_index < $this->dresult->rowCount()) {
+            $this->dresult->rowSeek($row_index);
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Returns the number of rows in buffered result set
+     *
+     * @return int|false
+     */
+    public function numRows()
+    {_dlog();
+        if ($this->bufferMode != PMA_Drizzle::BUFFER_RESULT) {
+            trigger_error("Can't count rows in an unbuffered result set", E_USER_WARNING);
+            return false;
+        }
+        return $this->dresult->rowCount();
+    }
+
+    /**
+     * Returns the number of rows affected by query
+     *
+     * @return int|false
+     */
+    public function affectedRows()
+    {_dlog();
+        return $this->dresult->affectedRows();
+    }
+
+    /**
+     * Frees resources taken by this result
+     */
+    public function free()
+    {_dlog();
+        unset($this->columns);
+        unset($this->columnNames);
+        drizzle_result_free($this->dresult);
+        unset($this->dresult);
+    }
+}
diff --git a/libraries/dbi/drizzle.dbi.lib.php b/libraries/dbi/drizzle.dbi.lib.php
new file mode 100644
index 0000000..153c64d
--- /dev/null
+++ b/libraries/dbi/drizzle.dbi.lib.php
@@ -0,0 +1,584 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ * Interface to the Drizzle extension
+ *
+ * WARNING - EXPERIMENTAL, never use in production, drizzle module segfaults often and when you least expect it to
+ *
+ * TODO: This file and drizzle-wrappers.lib.php should be devoid of any segault related hacks.
+ * TODO: Crashing versions of drizzle module and/or libdrizzle should be blacklisted
+ *
+ * @package phpMyAdmin-DBI-Drizzle
+ */
+if (! defined('PHPMYADMIN')) {
+    exit;
+}
+
+require_once './libraries/logging.lib.php';
+require_once './libraries/dbi/drizzle-wrappers.lib.php';
+
+/**
+ * MySQL client API
+ */
+if (!defined('PMA_MYSQL_CLIENT_API')) {
+    define('PMA_MYSQL_CLIENT_API', (int)drizzle_version());
+}
+
+/**
+ * Helper function for connecting to the database server
+ *
+ * @param   PMA_Drizzle  $drizzle
+ * @param   string       $host
+ * @param   int          $port
+ * @param   string       $uds
+ * @param   string       $user
+ * @param   string       $password
+ * @param   string       $db
+ * @param   int          $options
+ * @return  PMA_DrizzleCon
+ */
+function PMA_DBI_real_connect($drizzle, $host, $port, $uds, $user, $password, $db = null, $options = DRIZZLE_CON_NONE)
+{
+    if ($uds) {
+        $con = $drizzle->addUds($uds, $user, $password, $db, $options);
+    } else {
+        $con = $drizzle->addTcp($host, $port, $user, $password, $db, $options);
+    }
+
+    return $con;
+}
+
+/**
+ * connects to the database server
+ *
+ * @param   string  $user           drizzle user name
+ * @param   string  $password       drizzle user password
+ * @param   bool    $is_controluser
+ * @param   array   $server host/port/socket
+ * @param   bool    $auxiliary_connection (when true, don't go back to login if connection fails)
+ * @return  mixed   false on error or a mysqli object on success
+ */
+function PMA_DBI_connect($user, $password, $is_controluser = false, $server = null, $auxiliary_connection = false)
+{
+    global $cfg;
+
+    if ($server) {
+        $server_port   = (empty($server['port']))
+            ? false
+            : (int)$server['port'];
+        $server_socket = (empty($server['socket']))
+            ? ''
+            : $server['socket'];
+        $server['host'] = (empty($server['host']))
+            ? 'localhost'
+            : $server['host'];
+    } else {
+        $server_port   = (empty($cfg['Server']['port']))
+            ? false
+            : (int) $cfg['Server']['port'];
+        $server_socket = (empty($cfg['Server']['socket']))
+            ? null
+            : $cfg['Server']['socket'];
+    }
+
+    if (strtolower($GLOBALS['cfg']['Server']['connect_type']) == 'tcp') {
+        $GLOBALS['cfg']['Server']['socket'] = '';
+    }
+
+    $drizzle = new PMA_Drizzle();
+
+    $client_flags = 0;
+
+    /* Optionally compress connection */
+    if ($GLOBALS['cfg']['Server']['compress']) {
+        $client_flags |= DRIZZLE_CAPABILITIES_COMPRESS;
+    }
+
+    /* Optionally enable SSL */
+    if ($GLOBALS['cfg']['Server']['ssl']) {
+        $client_flags |= DRIZZLE_CAPABILITIES_SSL;
+    }
+
+    if (!$server) {
+        $link = @PMA_DBI_real_connect($drizzle, $cfg['Server']['host'], $server_port, $server_socket, $user, $password, false, $client_flags);
+        // Retry with empty password if we're allowed to
+        if ($link == false && isset($cfg['Server']['nopassword']) && $cfg['Server']['nopassword'] && !$is_controluser) {
+            $link = @PMA_DBI_real_connect($drizzle, $cfg['Server']['host'], $server_port, $server_socket, $user, null, false, $client_flags);
+        }
+    } else {
+        $link = @PMA_DBI_real_connect($drizzle, $server['host'], $server_port, $server_socket, $user, $password);
+    }
+
+    if ($link == false) {
+        if ($is_controluser) {
+            trigger_error(__('Connection for controluser as defined in your configuration failed.'), E_USER_WARNING);
+            return false;
+        }
+        // we could be calling PMA_DBI_connect() to connect to another
+        // server, for example in the Synchronize feature, so do not
+        // go back to main login if it fails
+        if (! $auxiliary_connection) {
+            PMA_log_user($user, 'drizzle-denied');
+            PMA_auth_fails();
+        } else {
+            return false;
+        }
+    } else {
+        PMA_DBI_postConnect($link, $is_controluser);
+    }
+
+    return $link;
+}
+
+/**
+ * selects given database
+ *
+ * @param string          $dbname  database name to select
+ * @param PMA_DrizzleCom  $link    connection object
+ * @return bool
+ */
+function PMA_DBI_select_db($dbname, $link = null)
+{
+    if (empty($link)) {
+        if (isset($GLOBALS['userlink'])) {
+            $link = $GLOBALS['userlink'];
+        } else {
+            return false;
+        }
+    }
+    return $link->selectDb($dbname);
+}
+
+/**
+ * runs a query and returns the result
+ *
+ * @param   string          $query    query to execute
+ * @param   PMA_DrizzleCon  $link     connection object
+ * @param   int             $options
+ * @return  PMA_DrizzleResult
+ */
+function PMA_DBI_real_query($query, $link, $options)
+{
+    $buffer_mode = $options & PMA_DBI_QUERY_UNBUFFERED
+        ? PMA_Drizzle::BUFFER_ROW
+        : PMA_Drizzle::BUFFER_RESULT;
+    $res = $link->query($query, $buffer_mode);
+    return $res;
+}
+
+/**
+ * returns array of rows with associative and numeric keys from $result
+ *
+ * @param   PMA_DrizzleResult  $result
+ * @return  array
+ */
+function PMA_DBI_fetch_array($result)
+{
+    return $result->fetchRow(PMA_Drizzle::FETCH_BOTH);
+}
+
+/**
+ * returns array of rows with associative keys from $result
+ *
+ * @param   PMA_DrizzleResult  $result
+ * @return  array
+ */
+function PMA_DBI_fetch_assoc($result)
+{
+    return $result->fetchRow(PMA_Drizzle::FETCH_ASSOC);
+}
+
+/**
+ * returns array of rows with numeric keys from $result
+ *
+ * @param   PMA_DrizzleResult  $result
+ * @return  array
+ */
+function PMA_DBI_fetch_row($result)
+{
+    return $result->fetchRow(PMA_Drizzle::FETCH_NUM);
+}
+
+/**
+ * Adjusts the result pointer to an arbitrary row in the result
+ *
+ * @param   PMA_DrizzleResult  $result
+ * @param   int                $offset
+ * @return  boolean true on success, false on failure
+ */
+function PMA_DBI_data_seek($result, $offset)
+{
+    return $result->seek($offset);
+}
+
+/**
+ * Frees memory associated with the result
+ *
+ * @param  PMA_DrizzleResult  $result
+ */
+function PMA_DBI_free_result($result)
+{
+    if ($result instanceof PMA_DrizzleResult) {
+        $result->free();
+    }
+}
+
+/**
+ * Check if there are any more query results from a multi query
+ *
+ * @return  bool         false
+ */
+function PMA_DBI_more_results() {
+    // N.B.: PHP's 'mysql' extension does not support
+    // multi_queries so this function will always
+    // return false. Use the 'mysqli' extension, if
+    // you need support for multi_queries.
+    return false;
+}
+
+/**
+ * Prepare next result from multi_query
+ *
+ * @return  bool         false
+ */
+function PMA_DBI_next_result() {
+    // N.B.: PHP's 'mysql' extension does not support
+    // multi_queries so this function will always
+    // return false. Use the 'mysqli' extension, if
+    // you need support for multi_queries.
+    return false;
+}
+
+/**
+ * Returns a string representing the type of connection used
+ * @param   PMA_DrizzleCon  $link   connection object
+ * @return  string          type of connection used
+ */
+function PMA_DBI_get_host_info($link = null)
+{
+    if (null === $link) {
+        if (isset($GLOBALS['userlink'])) {
+            $link = $GLOBALS['userlink'];
+        } else {
+            return false;
+        }
+    }
+
+    $str = $link->port()
+        ? $link->host() . ':' . $link->port() . ' via TCP/IP'
+        : 'Localhost via UNIX socket';
+    return $str;
+}
+
+/**
+ * Returns the version of the Drizzle protocol used
+ * @param   PMA_DrizzleCon  $link   connection object
+ * @return  int         version of the Drizzle protocol used
+ */
+function PMA_DBI_get_proto_info($link = null)
+{
+    if (null === $link) {
+        if (isset($GLOBALS['userlink'])) {
+            $link = $GLOBALS['userlink'];
+        } else {
+            return false;
+        }
+    }
+
+    return $link->protocolVersion();
+}
+
+/**
+ * returns a string that represents the client library version
+ * @return  string          Drizzle client library version
+ */
+function PMA_DBI_get_client_info()
+{
+    return 'libdrizzle (Drizzle ' . drizzle_version() . ')';
+}
+
+/**
+ * returns last error message or false if no errors occured
+ *
+ * @param   PMA_DrizzleCon  $link  connection object
+ * @return  string|bool  $error or false
+ */
+function PMA_DBI_getError($link = null)
+{
+    $GLOBALS['errno'] = 0;
+
+    /* Treat false same as null because of controllink */
+    if ($link === false) {
+        $link = null;
+    }
+
+    if (null === $link && isset($GLOBALS['userlink'])) {
+        $link =& $GLOBALS['userlink'];
+        // Do not stop now. We still can get the error code
+        // with mysqli_connect_errno()
+//    } else {
+//        return false;
+    }
+
+    if (null !== $link) {
+        $error_number = drizzle_con_errno($link->getConnectionObject());
+        $error_message = drizzle_con_error($link->getConnectionObject());
+    } else {
+        $error_number = drizzle_errno();
+        $error_message = drizzle_error();
+    }
+    if (0 == $error_number) {
+        return false;
+    }
+
+    // keep the error number for further check after the call to PMA_DBI_getError()
+    $GLOBALS['errno'] = $error_number;
+
+    if (! empty($error_message)) {
+        $error_message = PMA_DBI_convert_message($error_message);
+    }
+
+    $error_message = htmlspecialchars($error_message);
+
+    if ($error_number == 2002) {
+        $error = '#' . ((string) $error_number) . ' - ' . __('The server is not responding') . ' ' . __('(or the local Drizzle server\'s socket is not correctly configured)');
+    } else {
+        $error = '#' . ((string) $error_number) . ' - ' . $error_message;
+    }
+    return $error;
+}
+
+/**
+ * returns the number of rows returned by last query
+ *
+ * @param   PMA_DrizzleResult  $result
+ * @return  string|int
+ */
+function PMA_DBI_num_rows($result)
+{
+    // see the note for PMA_DBI_try_query();
+    if (!is_bool($result)) {
+        return @$result->numRows();
+    } else {
+        return 0;
+    }
+}
+
+/**
+ * returns last inserted auto_increment id for given $link or $GLOBALS['userlink']
+ *
+ * @param   PMA_DrizzleCon  $link  connection object
+ * @return  string|int
+ */
+function PMA_DBI_insert_id($link = null)
+{
+    if (empty($link)) {
+        if (isset($GLOBALS['userlink'])) {
+            $link = $GLOBALS['userlink'];
+        } else {
+            return false;
+        }
+    }
+
+    // copied from mysql and mysqli
+
+    // When no controluser is defined, using mysqli_insert_id($link)
+    // does not always return the last insert id due to a mixup with
+    // the tracking mechanism, but this works:
+    return PMA_DBI_fetch_value('SELECT LAST_INSERT_ID();', 0, 0, $link);
+    // Curiously, this problem does not happen with the mysql extension but
+    // there is another problem with BIGINT primary keys so PMA_DBI_insert_id()
+    // in the mysql extension also uses this logic.
+}
+
+/**
+ * returns the number of rows affected by last query
+ *
+ * @param   PMA_DrizzleResult  $link            connection object
+ * @param   bool               $get_from_cache
+ * @return  string|int
+ */
+function PMA_DBI_affected_rows($link = null, $get_from_cache = true)
+{
+    if (empty($link)) {
+        if (isset($GLOBALS['userlink'])) {
+            $link = $GLOBALS['userlink'];
+        } else {
+            return false;
+        }
+    }
+    if ($get_from_cache) {
+        return $GLOBALS['cached_affected_rows'];
+    } else {
+        return $link->affectedRows();
+    }
+}
+
+/**
+ * returns metainfo for fields in $result
+ *
+ * @param   PMA_DrizzleResult  $result
+ * @return  array  meta info for fields in $result
+ */
+function PMA_DBI_get_fields_meta($result)
+{
+    // Build an associative array for a type look up
+    $typeAr = array();
+    /*$typeAr[DRIZZLE_COLUMN_TYPE_DECIMAL]     = 'real';
+    $typeAr[DRIZZLE_COLUMN_TYPE_NEWDECIMAL]  = 'real';
+    $typeAr[DRIZZLE_COLUMN_TYPE_BIT]         = 'int';
+    $typeAr[DRIZZLE_COLUMN_TYPE_TINY]        = 'int';
+    $typeAr[DRIZZLE_COLUMN_TYPE_SHORT]       = 'int';
+    $typeAr[DRIZZLE_COLUMN_TYPE_LONG]        = 'int';
+    $typeAr[DRIZZLE_COLUMN_TYPE_FLOAT]       = 'real';
+    $typeAr[DRIZZLE_COLUMN_TYPE_DOUBLE]      = 'real';
+    $typeAr[DRIZZLE_COLUMN_TYPE_NULL]        = 'null';
+    $typeAr[DRIZZLE_COLUMN_TYPE_TIMESTAMP]   = 'timestamp';
+    $typeAr[DRIZZLE_COLUMN_TYPE_LONGLONG]    = 'int';
+    $typeAr[DRIZZLE_COLUMN_TYPE_INT24]       = 'int';
+    $typeAr[DRIZZLE_COLUMN_TYPE_DATE]        = 'date';
+    $typeAr[DRIZZLE_COLUMN_TYPE_TIME]        = 'date';
+    $typeAr[DRIZZLE_COLUMN_TYPE_DATETIME]    = 'datetime';
+    $typeAr[DRIZZLE_COLUMN_TYPE_YEAR]        = 'year';
+    $typeAr[DRIZZLE_COLUMN_TYPE_NEWDATE]     = 'date';
+    $typeAr[DRIZZLE_COLUMN_TYPE_ENUM]        = 'unknown';
+    $typeAr[DRIZZLE_COLUMN_TYPE_SET]         = 'unknown';
+    $typeAr[DRIZZLE_COLUMN_TYPE_VIRTUAL]     = 'unknown';
+    $typeAr[DRIZZLE_COLUMN_TYPE_TINY_BLOB]   = 'blob';
+    $typeAr[DRIZZLE_COLUMN_TYPE_MEDIUM_BLOB] = 'blob';
+    $typeAr[DRIZZLE_COLUMN_TYPE_LONG_BLOB]   = 'blob';
+    $typeAr[DRIZZLE_COLUMN_TYPE_BLOB]        = 'blob';
+    $typeAr[DRIZZLE_COLUMN_TYPE_VAR_STRING]  = 'string';
+    $typeAr[DRIZZLE_COLUMN_TYPE_VARCHAR]     = 'string';
+    $typeAr[DRIZZLE_COLUMN_TYPE_STRING]      = 'string';
+    $typeAr[DRIZZLE_COLUMN_TYPE_GEOMETRY]    = 'geometry';*/
+
+    $typeAr[DRIZZLE_COLUMN_TYPE_DRIZZLE_BLOB]      = 'blob';
+    $typeAr[DRIZZLE_COLUMN_TYPE_DRIZZLE_DATE]      = 'date';
+    $typeAr[DRIZZLE_COLUMN_TYPE_DRIZZLE_DATETIME]  = 'datetime';
+    $typeAr[DRIZZLE_COLUMN_TYPE_DRIZZLE_DOUBLE]    = 'real';
+    $typeAr[DRIZZLE_COLUMN_TYPE_DRIZZLE_ENUM]      = 'unknown';
+    $typeAr[DRIZZLE_COLUMN_TYPE_DRIZZLE_LONG]      = 'int';
+    $typeAr[DRIZZLE_COLUMN_TYPE_DRIZZLE_LONGLONG]  = 'int';
+    $typeAr[DRIZZLE_COLUMN_TYPE_DRIZZLE_MAX]       = 'unknown';
+    $typeAr[DRIZZLE_COLUMN_TYPE_DRIZZLE_NULL]      = 'null';
+    $typeAr[DRIZZLE_COLUMN_TYPE_DRIZZLE_TIMESTAMP] = 'timestamp';
+    $typeAr[DRIZZLE_COLUMN_TYPE_DRIZZLE_TINY]      = 'int';
+    $typeAr[DRIZZLE_COLUMN_TYPE_DRIZZLE_VARCHAR]   = 'string';
+
+    // array of DrizzleColumn
+    $columns = $result->getColumns();
+    // columns in a standarized format
+    $std_columns = array();
+
+    foreach ($columns as $k => $column) {
+        $c = new stdClass();
+        $c->name = $column->name();
+        $c->orgname = $column->origName();
+        $c->table = $column->table();
+        $c->orgtable = $column->origTable();
+        $c->def = $column->defaultValue();
+        $c->db = $column->db();
+        $c->catalog = $column->catalog();
+        // $column->maxSize() returns always 0 while size() seems
+        // to return a correct value (drizzle extension v.0.5, API v.7)
+        $c->max_length = $column->size();
+        $c->decimals = $column->decimals();
+        $c->charsetnr = $column->charset();
+        $c->type = $typeAr[$column->typeDrizzle()];
+        $c->_type = $column->type();
+        $c->flags = PMA_DBI_field_flags($result, $k);
+        $c->_flags = $column->flags();
+
+        $c->multiple_key = (int) (bool) ($c->_flags & DRIZZLE_COLUMN_FLAGS_MULTIPLE_KEY);
+        $c->primary_key =  (int) (bool) ($c->_flags & DRIZZLE_COLUMN_FLAGS_PRI_KEY);
+        $c->unique_key =   (int) (bool) ($c->_flags & DRIZZLE_COLUMN_FLAGS_UNIQUE_KEY);
+        $c->not_null =     (int) (bool) ($c->_flags & DRIZZLE_COLUMN_FLAGS_NOT_NULL);
+        $c->unsigned =     (int) (bool) ($c->_flags & DRIZZLE_COLUMN_FLAGS_UNSIGNED);
+        $c->zerofill =     (int) (bool) ($c->_flags & DRIZZLE_COLUMN_FLAGS_ZEROFILL);
+        $c->numeric =      (int) (bool) ($c->_flags & DRIZZLE_COLUMN_FLAGS_NUM);
+        $c->blob =         (int) (bool) ($c->_flags & DRIZZLE_COLUMN_FLAGS_BLOB);
+
+        $std_columns[] = $c;
+    }
+
+    return $std_columns;
+}
+
+/**
+ * return number of fields in given $result
+ *
+ * @param   PMA_DrizzleResult  $result
+ * @return  int  field count
+ */
+function PMA_DBI_num_fields($result)
+{
+    return $result->numColumns();
+}
+
+/**
+ * returns the length of the given field $i in $result
+ *
+ * @param   PMA_DrizzleResult  $result
+ * @param   int                $i       field
+ * @return  int  length of field
+ */
+function PMA_DBI_field_len($result, $i)
+{
+    $colums = $result->getColumns();
+    return $colums[$i]->size();
+}
+
+/**
+ * returns name of $i. field in $result
+ *
+ * @param   PMA_DrizzleResult  $result
+ * @param   int                $i       field
+ * @return  string  name of $i. field in $result
+ */
+function PMA_DBI_field_name($result, $i)
+{
+    $colums = $result->getColumns();
+    return $colums[$i]->name();
+}
+
+/**
+ * returns concatenated string of human readable field flags
+ *
+ * @param   PMA_DrizzleResult  $result
+ * @param   int            lt  $result  readable field flags  COLUMN_FLAGS_BLOB);  );      ) . ' ' . __('(or the local Drizzle server\'s socket is not correctly configured)');   ';  used.  alue,1)  short lived fix you can flush the query cache (might lock the query cache for a long time). Carefully adjusting {query_cache_min_res_unit} to a lower value might help too, e.g. you can set it to the average size of your queries in the cache using this formula: (query_cache_size - qcache_free_memory) / qcache_queries_in_cache  à!     @d‡âÿ  °d‡âÿ  HÞjrI+          €[‡âÿ         ’BnqI+          †`nqI+  @d‡âÿ  `BnqI+  d‡âÿ  pd‡âÿ  hd‡âÿ  8kqI+  Œp˜        °d‡âÿ  uJnqI+  €joqI+                  €[‡âÿ         PZ‡âÿ  k`nqI+          G       H   I       J   K           M   N   O       P   @d‡âÿ  °d‡âÿ  H•ArI+           ]‡âÿ         ’BnqI+          †`nqI+  @d‡âÿ         0ïrI+  uJnqI+    ‹rI+   ÉrI+    ïrI+  ØïrI+  ¨	ïrI+  €joqI+          H•ArI+           ]‡âÿ         `[‡âÿ  k`nqI+  8•ArI+           ]‡âÿ         [‡âÿ  k`nqI+  (•ArI+           ]‡âÿ         À[‡âÿ  k`nqI+  •ArI+           ]‡âÿ         ð[‡âÿ  k`nqI+  	       ¨ïrI+  uJnqI+         ¨	ïrI+  pV‡âÿ          ŠrI+  eInqI+         ØïrI+  \‡âÿ          yrI+  eInqI+           ïrI+  À\‡âÿ          ZrI+  eInqI+  ØÄrI+    ‹rI+   ÉrI+    ïrI+  Ø$‹rI+  ØïrI+  ¨	ïrI+  €joqI+          8kqI+                        êqI+  °d‡âÿ  p[rI+          p^‡âÿ          @]‡âÿ  k`nqI+      5   6   7   8   :   <   =   >       ?       @   B   D       @d‡âÿ  °d‡âÿ  àçqI+                 °d‡âÿ  uJnqI+         eqI+  ð\‡âÿ          êqI+  eInqI+  eqI+          Õ_ at fÆS         Qöl±íÁ£¶qI+  °d‡âÿ  àçqI+          €_‡âÿ         P^‡âÿ  k`nqI+  u]ÞÓ	4Q ÷U^Qʉ§ ¶uª¹ñìò*Ä“v@d‡âÿ  °d‡âÿ  HÞ³qI+          $ðqI+          ðe‡âÿ  ¦0RsI+  ¦0RsI+         víqI+  d‡âÿ  °e‡âÿ  hd‡âÿ  Ð`‡âÿ  /‹rI+  uJnqI+  Ø$‹rI+  0g‡âÿ  ¢0RsI+   f‡âÿ          a‡âÿ                 ÿÿÿÿÿÿÿÿ¢0RsI+          ¸d‡âÿ                      $i       field
+ * @return  string  field flags
+ */
+function PMA_DBI_field_flags($result, $i)
+{
+    $columns = $result->getColumns();
+    $f = $columns[$i];
+    $type = $f->typeDrizzle();
+    $charsetnr = $f->charset();
+    $f = $f->flags();
+    $flags = '';
+    if ($f & DRIZZLE_COLUMN_FLAGS_UNIQUE_KEY)     { $flags .= 'unique '; }
+    if ($f & DRIZZLE_COLUMN_FLAGS_NUM)            { $flags .= 'num '; }
+    if ($f & DRIZZLE_COLUMN_FLAGS_PART_KEY)       { $flags .= 'part_key '; }
+    if ($f & DRIZZLE_COLUMN_FLAGS_SET)            { $flags .= 'set '; }
+    if ($f & DRIZZLE_COLUMN_FLAGS_TIMESTAMP)      { $flags .= 'timestamp '; }
+    if ($f & DRIZZLE_COLUMN_FLAGS_AUTO_INCREMENT) { $flags .= 'auto_increment '; }
+    if ($f & DRIZZLE_COLUMN_FLAGS_ENUM)           { $flags .= 'enum '; }
+    // See http://dev.mysql.com/doc/refman/6.0/en/c-api-datatypes.html:
+    // to determine if a string is binary, we should not use MYSQLI_BINARY_FLAG
+    // but instead the charsetnr member of the MYSQL_FIELD
+    // structure. Watch out: some types like DATE returns 63 in charsetnr
+    // so we have to check also the type.
+    // Unfortunately there is no equivalent in the mysql extension.
+    if (($type == DRIZZLE_COLUMN_TYPE_DRIZZLE_BLOB || $type == DRIZZLE_COLUMN_TYPE_DRIZZLE_VARCHAR) && 63 == $charsetnr) { $flags .= 'binary ';}
+    if ($f & DRIZZLE_COLUMN_FLAGS_ZEROFILL)       { $flags .= 'zerofill ';}
+    if ($f & DRIZZLE_COLUMN_FLAGS_UNSIGNED)       { $flags .= 'unsigned ';}
+    if ($f & DRIZZLE_COLUMN_FLAGS_BLOB)           { $flags .= 'blob ';}
+    if ($f & DRIZZLE_COLUMN_FLAGS_MULTIPLE_KEY)   { $flags .= 'multiple_key ';}
+    if ($f & DRIZZLE_COLUMN_FLAGS_UNIQUE_KEY)     { $flags .= 'unique_key ';}
+    if ($f & DRIZZLE_COLUMN_FLAGS_PRI_KEY)        { $flags .= 'primary_key ';}
+    if ($f & DRIZZLE_COLUMN_FLAGS_NOT_NULL)       { $flags .= 'not_null ';}
+    return trim($flags);
+}
+
+?>
diff --git a/libraries/dbi/mysqli.dbi.lib.php b/libraries/dbi/mysqli.dbi.lib.php
index d382958..fa01497 100644
--- a/libraries/dbi/mysqli.dbi.lib.php
+++ b/libraries/dbi/mysqli.dbi.lib.php
@@ -43,6 +43,11 @@ if (! defined('MYSQLI_TYPE_BIT')) {
     define('MYSQLI_TYPE_BIT', 16);
 }
 
+// for Drizzle
+if (! defined('MYSQLI_TYPE_VARCHAR')) {
+    define('MYSQLI_TYPE_VARCHAR', 15);
+}
+
 /**
  * Helper function for connecting to the database server
  *
@@ -481,6 +486,7 @@ function PMA_DBI_get_fields_meta($result)
     $typeAr[MYSQLI_TYPE_BLOB]        = 'blob';
     $typeAr[MYSQLI_TYPE_VAR_STRING]  = 'string';
     $typeAr[MYSQLI_TYPE_STRING]      = 'string';
+    $typeAr[MYSQLI_TYPE_VARCHAR]     = 'string'; // for Drizzle
     // MySQL returns MYSQLI_TYPE_STRING for CHAR
     // and MYSQLI_TYPE_CHAR === MYSQLI_TYPE_TINY
     // so this would override TINYINT and mark all TINYINT as string
diff --git a/libraries/display_tbl.lib.php b/libraries/display_tbl.lib.php
index e7488ff..28db08d 100644
--- a/libraries/display_tbl.lib.php
+++ b/libraries/display_tbl.lib.php
@@ -2565,7 +2565,7 @@ function PMA_displayResultsOperations($the_disp_mode, $analyzed_sql)
         echo $header;
         $header_shown = true;
     }
-    if (! isset($analyzed_sql[0]['queryflags']['procedure'])) {
+    if (!PMA_DRIZZLE && !isset($analyzed_sql[0]['queryflags']['procedure'])) {
         echo PMA_linkOrButton(
             'view_create.php' . $url_query,
             PMA_getIcon('b_views.png', __('Create view')),
diff --git a/libraries/export/htmlword.php b/libraries/export/htmlword.php
index b7aa568..7f04703 100644
--- a/libraries/export/htmlword.php
+++ b/libraries/export/htmlword.php
@@ -199,15 +199,13 @@ if (isset($plugin_list)) {
         /**
          * Get the unique keys in the table
          */
-        $keys_query     = 'SHOW KEYS FROM ' . PMA_backquote($table) . ' FROM '. PMA_backquote($db);
-        $keys_result    = PMA_DBI_query($keys_query);
-        $unique_keys    = array();
-        while ($key = PMA_DBI_fetch_assoc($keys_result)) {
+        $unique_keys = array();
+        $keys        = PMA_DBI_get_table_indexes($db, $table);
+        foreach ($keys as $key) {
             if ($key['Non_unique'] == 0) {
                 $unique_keys[] = $key['Column_name'];
             }
         }
-        PMA_DBI_free_result($keys_result);
 
         /**
          * Gets fields properties
diff --git a/libraries/export/latex.php b/libraries/export/latex.php
index 72fe347..1e84820 100644
--- a/libraries/export/latex.php
+++ b/libraries/export/latex.php
@@ -302,15 +302,13 @@ if (isset($plugin_list)) {
         /**
          * Get the unique keys in the table
          */
-        $keys_query     = 'SHOW KEYS FROM ' . PMA_backquote($table) . ' FROM '. PMA_backquote($db);
-        $keys_result    = PMA_DBI_query($keys_query);
-        $unique_keys    = array();
-        while ($key = PMA_DBI_fetch_assoc($keys_result)) {
+        $unique_keys = array();
+        $keys        = PMA_DBI_get_table_indexes($db, $table);
+        foreach ($keys as $key) {
             if ($key['Non_unique'] == 0) {
                 $unique_keys[] = $key['Column_name'];
             }
         }
-        PMA_DBI_free_result($keys_result);
 
         /**
          * Gets fields properties
diff --git a/libraries/export/odt.php b/libraries/export/odt.php
index a73bb85..fc2b536 100644
--- a/libraries/export/odt.php
+++ b/libraries/export/odt.php
@@ -237,15 +237,13 @@ if (isset($plugin_list)) {
         /**
          * Get the unique keys in the table
          */
-        $keys_query     = 'SHOW KEYS FROM ' . PMA_backquote($table) . ' FROM '. PMA_backquote($db);
-        $keys_result    = PMA_DBI_query($keys_query);
-        $unique_keys    = array();
-        while ($key = PMA_DBI_fetch_assoc($keys_result)) {
+        $unique_keys = array();
+        $keys        = PMA_DBI_get_table_indexes($db, $table);
+        foreach ($keys as $key) {
             if ($key['Non_unique'] == 0) {
                 $unique_keys[] = $key['Column_name'];
             }
         }
-        PMA_DBI_free_result($keys_result);
 
         /**
          * Gets fields properties
diff --git a/libraries/export/sql.php b/libraries/export/sql.php
index 40efc2b..9df3bf6 100644
--- a/libraries/export/sql.php
+++ b/libraries/export/sql.php
@@ -158,9 +158,13 @@ if (isset($plugin_list)) {
                     $drop_clause = '<code>DROP TABLE</code>';
                 }
             } else {
-                $drop_clause = '<code>DROP TABLE / VIEW / PROCEDURE / FUNCTION</code>';
-                if (PMA_MYSQL_INT_VERSION > 50100) {
-                    $drop_clause .= '<code> / EVENT</code>';
+                if (PMA_DRIZZLE) {
+                    $drop_clause = '<code>DROP TABLE</code>';
+                } else {
+                    $drop_clause = '<code>DROP TABLE / VIEW / PROCEDURE / FUNCTION</code>';
+                    if (PMA_MYSQL_INT_VERSION > 50100) {
+                        $drop_clause .= '<code> / EVENT</code>';
+                    }
                 }
             }
             $plugin_list['sql']['options'][] = array(
@@ -168,11 +172,14 @@ if (isset($plugin_list)) {
                 'name' => 'drop_table',
                 'text' => sprintf(__('Add %s statement'), $drop_clause)
                 );
-            $plugin_list['sql']['options'][] = array(
-                'type' => 'bool',
-                'name' => 'procedure_function',
-                'text' => sprintf(__('Add %s statement'), '<code>CREATE PROCEDURE / FUNCTION' . (PMA_MYSQL_INT_VERSION > 50100 ? ' / EVENT</code>' : '</code>'))
-                );
+            // Drizzle doesn't support procedures and functions
+            if (!PMA_DRIZZLE) {
+                $plugin_list['sql']['options'][] = array(
+                    'type' => 'bool',
+                    'name' => 'procedure_function',
+                    'text' => sprintf(__('Add %s statement'), '<code>CREATE PROCEDURE / FUNCTION' . (PMA_MYSQL_INT_VERSION > 50100 ? ' / EVENT</code>' : '</code>'))
+                    );
+            }
 
             /* begin CREATE TABLE statements*/
             $plugin_list['sql']['options'][] = array(
@@ -223,12 +230,15 @@ if (isset($plugin_list)) {
                 'type' => 'message_only',
                 'text' => __('Instead of <code>INSERT</code> statements, use:')
             ));
-        $plugin_list['sql']['options'][] = array(
-            'type' => 'bool',
-            'name' => 'delayed',
-            'text' => __('<code>INSERT DELAYED</code> statements'),
-            'doc' => array('manual_MySQL_Database_Administration', 'insert_delayed')
-            );
+        // Not supported in Drizzle
+        if (!PMA_DRIZZLE) {
+            $plugin_list['sql']['options'][] = array(
+                'type' => 'bool',
+                'name' => 'delayed',
+                'text' => __('<code>INSERT DELAYED</code> statements'),
+                'doc' => array('manual_MySQL_Database_Administration', 'insert_delayed')
+                );
+        }
         $plugin_list['sql']['options'][] = array(
             'type' => 'bool',
             'name' => 'ignore',
@@ -282,12 +292,15 @@ if (isset($plugin_list)) {
             'text' => __('Dump binary columns in hexadecimal notation <i>(for example, "abc" becomes 0x616263)</i>')
             );
 
-        /* Dump time in UTC */
-        $plugin_list['sql']['options'][] = array(
-            'type' => 'bool',
-            'name' => 'utc_time',
-            'text' => __('Dump TIMESTAMP columns in UTC <i>(enables TIMESTAMP columns to be dumped and reloaded between servers in different time zones)</i>')
-            );
+        // Drizzle works only with UTC timezone
+        if (!PMA_DRIZZLE) {
+            /* Dump time in UTC */
+            $plugin_list['sql']['options'][] = array(
+                'type' => 'bool',
+                'name' => 'utc_time',
+                'text' => __('Dump TIMESTAMP columns in UTC <i>(enables TIMESTAMP columns to be dumped and reloaded between servers in different time zones)</i>')
+                );
+        }
 
         $plugin_list['sql']['options'][] = array('type' => 'end_group');
          /* end Data options */
@@ -426,7 +439,7 @@ if (isset($plugin_list)) {
 
         // restore connection settings
         $charset_of_file = isset($GLOBALS['charset_of_file']) ? $GLOBALS['charset_of_file'] : '';
-        if (!empty($GLOBALS['asfile']) && isset($mysql_charset_map[$charset_of_file])) {
+        if (!empty($GLOBALS['asfile']) && isset($mysql_charset_map[$charset_of_file]) && !PMA_DRIZZLE) {
             $foot .=  $crlf
                     . '/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;' . $crlf
                     . '/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;' . $crlf
@@ -434,7 +447,7 @@ if (isset($plugin_list)) {
         }
 
         /* Restore timezone */
-        if ($GLOBALS['sql_utc_time']) {
+        if (isset($GLOBALS['sql_utc_time']) && $GLOBALS['sql_utc_time']) {
             PMA_DBI_query('SET time_zone = "' . $GLOBALS['old_tz'] . '"');
         }
 
@@ -493,7 +506,8 @@ if (isset($plugin_list)) {
         }
 
         /* We want exported AUTO_INCREMENT fields to have still same value, do this only for recent MySQL exports */
-        if (!isset($GLOBALS['sql_compatibility']) || $GLOBALS['sql_compatibility'] == 'NONE') {
+        if ((!isset($GLOBALS['sql_compatibility']) || $GLOBALS['sql_compatibility'] == 'NONE')
+                && !PMA_DRIZZLE) {
             $head .= 'SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";' . $crlf;
         }
 
@@ -504,7 +518,7 @@ if (isset($plugin_list)) {
 
 
         /* Change timezone if we should export timestamps in UTC */
-        if ($GLOBALS['sql_utc_time']) {
+        if (isset($GLOBALS['sql_utc_time']) && $GLOBALS['sql_utc_time']) {
             $head .= 'SET time_zone = "+00:00";' . $crlf;
             $GLOBALS['old_tz'] = PMA_DBI_fetch_value('SELECT @@session.time_zone');
             PMA_DBI_query('SET time_zone = "+00:00"');
@@ -512,7 +526,7 @@ if (isset($plugin_list)) {
 
         $head .= PMA_possibleCRLF();
 
-        if (! empty($GLOBALS['asfile'])) {
+        if (! empty($GLOBALS['asfile']) && !PMA_DRIZZLE) {
             // we are saving as file, therefore we provide charset information
             // so that a utility like the mysql client can interpret
             // the file correctly
@@ -551,16 +565,21 @@ if (isset($plugin_list)) {
         }
         $create_query = 'CREATE DATABASE ' . (isset($GLOBALS['sql_backquotes']) ? PMA_backquote($db) : $db);
         $collation = PMA_getDbCollation($db);
-        if (strpos($collation, '_')) {
-            $create_query .= ' DEFAULT CHARACTER SET ' . substr($collation, 0, strpos($collation, '_')) . ' COLLATE ' . $collation;
+        if (PMA_DRIZZLE) {
+            $create_query .= ' COLLATE ' . $collation;
         } else {
-            $create_query .= ' DEFAULT CHARACTER SET ' . $collation;
+            if (strpos($collation, '_')) {
+                $create_query .= ' DEFAULT CHARACTER SET ' . substr($collation, 0, strpos($collation, '_')) . ' COLLATE ' . $collation;
+            } else {
+                $create_query .= ' DEFAULT CHARACTER SET ' . $collation;
+            }
         }
         $create_query .= ';' . $crlf;
         if (!PMA_exportOutputHandler($create_query)) {
             return false;
         }
-        if (isset($GLOBALS['sql_backquotes']) && isset($GLOBALS['sql_compatibility']) && $GLOBALS['sql_compatibility'] == 'NONE') {
+        if (isset($GLOBALS['sql_backquotes'])
+                && ((isset($GLOBALS['sql_compatibility']) && $GLOBALS['sql_compatibility'] == 'NONE') || PMA_DRIZZLE)) {
             $result = PMA_exportOutputHandler('USE ' . PMA_backquote($db) . ';' . $crlf);
         } else {
             $result = PMA_exportOutputHandler('USE ' . $db . ';' . $crlf);
@@ -700,9 +719,21 @@ if (isset($plugin_list)) {
         if ($result != false) {
             if (PMA_DBI_num_rows($result) > 0) {
                 $tmpres        = PMA_DBI_fetch_assoc($result);
+                if (PMA_DRIZZLE && $show_dates) {
+                    // Drizzle doesn't give Create_time and Update_time in SHOW TABLE STATUS, add it
+                    $sql ="SELECT
+                            TABLE_CREATION_TIME AS Create_time,
+                            TABLE_UPDATE_TIME AS Update_time
+                        FROM data_dictionary.TABLES
+                        WHERE TABLE_SCHEMA = '" . PMA_sqlAddSlashes($db) . "'
+                          AND TABLE_NAME = '" . PMA_sqlAddSlashes($table) . "'";
+                    $tmpres = array_merge(PMA_DBI_fetch_single_row($sql), $tmpres);
+                }
                 // Here we optionally add the AUTO_INCREMENT next value,
                 // but starting with MySQL 5.0.24, the clause is already included
                 // in SHOW CREATE TABLE so we'll remove it below
+                // It's required for Drizzle because SHOW CREATE TABLE uses
+                // the value from table's creation time
                 if (isset($GLOBALS['sql_auto_increment']) && !empty($tmpres['Auto_increment'])) {
                     $auto_increment .= ' AUTO_INCREMENT=' . $tmpres['Auto_increment'] . ' ';
                 }
@@ -734,10 +765,13 @@ if (isset($plugin_list)) {
 
         // Complete table dump,
         // Whether to quote table and fields names or not
-        if ($sql_backquotes) {
-            PMA_DBI_query('SET SQL_QUOTE_SHOW_CREATE = 1');
-        } else {
-            PMA_DBI_query('SET SQL_QUOTE_SHOW_CREATE = 0');
+        // Drizzle always quotes names
+        if (!PMA_DRIZZLE) {
+            if ($sql_backquotes) {
+                PMA_DBI_query('SET SQL_QUOTE_SHOW_CREATE = 1');
+            } else {
+                PMA_DBI_query('SET SQL_QUOTE_SHOW_CREATE = 0');
+            }
         }
 
         // I don't see the reason why this unbuffered query could cause problems,
@@ -785,6 +819,11 @@ if (isset($plugin_list)) {
                 $create_query     = preg_replace('/^CREATE TABLE/', 'CREATE TABLE IF NOT EXISTS', $create_query);
             }
 
+            // Drizzle (checked on 2011.03.13) returns ROW_FORMAT surrounded with quotes, which is not accepted by parser
+            if (PMA_DRIZZLE) {
+                $create_query = preg_replace('/ROW_FORMAT=\'(\S+)\'/', 'ROW_FORMAT=$1', $create_query);
+            }
+
             // are there any constraints to cut out?
             if (preg_match('@CONSTRAINT|FOREIGN[\s]+KEY@', $create_query)) {
 
@@ -867,6 +906,7 @@ if (isset($plugin_list)) {
 
         // remove a possible "AUTO_INCREMENT = value" clause
         // that could be there starting with MySQL 5.0.24
+        // in Drizzle it's useless as it contains the value given at table creation time
         $schema_create = preg_replace('/AUTO_INCREMENT\s*=\s*([0-9])+/', '', $schema_create);
 
         $schema_create .= $auto_increment;
diff --git a/libraries/export/texytext.php b/libraries/export/texytext.php
index 73353e1..351ce71 100644
--- a/libraries/export/texytext.php
+++ b/libraries/export/texytext.php
@@ -181,15 +181,13 @@ if (isset($plugin_list)) {
         /**
          * Get the unique keys in the table
          */
-        $keys_query     = 'SHOW KEYS FROM ' . PMA_backquote($table) . ' FROM '. PMA_backquote($db);
-        $keys_result    = PMA_DBI_query($keys_query);
-        $unique_keys    = array();
-        while ($key = PMA_DBI_fetch_assoc($keys_result)) {
+        $unique_keys = array();
+        $keys        = PMA_DBI_get_table_indexes($db, $table);
+        foreach ($keys as $key) {
             if ($key['Non_unique'] == 0) {
                 $unique_keys[] = $key['Column_name'];
             }
         }
-        PMA_DBI_free_result($keys_result);
 
         /**
          * Gets fields properties
diff --git a/libraries/export/xml.php b/libraries/export/xml.php
index 87f6fe0..694f04b 100644
--- a/libraries/export/xml.php
+++ b/libraries/export/xml.php
@@ -32,32 +32,36 @@ if (isset($plugin_list)) {
         'type' => 'begin_group',
         'name' => 'structure',
         'text' => __('Object creation options (all are recommended)')
-        );
-    $plugin_list['xml']['options'][] = array(
-        'type' => 'bool',
-        'name' => 'export_functions',
-        'text' => __('Functions')
-        );
-    $plugin_list['xml']['options'][] = array(
-        'type' => 'bool',
-        'name' => 'export_procedures',
-        'text' => __('Procedures')
-        );
+		);
+    if (!PMA_DRIZZLE) {
+        $plugin_list['xml']['options'][] = array(
+            'type' => 'bool',
+            'name' => 'export_functions',
+            'text' => __('Functions')
+            );
+        $plugin_list['xml']['options'][] = array(
+            'type' => 'bool',
+            'name' => 'export_procedures',
+            'text' => __('Procedures')
+			);
+    }
     $plugin_list['xml']['options'][] = array(
         'type' => 'bool',
         'name' => 'export_tables',
         'text' => __('Tables')
         );
-    $plugin_list['xml']['options'][] = array(
-        'type' => 'bool',
-        'name' => 'export_triggers',
-        'text' => __('Triggers')
-        );
-    $plugin_list['xml']['options'][] = array(
-        'type' => 'bool',
-        'name' => 'export_views',
-        'text' => __('Views')
-        );
+    if (!PMA_DRIZZLE) {
+        $plugin_list['xml']['options'][] = array(
+            'type' => 'bool',
+            'name' => 'export_triggers',
+            'text' => __('Triggers')
+            );
+        $plugin_list['xml']['options'][] = array(
+            'type' => 'bool',
+            'name' => 'export_views',
+            'text' => __('Views')
+			);
+	}
     $plugin_list['xml']['options'][] = array(
         'type' => 'end_group'
         );
@@ -137,7 +141,16 @@ if (isset($plugin_list)) {
         $head .= '<pma_xml_export version="1.0"' . (($export_struct) ? ' xmlns:pma="http://www.phpmyadmin.net/some_doc_url/"' : '') . '>' . $crlf;
 
         if ($export_struct) {
-            $result = PMA_DBI_fetch_result('SELECT `DEFAULT_CHARACTER_SET_NAME`, `DEFAULT_COLLATION_NAME` FROM `information_schema`.`SCHEMATA` WHERE `SCHEMA_NAME` = \''.PMA_sqlAddSlashes($db).'\' LIMIT 1');
+            if (PMA_DRIZZLE) {
+                $result = PMA_DBI_fetch_result("
+                    SELECT
+                        'utf8' AS DEFAULT_CHARACTER_SET_NAME,
+                        DEFAULT_COLLATION_NAME
+                    FROM data_dictionary.SCHEMAS
+                    WHERE SCHEMA_NAME = '" . PMA_sqlAddSlashes($db) . "'");
+            } else {
+                $result = PMA_DBI_fetch_result('SELECT `DEFAULT_CHARACTER_SET_NAME`, `DEFAULT_COLLATION_NAME` FROM `information_schema`.`SCHEMATA` WHERE `SCHEMA_NAME` = \''.PMA_sqlAddSlashes($db).'\' LIMIT 1');
+            }
             $db_collation = $result[0]['DEFAULT_COLLATION_NAME'];
             $db_charset = $result[0]['DEFAULT_CHARACTER_SET_NAME'];
 
diff --git a/libraries/import.lib.php b/libraries/import.lib.php
index a56f201..c2de669 100644
--- a/libraries/import.lib.php
+++ b/libraries/import.lib.php
@@ -872,7 +872,11 @@ function PMA_buildSQL($db_name, &$tables, &$analyses = null, &$additional_sql =
     $sql = array();
 
     if ($create_db) {
-        $sql[] = "CREATE DATABASE IF NOT EXISTS " . PMA_backquote($db_name) . " DEFAULT CHARACTER SET " . $charset . " COLLATE " . $collation;
+        if (PMA_DRIZZLE) {
+            $sql[] = "CREATE DATABASE IF NOT EXISTS " . PMA_backquote($db_name) . " COLLATE " . $collation;
+        } else {
+            $sql[] = "CREATE DATABASE IF NOT EXISTS " . PMA_backquote($db_name) . " DEFAULT CHARACTER SET " . $charset . " COLLATE " . $collation;
+        }
     }
 
     /**
@@ -946,7 +950,9 @@ function PMA_buildSQL($db_name, &$tables, &$analyses = null, &$additional_sql =
                     $tempSQLStr .= ", ";
                 }
             }
-            $tempSQLStr .= ") DEFAULT CHARACTER SET " . $charset . " COLLATE " . $collation . ";";
+            $tempSQLStr .= ")"
+                . (PMA_DRIZZLE ? "" : " DEFAULT CHARACTER SET " . $charset)
+                . " COLLATE " . $collation . ";";
 
             /**
              * Each SQL statement is executed immediately
diff --git a/libraries/mysql_charsets.lib.php b/libraries/mysql_charsets.lib.php
index 05a5c3b..e9d8d67 100644
--- a/libraries/mysql_charsets.lib.php
+++ b/libraries/mysql_charsets.lib.php
@@ -42,7 +42,7 @@ if (! PMA_cacheExists('mysql_charsets', true)) {
             $mysql_collations[$row['CHARACTER_SET_NAME']][] = $row['COLLATION_NAME'];
         }
         $mysql_collations_flat[] = $row['COLLATION_NAME'];
-        if ($row['IS_DEFAULT'] == 'Yes') {
+        if ($row['IS_DEFAULT'] == 'Yes' || $row['IS_DEFAULT'] == '1') {
             $mysql_default_collations[$row['CHARACTER_SET_NAME']] = $row['COLLATION_NAME'];
         }
         //$mysql_collations_available[$row['Collation']] = ! isset($row['Compiled']) || $row['Compiled'] == 'Yes';
@@ -56,7 +56,10 @@ if (! PMA_cacheExists('mysql_charsets', true)) {
 
     if (PMA_DRIZZLE && isset($mysql_collations['utf8_general_ci']) && isset($mysql_collations['utf8'])) {
         $mysql_collations['utf8'] = $mysql_collations['utf8_general_ci'];
-        unset($mysql_collations['utf8_general_ci']);
+        $mysql_default_collations['utf8'] = $mysql_default_collations['utf8_general_ci'];
+        $mysql_charsets_available['utf8'] = $mysql_charsets_available['utf8_general_ci'];
+        unset($mysql_collations['utf8_general_ci'], $mysql_default_collations['utf8_general_ci'],
+            $mysql_charsets_available['utf8_general_ci']);
     }
 
     sort($mysql_collations_flat, SORT_STRING);
@@ -147,8 +150,12 @@ function PMA_generateCharsetDropdownBox($type = PMA_CSDROPDOWN_COLLATION,
 
 function PMA_generateCharsetQueryPart($collation)
 {
-    list($charset) = explode('_', $collation);
-    return ' CHARACTER SET ' . $charset . ($charset == $collation ? '' : ' COLLATE ' . $collation);
+    if (!PMA_DRIZZLE) {
+        list($charset) = explode('_', $collation);
+        return ' CHARACTER SET ' . $charset . ($charset == $collation ? '' : ' COLLATE ' . $collation);
+    } else {
+        return ' COLLATE ' . $collation;
+    }
 }
 
 /**
@@ -159,7 +166,7 @@ function PMA_generateCharsetQueryPart($collation)
  */
 function PMA_getDbCollation($db)
 {
-    if ($db == 'information_schema') {
+    if (PMA_is_system_schema($db)) {
         // We don't have to check the collation of the virtual
         // information_schema database: We know it!
         return 'utf8_general_ci';
@@ -167,7 +174,10 @@ function PMA_getDbCollation($db)
 
     if (! $GLOBALS['cfg']['Server']['DisableIS']) {
         // this is slow with thousands of databases
-        return PMA_DBI_fetch_value('SELECT DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = \'' . PMA_sqlAddSlashes($db) . '\' LIMIT 1;');
+        $sql = PMA_DRIZZLE
+            ? 'SELECT DEFAULT_COLLATION_NAME FROM data_dictionary.SCHEMAS WHERE SCHEMA_NAME = \'' . PMA_sqlAddSlashes($db) . '\' LIMIT 1'
+            : 'SELECT DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = \'' . PMA_sqlAddSlashes($db) . '\' LIMIT 1';
+        return PMA_DBI_fetch_value($sql);
     } else {
         PMA_DBI_select_db($db);
         $return = PMA_DBI_fetch_value('SHOW VARIABLES LIKE \'collation_database\'', 0, 1);
diff --git a/libraries/pmd_common.php b/libraries/pmd_common.php
index 6593762..e671690 100644
--- a/libraries/pmd_common.php
+++ b/libraries/pmd_common.php
@@ -75,7 +75,7 @@ function get_tab_info()
     PMA_DBI_select_db($GLOBALS['db']);
     $tab_column = array();
     for ($i = 0, $cnt = count($GLOBALS['PMD']["TABLE_NAME"]); $i < $cnt; $i++) {
-        $fields_rs   = PMA_DBI_query('SHOW FULL FIELDS FROM '.PMA_backquote($GLOBALS['PMD']["TABLE_NAME_SMALL"][$i]), NULL, PMA_DBI_QUERY_STORE);
+        $fields_rs   = PMA_DBI_query(PMA_DBI_get_columns_sql($GLOBALS['db'], $GLOBALS['PMD']["TABLE_NAME_SMALL"][$i], true), NULL, PMA_DBI_QUERY_STORE);
         $j = 0;
         while ($row = PMA_DBI_fetch_assoc($fields_rs)) {
             $tab_column[$GLOBALS['PMD']['TABLE_NAME'][$i]]['COLUMN_ID'][$j]   = $j;
diff --git a/libraries/relation.lib.php b/libraries/relation.lib.php
index 4411743..d0ff706 100644
--- a/libraries/relation.lib.php
+++ b/libraries/relation.lib.php
@@ -286,9 +286,7 @@ function PMA__getRelationsParam()
         $cfgRelation['commwork']    = true;
 
         if ($GLOBALS['cfg']['Server']['verbose_check']) {
-            $mime_query  = 'SHOW FIELDS FROM '
-                . PMA_backquote($cfgRelation['db']) . '.'
-                . PMA_backquote($cfgRelation['column_info']);
+            $mime_query  = PMA_DBI_get_columns_sql($cfgRelation['db'], $cfgRelation['column_info']);
             $mime_rs     = PMA_query_as_controluser($mime_query, false);
 
             $mime_field_mimetype                = false;
@@ -435,14 +433,20 @@ function PMA_getForeigners($db, $table, $column = '', $source = 'both')
     }
 
     /**
-     * Emulating relations for some information_schema tables
+     * Emulating relations for some information_schema and data_dictionary tables
      */
-    if ($db == 'information_schema'
-     && ($source == 'internal' || $source == 'both')) {
-        require_once './libraries/information_schema_relations.lib.php';
-
-        if (isset($GLOBALS['information_schema_relations'][$table])) {
-            foreach ($GLOBALS['information_schema_relations'][$table] as $field => $relations) {
+    $is_information_schema = strtolower($db) == 'information_schema';
+    $is_data_dictionary = PMA_DRIZZLE && strtolower($db) == 'data_dictionary';
+    if (($is_information_schema || $is_data_dictionary) && ($source == 'internal' || $source == 'both')) {
+        if ($is_information_schema) {
+            $relations_key = 'information_schema_relations';
+            require_once './libraries/information_schema_relations.lib.php';
+        } else {
+            $relations_key = 'data_dictionary_relations';
+            require_once './libraries/data_dictionary_relations.lib.php';
+        }
+        if (isset($GLOBALS[$relations_key][$table])) {
+            foreach ($GLOBALS[$relations_key][$table] as $field => $relations) {
                 if ((! strlen($column) || $column == $field)
                  && (! isset($foreign[$field]) || ! strlen($foreign[$field]))) {
                     $foreign[$field] = $relations;
@@ -513,7 +517,7 @@ function PMA_getComments($db, $table = '')
 
     if ($table != '') {
         // MySQL native column comments
-        $fields = PMA_DBI_get_columns($db, $table, true);
+        $fields = PMA_DBI_get_columns($db, $table, null, true);
         if ($fields) {
             foreach ($fields as $field) {
                 if (! empty($field['Comment'])) {
diff --git a/libraries/replication.inc.php b/libraries/replication.inc.php
index 857f4dc..0871d32 100644
--- a/libraries/replication.inc.php
+++ b/libraries/replication.inc.php
@@ -266,7 +266,7 @@ function PMA_replication_master_replicated_dbs($link = null)
 
     $tmp_alldbs = PMA_DBI_query('SHOW DATABASES;', $link);
     while ($tmp_row = PMA_DBI_fetch_row($tmp_alldbs)) {
-        if ($tmp_row[0] == 'information_schema')
+        if (PMA_is_system_schema($tmp_row[0]))
             continue;
         if (count($do_db) == 0) {
             if (array_search($tmp_row[0], $ignore_db) !== false) {
diff --git a/libraries/replication_gui.lib.php b/libraries/replication_gui.lib.php
index 2f57b2b..227dc5b 100644
--- a/libraries/replication_gui.lib.php
+++ b/libraries/replication_gui.lib.php
@@ -19,7 +19,7 @@ function PMA_replication_db_multibox()
     $multi_values .= '<select name="db_select[]" size="6" multiple="multiple" id="db_select">';
 
     foreach ($GLOBALS['pma']->databases as $current_db) {
-        if ('information_schema' == $current_db) {
+        if (PMA_is_system_schema($current_db)) {
             continue;
         }
         if (! empty($selectall) || (isset($tmp_select) && strpos(' ' . $tmp_select, '|' . $current_db . '|'))) {
diff --git a/libraries/server_common.inc.php b/libraries/server_common.inc.php
index 9d1e011..5439011 100644
--- a/libraries/server_common.inc.php
+++ b/libraries/server_common.inc.php
@@ -43,13 +43,14 @@ require_once './libraries/header.inc.php';
 $is_superuser = PMA_isSuperuser();
 
 // now, select the mysql db
-if ($is_superuser) {
+if ($is_superuser && !PMA_DRIZZLE) {
     PMA_DBI_select_db('mysql', $userlink);
 }
 
 /**
  * @global array binary log files
  */
-$binary_logs = PMA_DBI_fetch_result('SHOW MASTER LOGS', 'Log_name', null, null,
-    PMA_DBI_QUERY_STORE);
+$binary_logs = PMA_DRIZZLE
+    ? null
+    : PMA_DBI_fetch_result('SHOW MASTER LOGS', 'Log_name', null, null, PMA_DBI_QUERY_STORE);
 ?>
diff --git a/libraries/server_links.inc.php b/libraries/server_links.inc.php
index 19ee5d7..e2ab3a7 100644
--- a/libraries/server_links.inc.php
+++ b/libraries/server_links.inc.php
@@ -54,7 +54,7 @@ if (!$GLOBALS['is_ajax_request']) {
     $tabs['process']['link'] = 'server_processlist.php';
     $tabs['process']['text'] = __('Processes');*/
 
-    if ($is_superuser) {
+    if ($is_superuser && !PMA_DRIZZLE) {
         $tabs['rights']['icon'] = 'ic_s_rights';
         $tabs['rights']['link'] = 'server_privileges.php';
         $tabs['rights']['text'] = __('Privileges');
@@ -84,7 +84,7 @@ if (!$GLOBALS['is_ajax_request']) {
         $tabs['binlog']['text'] = __('Binary log');
     }
 
-    if ($is_superuser) {
+    if ($is_superuser && !PMA_DRIZZLE) {
         $tabs['replication']['icon'] = 'ic_s_replication';
         $tabs['replication']['link'] = 'server_replication.php';
         $tabs['replication']['text'] = __('Replication');
@@ -98,9 +98,15 @@ if (!$GLOBALS['is_ajax_request']) {
     $tabs['charset']['link'] = 'server_collations.php';
     $tabs['charset']['text'] = __('Charsets');
 
-    $tabs['engine']['icon'] = 'ic_b_engine';
-    $tabs['engine']['link'] = 'server_engines.php';
-    $tabs['engine']['text'] = __('Engines');
+    if (PMA_DRIZZLE) {
+        $tabs['plugins']['icon'] = 'ic_b_engine';
+        $tabs['plugins']['link'] = 'server_plugins.php';
+        $tabs['plugins']['text'] = __('Plugins');
+    } else {
+        $tabs['engine']['icon'] = 'ic_b_engine';
+        $tabs['engine']['link'] = 'server_engines.php';
+        $tabs['engine']['text'] = __('Engines');
+    }
 
     echo PMA_generate_html_tabs($tabs, array());
     unset($tabs);
diff --git a/libraries/server_synchronize.lib.php b/libraries/server_synchronize.lib.php
index eacae70..8947b00 100644
--- a/libraries/server_synchronize.lib.php
+++ b/libraries/server_synchronize.lib.php
@@ -91,7 +91,7 @@ function PMA_dataDiffInTables($src_db, $trg_db, $src_link, $trg_link, &$matching
 {
     if (isset($matching_table[$matching_table_index])) {
         $fld = array();
-        $fld_results = PMA_DBI_get_columns($src_db, $matching_table[$matching_table_index], true, $src_link);
+        $fld_results = PMA_DBI_get_columns($src_db, $matching_table[$matching_table_index], null, true, $src_link);
         $is_key = array();
         if (isset($fld_results)) {
             foreach ($fld_results as $each_field) {
@@ -109,7 +109,7 @@ function PMA_dataDiffInTables($src_db, $trg_db, $src_link, $trg_link, &$matching
         $source_result_set = PMA_get_column_values($src_db, $matching_table[$matching_table_index], $is_key, $src_link);
         $source_size = sizeof($source_result_set);
 
-        $trg_fld_results = PMA_DBI_get_columns($trg_db, $matching_table[$matching_table_index], true, $trg_link);
+        $trg_fld_results = PMA_DBI_get_columns($trg_db, $matching_table[$matching_table_index], null, true, $trg_link);
         $all_keys_match = true;
         $trg_keys = array();
 
@@ -591,7 +591,7 @@ function PMA_insertIntoTargetTable($matching_table, $src_db, $trg_db, $src_link,
 function PMA_createTargetTables($src_db, $trg_db, $src_link, $trg_link, &$uncommon_tables, $table_index, &$uncommon_tables_fields, $display)
 {
     if (isset($uncommon_tables[$table_index])) {
-        $fields_result = PMA_DBI_get_columns($src_db, $uncommon_tables[$table_index], true, $src_link);
+        $fields_result = PMA_DBI_get_columns($src_db, $uncommon_tables[$table_index], null, true, $src_link);
         $fields = array();
         foreach ($fields_result as $each_field) {
             $field_name = $each_field['Field'];
@@ -1125,8 +1125,8 @@ function PMA_indexesDiffInTables($src_db, $trg_db, $src_link, $trg_link, $matchi
  &$alter_indexes_array, &$remove_indexes_array, $table_counter)
 {
     //Gets indexes information for source and target table
-    $source_indexes[$table_counter] = PMA_get_table_indexes($src_db, $matching_tables[$table_counter],$src_link);
-    $target_indexes[$table_counter] = PMA_get_table_indexes($trg_db, $matching_tables[$table_counter],$trg_link);
+    $source_indexes[$table_counter] = PMA_DBI_get_table_indexes($src_db, $matching_tables[$table_counter],$src_link);
+    $target_indexes[$table_counter] = PMA_DBI_get_table_indexes($trg_db, $matching_tables[$table_counter],$trg_link);
     for ($a = 0; $a < sizeof($source_indexes[$table_counter]); $a++) {
         $found = false;
         $z = 0;
@@ -1372,24 +1372,4 @@ function PMA_get_column_values($database, $table, $column, $link = null)
     }
     return $field_values;
 }
-
-/**
- * array  PMA_get_table_indexes($database, $table, $link = null)
- *
- * @param string  $database   name of database
- * @param string  $table      name of the table whose indexes are to be retreived
- * @param mixed   $link       mysql link resource
- * @return   array   $indexes
- */
-function PMA_get_table_indexes($database, $table, $link = null)
-{
-    $indexes = PMA_DBI_fetch_result(
-              'SHOW INDEXES FROM ' .PMA_backquote($database) . '.' . PMA_backquote($table),
-               null, null, $link);
-
-    if (!is_array($indexes) || count($indexes) == 0) {
-        return null;
-    }
-    return $indexes;
-}
 ?>
diff --git a/libraries/tbl_common.php b/libraries/tbl_common.php
index 41d8152..a7ecf18 100644
--- a/libraries/tbl_common.php
+++ b/libraries/tbl_common.php
@@ -17,11 +17,7 @@ require_once './libraries/bookmark.lib.php';
 // Check parameters
 PMA_checkParameters(array('db', 'table'));
 
-if ($db === 'information_schema') {
-    $db_is_information_schema = true;
-} else {
-    $db_is_information_schema = false;
-}
+$db_is_information_schema = PMA_is_system_schema($db);
 
 /**
  * Set parameters for links
diff --git a/libraries/tbl_properties.inc.php b/libraries/tbl_properties.inc.php
index cdc2c55..8b42189 100644
--- a/libraries/tbl_properties.inc.php
+++ b/libraries/tbl_properties.inc.php
@@ -28,7 +28,11 @@ require_once './libraries/StorageEngine.class.php';
 require_once './libraries/Partition.class.php';
 
 // load additional configuration variables
-require_once './libraries/data_mysql.inc.php';
+if (PMA_DRIZZLE) {
+    require_once './libraries/data_drizzle.inc.php';
+} else {
+    require_once './libraries/data_mysql.inc.php';
+}
 
 if (is_int($cfg['DefaultPropDisplay'])) {
     if ($num_fields <= $cfg['DefaultPropDisplay']) {
@@ -227,7 +231,7 @@ for ($i = 0; $i < $num_fields; $i++) {
                 if ($row['Null'] == 'YES') {
                     $row['DefaultType']  = 'NULL';
                     $row['DefaultValue'] = '';
-    // SHOW FULL FIELDS does not report the case when there is a DEFAULT value
+    // SHOW FULL COLUMNS does not report the case when there is a DEFAULT value
     // which is empty so we need to use the results of SHOW CREATE TABLE
                 } elseif (isset($row) && isset($analyzed_sql[0]['create_table_fields'][$row['Field']]['default_value'])) {
                     $row['DefaultType']  = 'USER_DEFINED';
@@ -413,7 +417,7 @@ for ($i = 0; $i < $num_fields; $i++) {
         $attribute = $submit_attribute;
     }
 
-    // here, we have a TIMESTAMP that SHOW FULL FIELDS reports as having the
+    // here, we have a TIMESTAMP that SHOW FULL COLUMNS reports as having the
     // NULL attribute, but SHOW CREATE TABLE says the contrary. Believe
     // the latter.
     if (PMA_MYSQL_INT_VERSION < 50025
@@ -486,11 +490,13 @@ for ($i = 0; $i < $num_fields; $i++) {
         }
         $content_cells[$i][$ci] .= '>INDEX</option>';
 
-        $content_cells[$i][$ci] .= '<option value="fulltext_' . $i . '" title="' . __('Fulltext') . '"';
-        if (isset($row['Key']) && $row['Key'] == 'FULLTEXT') {
-            $content_cells[$i][$ci] .= ' selected="selected"';
+        if (!PMA_DRIZZLE) {
+            $content_cells[$i][$ci] .= '<option value="fulltext_' . $i . '" title="' . __('Fulltext') . '"';
+            if (isset($row['Key']) && $row['Key'] == 'FULLTEXT') {
+                $content_cells[$i][$ci] .= ' selected="selected"';
+            }
+            $content_cells[$i][$ci] .= '>FULLTEXT</option>';
         }
-        $content_cells[$i][$ci] .= '>FULLTEXT</option>';
 
         $content_cells[$i][$ci] .= '</select>';
         $ci++;
diff --git a/main.php b/main.php
index 2ba3267..0325f08 100644
--- a/main.php
+++ b/main.php
@@ -79,28 +79,26 @@ if ($server > 0
     /**
      * Displays the mysql server related links
      */
-    if ($server > 0) {
+    if ($server > 0 && !PMA_DRIZZLE) {
         require_once './libraries/check_user_privileges.lib.php';
 
-        if (!PMA_DRIZZLE) {
-            // Logout for advanced authentication
-            if ($cfg['Server']['auth_type'] != 'config') {
-                if ($cfg['ShowChgPassword']) {
-                    if ($GLOBALS['cfg']['AjaxEnable']) {
-                        $conditional_class = 'ajax';
-                    } else {
-                        $conditional_class = null;
-                    }
-                    PMA_printListItem(__('Change password'), 'li_change_password',
-                        './user_password.php?' . $common_url_query, null, null, 'change_password_anchor', null, $conditional_class);
+        // Logout for advanced authentication
+        if ($cfg['Server']['auth_type'] != 'config') {
+            if ($cfg['ShowChgPassword']) {
+                if ($GLOBALS['cfg']['AjaxEnable']) {
+                    $conditional_class = 'ajax';
+                } else {
+                    $conditional_class = null;
                 }
-            } // end if
-
-            echo '    <li id="li_select_mysql_collation">';
-            echo '        <form method="post" action="index.php" target="_parent">' . "\n"
+                PMA_printListItem(__('Change password'), 'li_change_password',
+                    './user_password.php?' . $common_url_query, null, null, 'change_password_anchor', null, $conditional_class);
+            }
+        } // end if
+        echo '    <li id="li_select_mysql_collation">';
+        echo '        <form method="post" action="index.php" target="_parent">' . "\n"
            . PMA_generate_common_hidden_inputs(null, null, 4, 'collation_connection')
            . '            <label for="select_collation_connection">' . "\n"
-           . '                ' . __('MySQL connection collation') . "\n"
+           . '                ' . __('Server connection collation') . "\n"
            // put the doc link in the form so that it appears on the same line
            . PMA_showMySQLDocu('MySQL_Database_Administration', 'Charset-connection') . ': ' .  "\n"
            . '            </label>' . "\n"
@@ -109,8 +107,7 @@ if ($server > 0
            . '            <noscript><input type="submit" value="' . __('Go') . '" /></noscript>' . "\n"
            . '        </form>' . "\n"
            . '    </li>' . "\n";
-        } // not Drizzle
-    } // end of if ($server > 0)
+    } // end of if ($server > 0 && !PMA_DRIZZLE)
     echo '</ul>';
     echo '</div>';
 }
@@ -156,17 +153,18 @@ echo '<div id="main_pane_right">';
 
 if ($server > 0 && $GLOBALS['cfg']['ShowServerInfo']) {
     echo '<div class="group">';
-    echo '<h2>MySQL</h2>';
+    echo '<h2>' . __('Database server') . '</h2>';
     echo '<ul>' . "\n";
     PMA_printListItem(__('Server') . ': ' . $server_info, 'li_server_info');
-    PMA_printListItem(__('Server version') . ': ' . PMA_MYSQL_STR_VERSION, 'li_server_version');
+    PMA_printListItem(__('Software') . ': ' . PMA_getServerType(), 'li_server_type');
+    PMA_printListItem(__('Software version') . ': ' . PMA_MYSQL_STR_VERSION . ' - ' . PMA_MYSQL_VERSION_COMMENT, 'li_server_version');
     PMA_printListItem(__('Protocol version') . ': ' . PMA_DBI_get_proto_info(),
         'li_mysql_proto');
     PMA_printListItem(__('User') . ': ' . htmlspecialchars($mysql_cur_user_and_host),
         'li_user_info');
 
     echo '    <li id="li_select_mysql_charset">';
-    echo '        ' . __('MySQL charset') . ': '
+    echo '        ' . __('Server charset') . ': '
        . '        <span xml:lang="en" dir="ltr">'
        . '           ' . $mysql_charsets_descriptions[$mysql_charset_map['utf-8']] . "\n"
        . '           (' . $mysql_charset_map['utf-8'] . ')' . "\n"
@@ -184,9 +182,15 @@ if ($GLOBALS['cfg']['ShowServerInfo'] || $GLOBALS['cfg']['ShowPhpInfo']) {
         PMA_printListItem($_SERVER['SERVER_SOFTWARE'], 'li_web_server_software');
 
         if ($server > 0) {
-            PMA_printListItem(__('MySQL client version') . ': ' . PMA_DBI_get_client_info(),
+            $client_version_str = PMA_DBI_get_client_info();
+            if (preg_match('#\d+\.\d+\.\d+#', $client_version_str)
+                    && in_array($GLOBALS['cfg']['Server']['extension'], array('mysql', 'mysqli'))) {
+                $client_version_str = 'libmysql - ' . $client_version_str;
+            }
+            PMA_printListItem(__('Database client version') . ': ' . $client_version_str,
                 'li_mysql_client_version');
-            PMA_printListItem(__('PHP extension') . ': ' . $GLOBALS['cfg']['Server']['extension'] . ' ' . PMA_showPHPDocu('book.' . $GLOBALS['cfg']['Server']['extension'] . '.php'),
+            PMA_printListItem(__('PHP extension') . ': ' . $GLOBALS['cfg']['Server']['extension']. ' '
+                    . PMA_showPHPDocu('book.' . $GLOBALS['cfg']['Server']['extension'] . '.php'),
                 'li_used_php_extension');
         }
     }
@@ -290,9 +294,6 @@ if (file_exists('./config')) {
     trigger_error(__('Directory [code]config[/code], which is used by the setup script, still exists in your phpMyAdmin directory. You should remove it once phpMyAdmin has been configured.'), E_USER_WARNING);
 }
 
-/**
- * Check whether relations are supported.
- */
 if ($server > 0) {
     $cfgRelation = PMA_getRelationsParam();
     if (! $cfgRelation['allworks'] && $cfg['PmaNoRelation_DisableWarning'] == false) {
@@ -322,8 +323,9 @@ echo '</noscript>';
  * If someday there is a constant that we can check about mysqlnd, we can use it instead
  * of strpos().
  * If no default server is set, PMA_DBI_get_client_info() is not defined yet.
+ * Drizzle can speak MySQL protocol, so don't warn about version mismatch for Drizzle servers.
  */
-if (function_exists('PMA_DBI_get_client_info')) {
+if (function_exists('PMA_DBI_get_client_info') && !PMA_DRIZZLE) {
     $_client_info = PMA_DBI_get_client_info();
     if ($server > 0 && strpos($_client_info, 'mysqlnd') === false && substr(PMA_MYSQL_CLIENT_API, 0, 3) != substr(PMA_MYSQL_INT_VERSION, 0, 3)) {
         trigger_error(PMA_sanitize(sprintf(__('Your PHP MySQL library version %s differs from your MySQL server version %s. This may cause unpredictable behavior.'),
diff --git a/navigation.php b/navigation.php
index dc60e22..26716ac 100644
--- a/navigation.php
+++ b/navigation.php
@@ -296,7 +296,7 @@ if ($GLOBALS['cfg']['LeftFrameLight'] && strlen($GLOBALS['db'])) {
         echo __('No tables found in database.');
     }
     unset($table_list);
-    if ($db != 'information_schema') {
+    if (!PMA_is_system_schema($db)) {
         $class = '';
         $GLOBALS['cfg']['AjaxEnable'] ? $class="ajax" : '';
         echo '<ul id="newtable"><li><a target="frame_content" href="tbl_create.php' . PMA_generate_common_url(array('db' => $GLOBALS['db'])) . '"  class="'.$class .'" >'
diff --git a/scripts/create_tables.sql b/scripts/create_tables_drizzle.sql
similarity index 66%
copy from scripts/create_tables.sql
copy to scripts/create_tables_drizzle.sql
index b0a5220..1094a7d 100644
--- a/scripts/create_tables.sql
+++ b/scripts/create_tables_drizzle.sql
@@ -1,15 +1,11 @@
 -- --------------------------------------------------------
 -- SQL Commands to set up the pmadb as described in Documentation.html.
 -- 
--- This file is meant for use with MySQL 5 and above!
+-- This file is meant for use with Drizzle 2011.03.13 and above!
 -- 
--- This script expects the user pma to already be existing. If we would put a
--- line here to create him too many users might just use this script and end
--- up with having the same password for the controluser.
---                                                     
--- This user "pma" must be defined in config.inc.php (controluser/controlpass)                         
---                                                  
--- Please don't forget to set up the tablenames in config.inc.php                                 
+-- This script expects that you take care of database permissions.
+--
+-- Please don't forget to set up the tablenames in config.inc.php
 -- 
 
 -- --------------------------------------------------------
@@ -18,21 +14,12 @@
 -- Database : `phpmyadmin`
 -- 
 CREATE DATABASE IF NOT EXISTS `phpmyadmin`
-  DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
+  COLLATE utf8_bin;
 USE phpmyadmin;
 
 -- --------------------------------------------------------
 
 -- 
--- Privileges
--- 
--- (activate this statement if necessary)
--- GRANT SELECT, INSERT, DELETE, UPDATE ON `phpmyadmin`.* TO
---    'pma'@localhost;
-
--- --------------------------------------------------------
-
--- 
 -- Table structure for table `pma_bookmark`
 -- 
 
@@ -44,8 +31,8 @@ CREATE TABLE IF NOT EXISTS `pma_bookmark` (
   `query` text NOT NULL,
   PRIMARY KEY  (`id`)
 )
-  ENGINE=MyISAM COMMENT='Bookmarks'
-  DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
+  ENGINE=InnoDB COMMENT='Bookmarks'
+  COLLATE utf8_bin;
 
 -- --------------------------------------------------------
 
@@ -54,7 +41,7 @@ CREATE TABLE IF NOT EXISTS `pma_bookmark` (
 -- 
 
 CREATE TABLE IF NOT EXISTS `pma_column_info` (
-  `id` int(5) unsigned NOT NULL auto_increment,
+  `id` int(5) NOT NULL auto_increment,
   `db_name` varchar(64) NOT NULL default '',
   `table_name` varchar(64) NOT NULL default '',
   `column_name` varchar(64) NOT NULL default '',
@@ -65,8 +52,8 @@ CREATE TABLE IF NOT EXISTS `pma_column_info` (
   PRIMARY KEY  (`id`),
   UNIQUE KEY `db_name` (`db_name`,`table_name`,`column_name`)
 )
-  ENGINE=MyISAM COMMENT='Column information for phpMyAdmin'
-  DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
+  ENGINE=InnoDB COMMENT='Column information for phpMyAdmin'
+  COLLATE utf8_bin;
 
 -- --------------------------------------------------------
 
@@ -75,7 +62,7 @@ CREATE TABLE IF NOT EXISTS `pma_column_info` (
 -- 
 
 CREATE TABLE IF NOT EXISTS `pma_history` (
-  `id` bigint(20) unsigned NOT NULL auto_increment,
+  `id` bigint(20) NOT NULL auto_increment,
   `username` varchar(64) NOT NULL default '',
   `db` varchar(64) NOT NULL default '',
   `table` varchar(64) NOT NULL default '',
@@ -84,8 +71,8 @@ CREATE TABLE IF NOT EXISTS `pma_history` (
   PRIMARY KEY  (`id`),
   KEY `username` (`username`,`db`,`table`,`timevalue`)
 )
-  ENGINE=MyISAM COMMENT='SQL history for phpMyAdmin'
-  DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
+  ENGINE=InnoDB COMMENT='SQL history for phpMyAdmin'
+  COLLATE utf8_bin;
 
 -- --------------------------------------------------------
 
@@ -95,13 +82,13 @@ CREATE TABLE IF NOT EXISTS `pma_history` (
 
 CREATE TABLE IF NOT EXISTS `pma_pdf_pages` (
   `db_name` varchar(64) NOT NULL default '',
-  `page_nr` int(10) unsigned NOT NULL auto_increment,
+  `page_nr` int(10) NOT NULL auto_increment,
   `page_descr` varchar(50) COLLATE utf8_general_ci NOT NULL default '',
   PRIMARY KEY  (`page_nr`),
   KEY `db_name` (`db_name`)
 )
-  ENGINE=MyISAM COMMENT='PDF relation pages for phpMyAdmin'
-  DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
+  ENGINE=InnoDB COMMENT='PDF relation pages for phpMyAdmin'
+  COLLATE utf8_bin;
 
 -- --------------------------------------------------------
 
@@ -114,8 +101,8 @@ CREATE TABLE IF NOT EXISTS `pma_recent` (
   `tables` text NOT NULL,
   PRIMARY KEY (`username`)
 )
-  ENGINE=MyISAM COMMENT='Recently accessed tables'
-  DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
+  ENGINE=InnoDB COMMENT='Recently accessed tables'
+  COLLATE utf8_bin;
 
 -- --------------------------------------------------------
 
@@ -131,8 +118,8 @@ CREATE TABLE IF NOT EXISTS `pma_table_uiprefs` (
   `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
   PRIMARY KEY (`username`,`db_name`,`table_name`)
 )
-  ENGINE=MyISAM COMMENT='Tables'' UI preferences'
-  DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
+  ENGINE=InnoDB COMMENT='Tables'' UI preferences'
+  COLLATE utf8_bin;
 
 -- --------------------------------------------------------
 
@@ -150,8 +137,8 @@ CREATE TABLE IF NOT EXISTS `pma_relation` (
   PRIMARY KEY  (`master_db`,`master_table`,`master_field`),
   KEY `foreign_field` (`foreign_db`,`foreign_table`)
 )
-  ENGINE=MyISAM COMMENT='Relation table'
-  DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
+  ENGINE=InnoDB COMMENT='Relation table'
+  COLLATE utf8_bin;
 
 -- --------------------------------------------------------
 
@@ -163,12 +150,12 @@ CREATE TABLE IF NOT EXISTS `pma_table_coords` (
   `db_name` varchar(64) NOT NULL default '',
   `table_name` varchar(64) NOT NULL default '',
   `pdf_page_number` int(11) NOT NULL default '0',
-  `x` float unsigned NOT NULL default '0',
-  `y` float unsigned NOT NULL default '0',
+  `x` float NOT NULL default '0',
+  `y` float NOT NULL default '0',
   PRIMARY KEY  (`db_name`,`table_name`,`pdf_page_number`)
 )
-  ENGINE=MyISAM COMMENT='Table coordinates for phpMyAdmin PDF output'
-  DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
+  ENGINE=InnoDB COMMENT='Table coordinates for phpMyAdmin PDF output'
+  COLLATE utf8_bin;
 
 -- --------------------------------------------------------
 
@@ -182,8 +169,8 @@ CREATE TABLE IF NOT EXISTS `pma_table_info` (
   `display_field` varchar(64) NOT NULL default '',
   PRIMARY KEY  (`db_name`,`table_name`)
 )
-  ENGINE=MyISAM COMMENT='Table information for phpMyAdmin'
-  DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
+  ENGINE=InnoDB COMMENT='Table information for phpMyAdmin'
+  COLLATE utf8_bin;
 
 -- --------------------------------------------------------
 
@@ -196,12 +183,12 @@ CREATE TABLE IF NOT EXISTS `pma_designer_coords` (
   `table_name` varchar(64) NOT NULL default '',
   `x` INT,
   `y` INT,
-  `v` TINYINT,
-  `h` TINYINT,
+  `v` INT,
+  `h` INT,
   PRIMARY KEY (`db_name`,`table_name`)
 )
-  ENGINE=MyISAM COMMENT='Table coordinates for Designer'
-  DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
+  ENGINE=InnoDB COMMENT='Table coordinates for Designer'
+  COLLATE utf8_bin;
 
 -- --------------------------------------------------------
 
@@ -212,18 +199,18 @@ CREATE TABLE IF NOT EXISTS `pma_designer_coords` (
 CREATE TABLE IF NOT EXISTS `pma_tracking` (
   `db_name` varchar(64) NOT NULL,
   `table_name` varchar(64) NOT NULL,
-  `version` int(10) unsigned NOT NULL,
+  `version` int(10) NOT NULL,
   `date_created` datetime NOT NULL,
   `date_updated` datetime NOT NULL,
   `schema_snapshot` text NOT NULL,
   `schema_sql` text,
-  `data_sql` longtext,
-  `tracking` set('UPDATE','REPLACE','INSERT','DELETE','TRUNCATE','CREATE DATABASE','ALTER DATABASE','DROP DATABASE','CREATE TABLE','ALTER TABLE','RENAME TABLE','DROP TABLE','CREATE INDEX','DROP INDEX','CREATE VIEW','ALTER VIEW','DROP VIEW') default NULL,
-  `tracking_active` int(1) unsigned NOT NULL default '1',
+  `data_sql` text,
+  `tracking` varchar(15) default NULL,
+  `tracking_active` int(1) NOT NULL default '1',
   PRIMARY KEY  (`db_name`,`table_name`,`version`)
 )
-  ENGINE=MyISAM ROW_FORMAT=COMPACT COMMENT='Database changes tracking for phpMyAdmin'
-  DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
+  ENGINE=InnoDB
+  COLLATE utf8_bin;
 
 -- --------------------------------------------------------
 
@@ -237,5 +224,5 @@ CREATE TABLE IF NOT EXISTS `pma_userconfig` (
   `config_data` text NOT NULL,
   PRIMARY KEY  (`username`)
 )
-  ENGINE=MyISAM COMMENT='User preferences storage for phpMyAdmin'
-  DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
+  ENGINE=InnoDB COMMENT='User preferences storage for phpMyAdmin'
+  COLLATE utf8_bin;
diff --git a/server_databases.php b/server_databases.php
index 544db90..c709f83 100644
--- a/server_databases.php
+++ b/server_databases.php
@@ -11,7 +11,12 @@
 require_once './libraries/common.inc.php';
 
 require './libraries/server_common.inc.php';
-require './libraries/replication.inc.php';
+if (!PMA_DRIZZLE) {
+    require './libraries/replication.inc.php';
+} else {
+    $replication_types = array();
+    $replication_info = null;
+}
 require './libraries/build_html_for_db.lib.php';
 
 /**
@@ -186,7 +191,7 @@ if ($databases_count > 0) {
         echo '    <th>'. $name .'</th>' . "\n";
     }
 
-    if ($is_superuser) {
+    if ($is_superuser && !PMA_DRIZZLE) {
         echo '    <th>' . ($cfg['PropertiesIconic'] ? '' : __('Action')) . "\n"
            . '    </th>' . "\n";
     }
@@ -197,7 +202,7 @@ if ($databases_count > 0) {
     $odd_row = true;
     foreach ($databases as $current) {
         $tr_class = $odd_row ? 'odd' : 'even';
-        if ($current['SCHEMA_NAME'] == 'mysql' || $current['SCHEMA_NAME'] == 'information_schema') {
+        if (PMA_is_system_schema($current['SCHEMA_NAME'], true)) {
             $tr_class .= ' noclick';
         }
         echo '<tr class="' . $tr_class . '">' . "\n";
diff --git a/server_plugins.php b/server_plugins.php
new file mode 100644
index 0000000..ee096f8
--- /dev/null
+++ b/server_plugins.php
@@ -0,0 +1,208 @@
+<?php
+/* vim: set expandtab sw=4 ts=4 sts=4: */
+/**
+ *
+ * @package phpMyAdmin
+ */
+
+/**
+ * no need for variables importing
+ * @ignore
+ */
+if (! defined('PMA_NO_VARIABLES_IMPORT')) {
+    define('PMA_NO_VARIABLES_IMPORT', true);
+}
+
+/**
+ * requirements
+ */
+require_once './libraries/common.inc.php';
+
+/**
+ * JS includes
+ */
+$GLOBALS['js_include'][] = 'jquery/jquery-ui-1.8.custom.js';
+$GLOBALS['js_include'][] = 'jquery/jquery.cookie.js';
+$GLOBALS['js_include'][] = 'jquery/jquery.tablesorter.js';
+$GLOBALS['js_include'][] = 'server_plugins.js';
+
+/**
+ * Does the common work
+ */
+require './libraries/server_common.inc.php';
+
+
+/**
+ * Displays the links
+ */
+require './libraries/server_links.inc.php';
+
+/**
+ * Displays the sub-page heading
+ */
+echo '<h2>' . "\n"
+   . ($GLOBALS['cfg']['MainPageIconic']
+        ? '<img class="icon" src="' . $pmaThemeImage . 'b_engine.png"'
+            .' width="16" height="16" alt="" />' : '')
+   . "\n" . __('Plugins') . "\n"
+   . '</h2>' . "\n";
+
+/**
+ * Prepare plugin list
+ */
+$sql = "SELECT p.plugin_name, p.plugin_type, p.is_active, m.module_name, m.module_library,
+        m.module_version, m.module_author, m.module_description, m.module_license
+    FROM data_dictionary.plugins p
+        JOIN data_dictionary.modules m USING (module_name)
+    ORDER BY m.module_name, p.plugin_type, p.plugin_name";
+$res = PMA_DBI_query($sql);
+$plugins = array();
+$modules = array();
+while ($row = PMA_DBI_fetch_assoc($res)) {
+    $plugins[$row['plugin_type']][] = $row;
+    $modules[$row['module_name']]['info'] = $row;
+    $modules[$row['module_name']]['plugins'][$row['plugin_type']][] = $row;
+}
+PMA_DBI_free_result($res);
+
+// sort plugin list (modules are already sorted)
+ksort($plugins);
+
+/**
+ * Displays the page
+ */
+?>
+<script type="text/javascript">
+pma_theme_image = '<?php echo $GLOBALS['pmaThemeImage']; ?>';
+</script>
+<div id="pluginsTabs">
+    <ul>
+        <li><a href="#plugins_plugins"><?php echo __('Plugins'); ?></a></li>
+        <li><a href="#plugins_modules"><?php echo __('Modules'); ?></a></li>
+    </ul>
+
+    <div id="plugins_plugins">
+        <div id="sectionlinks">
+        <?php
+        foreach ($plugins as $plugin_type => $plugin_list) {
+            $key = 'plugins-' . preg_replace('/[^a-z]/', '', strtolower($plugin_type));
+            echo '<a href="#' . $key . '">' . htmlspecialchars($plugin_type) . '</a>' . "\n";
+        }
+        ?>
+        </div>
+        <br />
+        <?php
+        foreach ($plugins as $plugin_type => $plugin_list) {
+            $key = 'plugins-' . preg_replace('/[^a-z]/', '', strtolower($plugin_type));
+            sort($plugin_list);
+            ?>
+            <table class="data_full_width" id="<?php echo $key; ?>">
+            <caption class="tblHeaders">
+                <a class="top" href="#serverinfo"><?php
+                    echo __('Begin');
+                    echo $GLOBALS['cfg']['MainPageIconic']
+                        ? '<img src="' . $GLOBALS['pmaThemeImage'] .
+                            's_asc.png" width="11" height="9" align="middle" alt="" />'
+                        : ''; ?></a>
+                <?php echo htmlspecialchars($plugin_type); ?>
+            </caption>
+            <thead>
+                <tr>
+                    <th><?php echo __('Plugin'); ?></th>
+                    <th><?php echo __('Module'); ?></th>
+                    <th><?php echo __('Library'); ?></th>
+                    <th><?php echo __('Version'); ?></th>
+                    <th><?php echo __('Author'); ?></th>
+                    <th><?php echo __('License'); ?></th>
+                </tr>
+            </thead>
+            <tbody>
+            <?php
+            $odd_row = false;
+            foreach ($plugin_list as $plugin) {
+                $odd_row = !$odd_row;
+            ?>
+            <tr class="noclick <?php echo $odd_row ? 'odd' : 'even'; ?>">
+                <th><?php echo htmlspecialchars($plugin['plugin_name']); ?></th>
+                <td><?php echo htmlspecialchars($plugin['module_name']); ?></td>
+                <td><?php echo htmlspecialchars($plugin['module_library']); ?></td>
+                <td><?php echo htmlspecialchars($plugin['module_version']); ?></td>
+                <td><?php echo htmlspecialchars($plugin['module_author']); ?></td>
+                <td><?php echo htmlspecialchars($plugin['module_license']); ?></td>
+            </tr>
+            <?php
+            }
+            ?>
+            </tbody>
+            </table>
+            <?php
+        }
+        ?>
+    </div>
+    <div id="plugins_modules">
+        <table class="data_full_width">
+        <thead>
+            <tr>
+                <th><?php echo __('Module'); ?></th>
+                <th><?php echo __('Description'); ?></th>
+                <th><?php echo __('Library'); ?></th>
+                <th><?php echo __('Version'); ?></th>
+                <th><?php echo __('Author'); ?></th>
+                <th><?php echo __('License'); ?></th>
+            </tr>
+        </thead>
+        <tbody>
+        <?php
+        $odd_row = false;
+        foreach ($modules as $module_name => $module) {
+            $odd_row = !$odd_row;
+        ?>
+            <tr class="noclick <?php echo $odd_row ? 'odd' : 'even'; ?>">
+                <th rowspan="2"><?php echo htmlspecialchars($module_name); ?></th>
+                <td><?php echo htmlspecialchars($module['info']['module_description']); ?></td>
+                <td><?php echo htmlspecialchars($module['info']['module_library']); ?></td>
+                <td><?php echo htmlspecialchars($module['info']['module_version']); ?></td>
+                <td><?php echo htmlspecialchars($module['info']['module_author']); ?></td>
+                <td><?php echo htmlspecialchars($module['info']['module_license']); ?></td>
+            </tr>
+            <tr class="noclick <?php echo $odd_row ? 'odd' : 'even'; ?>">
+                <td colspan="5">
+                    <table>
+                        <tbody>
+                        <?php
+                        foreach ($module['plugins'] as $plugin_type => $plugin_list) {
+                        ?>
+                            <tr class="noclick">
+                                <td><b class="plugin-type"><?php echo htmlspecialchars($plugin_type); ?></b></td>
+                                <td>
+                                <?php
+                                for ($i = 0; $i < count($plugin_list); $i++) {
+                                    echo ($i != 0 ? '<br />' : '') . htmlspecialchars($plugin_list[$i]['plugin_name']);
+                                    if (!$plugin_list[$i]['is_active']) {
+                                        echo ' <small class="attention">' . __('disabled') . '</small>';
+                                    }
+                                }
+                                ?>
+                                </td>
+                            </tr>
+                        <?php
+                        }
+                        ?>
+                        </tbody>
+                    </table>
+                </td>
+            </tr>
+        <?php
+        }
+        ?>
+        </tbody>
+        </table>
+    </div>
+</div>
+<?php
+/**
+ * Sends the footer
+ */
+require './libraries/footer.inc.php';
+
+?>
diff --git a/server_privileges.php b/server_privileges.php
index 685b817..2735de9 100644
--- a/server_privileges.php
+++ b/server_privileges.php
@@ -750,7 +750,7 @@ function PMA_displayPrivTable($db = '*', $table = '*', $submit = true)
 function PMA_displayLoginInformationFields($mode = 'new')
 {
     // Get user/host name lengths
-    $fields_info = PMA_DBI_get_columns('mysql', 'user', true);
+    $fields_info = PMA_DBI_get_columns('mysql', 'user', null, true);
     $username_length = 16;
     $hostname_length = 41;
     foreach ($fields_info as $val) {
diff --git a/server_replication.php b/server_replication.php
index c2fa555..59d72f7 100644
--- a/server_replication.php
+++ b/server_replication.php
@@ -113,7 +113,7 @@ if (isset($GLOBALS['sr_take_action'])) {
 
         $tmp_alldbs = PMA_DBI_query('SHOW DATABASES;', $src_link);
         while ($tmp_row = PMA_DBI_fetch_row($tmp_alldbs)) {
-            if ($tmp_row[0] == 'information_schema') {
+            if (PMA_is_system_schema($tmp_row[0])) {
                 continue;
             }
             if (count($do_db) == 0) {
diff --git a/server_status.php b/server_status.php
index 803b76c..66244c2 100644
--- a/server_status.php
+++ b/server_status.php
@@ -48,10 +48,21 @@ if (isset($_REQUEST['ajax_request']) && $_REQUEST['ajax_request'] == true) {
 
         // Query realtime chart
         case 'queries':
-            $queries = PMA_DBI_fetch_result(
-                "SHOW GLOBAL STATUS
-                WHERE (Variable_name LIKE 'Com_%' OR Variable_name = 'Questions')
-                    AND Value > 0'", 0, 1);
+                if (PMA_DRIZZLE) {
+                    $sql = "SELECT concat('Com_', variable_name), variable_value
+                        FROM data_dictionary.GLOBAL_STATEMENTS
+                        WHERE variable_value > 0
+                          UNION
+                        SELECT variable_name, variable_value
+                        FROM data_dictionary.GLOBAL_STATUS
+                        WHERE variable_name = 'Questions'";
+                    $queries = PMA_DBI_fetch_result($sql, 0, 1);
+                } else {
+                    $queries = PMA_DBI_fetch_result(
+                        "SHOW GLOBAL STATUS
+                        WHERE (Variable_name LIKE 'Com_%' OR Variable_name = 'Questions')
+                            AND Value > 0'", 0, 1);
+                }
             cleanDeprecated($queries);
             // admin commands are not queries
             unset($queries['Com_admin_commands']);
@@ -389,8 +400,13 @@ if (isset($_REQUEST['ajax_request']) && $_REQUEST['ajax_request'] == true) {
 /**
  * Replication library
  */
-require './libraries/replication.inc.php';
-require_once './libraries/replication_gui.lib.php';
+if (PMA_DRIZZLE) {
+    $server_master_status = false;
+    $server_slave_status = false;
+} else {
+    require './libraries/replication.inc.php';
+    require_once './libraries/replication_gui.lib.php';
+}
 
 /**
  * JS Includes
@@ -445,6 +461,13 @@ if (!empty($_REQUEST['kill'])) {
  * get status from server
  */
 $server_status = PMA_DBI_fetch_result('SHOW GLOBAL STATUS', 0, 1);
+if (PMA_DRIZZLE) {
+    // Drizzle doesn't put query statistics into variables, add it
+    $sql = "SELECT concat('Com_', variable_name), variable_value
+        FROM data_dictionary.GLOBAL_STATEMENTS";
+    $statements = PMA_DBI_fetch_result($sql, 0, 1);
+    $server_status = array_merge($server_status, $statements);
+}
 
 /**
  * for some calculations we require also some server settings
@@ -568,6 +591,7 @@ $sections = array(
     'tc'            => __('Transaction coordinator'),
     'files'         => __('Files'),
     'ssl'           => 'SSL',
+    'other'         => __('Other')
 );
 
 /**
@@ -617,24 +641,34 @@ $links['innodb'][__('InnoDB Status')]
 $links['innodb']['doc'] = 'innodb';
 
 
-// Variable to contain all com_ variables
+// Variable to contain all com_ variables (query statistics)
 $used_queries = array();
 
 // Variable to map variable names to their respective section name
 // (used for js category filtering)
 $allocationMap = array();
 
+// Variable to mark used sections
+$categoryUsed = array();
+
 // sort vars into arrays
 foreach ($server_status as $name => $value) {
+    $section_found = false;
     foreach ($allocations as $filter => $section) {
         if (strpos($name, $filter) !== false) {
             $allocationMap[$name] = $section;
+            $categoryUsed[$section] = true;
+            $section_found = true;
             if ($section == 'com' && $value > 0) {
                 $used_queries[$name] = $value;
             }
             break; // Only exits inner loop
         }
     }
+    if (!$section_found) {
+        $allocationMap[$name] = 'other';
+        $categoryUsed['other'] = true;
+    }
 }
 
 if(PMA_DRIZZLE) {
@@ -807,11 +841,12 @@ echo __('Runtime Information');
                         <option value=''><?php echo __('Filter by category...'); ?></option>
                 <?php
                         foreach ($sections as $section_id => $section_name) {
+                            if (isset($categoryUsed[$section_id])) {
                 ?>
-                            <option value='<?php echo $section_id; ?>'><?php echo $section_name; ?></option>
+                                <option value='<?php echo $section_id; ?>'><?php echo $section_name; ?></option>
                 <?php
+                            }
                         }
-
                 ?>
                     </select>
                 </div>
@@ -1153,14 +1188,30 @@ function printServerTraffic()
 
     $url_params = array();
 
-    if (! empty($_REQUEST['full'])) {
-        $sql_query = 'SHOW FULL PROCESSLIST';
+    $show_full_sql = !empty($_REQUEST['full']);
+    if ($show_full_sql) {
         $url_params['full'] = 1;
         $full_text_link = 'server_status.php' . PMA_generate_common_url(array(), 'html', '?');
     } else {
-        $sql_query = 'SHOW PROCESSLIST';
         $full_text_link = 'server_status.php' . PMA_generate_common_url(array('full' => 1));
     }
+    if (PMA_DRIZZLE) {
+        $sql_query = "SELECT
+                p.id       AS Id,
+                p.username AS User,
+                p.host     AS Host,
+                p.db       AS db,
+                p.command  AS Command,
+                p.time     AS Time,
+                p.state    AS State,
+                " . ($show_full_sql ? 's.query' : 'left(p.info, ' . (int)$GLOBALS['cfg']['MaxCharactersInDisplayedSQL'] . ')') . " AS Info
+            FROM data_dictionary.PROCESSLIST p
+                " . ($show_full_sql ? 'LEFT JOIN data_dictionary.SESSIONS s ON s.session_id = p.id' : '');
+    } else {
+        $sql_query = $show_full_sql
+            ? 'SHOW FULL PROCESSLIST'
+            : 'SHOW PROCESSLIST';
+    }
     $result = PMA_DBI_query($sql_query);
 
     /**
@@ -1182,11 +1233,11 @@ function printServerTraffic()
             echo __('SQL query');
             if (! PMA_DRIZZLE) {
                 ?>
-                <a href="<?php echo $full_text_link; ?>"
-                    title="<?php echo empty($full) ? __('Show Full Queries') : __('Truncate Shown Queries'); ?>">
-                    <img src="<?php echo $GLOBALS['pmaThemeImage'] . 's_' . (empty($_REQUEST['full']) ? 'full' : 'partial'); ?>text.png"
-                    alt="<?php echo empty($_REQUEST['full']) ? __('Show Full Queries') : __('Truncate Shown Queries'); ?>" />
-                </a>
+            <a href="<?php echo $full_text_link; ?>"
+                title="<?php echo $show_full_sql ? __('Truncate Shown Queries') : __('Show Full Queries'); ?>">
+                <img src="<?php echo $GLOBALS['pmaThemeImage'] . 's_' . ($show_full_sql ? 'partial' : 'full'); ?>text.png"
+                alt="<?php echo $show_full_sql ? __('Truncate Shown Queries') : __('Show Full Queries'); ?>" />
+            </a>
             <?php } ?>
         </th>
     </tr>
@@ -1195,15 +1246,6 @@ function printServerTraffic()
     <?php
     $odd_row = true;
     while ($process = PMA_DBI_fetch_assoc($result)) {
-        if (PMA_DRIZZLE) {
-            // Drizzle uses uppercase keys
-            foreach ($process as $k => $v) {
-                $k = $k !== 'DB'
-                    ? ucfirst(strtolower($k))
-                    : 'db';
-                $process[$k] = $v;
-            }
-        }
         $url_params['kill'] = $process['Id'];
         $kill_process = 'server_status.php' . PMA_generate_common_url($url_params);
         ?>
@@ -1221,7 +1263,7 @@ function printServerTraffic()
         if (empty($process['Info'])) {
             echo '---';
         } else {
-            if (empty($_REQUEST['full']) && strlen($process['Info']) > $GLOBALS['cfg']['MaxCharactersInDisplayedSQL']) {
+            if (!$show_full_sql && strlen($process['Info']) > $GLOBALS['cfg']['MaxCharactersInDisplayedSQL']) {
                 echo htmlspecialchars(substr($process['Info'], 0, $GLOBALS['cfg']['MaxCharactersInDisplayedSQL'])) . '[...]';
             } else {
                 echo PMA_SQP_formatHtml(PMA_SQP_parse($process['Info']));
@@ -1392,20 +1434,20 @@ function printVariablesTable()
         'Table_locks_waited' => 0,
         'Qcache_lowmem_prunes' => 0,
 
-        'Qcache_free_blocks' => $server_status['Qcache_total_blocks'] / 5,
+        'Qcache_free_blocks' => isset($server_status['Qcache_total_blocks']) ? $server_status['Qcache_total_blocks'] / 5 : 0,
         'Slow_launch_threads' => 0,
 
         // depends on Key_read_requests
         // normaly lower then 1:0.01
-        'Key_reads' => (0.01 * $server_status['Key_read_requests']),
+        'Key_reads' => isset($server_status['Key_read_requests']) ? (0.01 * $server_status['Key_read_requests']) : 0,
         // depends on Key_write_requests
         // normaly nearly 1:1
-        'Key_writes' => (0.9 * $server_status['Key_write_requests']),
+        'Key_writes' => isset($server_status['Key_write_requests']) ? (0.9 * $server_status['Key_write_requests']) : 0,
 
         'Key_buffer_fraction' => 0.5,
 
         // alert if more than 95% of thread cache is in use
-        'Threads_cached' => 0.95 * $server_variables['thread_cache_size']
+        'Threads_cached' => isset($server_variables['thread_cache_size']) ? 0.95 * $server_variables['thread_cache_size'] : 0
 
         // higher is better
         // variable => min value
@@ -1501,10 +1543,12 @@ function printMonitor()
             <img src="themes/dot.gif" class="icon ic_s_cog" alt="" />
             <?php echo __('Settings'); ?>
         </a>
+        <?php if (!PMA_DRIZZLE) { ?>
         <a href="#monitorInstructionsDialog">
             <img src="themes/dot.gif" class="icon ic_b_help" alt="" />
             <?php echo __('Instructions/Setup'); ?>
         </a>
+        <?php } ?>
         <a href="#endChartEditMode" style="display:none;">
             <img src="themes/dot.gif" class="icon ic_s_okay" alt="" />
             <?php echo __('Done rearranging/editing charts'); ?>
@@ -1649,6 +1693,7 @@ function printMonitor()
     <div id="emptyDialog" title="Dialog" style="display:none;">
     </div>
 
+    <?php if (!PMA_DRIZZLE) { ?>
     <div id="logAnalyseDialog" title="<?php echo __('Log statistics'); ?>" style="display:none;">
         <p> <?php echo __('Selected time range:'); ?>
         <input type="text" name="dateStart" class="datetimefield" value="" /> -
@@ -1677,6 +1722,7 @@ function printMonitor()
         <p></p>
         <div class="placeHolder"></div>
     </div>
+    <?php } ?>
 
     <table border="0" class="clearfloat" id="chartGrid">
 
diff --git a/server_synchronize.php b/server_synchronize.php
index 9ba41b7..8057f89 100644
--- a/server_synchronize.php
+++ b/server_synchronize.php
@@ -117,6 +117,8 @@ if ((isset($_REQUEST['submit_connect']))) {
                 ${"{$con}_link"} = null;
             }
             ${"{$con}_db_selected"} = PMA_DBI_select_db(${"{$con}_db"}, ${"{$con}_link"});
+            ${"{$con}_version"} = PMA_DBI_fetch_value('SELECT VERSION()', 0, 0, ${"{$con}_link"});
+            ${"{$con}_is_drizzle"} = (bool)preg_match('/\d{4}\./', ${"{$con}_version"});
         } // end foreach ($cons as $con)
 
         if (($src_db_selected != 1) || ($trg_db_selected != 1)) {
@@ -1015,19 +1017,25 @@ if (isset($_REQUEST['synchronize_db'])) {
     * connecting the source and target servers
     */
     if ('cur' != $_SESSION['src_type']) {
-        $src_link = PMA_DBI_connect($src_username, $src_password,
-            $is_controluser = false, $_SESSION['src_server']);
+        $src_link = PMA_DBI_connect($src_username, $src_password, $is_controluser = false, $_SESSION['src_server']);
+        $src_version = PMA_DBI_fetch_value('SELECT VERSION()', 0, 0, $src_link);
+        $src_is_drizzle = (bool)preg_match('/\d{4}\./', $src_version);
     } else {
         $src_link = $GLOBALS['userlink'];
+        $src_version = PMA_MYSQL_STR_VERSION;
+        $src_is_drizzle = PMA_DRIZZLE;
         // working on current server, so initialize this for tracking
         // (does not work if user defined current server as a remote one)
         $GLOBALS['db'] = $_SESSION['src_db'];
     }
     if ('cur' != $_SESSION['trg_type']) {
-        $trg_link = PMA_DBI_connect($trg_username, $trg_password,
-            $is_controluser = false, $_SESSION['trg_server']);
+        $trg_link = PMA_DBI_connect($trg_username, $trg_password, $is_controluser = false, $_SESSION['trg_server']);
+        $trg_version = PMA_DBI_fetch_value('SELECT VERSION()', 0, 0, $trg_link);
+        $trg_is_drizzle = (bool)preg_match('/\d{4}\./', $trg_version);
     } else {
         $trg_link = $GLOBALS['userlink'];
+        $trg_version = PMA_MYSQL_STR_VERSION;
+        $trg_is_drizzle = PMA_DRIZZLE;
         // working on current server, so initialize this for tracking
         $GLOBALS['db'] = $_SESSION['trg_db'];
     }
@@ -1191,6 +1199,7 @@ if (! isset($_REQUEST['submit_connect'])
         }
         echo '>' .  __('Current connection') . '</option>';
 
+        $loaded_dbi = $GLOBALS['cfg']['Server']['extension'];
         foreach ($GLOBALS['cfg']['Servers'] as $key => $tmp_server) {
             if (empty($tmp_server['host']) && empty($tmp_server['socket'])) {
                 continue;
@@ -1204,20 +1213,30 @@ if (! isset($_REQUEST['submit_connect'])
                     $label .= ':' . $tmp_server['port'];
                 }
             }
-            $value = $tmp_server['host'];
-            $value .= '||||';
-            if (empty($tmp_server['port']) && empty($tmp_server['socket'])) {
-                $value .= '3306';
+
+            if ($loaded_dbi == 'drizzle' && $tmp_server['extension'] != 'drizzle'
+                    || $loaded_dbi != 'drizzle' && $tmp_server['extension'] == 'drizzle') {
+                // incompatible connection protocols
+                $disabled = ' disabled="disabled"';
+                $value = '';
             } else {
-                $value .= $tmp_server['port'];
+                $disabled = '';
+                $value = $tmp_server['host'];
+                $value .= '||||';
+                if (empty($tmp_server['port']) && empty($tmp_server['socket'])) {
+                    $value .= '3306';
+                } else {
+                    $value .= $tmp_server['port'];
+                }
+                $value .= '||||';
+                $value .= $tmp_server['socket'];
+                $value .= '||||';
+                $value .= $tmp_server['user'];
+                $value .= '||||';
+                $value .= $tmp_server['only_db'];
             }
-            $value .= '||||';
-            $value .= $tmp_server['socket'];
-            $value .= '||||';
-            $value .= $tmp_server['user'];
-            $value .= '||||';
-            $value .= $tmp_server['only_db'];
-            echo '<option value="' . $value . '" >'
+
+            echo '<option value="' . $value . '"' . $disabled . '>'
                 . sprintf(__('Configuration: %s'), htmlspecialchars($label)) . '</option>';
         } // end foreach
 ?>
@@ -1255,6 +1274,9 @@ if (! isset($_REQUEST['submit_connect'])
       // these unset() do not complain if the elements do not exist
     unset($databases['mysql']);
     unset($databases['information_schema']);
+    if (PMA_DRIZZLE) {
+        unset($databases['data_dictionary']);
+    }
 
     if (count($databases) == 0) {
         echo __('No databases');
diff --git a/sql.php b/sql.php
index e2d956d..715f7f2 100644
--- a/sql.php
+++ b/sql.php
@@ -121,7 +121,7 @@ if (isset($_REQUEST['get_relational_values']) && $_REQUEST['get_relational_value
  * Logic taken from libraries/display_tbl_lib.php
  */
 if (isset($_REQUEST['get_enum_values']) && $_REQUEST['get_enum_values'] == true) {
-    $field_info_query = 'SHOW FIELDS FROM `' . $db . '`.`' . $table . '` LIKE \'' . $_REQUEST['column'] . '\' ;';
+    $field_info_query = PMA_DBI_get_columns_sql($db, $table, $_REQUEST['column']);
 
     $field_info_result = PMA_DBI_fetch_result($field_info_query, null, null, null, PMA_DBI_QUERY_STORE);
 
@@ -148,7 +148,7 @@ if (isset($_REQUEST['get_enum_values']) && $_REQUEST['get_enum_values'] == true)
  * Find possible values for set fields during grid edit.
  */
 if (isset($_REQUEST['get_set_values']) && $_REQUEST['get_set_values'] == true) {
-    $field_info_query = 'SHOW FIELDS FROM `' . $db . '`.`' . $table . '` LIKE \'' . $_REQUEST['column'] . '\' ;';
+    $field_info_query = PMA_DBI_get_columns_sql($db, $table, $_REQUEST['column']);
 
     $field_info_result = PMA_DBI_fetch_result($field_info_query, null, null, null, PMA_DBI_QUERY_STORE);
 
@@ -795,7 +795,7 @@ else {
         }
 
         // hide edit and delete links for information_schema
-        if ($db == 'information_schema') {
+        if (PMA_is_system_schema($db)) {
             $disp_mode = 'nnnn110111';
         }
         
@@ -907,7 +907,7 @@ $(document).ready(makeProfilingChart);
     }
 
     // hide edit and delete links for information_schema
-    if ($db == 'information_schema') {
+    if (PMA_is_system_schema($db)) {
         $disp_mode = 'nnnn110111';
     }
 
diff --git a/tbl_alter.php b/tbl_alter.php
index 6c46c9f..a76af59 100644
--- a/tbl_alter.php
+++ b/tbl_alter.php
@ + b/tbl_alter.php  9 100644  l_alter.php  mation_schema   a  y, null, null, null, PMA_DBI_QUERY_STORE);  '\' ;';  ;  e'] : 0  text.png"    BLE','RENAME TABLE','DROP TABLE','CREATE INDEX','DROP INDEX','CREATE VIEW','ALTER VIEW','DROP VIEW') default NULL,  the query cache for a long time). Carefully adjusting {query_cache_min_res_unit} to a lower value might help too, e.g. you can set it to the average size of your queries in the cache using this formula: (query_cache_size - qcache_free_memory) / qcache_queries_in_cache  à!     @d‡âÿ  °d‡âÿ  HÞjrI+          €[‡âÿ         ’BnqI+          †`nqI+  @d‡âÿ  `BnqI+  d‡âÿ  pd‡âÿ  hd‡âÿ  8kqI+  Œp˜        °d‡âÿ  uJnqI+  €joqI+                  €[‡âÿ         PZ‡âÿ  k`nqI+          G       H   I       J   K           M   N   O       P   @d‡âÿ  °d‡âÿ  H•ArI+           ]‡âÿ         ’BnqI+          †`nqI+  @d‡âÿ         0ïrI+  uJnqI+    ‹rI+   ÉrI+    ïrI+  ØïrI+  ¨	ïrI+  €joqI+          H•ArI+           ]‡âÿ         `[‡âÿ  k`nqI+  8•ArI+           ]‡âÿ         [‡âÿ  k`nqI+  (•ArI+           ]‡âÿ         À[‡âÿ  k`nqI+  •ArI+           ]‡âÿ         ð[‡âÿ  k`nqI+  	       ¨ïrI+  uJnqI+         ¨	ïrI+  pV‡âÿ          ŠrI+  eInqI+         ØïrI+  \‡âÿ          yrI+  eInqI+           ïrI+  À\‡âÿ          ZrI+  eInqI+  ØÄrI+    ‹rI+   ÉrI+    ïrI+  Ø$‹rI+  ØïrI+  ¨	ïrI+  €joqI+          8kqI+                        êqI+  °d‡âÿ  p[rI+          p^‡âÿ          @]‡âÿ  k`nqI+      5   6   7   8   :   <   =   >       ?       @   B   D       @d‡âÿ  °d‡âÿ  àçqI+                 °d‡âÿ  uJnqI+         eqI+  ð\‡âÿ          êqI+  eInqI+  eqI+          Õ_ at fÆS         Qöl±íÁ£¶qI+  °d‡âÿ  àçqI+          €_‡âÿ         P^‡âÿ  k`nqI+  u]ÞÓ	4Q ÷U^Qʉ§ ¶uª¹ñìò*Ä“v@d‡âÿ  °d‡âÿ  HÞ³qI+          $ðqI+          ðe‡âÿ  ¦0RsI+  ¦0RsI+         víqI+  d‡âÿ  °e‡âÿ  hd‡âÿ  Ð`‡âÿ  /‹rI+  uJnqI+  Ø$‹rI+  0g‡âÿ  ¢0RsI+   f‡âÿ          a‡âÿ                 ÿÿÿÿÿÿÿÿ¢0RsI+          ¸d‡âÿ                 @ -170,12 +170,7 @@ if ($abort == false) {
      * @todo optimize in case of multiple fields to modify
      */
     for ($i = 0; $i < $selected_cnt; $i++) {
-        $_REQUEST['field'] = PMA_sqlAddSlashes($selected[$i], true);
-        $result        = PMA_DRIZZLE
-            ? PMA_DBI_query('SHOW COLUMNS FROM ' . PMA_backquote($table) . ' FROM ' . PMA_backquote($db) . ' WHERE Field = \'' . $_REQUEST['field'] . '\';')
-            : PMA_DBI_query('SHOW FULL COLUMNS FROM ' . PMA_backquote($table) . ' FROM ' . PMA_backquote($db) . ' LIKE \'' . $_REQUEST['field'] . '\';');
-        $fields_meta[] = PMA_DBI_fetch_assoc($result);
-        PMA_DBI_free_result($result);
+        $fields_meta[] = PMA_DBI_get_columns($db, $table, $selected[$i], true);
     }
     $num_fields  = count($fields_meta);
     $action      = 'tbl_alter.php';
@@ -184,14 +179,14 @@ if ($abort == false) {
     // For now, this is done to obtain MySQL 4.1.2+ new TIMESTAMP options
     // and to know when there is an empty DEFAULT value.
     // Later, if the analyser returns more information, it
-    // could be executed to replace the info given by SHOW FULL FIELDS FROM.
+    // could be executed to replace the info given by SHOW FULL COLUMNS FROM.
     /**
      * @todo put this code into a require()
      * or maybe make it part of PMA_DBI_get_fields();
      */
 
     // We also need this to correctly learn if a TIMESTAMP is NOT NULL, since
-    // SHOW FULL FIELDS says NULL and SHOW CREATE TABLE says NOT NULL (tested
+    // SHOW FULL COLUMNS says NULL and SHOW CREATE TABLE says NOT NULL (tested
     // in MySQL 4.0.25).
 
     $show_create_table = PMA_DBI_fetch_value('SHOW CREATE TABLE ' . PMA_backquote($db) . '.' . PMA_backquote($table), 0, 1);
diff --git a/tbl_change.php b/tbl_change.php
index e7011eb..0a3e54d 100644
--- a/tbl_change.php
+++ b/tbl_change.php
@@ -20,7 +20,11 @@ require_once './libraries/common.lib.php';
 require_once './libraries/db_table_exists.lib.php';
 
 // load additional configuration variables
-require_once './libraries/data_mysql.inc.php';
+if (PMA_DRIZZLE) {
+    require_once './libraries/data_drizzle.inc.php';
+} else {
+    require_once './libraries/data_mysql.inc.php';
+}
 
 /**
  * Sets global variables.
diff --git a/tbl_operations.php b/tbl_operations.php
index 3e536c2..38ecc50 100644
--- a/tbl_operations.php
+++ b/tbl_operations.php
@@ -633,7 +633,7 @@ if ($is_myisam_or_aria || $is_innodb || $is_berkeleydb) {
     </li>
         <?php
     }
-    if ($is_myisam_or_aria) {
+    if ($is_myisam_or_aria && !PMA_DRIZZLE) {
         $this_url_params = array_merge($url_params,
             array(
                 'sql_query' => 'REPAIR TABLE ' . PMA_backquote($GLOBALS['table']),
@@ -646,7 +646,7 @@ if ($is_myisam_or_aria || $is_innodb || $is_berkeleydb) {
     </li>
         <?php
     }
-    if ($is_myisam_or_aria || $is_innodb || $is_berkeleydb) {
+    if (($is_myisam_or_aria || $is_innodb || $is_berkeleydb) && !PMA_DRIZZLE) {
         $this_url_params = array_merge($url_params,
             array(
                 'sql_query' => 'OPTIMIZE TABLE ' . PMA_backquote($GLOBALS['table']),
diff --git a/tbl_printview.php b/tbl_printview.php
index 9489c74..76d4e73 100644
--- a/tbl_printview.php
+++ b/tbl_printview.php
@@ -166,7 +166,7 @@ foreach ($the_tables as $key => $table) {
         }
         $field_name = htmlspecialchars($row['Field']);
 
-        // here, we have a TIMESTAMP that SHOW FULL FIELDS reports as having the
+        // here, we have a TIMESTAMP that SHOW FULL COLUMNS reports as having the
         // NULL attribute, but SHOW CREATE TABLE says the contrary. Believe
         // the latter.
         /**
@@ -225,7 +225,7 @@ foreach ($the_tables as $key => $table) {
 </tbody>
 </table>
     <?php
-    if (! $tbl_is_view && $db != 'information_schema') {
+    if (! $tbl_is_view && !PMA_is_system_schema($db)) {
         /**
          * Displays indexes
          */
diff --git a/tbl_structure.php b/tbl_structure.php
index bbaee89..6604ea2 100644
--- a/tbl_structure.php
+++ b/tbl_structure.php
@@ -123,17 +123,16 @@ foreach (PMA_Index::getFromTable($table, $db) as $index) {
 unset($index, $columns, $column_name, $dummy);
 
 // 3. Get fields
-$fields = PMA_DBI_get_columns($db, $table, true);
-$fields_cnt  = count($fields);
+$fields = (array) PMA_DBI_get_columns($db, $table, null, true);
 
 // Get more complete field information
 // For now, this is done just for MySQL 4.1.2+ new TIMESTAMP options
 // but later, if the analyser returns more information, it
 // could be executed for any MySQL version and replace
-// the info given by SHOW FULL FIELDS FROM.
+// the info given by SHOW FULL COLUMNS FROM.
 //
 // We also need this to correctly learn if a TIMESTAMP is NOT NULL, since
-// SHOW FULL FIELDS or INFORMATION_SCHEMA incorrectly says NULL
+// SHOW FULL COLUMNS or INFORMATION_SCHEMA incorrectly says NULL
 // and SHOW CREATE TABLE says NOT NULL (tested
 // in MySQL 4.0.25 and 5.0.21, http://bugs.mysql.com/20910).
 
@@ -302,7 +301,7 @@ foreach ($fields as $row) {
         $attribute = 'on update CURRENT_TIMESTAMP';
     }
 
-    // here, we have a TIMESTAMP that SHOW FULL FIELDS reports as having the
+    // here, we have a TIMESTAMP that SHOW FULL COLUMNS reports as having the
     // NULL attribute, but SHOW CREATE TABLE says the contrary. Believe
     // the latter.
     if (!empty($analyzed_sql[0]['create_table_fields'][$row['Field']]['type']) && $analyzed_sql[0]['create_table_fields'][$row['Field']]['type'] == 'TIMESTAMP' && $analyzed_sql[0]['create_table_fields'][$row['Field']]['timestamp_not_null']) {
@@ -508,18 +507,19 @@ foreach ($fields as $row) {
                      }
                   } ?>
             </div>
-            <div class="action_spatial">
-               <?php
+	        <?php if (!PMA_DRIZZLE) { ?>
+	        <div class="action_spatial">
+                <?php
                 if (isset($spatial_enabled)) {
-                     if ($spatial_enabled) { ?>
-                         <a href="sql.php?<?php echo $url_query; ?>&sql_query=<?php echo urlencode('ALTER TABLE ' . PMA_backquote($table) . ' ADD SPATIAL(' . PMA_backquote($row['Field']) . ')'); ?>&message_to_show=<?php echo urlencode(sprintf(__('An index has been added on %s'), htmlspecialchars($row['Field']))); ?>">
-                             <?php echo $hidden_titles['Spatial']; ?>
-                         </a>
-                     <?php
-                     } else {
-                         echo $hidden_titles['NoSpatial'];
-                     }
-                  } ?>
+                    if ($spatial_enabled) { ?>
+                        <a href="sql.php?<?php echo $url_query; ?>&sql_query=<?php echo urlencode('ALTER TABLE ' . PMA_backquote($table) . ' ADD SPATIAL(' . PMA_backquote($row['Field']) . ')'); ?>&message_to_show=<?php echo urlencode(sprintf(__('An index has been added on %s'), htmlspecialchars($row['Field']))); ?>">
+                            <?php echo $hidden_titles['Spatial']; ?>
+                        </a>
+                    <?php
+                    } else {
+                        echo $hidden_titles['NoSpatial'];
+                    }
+                } ?>
             </div>
             <div class="action_fulltext">
                 <?php
@@ -533,7 +533,8 @@ foreach ($fields as $row) {
                          echo $hidden_titles['NoIdxFulltext'];
                      }
                 } ?>
-             </div>
+            </div>
+            <?php } ?>
         </div>
     </td>
     <?php
@@ -621,12 +622,14 @@ if (! $tbl_is_view && ! $db_is_information_schema) {
         ?></a>
         <?php
     }
-    ?>
-<a href="sql.php?<?php echo $url_query; ?>&session_max_rows=all&sql_query=<?php echo urlencode('SELECT * FROM ' . PMA_backquote($table) . ' PROCEDURE ANALYSE()'); ?>"><?php
-    echo PMA_getIcon('b_tblanalyse.png', __('Propose table structure'));
-    ?></a><?php
-    echo PMA_showMySQLDocu('Extending_MySQL', 'procedure_analyse') . "\n";
 
+    if (!PMA_DRIZZLE) {
+        ?>
+<a href="sql.php?<?php echo $url_query; ?>&session_max_rows=all&sql_query=<?php echo urlencode('SELECT * FROM ' . PMA_backquote($table) . ' PROCEDURE ANALYSE()'); ?>"><?php
+        echo PMA_getIcon('b_tblanalyse.png', __('Propose table structure'));
+        ?></a><?php
+        echo PMA_showMySQLDocu('Extending_MySQL', 'procedure_analyse') . "\n";
+    }
 
     if (PMA_Tracker::isActive())
     {
@@ -676,9 +679,9 @@ if (! $tbl_is_view && ! $db_is_information_schema) {
  * If there are more than 20 rows, displays browse/select/insert/empty/drop
  * links again
  */
-if ($fields_cnt > 20) {
+if (count($fields) > 20) {
     require './libraries/tbl_links.inc.php';
-} // end if ($fields_cnt > 20)
+} // end if (count($fields) > 20)
 
 /**
  * Displays indexes
@@ -802,7 +805,7 @@ if ($cfg['ShowStats']) {
             <?php
         }
         // Optimize link if overhead
-        if (isset($free_size) && ($tbl_type == 'MYISAM' || $tbl_type == 'ARIA' || $tbl_type == 'MARIA' || $tbl_type == 'BDB')) {
+        if (isset($free_size) && !PMA_DRIZZLE && ($tbl_type == 'MYISAM' || $tbl_type == 'ARIA' || $tbl_type == 'MARIA' || $tbl_type == 'BDB')) {
             ?>
     <tr class="tblFooters">
         <td colspan="3" align="center">
diff --git a/themes/original/css/theme_right.css.php b/themes/original/css/theme_right.css.php
index badeb92..e247bcc 100644
--- a/themes/original/css/theme_right.css.php
+++ b/themes/original/css/theme_right.css.php
@@ -422,11 +422,11 @@ table [class=value] {
     font-family:        <?php echo $GLOBALS['cfg']['FontFamilyFixed']; ?>;
 }
 <?php } ?>
-.value .attention {
+.attention {
     color:              red;
     font-weight:        bold;
 }
-.value .allfine {
+.allfine {
     color:              green;
 }
 
@@ -2366,6 +2366,10 @@ span.CodeMirror-selected {
     padding: 1px 3px !important;
 }
 
+
+.data_full_width {
+    width: 100%;
+}
 .cHide {
     background: #D3DCE3 url(<?php echo $_SESSION['PMA_Theme']->getImgPath(); ?>col_hide.png);
     color: #CCC;
diff --git a/themes/pmahomme/css/theme_right.css.php b/themes/pmahomme/css/theme_right.css.php
index c52a973..b09ce1b 100644
--- a/themes/pmahomme/css/theme_right.css.php
+++ b/themes/pmahomme/css/theme_right.css.php
@@ -58,10 +58,15 @@ h2 img{display:none;}
 h2 a img{display:inline;}
 
 
-.data{
+.data,
+.data_full_width {
     margin: 0 0 12px 0;
 }
 
+.data_full_width {
+    width: 100%;
+}
+
 h3 {
     font-weight:        bold;
 }
@@ -586,7 +591,7 @@ table [class=value] {
     color:              red;
     font-weight:        bold;
 }
-.value .allfine {
+.allfine {
     color:              green;
 }
 


hooks/post-receive
-- 
phpMyAdmin




More information about the Git mailing list