List:Commits« Previous MessageNext Message »
From:Ole John Aske Date:April 11 2012 10:35am
Subject:bzr push into mysql-5.5-cluster-7.2-spj branch (ole.john.aske:3860 to 3861)
View as plain text  
 3861 Ole John Aske	2012-04-11 [merge]
      merge mysql-5.5-cluster-7.2 -> mysql-5.5-cluster-7.2-spj>

    modified:
      storage/ndb/include/util/Vector.hpp
      storage/ndb/memcache/extra/memcached/CMakeLists.txt
      storage/ndb/memcache/extra/memcached/config_tests.in
      storage/ndb/memcache/extra/memcached/daemon/memcached.c
      storage/ndb/memcache/include/Scheduler.h
      storage/ndb/memcache/include/ndb_engine.h
      storage/ndb/memcache/include/ndb_engine_errors.h
      storage/ndb/memcache/include/ndb_pipeline.h
      storage/ndb/memcache/include/ndbmemcache_config.in
      storage/ndb/memcache/src/ExternalValue.cc
      storage/ndb/memcache/src/ndb_engine.c
      storage/ndb/memcache/src/ndb_engine_errors.cc
      storage/ndb/memcache/src/ndb_error_logger.cc
      storage/ndb/memcache/src/ndb_pipeline.cc
      storage/ndb/memcache/src/ndb_worker.cc
      storage/ndb/memcache/src/schedulers/S_sched.cc
      storage/ndb/memcache/src/schedulers/S_sched.h
      storage/ndb/memcache/src/schedulers/Stockholm.cc
      storage/ndb/memcache/src/schedulers/Stockholm.h
      storage/ndb/memcache/unit/alloc.cc
      storage/ndb/src/ndbapi/NdbQueryBuilder.cpp
      storage/ndb/src/ndbapi/NdbQueryOperation.cpp
      storage/ndb/test/CMakeLists.txt
 3860 Jan Wedvik	2012-03-30 [merge]
      Merged from mysql-5.5-cluster-7.2.

    added:
      extra/yassl/certs/ca-key.pem
      extra/yassl/certs/client-keyEnc.pem
      extra/yassl/certs/client-keyEnc3.pem
      extra/yassl/certs/server-keyEnc.pem
      extra/yassl/taocrypt/certs/
      extra/yassl/taocrypt/certs/client-cert.der
      extra/yassl/taocrypt/certs/client-key.der
      extra/yassl/taocrypt/certs/dh1024.dat
      extra/yassl/taocrypt/certs/dsa512.der
      extra/yassl/taocrypt/include/hc128.hpp
      extra/yassl/taocrypt/include/rabbit.hpp
      extra/yassl/taocrypt/src/hc128.cpp
      extra/yassl/taocrypt/src/rabbit.cpp
      mysql-test/include/libdaemon_example.ini
      mysql-test/r/bug13633383.result
      mysql-test/suite/innodb/r/innodb-blob.result
      mysql-test/suite/innodb/r/innodb_bug11754376.result
      mysql-test/suite/innodb/r/innodb_bug12400341.result
      mysql-test/suite/innodb/r/innodb_bug13510739.result
      mysql-test/suite/innodb/t/innodb-blob.test
      mysql-test/suite/innodb/t/innodb_bug11754376.test
      mysql-test/suite/innodb/t/innodb_bug12400341-master.opt
      mysql-test/suite/innodb/t/innodb_bug12400341.test
      mysql-test/suite/innodb/t/innodb_bug13510739.test
      mysql-test/suite/ndb/backups/wl946_pre/
      mysql-test/suite/ndb/backups/wl946_pre/BACKUP-1-0.1.Data
      mysql-test/suite/ndb/backups/wl946_pre/BACKUP-1-0.2.Data
      mysql-test/suite/ndb/backups/wl946_pre/BACKUP-1.1.ctl
      mysql-test/suite/ndb/backups/wl946_pre/BACKUP-1.1.log
      mysql-test/suite/ndb/backups/wl946_pre/BACKUP-1.2.ctl
      mysql-test/suite/ndb/backups/wl946_pre/BACKUP-1.2.log
      mysql-test/suite/ndb/data/wl946_pre.dat
      mysql-test/suite/ndb/r/ndb_wl946_pre.result
      mysql-test/suite/ndb/t/ndb_wl946_create.inc
      mysql-test/suite/ndb/t/ndb_wl946_pre.test
      mysql-test/suite/ndb/t/ndb_wl946_pre_query.inc
      mysql-test/suite/ndb/t/show_indexes.inc
      mysql-test/suite/ndb_binlog/r/ndb_binlog_index.result
      mysql-test/suite/ndb_binlog/t/ndb_binlog_check_binlog_index.inc
      mysql-test/suite/ndb_binlog/t/ndb_binlog_index.test
      mysql-test/suite/ndb_binlog/t/ndb_binlog_index_test_schema_independent.inc
      mysql-test/suite/rpl/r/rpl_skip_ddl_errors_cli.result
      mysql-test/suite/rpl/r/rpl_start_stop_slave.result
      mysql-test/suite/rpl/t/rpl_skip_ddl_errors_cli-slave.opt
      mysql-test/suite/rpl/t/rpl_skip_ddl_errors_cli.test
      mysql-test/suite/rpl/t/rpl_start_stop_slave.test
      mysql-test/suite/sys_vars/r/innodb_change_buffering_debug_basic.result
      mysql-test/suite/sys_vars/r/innodb_trx_rseg_n_slots_debug_basic.result
      mysql-test/suite/sys_vars/r/stored_program_cache_basic.result
      mysql-test/suite/sys_vars/t/innodb_change_buffering_debug_basic.test
      mysql-test/suite/sys_vars/t/innodb_trx_rseg_n_slots_debug_basic.test
      mysql-test/suite/sys_vars/t/stored_program_cache_basic.test
      mysql-test/t/bug13633383.test
      storage/ndb/src/ndbjtie/com/mysql/ndbjtie/ndbapi/NDBAPIConst.java
    modified:
      .bzrignore
      CMakeLists.txt
      INSTALL-SOURCE
      INSTALL-WIN-SOURCE
      README
      VERSION
      client/CMakeLists.txt
      client/mysql_plugin.c
      client/mysql_upgrade.c
      client/mysqldump.c
      client/sql_string.cc
      cmake/build_configurations/mysql_release.cmake
      cmake/install_macros.cmake
      cmake/mysql_version.cmake
      cmake/package_name.cmake
      extra/yassl/INSTALL
      extra/yassl/README
      extra/yassl/certs/ca-cert.pem
      extra/yassl/certs/client-cert.der
      extra/yassl/certs/client-cert.pem
      extra/yassl/certs/client-key.der
      extra/yassl/certs/client-key.pem
      extra/yassl/certs/dsa-cert.pem
      extra/yassl/certs/dsa512.der
      extra/yassl/certs/server-cert.pem
      extra/yassl/certs/server-key.pem
      extra/yassl/certs/taoCert.txt
      extra/yassl/examples/client/client.cpp
      extra/yassl/examples/echoclient/echoclient.cpp
      extra/yassl/examples/echoserver/echoserver.cpp
      extra/yassl/examples/server/server.cpp
      extra/yassl/include/buffer.hpp
      extra/yassl/include/openssl/ssl.h
      extra/yassl/include/socket_wrapper.hpp
      extra/yassl/include/yassl_int.hpp
      extra/yassl/include/yassl_types.hpp
      extra/yassl/src/buffer.cpp
      extra/yassl/src/cert_wrapper.cpp
      extra/yassl/src/crypto_wrapper.cpp
      extra/yassl/src/handshake.cpp
      extra/yassl/src/make.bat*
      extra/yassl/src/socket_wrapper.cpp
      extra/yassl/src/ssl.cpp
      extra/yassl/src/yassl.cpp
      extra/yassl/src/yassl_error.cpp
      extra/yassl/src/yassl_imp.cpp
      extra/yassl/src/yassl_int.cpp
      extra/yassl/taocrypt/CMakeLists.txt
      extra/yassl/taocrypt/README
      extra/yassl/taocrypt/benchmark/benchmark.cpp
      extra/yassl/taocrypt/benchmark/benchmark.dsp
      extra/yassl/taocrypt/benchmark/dh1024.der
      extra/yassl/taocrypt/benchmark/dsa1024.der
      extra/yassl/taocrypt/benchmark/make.bat*
      extra/yassl/taocrypt/benchmark/rsa1024.der
      extra/yassl/taocrypt/include/asn.hpp
      extra/yassl/taocrypt/include/block.hpp
      extra/yassl/taocrypt/include/blowfish.hpp
      extra/yassl/taocrypt/include/des.hpp
      extra/yassl/taocrypt/include/file.hpp
      extra/yassl/taocrypt/include/hash.hpp
      extra/yassl/taocrypt/include/integer.hpp
      extra/yassl/taocrypt/include/kernelc.hpp
      extra/yassl/taocrypt/include/misc.hpp
      extra/yassl/taocrypt/include/modes.hpp
      extra/yassl/taocrypt/include/pwdbased.hpp
      extra/yassl/taocrypt/include/rsa.hpp
      extra/yassl/taocrypt/include/runtime.hpp
      extra/yassl/taocrypt/include/types.hpp
      extra/yassl/taocrypt/mySTL/stdexcept.hpp
      extra/yassl/taocrypt/mySTL/vector.hpp
      extra/yassl/taocrypt/src/aes.cpp
      extra/yassl/taocrypt/src/aestables.cpp
      extra/yassl/taocrypt/src/algebra.cpp
      extra/yassl/taocrypt/src/arc4.cpp
      extra/yassl/taocrypt/src/asn.cpp
      extra/yassl/taocrypt/src/blowfish.cpp
      extra/yassl/taocrypt/src/coding.cpp
      extra/yassl/taocrypt/src/dsa.cpp
      extra/yassl/taocrypt/src/hash.cpp
      extra/yassl/taocrypt/src/integer.cpp
      extra/yassl/taocrypt/src/make.bat*
      extra/yassl/taocrypt/src/md4.cpp
      extra/yassl/taocrypt/src/md5.cpp
      extra/yassl/taocrypt/src/misc.cpp
      extra/yassl/taocrypt/src/random.cpp
      extra/yassl/taocrypt/src/ripemd.cpp
      extra/yassl/taocrypt/src/rsa.cpp
      extra/yassl/taocrypt/src/sha.cpp
      extra/yassl/taocrypt/src/template_instnt.cpp
      extra/yassl/taocrypt/src/twofish.cpp
      extra/yassl/taocrypt/taocrypt.dsp
      extra/yassl/taocrypt/test/make.bat*
      extra/yassl/taocrypt/test/memory.cpp
      extra/yassl/taocrypt/test/test.cpp
      extra/yassl/testsuite/make.bat*
      extra/yassl/testsuite/test.hpp
      extra/yassl/testsuite/testsuite.cpp
      include/m_ctype.h
      include/m_string.h
      include/my_global.h
      include/myisam.h
      include/mysql/plugin.h
      include/welcome_copyright_notice.h
      libmysql/CMakeLists.txt
      libmysqld/CMakeLists.txt
      libmysqld/examples/CMakeLists.txt
      man/CMakeLists.txt
      mysql-test/CMakeLists.txt
      mysql-test/collections/default.experimental
      mysql-test/extra/rpl_tests/rpl_extra_col_master.test
      mysql-test/extra/rpl_tests/rpl_insert_id_pk.test
      mysql-test/extra/rpl_tests/rpl_multi_update.test
      mysql-test/extra/rpl_tests/rpl_multi_update2.test
      mysql-test/extra/rpl_tests/rpl_multi_update3.test
      mysql-test/extra/rpl_tests/rpl_start_stop_slave.test
      mysql-test/include/have_32bit.inc
      mysql-test/include/have_example_plugin.inc
      mysql-test/include/have_semisync_plugin.inc
      mysql-test/include/have_simple_parser.inc
      mysql-test/include/have_udf.inc
      mysql-test/include/mtr_check.sql
      mysql-test/include/show_slave_status.inc
      mysql-test/include/wait_for_slave_io_error.inc
      mysql-test/mysql-stress-test.pl
      mysql-test/mysql-test-run.pl
      mysql-test/r/bigint.result
      mysql-test/r/ctype_utf8.result
      mysql-test/r/func_in.result
      mysql-test/r/func_str.result
      mysql-test/r/func_time.result
      mysql-test/r/init_connect.result
      mysql-test/r/join_outer.result
      mysql-test/r/multi_update.result
      mysql-test/r/myisam.result
      mysql-test/r/mysql_plugin.result
      mysql-test/r/mysqld--help-notwin.result
      mysql-test/r/mysqld--help-win.result
      mysql-test/r/mysqldump.result
      mysql-test/r/partition.result
      mysql-test/r/partition_binlog_stmt.result
      mysql-test/r/partition_error.result
      mysql-test/r/ps.result
      mysql-test/r/range.result
      mysql-test/r/sp-bugs.result
      mysql-test/r/sp.result
      mysql-test/r/xa.result
      mysql-test/suite/binlog/r/binlog_stm_unsafe_warning.result
      mysql-test/suite/binlog/r/binlog_unsafe.result
      mysql-test/suite/binlog/t/binlog_stm_unsafe_warning.test
      mysql-test/suite/binlog/t/binlog_unsafe.test
      mysql-test/suite/engines/funcs/r/db_alter_collate_ascii.result
      mysql-test/suite/engines/funcs/r/db_alter_collate_utf8.result
      mysql-test/suite/funcs_1/r/is_columns_mysql.result
      mysql-test/suite/innodb/r/innodb-index.result
      mysql-test/suite/innodb/t/innodb-index.test
      mysql-test/suite/innodb/t/innodb_bug34300.test
      mysql-test/suite/innodb/t/innodb_bug53756.test
      mysql-test/suite/ndb/include/ndb_share_check_shares.inc
      mysql-test/suite/ndb/r/ndb_basic.result
      mysql-test/suite/ndb/r/ndb_ddl_open_trans.result
      mysql-test/suite/ndb/r/ndb_index_stat_restart.result
      mysql-test/suite/ndb/r/ndb_share.result
      mysql-test/suite/ndb/t/ndb_basic.test
      mysql-test/suite/ndb/t/ndb_ddl_open_trans.test
      mysql-test/suite/ndb/t/ndb_index_stat_restart.test
      mysql-test/suite/ndb_binlog/r/ndb_binlog_ignore_db.result
      mysql-test/suite/ndb_binlog/t/ndb_binlog_ignore_db.test
      mysql-test/suite/ndb_rpl/r/ndb_rpl_ddl_open_trans.result
      mysql-test/suite/ndb_rpl/r/ndb_rpl_idempotent.result
      mysql-test/suite/ndb_rpl/r/ndb_rpl_sync.result
      mysql-test/suite/ndb_rpl/t/ndb_rpl_idempotent.test
      mysql-test/suite/rpl/r/rpl_auto_increment_11932.result
      mysql-test/suite/rpl/r/rpl_cant_read_event_incident.result
      mysql-test/suite/rpl/r/rpl_heartbeat_basic.result
      mysql-test/suite/rpl/r/rpl_innodb_mixed_dml.result
      mysql-test/suite/rpl/r/rpl_insert_id_pk.result
      mysql-test/suite/rpl/r/rpl_known_bugs_detection.result
      mysql-test/suite/rpl/r/rpl_log_pos.result
      mysql-test/suite/rpl/r/rpl_manual_change_index_file.result
      mysql-test/suite/rpl/r/rpl_multi_update.result
      mysql-test/suite/rpl/r/rpl_multi_update2.result
      mysql-test/suite/rpl/r/rpl_multi_update3.result
      mysql-test/suite/rpl/r/rpl_packet.result
      mysql-test/suite/rpl/r/rpl_rotate_logs.result
      mysql-test/suite/rpl/r/rpl_stm_start_stop_slave.result
      mysql-test/suite/rpl/t/rpl_auto_increment_11932.test
      mysql-test/suite/rpl/t/rpl_cant_read_event_incident.test
      mysql-test/suite/rpl/t/rpl_heartbeat_basic.test
      mysql-test/suite/rpl/t/rpl_known_bugs_detection.test
      mysql-test/suite/rpl/t/rpl_log_pos.test
      mysql-test/suite/rpl/t/rpl_manual_change_index_file.test
      mysql-test/suite/rpl/t/rpl_multi_update2.test
      mysql-test/suite/rpl/t/rpl_multi_update3.test
      mysql-test/suite/rpl/t/rpl_optimize.test
      mysql-test/suite/rpl/t/rpl_packet.test
      mysql-test/suite/rpl/t/rpl_rotate_logs.test
      mysql-test/suite/rpl/t/rpl_semi_sync_event.test
      mysql-test/suite/rpl/t/rpl_stm_start_stop_slave.test
      mysql-test/suite/rpl/t/rpl_timezone.test
      mysql-test/suite/sys_vars/r/all_vars.result
      mysql-test/suite/sys_vars/r/character_sets_dir_basic.result
      mysql-test/suite/sys_vars/r/plugin_dir_basic.result
      mysql-test/suite/sys_vars/t/all_vars.test
      mysql-test/suite/sys_vars/t/character_sets_dir_basic.test
      mysql-test/suite/sys_vars/t/disabled.def
      mysql-test/t/bigint.test
      mysql-test/t/ctype_utf8.test
      mysql-test/t/events_restart.test
      mysql-test/t/func_str.test
      mysql-test/t/func_time.test
      mysql-test/t/init_connect.test
      mysql-test/t/join_outer.test
      mysql-test/t/multi_update.test
      mysql-test/t/myisam.test
      mysql-test/t/mysql_plugin.test
      mysql-test/t/mysqldump.test
      mysql-test/t/partition.test
      mysql-test/t/partition_binlog_stmt.test
      mysql-test/t/partition_error.test
      mysql-test/t/ps.test
      mysql-test/t/range.test
      mysql-test/t/sp-bugs.test
      mysql-test/t/sp.test
      mysql-test/t/udf_skip_grants-master.opt
      mysql-test/t/xa.test
      mysql-test/valgrind.supp
      mysys/charset-def.c
      mysys/my_init.c
      mysys/my_symlink.c
      packaging/WiX/custom_ui.wxs
      plugin/auth/dialog.c
      plugin/auth/qa_auth_interface.c
      plugin/auth/qa_auth_server.c
      plugin/daemon_example/CMakeLists.txt
      plugin/daemon_example/daemon_example.cc
      scripts/mysql_install_db.pl.in
      scripts/mysql_install_db.sh
      scripts/mysql_system_tables.sql
      scripts/mysql_system_tables_fix.sql
      scripts/mysqld_safe.sh
      sql-common/my_time.c
      sql/filesort.cc
      sql/ha_ndbcluster.cc
      sql/ha_ndbcluster_binlog.cc
      sql/ha_partition.cc
      sql/item.cc
      sql/item_cmpfunc.cc
      sql/item_cmpfunc.h
      sql/item_timefunc.cc
      sql/item_xmlfunc.cc
      sql/log.cc
      sql/log.h
      sql/log_event.h
      sql/mysqld.cc
      sql/mysqld.h
      sql/rpl_handler.h
      sql/rpl_injector.cc
      sql/rpl_injector.h
      sql/rpl_mi.cc
      sql/rpl_mi.h
      sql/rpl_rli.cc
      sql/rpl_rli.h
      sql/set_var.h
      sql/share/errmsg-utf8.txt
      sql/slave.cc
      sql/slave.h
      sql/sp_cache.cc
      sql/sp_cache.h
      sql/sp_head.cc
      sql/sp_head.h
      sql/sql_admin.cc
      sql/sql_base.cc
      sql/sql_cache.cc
      sql/sql_class.cc
      sql/sql_class.h
      sql/sql_connect.cc
      sql/sql_lex.cc
      sql/sql_lex.h
      sql/sql_parse.cc
      sql/sql_partition.cc
      sql/sql_partition.h
      sql/sql_plugin.cc
      sql/sql_prepare.cc
      sql/sql_profile.cc
      sql/sql_repl.cc
      sql/sql_select.cc
      sql/sql_show.cc
      sql/sql_table.cc
      sql/sql_udf.cc
      sql/sql_yacc.yy
      sql/sys_vars.cc
      sql/sys_vars.h
      sql/table.h
      storage/archive/ha_archive.cc
      storage/blackhole/ha_blackhole.cc
      storage/csv/ha_tina.cc
      storage/example/ha_example.cc
      storage/federated/ha_federated.cc
      storage/heap/hp_info.c
      storage/innobase/btr/btr0btr.c
      storage/innobase/btr/btr0cur.c
      storage/innobase/btr/btr0pcur.c
      storage/innobase/btr/btr0sea.c
      storage/innobase/buf/buf0buf.c
      storage/innobase/buf/buf0flu.c
      storage/innobase/dict/dict0load.c
      storage/innobase/fil/fil0fil.c
      storage/innobase/fsp/fsp0fsp.c
      storage/innobase/handler/ha_innodb.cc
      storage/innobase/handler/ha_innodb.h
      storage/innobase/handler/handler0alter.cc
      storage/innobase/ibuf/ibuf0ibuf.c
      storage/innobase/include/btr0btr.h
      storage/innobase/include/btr0btr.ic
      storage/innobase/include/btr0cur.h
      storage/innobase/include/btr0cur.ic
      storage/innobase/include/btr0pcur.h
      storage/innobase/include/buf0buf.h
      storage/innobase/include/buf0buf.ic
      storage/innobase/include/data0data.h
      storage/innobase/include/data0data.ic
      storage/innobase/include/fsp0fsp.h
      storage/innobase/include/log0log.h
      storage/innobase/include/mem0mem.ic
      storage/innobase/include/mtr0log.ic
      storage/innobase/include/mtr0mtr.h
      storage/innobase/include/mtr0mtr.ic
      storage/innobase/include/page0page.h
      storage/innobase/include/page0page.ic
      storage/innobase/include/row0mysql.h
      storage/innobase/include/row0sel.h
      storage/innobase/include/sync0sync.h
      storage/innobase/include/trx0rec.ic
      storage/innobase/include/trx0rseg.ic
      storage/innobase/include/trx0sys.h
      storage/innobase/include/trx0undo.h
      storage/innobase/include/univ.i
      storage/innobase/include/ut0mem.h
      storage/innobase/include/ut0rnd.ic
      storage/innobase/lock/lock0lock.c
      storage/innobase/log/log0log.c
      storage/innobase/mem/mem0pool.c
      storage/innobase/mtr/mtr0mtr.c
      storage/innobase/os/os0file.c
      storage/innobase/os/os0proc.c
      storage/innobase/page/page0cur.c
      storage/innobase/page/page0page.c
      storage/innobase/pars/pars0pars.c
      storage/innobase/row/row0ins.c
      storage/innobase/row/row0merge.c
      storage/innobase/row/row0mysql.c
      storage/innobase/row/row0row.c
      storage/innobase/row/row0sel.c
      storage/innobase/row/row0umod.c
      storage/innobase/row/row0upd.c
      storage/innobase/srv/srv0srv.c
      storage/innobase/srv/srv0start.c
      storage/innobase/sync/sync0rw.c
      storage/innobase/sync/sync0sync.c
      storage/innobase/trx/trx0purge.c
      storage/innobase/trx/trx0rec.c
      storage/innobase/trx/trx0sys.c
      storage/innobase/trx/trx0trx.c
      storage/innobase/trx/trx0undo.c
      storage/innobase/ut/ut0mem.c
      storage/myisam/ft_boolean_search.c
      storage/myisam/ft_nlq_search.c
      storage/myisam/ha_myisam.cc
      storage/myisam/ha_myisam.h
      storage/myisam/mi_check.c
      storage/myisam/mi_packrec.c
      storage/myisam/mi_preload.c
      storage/myisam/myisamchk.c
      storage/myisam/myisamdef.h
      storage/myisam/sort.c
      storage/ndb/clusterj/clusterj-api/pom.xml
      storage/ndb/clusterj/clusterj-bindings/pom.xml
      storage/ndb/clusterj/clusterj-core/pom.xml
      storage/ndb/clusterj/clusterj-jdbc/pom.xml
      storage/ndb/clusterj/clusterj-jpatest/pom.xml
      storage/ndb/clusterj/clusterj-openjpa/pom.xml
      storage/ndb/clusterj/clusterj-test/pom.xml
      storage/ndb/clusterj/clusterj-test/src/main/java/testsuite/clusterj/VarcharStringLengthTest.java
      storage/ndb/clusterj/clusterj-tie/pom.xml
      storage/ndb/clusterj/clusterj-tie/src/main/java/com/mysql/clusterj/tie/OperationImpl.java
      storage/ndb/clusterj/clusterj-tie/src/main/java/com/mysql/clusterj/tie/Utility.java
      storage/ndb/clusterj/clusterj-tie/src/main/resources/com/mysql/clusterj/tie/Bundle.properties
      storage/ndb/clusterj/pom.xml
      storage/ndb/memcache/include/NdbInstance.h
      storage/ndb/memcache/include/ndb_engine_errors.h
      storage/ndb/memcache/include/ndb_pipeline.h
      storage/ndb/memcache/src/ExternalValue.cc
      storage/ndb/memcache/src/NdbInstance.cc
      storage/ndb/memcache/src/ndb_configuration.cc
      storage/ndb/memcache/src/ndb_engine.c
      storage/ndb/memcache/src/ndb_engine_errors.cc
      storage/ndb/memcache/src/ndb_worker.cc
      storage/ndb/src/mgmsrv/ConfigManager.cpp
      storage/ndb/src/ndbapi/NdbQueryBuilder.cpp
      storage/ndb/src/ndbapi/NdbQueryBuilder.hpp
      storage/ndb/src/ndbapi/NdbQueryBuilderImpl.hpp
      storage/ndb/src/ndbapi/NdbQueryOperation.cpp
      storage/ndb/src/ndbapi/NdbQueryOperationImpl.hpp
      storage/ndb/src/ndbjtie/com/mysql/ndbjtie/ndbapi/NDBAPI.java
      storage/ndb/src/ndbjtie/com/mysql/ndbjtie/ndbapi/NdbIndexScanOperation.java
      storage/ndb/src/ndbjtie/ndbapi_jtie.hpp
      storage/ndb/test/ndbapi/testMgmd.cpp
      storage/ndb/tools/ndb_size.pl
      storage/perfschema/ha_perfschema.cc
      storage/perfschema/pfs.cc
      storage/perfschema/table_ews_global_by_event_name.cc
      storage/perfschema/table_ews_global_by_event_name.h
      strings/ctype-uca.c
      strings/ctype-ucs2.c
      strings/ctype-utf8.c
      strings/dtoa.c
      support-files/compiler_warnings.supp
      unittest/mysys/bitmap-t.c
      unittest/mysys/my_atomic-t.c
      unittest/strings/strings-t.c
=== modified file 'storage/ndb/include/util/Vector.hpp'
--- a/storage/ndb/include/util/Vector.hpp	2011-09-02 09:16:56 +0000
+++ b/storage/ndb/include/util/Vector.hpp	2012-04-11 08:45:06 +0000
@@ -24,7 +24,8 @@
 template<class T>
 class Vector {
 public:
-  Vector(int sz = 10);
+  Vector(unsigned sz = 10, unsigned inc_sz = 0);
+  int expand(unsigned sz);
   ~Vector();
 
   T& operator[](unsigned i);
@@ -32,7 +33,7 @@ public:
   unsigned size() const { return m_size; };
   
   int push_back(const T &);
-  void push(const T&, unsigned pos);
+  int push(const T&, unsigned pos);
   T& set(T&, unsigned pos, T& fill_obj);
   T& back();
   
@@ -63,40 +64,80 @@ private:
   unsigned m_arraySize;
 };
 
-template<class T>
-Vector<T>::Vector(int i){
-  m_items = new T[i];
+/**
+ * BEWARE: Constructing Vector with initial size > 0 is
+ * unsafe wrt. catching 'out of memory' errors.
+ * (C'tor doesn't return error code)
+ * Instead construct Vector with size==0, and then
+ * expand() it to the wanted initial size.
+ */
+template<class T>
+Vector<T>::Vector(unsigned sz, unsigned inc_sz):
+  m_items(NULL),
+  m_size(0),
+  m_incSize((inc_sz > 0) ? inc_sz : 50),
+  m_arraySize(0)
+{
+  if (sz == 0)
+    return;
+
+  m_items = new T[sz];
   if (m_items == NULL)
   {
     errno = ENOMEM;
-    m_size = 0;
-    m_arraySize = 0;
-    m_incSize = 0;
     return;
   }
-  m_size = 0;
-  m_arraySize = i;
-  m_incSize = 50;
+  m_arraySize = sz;
+}
+
+template<class T>
+int
+Vector<T>::expand(unsigned sz){
+  if (sz <= m_size)
+    return 0;
+
+  T * tmp = new T[sz];
+  if(tmp == NULL)
+  {
+    errno = ENOMEM;
+    return -1;
+  }
+  for (unsigned i = 0; i < m_size; i++)
+    tmp[i] = m_items[i];
+  delete[] m_items;
+  m_items = tmp;
+  m_arraySize = sz;
+  return 0;
 }
 
+/**
+ * BEWARE: Copy-constructing a Vector is
+ * unsafe wrt. catching 'out of memory' errors.
+ * (C'tor doesn't return error code)
+ * Instead construct empty Vector (size==0),
+ * and then assign() it the initial contents.
+ */
 template<class T>
 Vector<T>::Vector(const Vector& src):
-  m_items(new T[src.m_size]),
-  m_size(src.m_size),
+  m_items(NULL),
+  m_size(0),
   m_incSize(src.m_incSize),
-  m_arraySize(src.m_size)
-  
+  m_arraySize(0)
 {
+  const unsigned sz = src.m_size;
+  if (sz == 0)
+    return;
+
+  m_items = new T[sz];
   if (unlikely(m_items == NULL)){
     errno = ENOMEM;
-    m_size = 0;
-    m_arraySize = 0;
-    m_incSize = 0;
     return;
   }
-  for(unsigned i = 0; i < m_size; i++){
+  for(unsigned i = 0; i < sz; i++){
     m_items[i] = src.m_items[i];
   }
+  m_arraySize = sz;
+  m_size = sz;
 }
 
 template<class T>
@@ -127,6 +168,8 @@ Vector<T>::operator[](unsigned i) const 
 template<class T>
 T &
 Vector<T>::back(){
+  if(m_size==0)
+    abort();
   return (* this)[m_size - 1];
 }
 
@@ -134,17 +177,9 @@ template<class T>
 int
 Vector<T>::push_back(const T & t){
   if(m_size == m_arraySize){
-    T * tmp = new T [m_arraySize + m_incSize];
-    if(tmp == NULL)
-    {
-      errno = ENOMEM;
-      return -1;
-    }
-    for (unsigned k = 0; k < m_size; k++)
-      tmp[k] = m_items[k];
-    delete[] m_items;
-    m_items = tmp;
-    m_arraySize = m_arraySize + m_incSize;
+    const int err = expand(m_arraySize + m_incSize);
+    if (unlikely(err))
+      return err;
   }
   m_items[m_size] = t;
   m_size++;
@@ -152,10 +187,12 @@ Vector<T>::push_back(const T & t){
 }
 
 template<class T>
-void
+int
 Vector<T>::push(const T & t, unsigned pos)
 {
-  push_back(t);
+  const int err = push_back(t);
+  if (unlikely(err))
+    return err;
   if (pos < m_size - 1)
   {
     for(unsigned i = m_size - 1; i > pos; i--)
@@ -164,13 +201,15 @@ Vector<T>::push(const T & t, unsigned po
     }
     m_items[pos] = t;
   }
+  return 0;
 }
 
 template<class T>
 T&
 Vector<T>::set(T & t, unsigned pos, T& fill_obj)
 {
-  fill(pos, fill_obj);
+  if (fill(pos, fill_obj))
+    abort();
   T& ret = m_items[pos];
   m_items[pos] = t;
   return ret;
@@ -196,19 +235,31 @@ Vector<T>::clear(){
 template<class T>
 int
 Vector<T>::fill(unsigned new_size, T & obj){
+  const int err = expand(new_size);
+  if (unlikely(err))
+    return err;
   while(m_size <= new_size)
     if (push_back(obj))
       return -1;
   return 0;
 }
 
+/**
+ * 'operator=' will 'abort()' on 'out of memory' errors.
+ *  You may prefer using ::assign()' which returns
+ *  an error code instead of aborting.
+ */
 template<class T>
 Vector<T>& 
 Vector<T>::operator=(const Vector<T>& obj){
   if(this != &obj){
     clear();
+    const int err = expand(obj.size());
+    if (unlikely(err))
+      abort();
     for(unsigned i = 0; i<obj.size(); i++){
-      push_back(obj[i]);
+      if (push_back(obj[i]))
+        abort();
     }
   }
   return * this;
@@ -218,12 +269,19 @@ template<class T>
 int
 Vector<T>::assign(const T* src, unsigned cnt)
 {
+  if (getBase() == src)
+    return 0;  // Self-assign is a NOOP
+
   clear();
+  const int err = expand(cnt);
+  if (unlikely(err))
+    return err;
+
   for (unsigned i = 0; i<cnt; i++)
   {
-    int ret;
-    if ((ret = push_back(src[i])))
-      return ret;
+    const int err = push_back(src[i]);
+    if (unlikely(err))
+      return err;
   }
   return 0;
 }
@@ -241,7 +299,8 @@ Vector<T>::equal(const Vector<T>& obj) c
 template<class T>
 class MutexVector : public NdbLockable {
 public:
-  MutexVector(int sz = 10);
+  MutexVector(unsigned sz = 10, unsigned inc_sz = 0);
+  int expand(unsigned sz);
   ~MutexVector();
 
   T& operator[](unsigned i);
@@ -260,26 +319,60 @@ public:
 
   int fill(unsigned new_size, T & obj);
 private:
+  // Don't allow copy and assignment of MutexVector
+  MutexVector(const MutexVector&); 
+  MutexVector<T>& operator=(const MutexVector<T>&);
+
   T * m_items;
   unsigned m_size;
   unsigned m_incSize;
   unsigned m_arraySize;
 };
 
-template<class T>
-MutexVector<T>::MutexVector(int i){
-  m_items = new T[i];
+/**
+ * BEWARE: Constructing MutexVector with initial size > 0 is
+ * unsafe wrt. catching 'out of memory' errors.
+ * (C'tor doesn't return error code)
+ * Instead construct MutexVector with size==0, and then
+ * expand() it to the wanted initial size.
+ */
+template<class T>
+MutexVector<T>::MutexVector(unsigned sz, unsigned inc_sz):
+  m_items(NULL),
+  m_size(0),
+  m_incSize((inc_sz > 0) ? inc_sz : 50),
+  m_arraySize(0)
+{
+  if (sz == 0)
+    return;
+
+  m_items = new T[sz];
   if (m_items == NULL)
   {
     errno = ENOMEM;
-    m_size = 0;
-    m_arraySize = 0;
-    m_incSize = 0;
     return;
   }
-  m_size = 0;
-  m_arraySize = i;
-  m_incSize = 50;
+  m_arraySize = sz;
+}
+
+template<class T>
+int
+MutexVector<T>::expand(unsigned sz){
+  if (sz <= m_size)
+    return 0;
+
+  T * tmp = new T[sz];
+  if(tmp == NULL)
+  {
+    errno = ENOMEM;
+    return -1;
+  }
+  for (unsigned i = 0; i < m_size; i++)
+    tmp[i] = m_items[i];
+  delete[] m_items;
+  m_items = tmp;
+  m_arraySize = sz;
+  return 0;
 }
 
 template<class T>
@@ -310,6 +403,8 @@ MutexVector<T>::operator[](unsigned i) c
 template<class T>
 T &
 MutexVector<T>::back(){
+  if(m_size==0)
+    abort();
   return (* this)[m_size - 1];
 }
 
@@ -318,18 +413,12 @@ int
 MutexVector<T>::push_back(const T & t){
   lock();
   if(m_size == m_arraySize){
-    T * tmp = new T [m_arraySize + m_incSize];
-    if (tmp == NULL)
+    const int err = expand(m_arraySize + m_incSize);
+    if (unlikely(err))
     {
-      errno = ENOMEM;
       unlock();
-      return -1;
+      return err;
     }
-    for (unsigned k = 0; k < m_size; k++)
-      tmp[k] = m_items[k];
-    delete[] m_items;
-    m_items = tmp;
-    m_arraySize = m_arraySize + m_incSize;
   }
   m_items[m_size] = t;
   m_size++;
@@ -343,19 +432,13 @@ MutexVector<T>::push_back(const T & t, b
   if(lockMutex) 
     lock();
   if(m_size == m_arraySize){
-    T * tmp = new T [m_arraySize + m_incSize];
-    if (tmp == NULL)
+    const int err = expand(m_arraySize + m_incSize);
+    if (unlikely(err))
     {
-      errno = ENOMEM;
       if(lockMutex) 
         unlock();
-      return -1;
+      return err;
     }
-    for (unsigned k = 0; k < m_size; k++)
-      tmp[k] = m_items[k];
-    delete[] m_items;
-    m_items = tmp;
-    m_arraySize = m_arraySize + m_incSize;
   }
   m_items[m_size] = t;
   m_size++;

=== modified file 'storage/ndb/memcache/extra/memcached/CMakeLists.txt'
--- a/storage/ndb/memcache/extra/memcached/CMakeLists.txt	2011-09-23 00:00:18 +0000
+++ b/storage/ndb/memcache/extra/memcached/CMakeLists.txt	2012-03-31 15:10:44 +0000
@@ -84,6 +84,7 @@ CHECK_INCLUDE_FILE("netdb.h"         HAV
 CHECK_INCLUDE_FILE("sys/uio.h"       HAVE_SYS_UIO_H)
 CHECK_INCLUDE_FILE("signal.h"        HAVE_SIGIGNORE)
 CHECK_INCLUDE_FILES("sys/types.h;netinet/tcp.h" HAVE_NETINET_TCP_H)
+CHECK_FUNCTION_EXISTS(htonll         HAVE_HTONLL)
 
 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config_tests.in 
                ${CMAKE_CURRENT_SOURCE_DIR}/config.h)

=== modified file 'storage/ndb/memcache/extra/memcached/config_tests.in'
--- a/storage/ndb/memcache/extra/memcached/config_tests.in	2011-09-20 05:13:01 +0000
+++ b/storage/ndb/memcache/extra/memcached/config_tests.in	2012-03-31 15:16:18 +0000
@@ -24,6 +24,7 @@
 #cmakedefine HAVE_SYS_UIO_H
 #cmakedefine HAVE_NETINET_TCP_H
 #cmakedefine HAVE_SIGIGNORE
+#cmakedefine HAVE_HTONLL
 
 #include "my_config.h"
 #include "config_static.h"

=== modified file 'storage/ndb/memcache/extra/memcached/daemon/memcached.c'
--- a/storage/ndb/memcache/extra/memcached/daemon/memcached.c	2011-09-20 05:13:01 +0000
+++ b/storage/ndb/memcache/extra/memcached/daemon/memcached.c	2012-04-06 00:06:41 +0000
@@ -1761,6 +1761,10 @@ static void process_bin_get(conn *c) {
     case ENGINE_NOT_MY_VBUCKET:
         write_bin_packet(c, PROTOCOL_BINARY_RESPONSE_NOT_MY_VBUCKET, 0);
         break;
+    case ENGINE_TMPFAIL:
+        write_bin_packet(c, PROTOCOL_BINARY_RESPONSE_ETMPFAIL, 0);
+        break;
+
     default:
         /* @todo add proper error handling! */
         settings.extensions.logger->log(EXTENSION_LOG_WARNING, c,

=== modified file 'storage/ndb/memcache/include/Scheduler.h'
--- a/storage/ndb/memcache/include/Scheduler.h	2012-03-07 01:22:53 +0000
+++ b/storage/ndb/memcache/include/Scheduler.h	2012-04-03 00:34:18 +0000
@@ -23,13 +23,21 @@
 #include "ndbmemcache_global.h"
 #include <memcached/types.h>
 
-#include "ndb_pipeline.h"
+#include "thread_identifier.h"
+
+
+typedef struct {
+  int nthreads;                /* number of worker threads */
+  int max_clients;             /* maximum number of client connections */
+  const char * config_string;  /* scheduler-specific configuration string */
+} scheduler_options;       
+
 
 #ifdef __cplusplus
-#include "NdbInstance.h"
-#include "Configuration.h"
-#include "thread_identifier.h"
 
+/* Forward declarations */
+class Configuration;
+class workitem;
 
 /* Scheduler is an interface */
 
@@ -44,10 +52,9 @@ public:
   /** init() is the called from the main thread, 
       after configuration has been read. 
       threadnum: which thread this scheduler will eventually attach to 
-      nthreads: how many total threads will be initialized 
-      config_string: additional configuration string for scheduler   
+      options: struct specifying run-time options   
   */
-  virtual void init(int threadnum, int nthreads, const char *config_string) = 0;
+  virtual void init(int threadnum, const scheduler_options * options) = 0;
                     
   /** attach_thread() is called from each thread 
       at pipeline initialization time. */
@@ -87,9 +94,6 @@ public:
    */
   virtual bool global_reconfigure(Configuration *new_config) = 0;
     
-  /** each scheduler instance serves a single NDB pipeline 
-  */
-  ndb_pipeline *pipeline;
 };
 #endif
 

=== modified file 'storage/ndb/memcache/include/ndb_engine.h'
--- a/storage/ndb/memcache/include/ndb_engine.h	2012-03-07 01:22:53 +0000
+++ b/storage/ndb/memcache/include/ndb_engine.h	2012-04-03 00:34:18 +0000
@@ -62,6 +62,7 @@ struct ndb_engine {
   } startup_options;
   
   struct {
+    size_t maxconns;
     size_t nthreads;
     bool cas_enabled;  
     size_t verbose;

=== modified file 'storage/ndb/memcache/include/ndb_engine_errors.h'
--- a/storage/ndb/memcache/include/ndb_engine_errors.h	2012-03-23 19:01:07 +0000
+++ b/storage/ndb/memcache/include/ndb_engine_errors.h	2012-04-05 21:37:02 +0000
@@ -22,11 +22,22 @@
 
 #include <ndberror.h>
 
-/* Errors 9000 - 9099 are reported as "Scheduler Error" */
-extern ndberror_struct AppError9001_ReconfLock;
-extern ndberror_struct AppError9002_NoNDBs;
-extern ndberror_struct AppError9003_SyncClose;
+/* 
+   The NDB Engine for Memcached uses error codes 29000 - 29999 
+*/
 
-/* Errors 9100 and up are reported as "Memcached Error" */
+
+
+/*** Errors 290xx and 291xx are reported as "Scheduler Error" ***/
+
+/* 2900x: general scheduler error codes */
+extern ndberror_struct AppError29001_ReconfLock;
+extern ndberror_struct AppError29002_NoNDBs;
+
+/* 2902x: blocking NDB operations in worker thread */
+extern ndberror_struct AppError29023_SyncClose;
+extern ndberror_struct AppError29024_autogrow;
+
+/*** Errors 29200 and up are reported as "Memcached Error" ***/
 
 #endif

=== modified file 'storage/ndb/memcache/include/ndb_pipeline.h'
--- a/storage/ndb/memcache/include/ndb_pipeline.h	2012-03-23 23:33:32 +0000
+++ b/storage/ndb/memcache/include/ndb_pipeline.h	2012-04-05 21:00:05 +0000
@@ -26,14 +26,13 @@
 
 #include "workqueue.h"
 #include "ndb_engine.h"
+#include "Scheduler.h"
 
 /* This structure is used in both C and C++ code, requiring a small hack: */
 #ifdef __cplusplus
-/* forward declaration: */
-class Scheduler;
-#define C_OR_CPP_SCHEDULER Scheduler
+#define CPP_SCHEDULER Scheduler
 #else 
-#define C_OR_CPP_SCHEDULER void
+#define CPP_SCHEDULER void
 #endif
 
 /* In each pipeline there lives an allocator, which is used for workitems, 
@@ -83,9 +82,9 @@ typedef struct request_pipeline {
   unsigned int id;              /*! each pipeline has an id */
   unsigned int nworkitems;      /*! counter used to give each workitem an id */
   struct ndb_engine *engine;    
-  pthread_t engine_thread_id;   
+  pthread_t worker_thread_id;   
   allocator_slab_class alligator[ALLIGATOR_ARRAY_SIZE];  /*! an allocator */
-  C_OR_CPP_SCHEDULER *scheduler;
+  CPP_SCHEDULER *scheduler;
   memory_pool *pool;            /*! has the whole lifetime of the pipeline */
 } ndb_pipeline;
 
@@ -99,7 +98,7 @@ DECLARE_FUNCTIONS_WITH_C_LINKAGE
 ndb_pipeline * ndb_pipeline_initialize(struct ndb_engine *);
 
 /** create a generic request pipeline */
-ndb_pipeline * get_request_pipeline(int thd_id);
+ndb_pipeline * get_request_pipeline(int thd_id, struct ndb_engine *);
 
 /** call into a pipeline for its own statistics */
 void pipeline_add_stats(ndb_pipeline *, const char *key, ADD_STAT, const void *);
@@ -111,7 +110,7 @@ ENGINE_ERROR_CODE pipeline_flush_all(ndb
 /***** SCHEDULER APIS *****/
 
 /** Global initialization of scheduler, at startup time */
-void * scheduler_initialize(const char *name, int nthreads, int threadnum);
+void * scheduler_initialize(ndb_pipeline *, scheduler_options *);
 
 /** shutdown a scheduler */
 void scheduler_shutdown(ndb_pipeline *);

=== modified file 'storage/ndb/memcache/include/ndbmemcache_config.in'
--- a/storage/ndb/memcache/include/ndbmemcache_config.in	2011-10-14 08:26:28 +0000
+++ b/storage/ndb/memcache/include/ndbmemcache_config.in	2012-03-31 18:56:49 +0000
@@ -41,5 +41,6 @@
  
 #cmakedefine HAVE_FUNC_IN_CXX
 
+#cmakedefine HAVE_HTONLL
 
 #endif

=== modified file 'storage/ndb/memcache/src/ExternalValue.cc'
--- a/storage/ndb/memcache/src/ExternalValue.cc	2012-03-23 19:01:07 +0000
+++ b/storage/ndb/memcache/src/ExternalValue.cc	2012-04-05 21:00:05 +0000
@@ -22,6 +22,7 @@
 #include <assert.h>
 
 #include "workitem.h"
+#include "NdbInstance.h"
 #include "Operation.h"
 #include "Scheduler.h"
 #include "status_block.h"

=== modified file 'storage/ndb/memcache/src/ndb_engine.c'
--- a/storage/ndb/memcache/src/ndb_engine.c	2012-03-23 23:33:32 +0000
+++ b/storage/ndb/memcache/src/ndb_engine.c	2012-04-05 21:00:05 +0000
@@ -166,6 +166,7 @@ static ENGINE_ERROR_CODE ndb_initialize(
   ENGINE_ERROR_CODE return_status;
   struct ndb_engine *ndb_eng = ndb_handle(handle);
   struct default_engine *def_eng = default_handle(ndb_eng);
+  scheduler_options sched_opts;
   
   /* Process options for both the ndb engine and the default engine:  */
   read_cmdline_options(ndb_eng, def_eng, config_str);
@@ -212,6 +213,10 @@ static ENGINE_ERROR_CODE ndb_initialize(
   /* prefetch data dictionary objects */
   prefetch_dictionary_objects();
 
+  /* Build the scheduler options structure */
+  sched_opts.nthreads = ndb_eng->server_options.nthreads;
+  sched_opts.max_clients = ndb_eng->server_options.maxconns;
+
   /* Allocate and initailize the pipelines, and their schedulers.  
      This will take some time; each pipeline creates slab and pool allocators,
      and each scheduler may preallocate a large number of Ndb objects and 
@@ -224,9 +229,9 @@ static ENGINE_ERROR_CODE ndb_initialize(
   ndb_eng->pipelines  = malloc(nthreads * sizeof(void *));
   ndb_eng->schedulers = malloc(nthreads * sizeof(void *));
   for(i = 0 ; i < nthreads ; i++) {
-    ndb_eng->pipelines[i] = get_request_pipeline(i);
-    ndb_eng->schedulers[i] = 
-      scheduler_initialize(ndb_eng->startup_options.scheduler, nthreads, i);
+    ndb_eng->pipelines[i] = get_request_pipeline(i, ndb_eng);
+    ndb_eng->schedulers[i] = scheduler_initialize(ndb_eng->pipelines[i], 
+                                                  & sched_opts);
     if(ndb_eng->schedulers[i] == 0) {
       logger->log(LOG_WARNING, NULL, "Illegal scheduler: \"%s\"\n", 
                   ndb_eng->startup_options.scheduler); 
@@ -819,6 +824,9 @@ int fetch_core_settings(struct ndb_engin
     { .key = "cas_enabled",
       .datatype = DT_BOOL,
       .value.dt_bool = &engine->server_options.cas_enabled },
+    { .key = "maxconns",
+      .datatype = DT_SIZE,
+      .value.dt_size = &engine->server_options.maxconns },
     { .key = "num_threads",
       .datatype = DT_SIZE,
       .value.dt_size = &engine->server_options.nthreads },

=== modified file 'storage/ndb/memcache/src/ndb_engine_errors.cc'
--- a/storage/ndb/memcache/src/ndb_engine_errors.cc	2012-03-23 19:01:07 +0000
+++ b/storage/ndb/memcache/src/ndb_engine_errors.cc	2012-04-05 21:37:02 +0000
@@ -20,17 +20,22 @@
 
 #include <ndberror.h>
 
-ndberror_struct AppError9001_ReconfLock = 
-  { ndberror_st_temporary , ndberror_cl_application , 9001, -1,
+ndberror_struct AppError29001_ReconfLock = 
+  { ndberror_st_temporary , ndberror_cl_application , 29001, -1,
     "Could not obtain configuration read lock", 0
   };
 
-ndberror_struct AppError9002_NoNDBs =
-  { ndberror_st_temporary , ndberror_cl_application , 9002, -1,
+ndberror_struct AppError29002_NoNDBs =
+  { ndberror_st_temporary , ndberror_cl_application , 29002, -1,
     "No Ndb Instances in freelist", 0
   };
 
-ndberror_struct AppError9003_SyncClose =
-  { ndberror_st_temporary , ndberror_cl_application , 9003, -1,
+ndberror_struct AppError29023_SyncClose =
+  { ndberror_st_temporary , ndberror_cl_application , 29023, -1,
     "Waited for synchronous close of NDB transaction", 0 
   };
+
+ndberror_struct AppError29024_autogrow = 
+  { ndberror_st_temporary , ndberror_cl_application , 29024, -1,
+    "Out of Ndb instances, growing freelist", 0 
+  };

=== modified file 'storage/ndb/memcache/src/ndb_error_logger.cc'
--- a/storage/ndb/memcache/src/ndb_error_logger.cc	2012-03-07 03:57:36 +0000
+++ b/storage/ndb/memcache/src/ndb_error_logger.cc	2012-04-06 01:00:19 +0000
@@ -208,8 +208,10 @@ void ndb_error_logger_stats(ADD_STAT add
 
   for(i = 0 ; i < ERROR_HASH_TABLE_SIZE; i++) {
     for(sym = error_hash_table[i] ; sym != 0 ; sym = sym->next) { 
-      klen = sprintf(key, "NDB_Error_%d", sym->error_code);
-      vlen = sprintf(val, "%du", sym->count);
+      klen = sprintf(key, "%s_Error_%d", 
+                     (sym->error_code < 29000 ? "NDB" : "Engine"),
+                     sym->error_code);
+      vlen = sprintf(val, "%lu", (long unsigned int) sym->count);
       add_stat(key, klen, val, vlen, cookie);
     }
   }

=== modified file 'storage/ndb/memcache/src/ndb_pipeline.cc'
--- a/storage/ndb/memcache/src/ndb_pipeline.cc	2012-03-07 01:22:53 +0000
+++ b/storage/ndb/memcache/src/ndb_pipeline.cc	2012-04-03 00:34:18 +0000
@@ -71,7 +71,12 @@ void init_pool_header(allocation_referen
 
 /* The public API */
 
-/* initialize a new pipeline for an NDB engine thread */
+/* Attach a new pipeline to an NDB worker thread. 
+   Some initialization has already occured when the main single-thread startup
+   called get_request_pipeline().  But this is the first call into a pipeline
+   from its worker thread.  It will initialize the thread's identifier, and 
+   attach the pipeline to its scheduler.
+*/
 ndb_pipeline * ndb_pipeline_initialize(struct ndb_engine *engine) {
   bool did_inc;
   unsigned int id;
@@ -85,14 +90,13 @@ ndb_pipeline * ndb_pipeline_initialize(s
   
   /* Fetch the partially initialized pipeline */
   ndb_pipeline * self = (ndb_pipeline *) engine->pipelines[id];
-  
+
+  /* Sanity checks */
   assert(self->id == id);
+  assert(self->engine == engine);
   
-  /* Set the pointer back to the engine */
-  self->engine = engine;
-  
-  /* And the thread id */
-  self->engine_thread_id = pthread_self(); 
+  /* Set the pthread id */
+  self->worker_thread_id = pthread_self(); 
 
   /* Create and set a thread identity */
   tid = (thread_identifier *) memory_pool_alloc(self->pool, sizeof(thread_identifier));
@@ -108,16 +112,20 @@ ndb_pipeline * ndb_pipeline_initialize(s
 }
 
 
-/* Allocate and initialize a generic request pipeline */
-ndb_pipeline * get_request_pipeline(int thd_id) { 
+/* Allocate and initialize a generic request pipeline.
+   In unit test code, this can be called with a NULL engine pointer -- 
+   it will still initialize a usable slab allocator and memory pool 
+   which can be tested.  
+*/
+ndb_pipeline * get_request_pipeline(int thd_id, struct ndb_engine *engine) { 
   /* Allocate the pipeline */
   ndb_pipeline *self = (ndb_pipeline *) malloc(sizeof(ndb_pipeline)); 
   
   /* Initialize */  
-  self->engine = 0;
+  self->engine = engine;
   self->id = thd_id;
   self->nworkitems = 0;
-
+    
   /* Say hi to the alligator */  
   init_allocator(self);
   
@@ -160,27 +168,27 @@ ENGINE_ERROR_CODE pipeline_flush_all(ndb
 
 /* The scheduler API */
 
-void * scheduler_initialize(const char *cf, int nthreads, int athread) {
+void * scheduler_initialize(ndb_pipeline *self, scheduler_options *options) {
   Scheduler *s = 0;
-  const char *sched_options = 0;
+  const char *cf = self->engine->startup_options.scheduler;
+  options->config_string = 0;
   
   if(cf == 0 || *cf == 0) {
     s = new DEFAULT_SCHEDULER;
   }
   else if(!strncasecmp(cf, "stockholm", 9)) {
     s = new Scheduler_stockholm;
-    sched_options = & cf[9];
+    options->config_string = & cf[9];
   }
   else if(!strncasecmp(cf,"S", 1)) {
     s = new S::SchedulerWorker;
-    sched_options = & cf[1];
+    options->config_string = & cf[1];
   }
   else {
     return NULL;
   }
-    
-  s->init(athread, nthreads, sched_options);
-  s->pipeline = 0;
+  
+  s->init(self->id, options);
 
   return (void *) s;
 }

=== modified file 'storage/ndb/memcache/src/ndb_worker.cc'
--- a/storage/ndb/memcache/src/ndb_worker.cc	2012-03-23 19:01:07 +0000
+++ b/storage/ndb/memcache/src/ndb_worker.cc	2012-04-05 21:37:02 +0000
@@ -880,7 +880,7 @@ void worker_close(NdbTransaction *tx, wo
   nwaits_post = ndb->getClientStat(Ndb::WaitExecCompleteCount);
 
   if(nwaits_post > nwaits_pre) 
-    log_app_error(& AppError9003_SyncClose);
+    log_app_error(& AppError29023_SyncClose);
  
   if(wqitem->ext_val) 
     delete wqitem->ext_val;

=== modified file 'storage/ndb/memcache/src/schedulers/S_sched.cc'
--- a/storage/ndb/memcache/src/schedulers/S_sched.cc	2012-03-22 19:24:32 +0000
+++ b/storage/ndb/memcache/src/schedulers/S_sched.cc	2012-04-06 01:00:19 +0000
@@ -64,13 +64,14 @@ S::SchedulerGlobal::SchedulerGlobal(Conf
 }
 
 
-void S::SchedulerGlobal::init(int _nthreads, const char *_config_string) {
+void S::SchedulerGlobal::init(const scheduler_options *sched_opts) {
   DEBUG_ENTER_METHOD("S::SchedulerGlobal::init");
 
   /* Set member variables */
-  nthreads = _nthreads;
-  config_string = _config_string;
+  nthreads = sched_opts->nthreads;
+  config_string = sched_opts->config_string;
   parse_config_string(nthreads, config_string);
+  options.max_clients = sched_opts->max_clients;
 
   /* Fetch or initialize clusters */
   nclusters = conf->nclusters;
@@ -104,8 +105,9 @@ void S::SchedulerGlobal::init(int _nthre
   
   /* Log message for startup */
   logger->log(LOG_WARNING, 0, "Scheduler: starting for %d cluster%s; "
-              "c%d,f%d,t%d", nclusters, nclusters == 1 ? "" : "s",
-              options.n_connections, options.force_send, options.send_timer);
+              "c%d,f%d,g%d,t%d", nclusters, nclusters == 1 ? "" : "s",
+              options.n_connections, options.force_send, 
+              options.auto_grow, options.send_timer);
 
   /* Now Running */
   running = true;
@@ -171,6 +173,7 @@ void S::SchedulerGlobal::parse_config_st
   options.n_connections = 0;   // 0 = n_connections based on db-stored config
   options.force_send = 0;      // 0 = force send always off
   options.send_timer = 1;      // 1 = 1 ms. timer in send thread
+  options.auto_grow = 1;       // 1 = allow NDB instance pool to grow on demand
 
   if(str) {
     const char *s = str;
@@ -188,6 +191,9 @@ void S::SchedulerGlobal::parse_config_st
         case 'f':
           options.force_send = value;
           break;
+        case 'g':
+          options.auto_grow = value;
+          break;
         case 't':
           options.send_timer = value;
           break;
@@ -214,6 +220,10 @@ void S::SchedulerGlobal::parse_config_st
     logger->log(LOG_WARNING, 0, "Invalid scheduler configuration.\n");
     assert(options.send_timer >= 1 && options.send_timer <= 10);
   }
+  if(options.auto_grow < 0 || options.auto_grow > 1) {
+    logger->log(LOG_WARNING, 0, "Invalid scheduler configuration.\n");
+    assert(options.auto_grow == 0 || options.auto_grow == 1);
+  }
 }
 
 
@@ -249,15 +259,14 @@ void S::SchedulerGlobal::add_stats(const
 /* SchedulerWorker methods */
 
 void S::SchedulerWorker::init(int my_thread, 
-                              int nthreads, 
-                              const char * config_string) {
+                              const scheduler_options * options) {
   /* On the first call in, initialize the SchedulerGlobal.
    * This will start the send & poll threads for each connection.
    */
   if(my_thread == 0) {
     sched_generation_number = 1;
     s_global = new SchedulerGlobal(& get_Configuration());
-    s_global->init(nthreads, config_string);
+    s_global->init(options);
   }
   
   /* Initialize member variables */
@@ -286,7 +295,7 @@ void S::SchedulerWorker::attach_thread(t
 ENGINE_ERROR_CODE S::SchedulerWorker::schedule(workitem *item) {
   int c = item->prefix_info.cluster_id;
   ENGINE_ERROR_CODE response_code;
-  NdbInstance *inst;
+  NdbInstance *inst = 0;
   S::WorkerConnection *wc;
   const KeyPrefix *pfx;
   
@@ -299,29 +308,41 @@ ENGINE_ERROR_CODE S::SchedulerWorker::sc
     pthread_rwlock_unlock(& reconf_lock);
   }
   else {
-    log_app_error(& AppError9001_ReconfLock);
+    log_app_error(& AppError29001_ReconfLock);
     return ENGINE_TMPFAIL;
   }
   /* READ LOCK RELEASED */
   
   item->base.nsuffix = item->base.nkey - pfx->prefix_len;
   if(item->base.nsuffix == 0) return ENGINE_EINVAL; // key too short
-  
-  if(wc && wc->freelist) {
+ 
+  if(wc == 0) return ENGINE_FAILED;
+    
+  if(wc->freelist) {                 /* Get the next NDB from the freelist. */
     inst = wc->freelist;
     wc->freelist = inst->next;
   }
-  else {
-    /* No more free NDBs. 
-     Eventually Scheduler::io_completed() will run _in this thread_ and return 
-     an NDB to the freelist.  But no other thread can free one, so 
-     all we can do is return an error. 
-     (Or, alternately, the scheduler may be shutting down.)
-     */
-    log_app_error(& AppError9002_NoNDBs);
-    return ENGINE_TMPFAIL;
+  else {                             /* No free NDBs. */
+    if(wc->sendqueue->is_aborted()) {
+      return ENGINE_TMPFAIL;
+    }
+    else {                           /* Try to make an NdbInstance on the fly */
+      inst = wc->newNdbInstance();
+      if(inst) {
+        log_app_error(& AppError29024_autogrow);
+      }
+      else {
+        /* We have hit a hard maximum.  Eventually Scheduler::io_completed() 
+           will run _in this thread_ and return an NDB to the freelist.  
+           But no other thread can free one, so here we return an error. 
+         */
+        log_app_error(& AppError29002_NoNDBs);
+        return ENGINE_TMPFAIL;
+      }
+    }
   }
   
+  assert(inst);
   inst->link_workitem(item);
   
   // Fetch the query plan for this prefix.
@@ -520,6 +541,18 @@ void S::Cluster::add_stats(const char *s
 
 /* WorkerConnection methods */
 
+
+NdbInstance * S::WorkerConnection::newNdbInstance() {
+  NdbInstance *inst = 0;
+  if(instances.current < instances.max) {
+    inst = new NdbInstance(conn->conn, 2);
+    instances.current++;
+    inst->id = ((id.thd + 1) * 10000) + instances.current;
+  }
+  return inst;
+}
+
+
 S::WorkerConnection::WorkerConnection(SchedulerGlobal *global,
                                       int thd_id, int cluster_id) {
   S::Cluster *cl = global->clusters[cluster_id];  
@@ -536,21 +569,25 @@ S::WorkerConnection::WorkerConnection(Sc
   plan_set = new ConnQueryPlanSet(conn->conn, conf->nprefixes);
   plan_set->buildSetForConfiguration(conf, cluster_id);
 
+  /* How many NDB instances to start initially */
+  instances.initial = conn->instances.initial / conn->n_workers;
+
+  /* Maximum size of send queue, and upper bound on NDB instances */
+  instances.max = conn->instances.max / conn->n_workers;
+
   /* Build the freelist */
   freelist = 0;
-  int my_ndb_inst = conn->nInst / conn->n_workers;
-  for(int j = 0 ; j < my_ndb_inst ; j++ ) {
-    NdbInstance *inst = new NdbInstance(conn->conn, 2);
-    inst->id = ((id.thd + 1) * 10000) + j + 1; 
+  for(instances.current = 0; instances.current < instances.initial; ) {
+    NdbInstance *inst = newNdbInstance();
     inst->next = freelist;
     freelist = inst;
   }
 
   DEBUG_PRINT("Cluster %d, connection %d (node %d), worker %d: %d NDBs.", 
-              id.cluster, id.conn, id.node, id.thd, my_ndb_inst);
+              id.cluster, id.conn, id.node, id.thd, instances.current);
   
   /* Initialize the sendqueue */
-  sendqueue = new Queue<NdbInstance>(my_ndb_inst);
+  sendqueue = new Queue<NdbInstance>(instances.max);
   
   /* Hoard a transaction (an API connect record) for each Ndb object.  This
    * first call to startTransaction() will send TC_SEIZEREQ and wait for a 
@@ -560,7 +597,7 @@ S::WorkerConnection::WorkerConnection(Sc
   QueryPlan *plan;
   const KeyPrefix *prefix = conf->getNextPrefixForCluster(id.cluster, NULL);
   if(prefix) {
-    NdbTransaction ** txlist = new NdbTransaction * [my_ndb_inst];
+    NdbTransaction ** txlist = new NdbTransaction * [instances.current];
     int i = 0;
 
     // Open them all.
@@ -573,7 +610,7 @@ S::WorkerConnection::WorkerConnection(Sc
     }
     
     // Close them all.
-    for(i = 0 ; i < my_ndb_inst ; i++) {
+    for(i = 0 ; i < instances.current ; i++) {
       txlist[i]->close();
     }    
     
@@ -642,17 +679,29 @@ S::Connection::Connection(S::Cluster & _
   n_workers = global->options.n_worker_threads / cluster.nconnections;
   if(n_total_workers % cluster.nconnections > id) n_workers += 1;  
 
-  /* How many NDB objects are needed? */
-  /* Note that this is used to configure hard limits on the size of the 
-   * waitgroup, the sentqueue, and the reschedulequeue -- and it will not be 
+  /* How many NDB objects are needed for the desired performance? */
+  double total_ndb_objects = conf->figureInFlightTransactions(cluster.cluster_id);
+  instances.initial = (int) (total_ndb_objects / cluster.nconnections);
+  while(instances.initial % n_workers) instances.initial++; // round up
+
+  /* The maximum number of NDB objects.
+   * This is used to configure hard limits on the size of the waitgroup, 
+   * the sentqueue, and the reschedulequeue -- and it will not be 
    * possible to increase those limits during online reconfig. 
    */
-  double total_ndb_objects = conf->figureInFlightTransactions(cluster.cluster_id);
-  nInst = (int) (total_ndb_objects / cluster.nconnections);
-  while(nInst % n_workers) nInst++; // round up
-    
+  instances.max = instances.initial;
+  // allow the pool to grow on demand? 
+  if(global->options.auto_grow)
+    instances.max = (int) (instances.max * 1.6);
+  // max_clients imposes a hard upper limit
+  if(instances.max > (global->options.max_clients / cluster.nconnections))
+    instances.max = global->options.max_clients / cluster.nconnections;
+  // instances.initial might also be subject to the max_clients limit
+  if(instances.initial > instances.max) 
+    instances.initial = instances.max;
+  
   /* Get a multi-wait Poll Group */
-  pollgroup = conn->create_ndb_wait_group(nInst);
+  pollgroup = conn->create_ndb_wait_group(instances.max);
       
   /* Initialize the statistics */
   stats.sent_operations = 0;
@@ -665,8 +714,8 @@ S::Connection::Connection(S::Cluster & _
   sem.counter = 0;
     
   /* Initialize the queues for sent and resceduled items */
-  sentqueue = new Queue<NdbInstance>(nInst);
-  reschedulequeue = new Queue<NdbInstance>(nInst);
+  sentqueue = new Queue<NdbInstance>(instances.max);
+  reschedulequeue = new Queue<NdbInstance>(instances.max);
 }
 
 
@@ -726,6 +775,14 @@ void S::Connection::add_stats(const char
   klen = sprintf(key, "cl%d.conn%d.timeout_races", cluster.cluster_id, id);
   vlen = sprintf(val, "%llu", stats.timeout_races);
   add_stat(key, klen, val, vlen, cookie);
+  
+  klen = sprintf(key, "cl%d.conn%d.instances.initial", cluster.cluster_id, id);
+  vlen = sprintf(val, "%d", instances.initial);
+  add_stat(key, klen, val, vlen, cookie);
+
+  klen = sprintf(key, "cl%d.conn%d.instances.max", cluster.cluster_id, id);
+  vlen = sprintf(val, "%d", instances.max);
+  add_stat(key, klen, val, vlen, cookie);
 }                              
   
 

=== modified file 'storage/ndb/memcache/src/schedulers/S_sched.h'
--- a/storage/ndb/memcache/src/schedulers/S_sched.h	2012-03-07 01:22:53 +0000
+++ b/storage/ndb/memcache/src/schedulers/S_sched.h	2012-04-06 00:12:54 +0000
@@ -61,7 +61,7 @@ class S::SchedulerGlobal {
 public:
   SchedulerGlobal(Configuration *);
   ~SchedulerGlobal() {};
-  void init(int threads, const char *config_string);
+  void init(const scheduler_options *options);
   void add_stats(const char *, ADD_STAT, const void *);
   void reconfigure(Configuration *);
   void shutdown();
@@ -82,6 +82,8 @@ public:
     int n_connections;     /** preferred number of NDB cluster connections */
     int force_send;        /** how to use NDB force-send */
     int send_timer;        /** milliseconds to set for adaptive send timer */
+    int auto_grow;         /** whether to allow NDB instance pool to grow */
+    int max_clients;       /** memcached max allowed connections */
   } options;
 
 private:
@@ -99,7 +101,7 @@ class S::SchedulerWorker : public Schedu
 public:  
   SchedulerWorker() {};
   ~SchedulerWorker() {};
-  void init(int threadnum, int nthreads, const char *config_string);
+  void init(int threadnum, const scheduler_options * sched_opts);
   void attach_thread(thread_identifier *);
   ENGINE_ERROR_CODE schedule(workitem *);
   void yield(workitem *) const {};
@@ -111,6 +113,7 @@ public:  
   
 private:
   int id;
+  ndb_pipeline *pipeline;
   SchedulerGlobal * m_global;
 };
 
@@ -159,9 +162,12 @@ private:
   Queue<NdbInstance> * reschedulequeue;
   int id;
   int node_id;
-  int nInst;
-  int n_total_workers;
-  int n_workers;
+  int n_total_workers;   /* same as SchedulerGlobal::options.n_worker_threads */
+  int n_workers;         /* number of workers for this connection */
+  struct {
+    int initial;         /* start with this many NDB instances */
+    int max;             /* scale up to this many */
+  } instances; 
   pthread_t send_thread_id;
   pthread_t poll_thread_id;  
   struct {
@@ -187,6 +193,7 @@ public:
   ~WorkerConnection();
   void shutdown();
   void reconfigure(Configuration *);
+  NdbInstance * newNdbInstance();
 
   struct { 
     int thd           : 8;
@@ -194,6 +201,11 @@ public:
     int conn          : 8;
     unsigned int node : 8;
   } id;
+  struct {
+    int initial;
+    int current;
+    int max;
+  } instances;
   S::Connection *conn;
   ConnQueryPlanSet *plan_set, *old_plan_set;
   NdbInstance *freelist;

=== modified file 'storage/ndb/memcache/src/schedulers/Stockholm.cc'
--- a/storage/ndb/memcache/src/schedulers/Stockholm.cc	2012-03-07 01:22:53 +0000
+++ b/storage/ndb/memcache/src/schedulers/Stockholm.cc	2012-04-03 00:34:18 +0000
@@ -46,14 +46,15 @@ extern "C" {
 }
 
 
-void Scheduler_stockholm::init(int my_thread, int nthreads, const char *config_string) {
+void Scheduler_stockholm::init(int my_thread, 
+                               const scheduler_options *options) {
   const Configuration & conf = get_Configuration();
 
   /* How many NDB instances are needed per cluster? */
   for(unsigned int c = 0 ; c < conf.nclusters ; c++) {
     ClusterConnectionPool *pool = conf.getConnectionPoolById(c);
     double total_ndb_objects = conf.figureInFlightTransactions(c);
-    cluster[c].nInst = (int) total_ndb_objects / nthreads;
+    cluster[c].nInst = (int) total_ndb_objects / options->nthreads;
     DEBUG_PRINT("cluster %d: %d TPS @ %d usec RTT ==> %d NDB instances.",
                 c, conf.max_tps, pool->usec_rtt, cluster[c].nInst);
   }

=== modified file 'storage/ndb/memcache/src/schedulers/Stockholm.h'
--- a/storage/ndb/memcache/src/schedulers/Stockholm.h	2012-03-07 01:22:53 +0000
+++ b/storage/ndb/memcache/src/schedulers/Stockholm.h	2012-04-03 00:34:18 +0000
@@ -44,7 +44,7 @@ class Scheduler_stockholm : public Sched
 public:
   Scheduler_stockholm() {};
   ~Scheduler_stockholm() {};
-  void init(int threadnum, int nthreads, const char *config_string);
+  void init(int threadnum, const scheduler_options *options);
   void attach_thread(thread_identifier *);
   ENGINE_ERROR_CODE schedule(workitem *);
   void yield(workitem *) const;                                       // inlined
@@ -56,6 +56,7 @@ public:
   bool global_reconfigure(Configuration *) { return false; } ;
 
 private:  
+  ndb_pipeline *pipeline;
   struct {
     struct workqueue *queue; 
     struct sched_stats_stockholm { 

=== modified file 'storage/ndb/memcache/unit/alloc.cc'
--- a/storage/ndb/memcache/unit/alloc.cc	2011-12-18 23:26:44 +0000
+++ b/storage/ndb/memcache/unit/alloc.cc	2012-04-03 00:34:18 +0000
@@ -27,14 +27,16 @@
 
 #include "all_tests.h"
 
+#define TEST_ALLOC_BLOCKS 34
+
 int run_allocator_test(QueryPlan *, Ndb *, int v) {
-  struct request_pipeline *p = get_request_pipeline(0);
+  struct request_pipeline *p = get_request_pipeline(0, NULL);
   
   memory_pool *p1 = pipeline_create_memory_pool(p);
   int sz = 13;
   uint tot = 0;
   void *v1, *v2;
-  for(int i = 0 ; i < 25 ; i++) {
+  for(int i = 0 ; i < TEST_ALLOC_BLOCKS ; i++) {
     v1 = memory_pool_alloc(p1, sz);     tot += sz;
     v2 = memory_pool_alloc(p1, sz + 1); tot += sz + 1;
     sz = (int) (sz * 1.25);

=== modified file 'storage/ndb/src/ndbapi/NdbQueryBuilder.cpp'
--- a/storage/ndb/src/ndbapi/NdbQueryBuilder.cpp	2012-03-30 12:40:48 +0000
+++ b/storage/ndb/src/ndbapi/NdbQueryBuilder.cpp	2012-04-11 10:34:58 +0000
@@ -702,24 +702,7 @@ NdbQueryOperationDef::getIndex() const
 NdbQueryBuilder* NdbQueryBuilder::create()
 {
   NdbQueryBuilderImpl* const impl = new NdbQueryBuilderImpl();
-  if (likely (impl != NULL))
-  {
-    if (likely(impl->getNdbError().code == 0))
-    {
-      return &impl->m_interface;
-    }
-    else
-    {
-      // Probably failed to create Vector instances.
-      assert(impl->getNdbError().code == Err_MemoryAlloc);
-      delete impl;
-      return NULL;
-    }
-  }
-  else
-  {
-    return NULL;
-  }
+  return (likely(impl!=NULL)) ? &impl->m_interface : NULL;
 }
 
 void NdbQueryBuilder::destroy()
@@ -1116,17 +1099,11 @@ NdbQueryBuilder::prepare()
 NdbQueryBuilderImpl::NdbQueryBuilderImpl()
 : m_interface(*this),
   m_error(),
-  m_operations(),
-  m_operands(),
+  m_operations(0),
+  m_operands(0),
   m_paramCnt(0),
   m_hasError(false)
-{
-  if (errno == ENOMEM)
-  {
-    // ENOMEM probably comes from Vector().
-    setErrorCode(Err_MemoryAlloc);
-  }
-}
+{}
 
 NdbQueryBuilderImpl::~NdbQueryBuilderImpl()
 {
@@ -1242,12 +1219,12 @@ NdbQueryDefImpl(const Vector<NdbQueryOpe
                 const Vector<NdbQueryOperandImpl*>& operands,
                 int& error)
  : m_interface(*this), 
-   m_operations(operations),
-   m_operands(operands)
+   m_operations(0),
+   m_operands(0)
 {
-  if (errno == ENOMEM)
+  if (m_operations.assign(operations) || m_operands.assign(operands))
   {
-    // Failed to allocate memory for m_operations or m_operands.
+    // Failed to allocate memory in Vector::assign().
     error = Err_MemoryAlloc;
     return;
   }
@@ -1909,16 +1886,10 @@ NdbQueryOperationDefImpl::NdbQueryOperat
    m_opNo(opNo), m_internalOpNo(internalOpNo),
    m_options(options),
    m_parent(NULL), 
-   m_children(), 
-   m_params(),
-   m_spjProjection() 
+   m_children(0), 
+   m_params(0),
+   m_spjProjection(0) 
 {
-  if (unlikely(errno == ENOMEM))
-  {
-    // Heap allocation in Vector() must have failed.
-    error = Err_MemoryAlloc;
-    return;
-  }
   if (unlikely(m_internalOpNo >= NDB_SPJ_MAX_TREE_NODES))
   {
     error = QRY_DEFINITION_TOO_LARGE;

=== modified file 'storage/ndb/src/ndbapi/NdbQueryOperation.cpp'
--- a/storage/ndb/src/ndbapi/NdbQueryOperation.cpp	2012-03-30 12:40:48 +0000
+++ b/storage/ndb/src/ndbapi/NdbQueryOperation.cpp	2012-04-11 10:34:58 +0000
@@ -3788,7 +3788,7 @@ NdbQueryOperationImpl::NdbQueryOperation
   m_queryImpl(queryImpl),
   m_operationDef(def),
   m_parent(NULL),
-  m_children(def.getNoOfChildOperations()),
+  m_children(0),
   m_maxBatchRows(0),   // >0: User specified prefered value, ==0: Use default CFG values
   m_params(),
   m_resultBuffer(NULL),
@@ -3805,9 +3805,9 @@ NdbQueryOperationImpl::NdbQueryOperation
                 ? Parallelism_max : Parallelism_adaptive),
   m_rowSize(0xffffffff)
 { 
-  if (errno == ENOMEM)
+  if (m_children.expand(def.getNoOfChildOperations()))
   {
-    // Memory allocation in Vector() (for m_children) assumed to have failed.
+    // Memory allocation during Vector::expand() failed.
     queryImpl.setErrorCode(Err_MemoryAlloc);
     return;
   }

=== modified file 'storage/ndb/test/CMakeLists.txt'
--- a/storage/ndb/test/CMakeLists.txt	2011-07-05 12:46:07 +0000
+++ b/storage/ndb/test/CMakeLists.txt	2012-04-11 10:34:58 +0000
@@ -15,8 +15,8 @@
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
 ADD_SUBDIRECTORY(src)
-IF(WITH_NDB_TEST)
+#IF(WITH_NDB_TEST)
 ADD_SUBDIRECTORY(tools)
 ADD_SUBDIRECTORY(ndbapi)
 ADD_SUBDIRECTORY(run-test)
-ENDIF(WITH_NDB_TEST)
+#ENDIF(WITH_NDB_TEST)

No bundle (reason: useless for push emails).
Thread
bzr push into mysql-5.5-cluster-7.2-spj branch (ole.john.aske:3860 to 3861) Ole John Aske11 Apr