ruby-mysql 2.9.13 → 2.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/test/test_mysql.rb CHANGED
@@ -20,7 +20,7 @@ MYSQL_SOCKET = ENV['MYSQL_SOCKET']
20
20
  class TestMysql < Test::Unit::TestCase
21
21
  sub_test_case 'Mysql::VERSION' do
22
22
  test 'returns client version' do
23
- assert{ Mysql::VERSION == 20913 }
23
+ assert{ Mysql::VERSION == 21101 }
24
24
  end
25
25
  end
26
26
 
@@ -140,8 +140,8 @@ class TestMysql < Test::Unit::TestCase
140
140
  end
141
141
  test 'OPT_CONNECT_TIMEOUT: set timeout for connecting' do
142
142
  assert{ @m.options(Mysql::OPT_CONNECT_TIMEOUT, 0.1) == @m }
143
- stub(UNIXSocket).new{ sleep 1}
144
- stub(TCPSocket).new{ sleep 1}
143
+ stub(Socket).tcp{ raise Errno::ETIMEDOUT }
144
+ stub(Socket).unix{ raise Errno::ETIMEDOUT }
145
145
  assert_raise Mysql::ClientError, 'connection timeout' do
146
146
  @m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
147
147
  end
@@ -160,16 +160,63 @@ class TestMysql < Test::Unit::TestCase
160
160
  @m.query("load data local infile '#{tmpf.path}' into table t")
161
161
  assert{ @m.query('select * from t').fetch_row == ['123','abc'] }
162
162
  end
163
+ test 'OPT_LOAD_DATA_LOCAL_DIR: client can execute LOAD DATA LOCAL INFILE query with specified directory' do
164
+ require 'tempfile'
165
+ tmpf = Tempfile.new 'mysql_spec'
166
+ tmpf.puts "123\tabc\n"
167
+ tmpf.close
168
+ assert{ @m.options(Mysql::OPT_LOAD_DATA_LOCAL_DIR, File.dirname(tmpf.path)) == @m }
169
+ @m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
170
+ @m.query('create temporary table t (i int, c char(10))')
171
+ @m.query("load data local infile '#{tmpf.path}' into table t")
172
+ assert{ @m.query('select * from t').fetch_row == ['123','abc'] }
173
+ end
174
+ test 'OPT_LOAD_DATA_LOCAL_DIR: client cannot execute LOAD DATA LOCAL INFILE query without specified directory' do
175
+ require 'tempfile'
176
+ tmpf = Tempfile.new 'mysql_spec'
177
+ tmpf.puts "123\tabc\n"
178
+ tmpf.close
179
+ assert{ @m.options(Mysql::OPT_LOAD_DATA_LOCAL_DIR, '/hoge') == @m }
180
+ @m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
181
+ @m.query('create temporary table t (i int, c char(10))')
182
+ assert_raise Mysql::ClientError::LoadDataLocalInfileRejected, 'LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.' do
183
+ @m.query("load data local infile '#{tmpf.path}' into table t")
184
+ end
185
+ end
186
+ test 'without OPT_LOCAL_INFILE and OPT_LOAD_DATA_LOCAL_DIR: client cannot execute LOAD DATA LOCAL INFILE query' do
187
+ require 'tempfile'
188
+ tmpf = Tempfile.new 'mysql_spec'
189
+ tmpf.puts "123\tabc\n"
190
+ tmpf.close
191
+ @m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
192
+ @m.query('create temporary table t (i int, c char(10))')
193
+ if @m.server_version >= 80000
194
+ assert_raise Mysql::ServerError, 'Loading local data is disabled; this must be enabled on both the client and server sides' do
195
+ @m.query("load data local infile '#{tmpf.path}' into table t")
196
+ end
197
+ else
198
+ assert_raise Mysql::ServerError::NotAllowedCommand, 'The used command is not allowed with this MySQL version' do
199
+ @m.query("load data local infile '#{tmpf.path}' into table t")
200
+ end
201
+ end
202
+ end
163
203
  test 'OPT_READ_TIMEOUT: set timeout for reading packet' do
164
- assert{ @m.options(Mysql::OPT_READ_TIMEOUT, 10) == @m }
204
+ assert{ @m.options(Mysql::OPT_READ_TIMEOUT, 1) == @m }
205
+ @m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
206
+ @m.query("select 123").entries
165
207
  end
166
208
  test 'OPT_WRITE_TIMEOUT: set timeout for writing packet' do
167
- assert{ @m.options(Mysql::OPT_WRITE_TIMEOUT, 10) == @m }
209
+ assert{ @m.options(Mysql::OPT_WRITE_TIMEOUT, 1) == @m }
210
+ @m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
211
+ @m.query("select 123").entries
168
212
  end
169
213
  test 'SET_CHARSET_NAME: set charset for connection' do
170
- assert{ @m.options(Mysql::SET_CHARSET_NAME, 'utf8') == @m }
214
+ assert{ @m.options(Mysql::SET_CHARSET_NAME, 'utf8mb3') == @m }
171
215
  @m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
172
- assert{ @m.query('select @@character_set_connection').fetch_row == ['utf8'] }
216
+ assert do
217
+ @m.query('select @@character_set_connection').fetch_row == ['utf8mb3'] ||
218
+ @m.query('select @@character_set_connection').fetch_row == ['utf8']
219
+ end
173
220
  end
174
221
  end
175
222
 
@@ -537,6 +584,10 @@ class TestMysql < Test::Unit::TestCase
537
584
  end
538
585
 
539
586
  sub_test_case '#warning_count' do
587
+ setup do
588
+ @m.query("set sql_mode=''")
589
+ @m.query("set sql_mode=''") # clear warnings on previous `set' statement.
590
+ end
540
591
  test 'default values is zero' do
541
592
  assert{ @m.warning_count == 0 }
542
593
  end
@@ -683,7 +734,7 @@ class TestMysql < Test::Unit::TestCase
683
734
  setup do
684
735
  @m = Mysql.new(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
685
736
  @m.charset = 'latin1'
686
- @m.query 'create temporary table t (id int, str char(10), primary key (id))'
737
+ @m.query 'create temporary table t (id int default 0, str char(10), primary key (id))'
687
738
  @m.query "insert into t values (1,'abc'),(2,'defg'),(3,'hi'),(4,null)"
688
739
  @res = @m.query 'select * from t'
689
740
  end
@@ -707,7 +758,7 @@ class TestMysql < Test::Unit::TestCase
707
758
  assert{ f.def == nil }
708
759
  assert{ f.type == Mysql::Field::TYPE_LONG }
709
760
  assert{ f.length == 11 }
710
- f.max_length == 1
761
+ assert{ f.max_length == 1 }
711
762
  assert{ f.flags == Mysql::Field::NUM_FLAG|Mysql::Field::PRI_KEY_FLAG|Mysql::Field::PART_KEY_FLAG|Mysql::Field::NOT_NULL_FLAG }
712
763
  assert{ f.decimals == 0 }
713
764
 
@@ -717,7 +768,7 @@ class TestMysql < Test::Unit::TestCase
717
768
  assert{ f.def == nil }
718
769
  assert{ f.type == Mysql::Field::TYPE_STRING }
719
770
  assert{ f.length == 10 }
720
- f.max_length == 4
771
+ assert{ f.max_length == 4 }
721
772
  assert{ f.flags == 0 }
722
773
  assert{ f.decimals == 0 }
723
774
 
@@ -955,6 +1006,7 @@ class TestMysql < Test::Unit::TestCase
955
1006
  sub_test_case 'Mysql::Stmt' do
956
1007
  setup do
957
1008
  @m = Mysql.new(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
1009
+ @m.query("set sql_mode=''")
958
1010
  @s = @m.stmt_init
959
1011
  end
960
1012
 
@@ -1000,12 +1052,6 @@ class TestMysql < Test::Unit::TestCase
1000
1052
  assert{ @s.fetch == [123, 9, 1, 20091208100446] }
1001
1053
  end
1002
1054
 
1003
- test '(Fixnum) make result format to be Integer value' do
1004
- @s.bind_result Fixnum, Fixnum, Fixnum, Fixnum
1005
- @s.execute
1006
- assert{ @s.fetch == [123, 9, 1, 20091208100446] }
1007
- end
1008
-
1009
1055
  test '(String) make result format to be String value' do
1010
1056
  @s.bind_result String, String, String, String
1011
1057
  @s.execute
@@ -1559,6 +1605,16 @@ class TestMysql < Test::Unit::TestCase
1559
1605
  assert{ @s.entries == [[nil], [''], ['abc'], ['def'], ['abc,def'], ['abc'], ['def'], ['abc,def'], ['']] }
1560
1606
  end
1561
1607
 
1608
+ test '#fetch json column' do
1609
+ if @m.server_version >= 50700
1610
+ @m.query "create temporary table t (i json)"
1611
+ @m.query "insert into t values ('123'),('{\"a\":1,\"b\":2,\"c\":3}'),('[1,2,3]')"
1612
+ @s.prepare 'select i from t'
1613
+ @s.execute
1614
+ assert{ @s.entries == [['123'], ['{"a": 1, "b": 2, "c": 3}'], ['[1, 2, 3]']] }
1615
+ end
1616
+ end
1617
+
1562
1618
  test '#field_count' do
1563
1619
  @s.prepare 'select 1,2,3'
1564
1620
  assert{ @s.field_count == 3 }
@@ -1760,13 +1816,19 @@ class TestMysql < Test::Unit::TestCase
1760
1816
  end
1761
1817
 
1762
1818
  teardown do
1819
+ v = $VERBOSE
1820
+ $VERBOSE = false
1763
1821
  Encoding.default_internal = @default_internal
1822
+ $VERBOSE = v
1764
1823
  end
1765
1824
 
1766
1825
  sub_test_case 'default_internal is CP932' do
1767
1826
  setup do
1768
1827
  @m.prepare("insert into t (utf8,cp932,eucjp,bin) values (?,?,?,?)").execute @utf8, @cp932, @eucjp, @bin
1828
+ v = $VERBOSE
1829
+ $VERBOSE = false
1769
1830
  Encoding.default_internal = 'CP932'
1831
+ $VERBOSE = v
1770
1832
  end
1771
1833
  test 'is converted to CP932' do
1772
1834
  assert @m.query('select "あいう"').fetch == ["\x82\xA0\x82\xA2\x82\xA4".force_encoding("CP932")]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-mysql
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.9.13
4
+ version: 2.11.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tomita Masahiro
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-16 00:00:00.000000000 Z
11
+ date: 2021-11-13 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: This is MySQL connector. pure Ruby version
14
14
  email: tommy@tmtm.org
@@ -19,6 +19,10 @@ extra_rdoc_files:
19
19
  files:
20
20
  - README.rdoc
21
21
  - lib/mysql.rb
22
+ - lib/mysql/authenticator.rb
23
+ - lib/mysql/authenticator/caching_sha2_password.rb
24
+ - lib/mysql/authenticator/mysql_native_password.rb
25
+ - lib/mysql/authenticator/sha256_password.rb
22
26
  - lib/mysql/charset.rb
23
27
  - lib/mysql/constants.rb
24
28
  - lib/mysql/error.rb
@@ -28,9 +32,9 @@ files:
28
32
  - test/test_mysql_packet.rb
29
33
  homepage: http://github.com/tmtm/ruby-mysql
30
34
  licenses:
31
- - Ruby's
35
+ - Ruby
32
36
  metadata: {}
33
- post_install_message:
37
+ post_install_message:
34
38
  rdoc_options: []
35
39
  require_paths:
36
40
  - lib
@@ -45,11 +49,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
45
49
  - !ruby/object:Gem::Version
46
50
  version: '0'
47
51
  requirements: []
48
- rubyforge_project:
49
- rubygems_version: 2.4.1
50
- signing_key:
52
+ rubygems_version: 3.2.22
53
+ signing_key:
51
54
  specification_version: 4
52
55
  summary: MySQL connector
53
56
  test_files:
54
- - test/test_mysql_packet.rb
55
57
  - test/test_mysql.rb
58
+ - test/test_mysql_packet.rb