text: # vi:filetype=
  
  use lib 'lib';
  use Test::Nginx::Socket;
  
  #repeat_each(10);
  no_shuffle();
  
  repeat_each(2);
  
  plan tests => repeat_each() * 2 * blocks() + 2 * repeat_each() * 3;
  
  $ENV{TEST_NGINX_MYSQL_HOST} ||= '127.0.0.1';
  $ENV{TEST_NGINX_MYSQL_PORT} ||= 3306;
  
  our $http_config = <<'_EOC_';
      upstream backend {
          drizzle_server $TEST_NGINX_MYSQL_HOST:$TEST_NGINX_MYSQL_PORT protocol=mysql
                         dbname=ngx_test user=ngx_test password=ngx_test;
      }
  _EOC_
  
  #no_long_string();
  
  run_tests();
  
  #no_diff();
  
  __DATA__
  
  === TEST 1: sanity
  --- http_config eval: $::http_config
  --- config
      location /mysql {
          drizzle_pass backend;
          #drizzle_dbname $dbname;
          drizzle_query 'select * from cats';
          rds_json on;
          rds_json_format compact;
          drizzle_buffer_size 1;
      }
  --- request
  GET /mysql
  --- response_headers_like
  X-Resty-DBD-Module: ngx_drizzle \d+\.\d+\.\d+
  Content-Type: application/json
  --- response_body chomp
  [["id","name"],[2,null],[3,"bob"]]
  --- timeout: 15
  
  
  
  === TEST 2: keep-alive
  --- http_config eval: $::http_config
  --- config
      location /mysql {
          drizzle_pass backend;
          #drizzle_dbname $dbname;
          drizzle_query 'select * from cats';
          rds_json on;
          rds_json_format compact;
          drizzle_buffer_size 1;
      }
  --- request
  GET /mysql
  --- response_body chop
  [["id","name"],[2,null],[3,"bob"]]
  
  
  
  === TEST 3: update
  --- http_config eval: $::http_config
  --- config
      location /mysql {
          drizzle_pass backend;
          #drizzle_dbname $dbname;
          drizzle_query "update cats set name='bob' where name='bob'";
          rds_json on;
          rds_json_format compact;
          drizzle_buffer_size 1;
      }
  --- request
  GET /mysql
  --- response_body chop
  {"errcode":0,"errstr":"Rows matched: 1  Changed: 0  Warnings: 0"}
  
  
  
  === TEST 4: select empty result
  --- http_config eval: $::http_config
  --- config
      location /mysql {
          drizzle_pass backend;
          drizzle_query "select * from cats where name='tom'";
          rds_json on;
          rds_json_format compact;
          drizzle_buffer_size 1;
      }
  --- request
  GET /mysql
  --- response_body chop
  [["id","name"]]
  
  
  
  === TEST 5: update & no module header
  --- http_config eval: $::http_config
  --- config
      location /mysql {
          if ($arg_name ~ '[^A-Za-z0-9]') {
              return 400;
          }
  
          drizzle_pass backend;
          drizzle_module_header off;
          drizzle_query "update cats set name='$arg_name' where name='$arg_name'";
  
          rds_json on;
          rds_json_format compact;
          drizzle_buffer_size 1;
      }
  --- request
  GET /mysql?name=bob
  --- response_headers
  X-Resty-DBD-Module: 
  Content-Type: application/json
  --- response_body chop
  {"errcode":0,"errstr":"Rows matched: 1  Changed: 0  Warnings: 0"}
  
  
  
  === TEST 6: invalid SQL
  --- http_config eval: $::http_config
  --- config
      location /mysql {
          drizzle_pass backend;
          drizzle_module_header off;
          drizzle_query "select '32";
          rds_json on;
          rds_json_format compact;
          drizzle_buffer_size 1;
      }
  --- response_headers
  X-Resty-DBD-Module:
  Content-Type: text/html
  --- request
  GET /mysql
  --- error_code: 500
  --- response_body_like: 500 Internal Server Error
  
  
  
  === TEST 7: single row, single col
  --- http_config eval: $::http_config
  --- config
      location /test {
          echo_location /mysql "drop table if exists singles";
          echo;
          echo_location /mysql "create table singles (name varchar(15));";
          echo;
          echo_location /mysql "insert into singles values ('marry');";
          echo;
          echo_location /mysql "select * from singles;";
          echo;
      }
      location /mysql {
          drizzle_pass backend;
          drizzle_module_header off;
          drizzle_query $query_string;
          rds_json on;
          rds_json_format compact;
          drizzle_buffer_size 1;
      }
  --- request
  GET /test
  --- response_body
  {"errcode":0}
  {"errcode":0}
  {"errcode":0,"affected_rows":1}
  [["name"],["marry"]]
  --- skip_nginx: 2: < 0.7.46
  --- timeout: 5
  
  
  
  === TEST 8: floating number and insert id
  --- http_config eval: $::http_config
  --- config
      location /test {
          echo_location /mysql "drop table if exists foo";
          echo;
          echo_location /mysql "create table foo (id serial not null, primary key (id), val real);";
          echo;
          echo_location /mysql "insert into foo (val) values (3.1415926);";
          echo;
          echo_location /mysql "select * from foo;";
          echo;
      }
      location /mysql {
          drizzle_pass backend;
          drizzle_module_header off;
          drizzle_query $query_string;
          rds_json on;
          rds_json_format compact;
          drizzle_buffer_size 1;
      }
  --- request
  GET /test
  --- response_body
  {"errcode":0}
  {"errcode":0}
  {"errcode":0,"insert_id":1,"affected_rows":1}
  [["id","val"],[1,3.1415926]]
  --- skip_nginx: 2: < 0.7.46
  
  
  
  === TEST 9: text blob field
  --- http_config eval: $::http_config
  --- config
      location /test {
          echo_location /mysql "drop table if exists foo";
          echo;
          echo_location /mysql "create table foo (id serial, body text);";
          echo;
          echo_location /mysql "insert into foo (body) values ('hello');";
          echo;
          echo_location /mysql "select * from foo;";
          echo;
      }
      location /mysql {
          drizzle_pass backend;
          drizzle_module_header off;
          drizzle_query $query_string;
          rds_json on;
          rds_json_format compact;
          drizzle_buffer_size 1;
      }
  --- request
  GET /test
  --- response_body
  {"errcode":0}
  {"errcode":0}
  {"errcode":0,"insert_id":1,"affected_rows":1}
  [["id","body"],[1,"hello"]]
  --- skip_nginx: 2: < 0.7.46
  
  
  
  === TEST 10: bool blob field
  --- http_config eval: $::http_config
  --- config
      location /test {
          echo_location /mysql "drop table if exists foo";
          echo;
          echo_location /mysql "create table foo (id serial, flag bool);";
          echo;
          echo_location /mysql "insert into foo (flag) values (true);";
          echo;
          echo_location /mysql "insert into foo (flag) values (false);";
          echo;
          echo_location /mysql "select * from foo order by id;";
          echo;
      }
      location /mysql {
          drizzle_pass backend;
          drizzle_module_header off;
          drizzle_query $query_string;
          rds_json on;
          rds_json_format compact;
          drizzle_buffer_size 1;
      }
  --- request
  GET /test
  --- response_body
  {"errcode":0}
  {"errcode":0}
  {"errcode":0,"insert_id":1,"affected_rows":1}
  {"errcode":0,"insert_id":2,"affected_rows":1}
  [["id","flag"],[1,1],[2,0]]
  --- skip_nginx: 2: < 0.7.46
  --- timeout: 10
  
  
  
  === TEST 11: bit field
  --- http_config eval: $::http_config
  --- config
      location /test {
          echo_location /mysql "drop table if exists foo";
          echo;
          echo_location /mysql "create table foo (id serial, flag bit);";
          echo;
          echo_location /mysql "insert into foo (flag) values (1);";
          echo;
          echo_location /mysql "insert into foo (flag) values (0);";
          echo;
          echo_location /mysql "select * from foo order by id;";
          echo;
      }
      location /mysql {
          drizzle_pass backend;
          drizzle_module_header off;
          drizzle_query $query_string;
          rds_json on;
          rds_json_format compact;
          drizzle_buffer_size 1;
      }
  --- request
  GET /test
  --- response_body
  {"errcode":0}
  {"errcode":0}
  {"errcode":0,"insert_id":1,"affected_rows":1}
  {"errcode":0,"insert_id":2,"affected_rows":1}
  [["id","flag"],[1,"\u0001"],[2,"\u0000"]]
  --- skip_nginx: 2: < 0.7.46
  --- timeout: 10
  
  
  
  === TEST 12: date type
  --- http_config eval: $::http_config
  --- config
      location /test {
          echo_location /mysql "drop table if exists foo";
          echo;
          echo_location /mysql "create table foo (id serial, created date);";
          echo;
          echo_location /mysql "insert into foo (created) values ('2007-05-24');";
          echo;
          echo_location /mysql "select * from foo";
          echo;
      }
      location /mysql {
          drizzle_pass backend;
          drizzle_module_header off;
          drizzle_query $query_string;
          rds_json on;
          rds_json_format compact;
          drizzle_buffer_size 1;
      }
  --- request
  GET /test
  --- response_body
  {"errcode":0}
  {"errcode":0}
  {"errcode":0,"insert_id":1,"affected_rows":1}
  [["id","created"],[1,"2007-05-24"]]
  
  
  
  === TEST 13: strings need to be escaped
  --- http_config eval: $::http_config
  --- config
      location /test {
          echo_location /mysql "drop table if exists foo";
          echo;
          echo_location /mysql "create table foo (id serial, body char(25));";
          echo;
          echo_location /mysql "insert into foo (body) values ('a\\r\\nb\\bhello\Z');";
          echo;
          echo_location /mysql "select * from foo";
          echo;
      }
      location /mysql {
          drizzle_pass backend;
          drizzle_module_header off;
          drizzle_query $query_string;
          rds_json on;
          rds_json_format compact;
          drizzle_buffer_size 1;
      }
  --- request
  GET /test
  --- response_body
  {"errcode":0}
  {"errcode":0}
  {"errcode":0,"insert_id":1,"affected_rows":1}
  [["id","body"],[1,"a\r\nb\bhello\u001a"]]
  
  
  
  === TEST 14: null values
  --- http_config eval: $::http_config
  --- config
      location /test {
          echo_location /mysql "drop table if exists foo";
          echo;
          echo_location /mysql "create table foo (id serial, name char(10), age integer);";
          echo;
          echo_location /mysql "insert into foo (name, age) values ('', null);";
          echo;
          echo_location /mysql "insert into foo (name, age) values (null, 0);";
          echo;
          echo_location /mysql "select * from foo order by id";
          echo;
      }
      location /mysql {
          drizzle_pass backend;
          drizzle_module_header off;
          drizzle_query $query_string;
          rds_json on;
          rds_json_format compact;
          drizzle_buffer_size 1;
      }
  --- request
  GET /test
  --- response_body
  {"errcode":0}
  {"errcode":0}
  {"errcode":0,"insert_id":1,"affected_rows":1}
  {"errcode":0,"insert_id":2,"affected_rows":1}
  [["id","name","age"],[1,"",null],[2,null,0]]
  --- timeout: 10
  
  