vertica 0.12.0 → 1.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +18 -20
- data/lib/vertica.rb +15 -8
- data/lib/vertica/column.rb +32 -13
- data/lib/vertica/connection.rb +143 -119
- data/lib/vertica/{messages/backend_messages → protocol/backend}/authentication.rb +1 -1
- data/lib/vertica/{messages/backend_messages → protocol/backend}/backend_key_data.rb +1 -1
- data/lib/vertica/{messages/backend_messages → protocol/backend}/bind_complete.rb +1 -1
- data/lib/vertica/{messages/backend_messages → protocol/backend}/close_complete.rb +1 -1
- data/lib/vertica/{messages/backend_messages → protocol/backend}/command_complete.rb +1 -1
- data/lib/vertica/{messages/backend_messages → protocol/backend}/copy_in_response.rb +2 -2
- data/lib/vertica/{messages/backend_messages → protocol/backend}/data_row.rb +1 -1
- data/lib/vertica/{messages/backend_messages → protocol/backend}/empty_query_response.rb +1 -1
- data/lib/vertica/{messages/backend_messages → protocol/backend}/error_response.rb +1 -1
- data/lib/vertica/{messages/backend_messages → protocol/backend}/no_data.rb +1 -1
- data/lib/vertica/{messages/backend_messages → protocol/backend}/notice_response.rb +6 -6
- data/lib/vertica/{messages/backend_messages → protocol/backend}/parameter_description.rb +2 -2
- data/lib/vertica/{messages/backend_messages → protocol/backend}/parameter_status.rb +3 -3
- data/lib/vertica/{messages/backend_messages → protocol/backend}/parse_complete.rb +1 -1
- data/lib/vertica/{messages/backend_messages → protocol/backend}/portal_suspended.rb +1 -1
- data/lib/vertica/{messages/backend_messages → protocol/backend}/ready_for_query.rb +2 -2
- data/lib/vertica/{messages/backend_messages → protocol/backend}/row_description.rb +9 -9
- data/lib/vertica/{messages/backend_messages → protocol/backend}/unknown.rb +1 -1
- data/lib/vertica/{messages/frontend_messages → protocol/frontend}/bind.rb +2 -3
- data/lib/vertica/{messages/frontend_messages → protocol/frontend}/cancel_request.rb +3 -4
- data/lib/vertica/{messages/frontend_messages → protocol/frontend}/close.rb +3 -3
- data/lib/vertica/{messages/frontend_messages → protocol/frontend}/copy_data.rb +6 -6
- data/lib/vertica/{messages/frontend_messages → protocol/frontend}/copy_done.rb +1 -1
- data/lib/vertica/{messages/frontend_messages → protocol/frontend}/copy_fail.rb +5 -5
- data/lib/vertica/{messages/frontend_messages → protocol/frontend}/describe.rb +3 -3
- data/lib/vertica/{messages/frontend_messages → protocol/frontend}/execute.rb +3 -3
- data/lib/vertica/{messages/frontend_messages → protocol/frontend}/flush.rb +1 -1
- data/lib/vertica/{messages/frontend_messages → protocol/frontend}/parse.rb +3 -3
- data/lib/vertica/protocol/frontend/password.rb +32 -0
- data/lib/vertica/{messages/frontend_messages → protocol/frontend}/query.rb +3 -4
- data/lib/vertica/{messages/frontend_messages → protocol/frontend}/ssl_request.rb +2 -2
- data/lib/vertica/{messages/frontend_messages → protocol/frontend}/startup.rb +2 -3
- data/lib/vertica/{messages/frontend_messages → protocol/frontend}/sync.rb +1 -1
- data/lib/vertica/{messages/frontend_messages → protocol/frontend}/terminate.rb +1 -1
- data/lib/vertica/protocol/message.rb +86 -0
- data/lib/vertica/query.rb +63 -44
- data/lib/vertica/result.rb +25 -47
- data/lib/vertica/row.rb +44 -0
- data/lib/vertica/row_description.rb +102 -0
- data/lib/vertica/version.rb +1 -1
- data/test/connection.yml.example +8 -8
- data/test/functional/functional_connection_test.rb +178 -0
- data/test/functional/{query_test.rb → functional_query_test.rb} +64 -67
- data/test/functional/functional_value_conversion_test.rb +117 -0
- data/test/test_helper.rb +1 -1
- data/test/unit/backend_message_test.rb +57 -57
- data/test/unit/column_test.rb +23 -23
- data/test/unit/frontend_message_test.rb +5 -5
- data/test/unit/quoting_test.rb +16 -5
- data/test/unit/result_test.rb +61 -0
- data/test/unit/row_description_test.rb +56 -0
- data/test/unit/row_test.rb +31 -0
- data/vertica.gemspec +1 -0
- metadata +67 -45
- data/lib/vertica/messages/frontend_messages/password.rb +0 -34
- data/lib/vertica/messages/message.rb +0 -79
- data/test/functional/connection_test.rb +0 -128
- data/test/functional/value_conversion_test.rb +0 -88
@@ -0,0 +1,117 @@
|
|
1
|
+
# encoding : UTF-8
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
class FunctionalValueConversionTest < Minitest::Test
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@connection = Vertica::Connection.new(TEST_CONNECTION_HASH)
|
8
|
+
|
9
|
+
@connection.query <<-SQL
|
10
|
+
CREATE TABLE IF NOT EXISTS conversions_table (
|
11
|
+
"int_field" int,
|
12
|
+
"string_field" varchar(100),
|
13
|
+
"date_field" date,
|
14
|
+
"timestamp_field" timestamp,
|
15
|
+
"timestamptz_field" timestamptz,
|
16
|
+
"time_field" time,
|
17
|
+
"interval_field" interval,
|
18
|
+
"boolean_field" boolean,
|
19
|
+
"float_field" float,
|
20
|
+
"float_zero" float,
|
21
|
+
"binary_field" varbinary,
|
22
|
+
"long_varchar_field" long varchar
|
23
|
+
)
|
24
|
+
SQL
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
def teardown
|
29
|
+
@connection.query("DROP TABLE IF EXISTS conversions_table CASCADE;")
|
30
|
+
@connection.close
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_value_conversions
|
34
|
+
@connection.query <<-SQL
|
35
|
+
INSERT INTO conversions_table VALUES (
|
36
|
+
123,
|
37
|
+
'hello world',
|
38
|
+
'2010-01-01',
|
39
|
+
'2010-01-01 12:00:00.123456',
|
40
|
+
'2010-01-01 12:00:00 +0930',
|
41
|
+
'12:00:00',
|
42
|
+
INTERVAL '1 DAY',
|
43
|
+
TRUE,
|
44
|
+
1.0,
|
45
|
+
0.0,
|
46
|
+
HEX_TO_BINARY('d09fd180d0b8d0b2d0b5d1822c2068656c6c6f21'),
|
47
|
+
'hello world'
|
48
|
+
)
|
49
|
+
SQL
|
50
|
+
|
51
|
+
result = @connection.query <<-SQL
|
52
|
+
SELECT *,
|
53
|
+
float_field / float_zero as infinity,
|
54
|
+
float_field / float_zero - float_field / float_zero as nan
|
55
|
+
FROM conversions_table LIMIT 1
|
56
|
+
SQL
|
57
|
+
|
58
|
+
assert_equal result.rows.length, 1
|
59
|
+
assert_equal [
|
60
|
+
123,
|
61
|
+
'hello world',
|
62
|
+
Date.parse('2010-01-01'),
|
63
|
+
Time.new(2010, 1, 1, 12, 0, BigDecimal.new("0.123456")),
|
64
|
+
Time.new(2010, 1, 1, 12, 0, 0, '+09:30'),
|
65
|
+
"12:00:00",
|
66
|
+
"1",
|
67
|
+
true,
|
68
|
+
1.0,
|
69
|
+
0.0,
|
70
|
+
['d09fd180d0b8d0b2d0b5d1822c2068656c6c6f21'].pack('H*'),
|
71
|
+
'hello world',
|
72
|
+
Float::INFINITY,
|
73
|
+
Float::NAN
|
74
|
+
], result[0].to_a
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_nil_conversions
|
78
|
+
@connection.query "INSERT INTO conversions_table VALUES (NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)"
|
79
|
+
result = @connection.query "SELECT * FROM conversions_table LIMIT 1"
|
80
|
+
assert_equal result.rows.length, 1
|
81
|
+
assert_equal [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil], result[0].to_a
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_string_decoding
|
85
|
+
assert_equal 'åßç∂ë', @connection.query("SELECT 'åßç∂ë'").the_value
|
86
|
+
assert_equal Encoding::UTF_8, @connection.query("SELECT 'åßç∂ë'").the_value.encoding
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_binary_decoding
|
90
|
+
assert_equal ['d09fd180d0b8d0b2d0b5d1822c2068656c6c6f21'].pack('H*'), @connection.query("SELECT HEX_TO_BINARY('d09fd180d0b8d0b2d0b5d1822c2068656c6c6f21')").the_value
|
91
|
+
assert_equal Encoding::BINARY, @connection.query("SELECT HEX_TO_BINARY('d09fd180d0b8d0b2d0b5d1822c2068656c6c6f21')").the_value.encoding
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_timestamp_decoding_with_utc_timezone_connection
|
95
|
+
@connection.query("SET TIMEZONE TO 'UTC'")
|
96
|
+
|
97
|
+
assert_equal Time.new(2013, 1, 2, 14, 15, 16), @connection.query("SELECT '2013-01-02 14:15:16'::timestamp").the_value
|
98
|
+
assert_equal Time.new(2013, 1, 2, 19, 15, 16), @connection.query("SELECT '2013-01-02 14:15:16 America/Toronto'::timestamp").the_value
|
99
|
+
assert_equal Time.new(2013, 1, 2, 4, 45, 16), @connection.query("SELECT '2013-01-02 14:15:16 +9:30'::timestamp").the_value
|
100
|
+
|
101
|
+
assert_equal Time.new(2013, 1, 2, 14, 15, 16, '+00:00'), @connection.query("SELECT '2013-01-02 14:15:16'::timestamptz").the_value
|
102
|
+
assert_equal Time.new(2013, 1, 2, 19, 15, 16, '+00:00'), @connection.query("SELECT '2013-01-02 14:15:16 America/Toronto'::timestamptz").the_value
|
103
|
+
assert_equal Time.new(2013, 1, 2, 4, 45, 16, '+00:00'), @connection.query("SELECT '2013-01-02 14:15:16 +09:30'::timestamptz").the_value
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_timestamp_decoding_with_toronto_timezone_connection
|
107
|
+
@connection.query("SET TIMEZONE TO 'America/Toronto'")
|
108
|
+
|
109
|
+
assert_equal Time.new(2013, 1, 2, 14, 15, 16), @connection.query("SELECT '2013-01-02 14:15:16'::timestamp").the_value
|
110
|
+
assert_equal Time.new(2013, 1, 2, 14, 15, 16), @connection.query("SELECT '2013-01-02 14:15:16 America/Toronto'::timestamp").the_value
|
111
|
+
assert_equal Time.new(2013, 1, 1, 23, 45, 16), @connection.query("SELECT '2013-01-02 14:15:16 +9:30'::timestamp").the_value
|
112
|
+
|
113
|
+
assert_equal Time.new(2013, 1, 2, 14, 15, 16, '-05:00'), @connection.query("SELECT '2013-01-02 14:15:16'::timestamptz").the_value
|
114
|
+
assert_equal Time.new(2013, 1, 2, 14, 15, 16, '-05:00'), @connection.query("SELECT '2013-01-02 14:15:16 America/Toronto'::timestamptz").the_value
|
115
|
+
assert_equal Time.new(2013, 1, 1, 23, 45, 16, '-05:00'), @connection.query("SELECT '2013-01-02 14:15:16 +09:30'::timestamptz").the_value
|
116
|
+
end
|
117
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -1,61 +1,61 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class BackendMessageTest < Minitest::Test
|
4
|
-
|
4
|
+
|
5
5
|
def test_cleartext_authentication_message
|
6
|
-
msg = Vertica::
|
7
|
-
assert_equal Vertica::
|
6
|
+
msg = Vertica::Protocol::Authentication.new("\x00\x00\x00\x03")
|
7
|
+
assert_equal Vertica::Protocol::Authentication::CLEARTEXT_PASSWORD , msg.code
|
8
8
|
assert_nil msg.salt
|
9
9
|
assert_nil msg.auth_data
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
def test_parameter_status_message
|
13
|
-
msg = Vertica::
|
13
|
+
msg = Vertica::Protocol::ParameterStatus.new("standard_conforming_strings\x00on\x00")
|
14
14
|
assert_equal "standard_conforming_strings", msg.name
|
15
15
|
assert_equal "on", msg.value
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
def test_backend_key_data_message
|
19
|
-
msg = Vertica::
|
19
|
+
msg = Vertica::Protocol::BackendKeyData.new("\x00\x01\xED\xD8\x02\xC4\"\t")
|
20
20
|
assert_equal 126424, msg.pid
|
21
21
|
assert_equal 46408201, msg.key
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
def test_ready_for_query_message
|
25
|
-
msg = Vertica::
|
25
|
+
msg = Vertica::Protocol::ReadyForQuery.new("I")
|
26
26
|
assert_equal :no_transaction, msg.transaction_status
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
def test_error_response_message
|
30
30
|
data = "SFATAL\x00C3D000\x00Mdatabase \"nonexistant_db\" does not exist\x00F/scratch_a/release/vbuild/vertica/Basics/ClientAuthentication.cpp\x00L1496\x00RClientAuthentication\x00\x00"
|
31
|
-
msg = Vertica::
|
31
|
+
msg = Vertica::Protocol::ErrorResponse.new(data)
|
32
32
|
assert_equal msg.values, {
|
33
|
-
"Severity" => "FATAL",
|
34
|
-
"Sqlstate" => "3D000",
|
35
|
-
"Message" => "database \"nonexistant_db\" does not exist",
|
36
|
-
"File" => "/scratch_a/release/vbuild/vertica/Basics/ClientAuthentication.cpp",
|
37
|
-
"Line" => "1496",
|
33
|
+
"Severity" => "FATAL",
|
34
|
+
"Sqlstate" => "3D000",
|
35
|
+
"Message" => "database \"nonexistant_db\" does not exist",
|
36
|
+
"File" => "/scratch_a/release/vbuild/vertica/Basics/ClientAuthentication.cpp",
|
37
|
+
"Line" => "1496",
|
38
38
|
"Routine" => "ClientAuthentication"
|
39
39
|
}
|
40
|
-
|
40
|
+
|
41
41
|
assert_equal "Severity: FATAL, Message: database \"nonexistant_db\" does not exist, Sqlstate: 3D000, Routine: ClientAuthentication, File: /scratch_a/release/vbuild/vertica/Basics/ClientAuthentication.cpp, Line: 1496", msg.error_message
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
def test_error_response_fields
|
45
45
|
data = "SFATAL\x00C3D000\x00Mdatabase \"nonexistant_db\" does not exist\x00F/scratch_a/release/vbuild/vertica/Basics/ClientAuthentication.cpp\x00L1496\x00RClientAuthentication\x00\x00"
|
46
|
-
msg = Vertica::
|
46
|
+
msg = Vertica::Protocol::ErrorResponse.new(data)
|
47
47
|
|
48
48
|
assert_equal "FATAL", msg.severity
|
49
49
|
assert_equal "ClientAuthentication", msg.routine
|
50
50
|
end
|
51
|
-
|
52
|
-
|
51
|
+
|
52
|
+
|
53
53
|
def test_notice_response_values
|
54
54
|
data = "SINFO\x00C00000\x00Mcannot commit; no transaction in progress\x00F/scratch_a/release/vbuild/vertica/Commands/PGCall.cpp\x00L3502\x00Rprocess_vertica_transaction\x00\x00"
|
55
|
-
msg = Vertica::
|
56
|
-
|
55
|
+
msg = Vertica::Protocol::NoticeResponse.new(data)
|
56
|
+
|
57
57
|
assert_equal msg.values, {
|
58
|
-
"Severity" => "INFO",
|
58
|
+
"Severity" => "INFO",
|
59
59
|
"Sqlstate" => "00000",
|
60
60
|
"Message" => "cannot commit; no transaction in progress",
|
61
61
|
"File" => "/scratch_a/release/vbuild/vertica/Commands/PGCall.cpp",
|
@@ -63,54 +63,54 @@ class BackendMessageTest < Minitest::Test
|
|
63
63
|
"Routine" => "process_vertica_transaction"
|
64
64
|
}
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
def test_row_description_message
|
68
|
-
msg = Vertica::
|
68
|
+
msg = Vertica::Protocol::RowDescription.new("\x00\x01OUTPUT\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\b\x00\x00\x00\b\x00\x00")
|
69
69
|
assert_equal 1, msg.fields.size
|
70
70
|
assert_equal msg.fields[0], {
|
71
|
-
:name
|
72
|
-
:table_oid
|
73
|
-
:attribute_number
|
74
|
-
:data_type_oid
|
75
|
-
:data_type_size
|
76
|
-
:
|
77
|
-
:format_code
|
71
|
+
:name => "OUTPUT",
|
72
|
+
:table_oid => 0,
|
73
|
+
:attribute_number => 0,
|
74
|
+
:data_type_oid => 6,
|
75
|
+
:data_type_size => 8,
|
76
|
+
:data_type_modifier => 8,
|
77
|
+
:format_code => 0
|
78
78
|
}
|
79
|
-
|
80
|
-
msg = Vertica::
|
79
|
+
|
80
|
+
msg = Vertica::Protocol::RowDescription.new("\x00\x02id\x00\x00\np8\x00\x01\x00\x00\x00\x06\x00\b\xFF\xFF\xFF\xFF\x00\x00name\x00\x00\np8\x00\x02\x00\x00\x00\t\xFF\xFF\x00\x00\x00h\x00\x00")
|
81
81
|
assert_equal msg.fields[0], {
|
82
|
-
:name
|
83
|
-
:table_oid
|
84
|
-
:attribute_number
|
85
|
-
:data_type_oid
|
86
|
-
:data_type_size
|
87
|
-
:
|
88
|
-
:format_code
|
82
|
+
:name => "id",
|
83
|
+
:table_oid => 684088,
|
84
|
+
:attribute_number => 1,
|
85
|
+
:data_type_oid => 6,
|
86
|
+
:data_type_size => 8,
|
87
|
+
:data_type_modifier => 4294967295,
|
88
|
+
:format_code => 0
|
89
89
|
}
|
90
90
|
assert_equal msg.fields[1], {
|
91
|
-
:name
|
92
|
-
:table_oid
|
93
|
-
:attribute_number
|
94
|
-
:data_type_oid
|
95
|
-
:data_type_size
|
96
|
-
:
|
97
|
-
:format_code
|
91
|
+
:name => "name",
|
92
|
+
:table_oid => 684088,
|
93
|
+
:attribute_number => 2,
|
94
|
+
:data_type_oid => 9,
|
95
|
+
:data_type_size => 65535,
|
96
|
+
:data_type_modifier => 104,
|
97
|
+
:format_code => 0
|
98
98
|
}
|
99
99
|
end
|
100
|
-
|
100
|
+
|
101
101
|
def test_data_row_message
|
102
|
-
msg = Vertica::
|
102
|
+
msg = Vertica::Protocol::DataRow.new("\x00\x01\x00\x00\x00\x011")
|
103
103
|
assert_equal ['1'], msg.values
|
104
|
-
|
105
|
-
msg = Vertica::
|
104
|
+
|
105
|
+
msg = Vertica::Protocol::DataRow.new("\x00\x02\x00\x00\x00\x011\x00\x00\x00\x04matt")
|
106
106
|
assert_equal ['1', 'matt'], msg.values
|
107
|
-
|
108
|
-
msg = Vertica::
|
107
|
+
|
108
|
+
msg = Vertica::Protocol::DataRow.new("\x00\a\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF")
|
109
109
|
assert_equal [nil,nil,nil,nil,nil,nil,nil], msg.values
|
110
110
|
end
|
111
|
-
|
111
|
+
|
112
112
|
def test_command_complete_message
|
113
|
-
msg = Vertica::
|
113
|
+
msg = Vertica::Protocol::CommandComplete.new("CREATE TABLE\x00")
|
114
114
|
assert_equal "CREATE TABLE", msg.tag
|
115
115
|
assert_nil msg.rows
|
116
116
|
assert_nil msg.oid
|
data/test/unit/column_test.rb
CHANGED
@@ -4,30 +4,30 @@ class ColumnTest < Minitest::Test
|
|
4
4
|
|
5
5
|
def test_initialize_from_row_description
|
6
6
|
field_description = {
|
7
|
-
:name
|
8
|
-
:table_oid
|
9
|
-
:attribute_number
|
10
|
-
:data_type_oid
|
11
|
-
:data_type_size
|
12
|
-
:
|
13
|
-
:format_code
|
7
|
+
:name => "OUTPUT",
|
8
|
+
:table_oid => 0,
|
9
|
+
:attribute_number => 0,
|
10
|
+
:data_type_oid => 6,
|
11
|
+
:data_type_size => 8,
|
12
|
+
:data_type_modifier => 8,
|
13
|
+
:format_code => 0
|
14
14
|
}
|
15
15
|
|
16
16
|
column = Vertica::Column.new(field_description)
|
17
|
-
assert_equal
|
17
|
+
assert_equal 'OUTPUT', column.name
|
18
18
|
assert_equal :integer, column.data_type
|
19
|
-
assert_equal 8, column.
|
19
|
+
assert_equal 8, column.data_type_modifier
|
20
20
|
end
|
21
21
|
|
22
22
|
def test_unknown_type_oid
|
23
23
|
field_description = {
|
24
|
-
:name
|
25
|
-
:table_oid
|
26
|
-
:attribute_number
|
27
|
-
:data_type_oid
|
28
|
-
:data_type_size
|
29
|
-
:
|
30
|
-
:format_code
|
24
|
+
:name => "OUTPUT",
|
25
|
+
:table_oid => 0,
|
26
|
+
:attribute_number => 0,
|
27
|
+
:data_type_oid => 123456,
|
28
|
+
:data_type_size => 8,
|
29
|
+
:data_type_modifier => 8,
|
30
|
+
:format_code => 0
|
31
31
|
}
|
32
32
|
|
33
33
|
assert_raises(Vertica::Error::UnknownTypeError) { Vertica::Column.new(field_description) }
|
@@ -35,13 +35,13 @@ class ColumnTest < Minitest::Test
|
|
35
35
|
|
36
36
|
def test_integer_converter
|
37
37
|
field_description = {
|
38
|
-
:name
|
39
|
-
:table_oid
|
40
|
-
:attribute_number
|
41
|
-
:data_type_oid
|
42
|
-
:data_type_size
|
43
|
-
:
|
44
|
-
:format_code
|
38
|
+
:name => "OUTPUT",
|
39
|
+
:table_oid => 0,
|
40
|
+
:attribute_number => 0,
|
41
|
+
:data_type_oid => 6,
|
42
|
+
:data_type_size => 8,
|
43
|
+
:data_type_modifier => 8,
|
44
|
+
:format_code => 0
|
45
45
|
}
|
46
46
|
|
47
47
|
column = Vertica::Column.new(field_description)
|
@@ -3,17 +3,17 @@ require 'test_helper'
|
|
3
3
|
class FrontendMessageTest < Minitest::Test
|
4
4
|
|
5
5
|
def test_copy_done_message
|
6
|
-
message = Vertica::
|
6
|
+
message = Vertica::Protocol::CopyDone.new
|
7
7
|
assert_equal message.to_bytes, ['c', 0, 0, 0, 4].pack('AC4')
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
def test_copy_fail_message
|
11
|
-
message = Vertica::
|
11
|
+
message = Vertica::Protocol::CopyFail.new('sad panda')
|
12
12
|
assert_equal message.to_bytes, ['f', 0, 0, 0, 14, "sad panda"].pack('AC4Z*')
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
def test_copy_data_message
|
16
|
-
message = Vertica::
|
16
|
+
message = Vertica::Protocol::CopyData.new("foo|bar\n")
|
17
17
|
assert_equal message.to_bytes, ['d', 0, 0, 0, 12, "foo|bar\n"].pack('AC4A*')
|
18
18
|
end
|
19
19
|
end
|
data/test/unit/quoting_test.rb
CHANGED
@@ -1,31 +1,42 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class QuotingTest < Minitest::Test
|
4
|
-
|
5
4
|
def test_quote_identifier
|
6
5
|
assert_equal '"test"', Vertica.quote_identifier(:test)
|
7
6
|
assert_equal '"te""st"', Vertica.quote_identifier('te"st')
|
8
7
|
assert_equal '"te""""st"', Vertica.quote_identifier('te""st')
|
9
8
|
end
|
10
9
|
|
11
|
-
def
|
10
|
+
def test_quote_strings
|
12
11
|
assert_equal "'test'", Vertica.quote('test')
|
13
12
|
assert_equal "'te''st'", Vertica.quote("te'st")
|
14
13
|
assert_equal "'te''''st'", Vertica.quote("te''st")
|
15
14
|
assert_equal "'test'", Vertica.quote(:test)
|
15
|
+
end
|
16
16
|
|
17
|
+
def test_quote_null_and_booleans
|
17
18
|
assert_equal 'NULL', Vertica.quote(nil)
|
18
19
|
assert_equal 'TRUE', Vertica.quote(true)
|
19
20
|
assert_equal 'FALSE', Vertica.quote(false)
|
21
|
+
end
|
20
22
|
|
23
|
+
def test_quote_numerics
|
21
24
|
assert_equal '1', Vertica.quote(1)
|
22
25
|
assert_equal '1.1', Vertica.quote(1.1)
|
23
26
|
assert_equal '1.1', Vertica.quote(BigDecimal.new('1.1'))
|
27
|
+
end
|
24
28
|
|
29
|
+
def test_quote_date_and_timestamps
|
25
30
|
assert_equal "'2010-02-27'::date", Vertica.quote(Date.parse('2010-02-27'))
|
26
|
-
assert_equal "'2010-02-
|
27
|
-
assert_equal "'2010-02-
|
28
|
-
|
31
|
+
assert_equal "'2010-02-27T12:44:25.000000+0000'::timestamptz", Vertica.quote(DateTime.parse('2010-02-27 12:44:25'))
|
32
|
+
assert_equal "'2010-02-27T12:44:25.000000+0800'::timestamptz", Vertica.quote(DateTime.parse('2010-02-27 12:44:25 +8'))
|
33
|
+
|
34
|
+
assert_equal "'2010-02-27T12:44:25.123400+0000'::timestamptz", Vertica.quote(Time.utc(2010,2, 27, 12, 44, BigDecimal.new('25.1234')))
|
35
|
+
assert_equal "'2010-02-27T12:44:25.123400-0500'::timestamptz", Vertica.quote(Time.new(2010,2, 27, 12, 44, BigDecimal.new('25.1234'), '-05:00'))
|
36
|
+
assert_equal "'2010-02-27T12:44:25.123400+0900'::timestamptz", Vertica.quote(Time.new(2010,2, 27, 12, 44, BigDecimal.new('25.1234'), '+09:00'))
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_quote_array
|
29
40
|
assert_equal "NULL, 1, TRUE, 'test'", Vertica.quote([nil, 1, true, 'test'])
|
30
41
|
end
|
31
42
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ResultTest < Minitest::Test
|
4
|
+
def setup
|
5
|
+
@result = Vertica::Result.build(
|
6
|
+
row_description: [
|
7
|
+
Vertica::Column.new(name: 'a', data_type_oid: 6),
|
8
|
+
Vertica::Column.new(name: 'b', data_type_oid: 6),
|
9
|
+
],
|
10
|
+
rows: [
|
11
|
+
[1, 2],
|
12
|
+
[3, 4],
|
13
|
+
],
|
14
|
+
tag: 'SELECT'
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_basics
|
19
|
+
assert_equal 'SELECT', @result.tag
|
20
|
+
assert_equal 2, @result.size
|
21
|
+
refute_predicate @result, :empty?
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_fetch_row
|
25
|
+
assert_equal [1, 2], @result.fetch(0).to_a
|
26
|
+
assert_equal [3, 4], @result.fetch(1).to_a
|
27
|
+
|
28
|
+
assert_raises(IndexError) { @result.fetch(-1234) }
|
29
|
+
assert_raises(IndexError) { @result.fetch(1234) }
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_fetch_row_with_negative_index
|
33
|
+
assert_equal @result.fetch(0), @result.fetch(-(@result.size) + 0)
|
34
|
+
assert_equal @result.fetch(1), @result.fetch(-(@result.size) + 1)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_fetch_value_by_column_index
|
38
|
+
assert_equal 1, @result.fetch(0, 0)
|
39
|
+
assert_equal 2, @result.fetch(0, 1)
|
40
|
+
assert_raises(IndexError) { @result.fetch(0, 2) }
|
41
|
+
assert_raises(IndexError) { @result.fetch(0, -3) }
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_fetch_value_by_column_name
|
45
|
+
assert_equal 1, @result.fetch(0, :a)
|
46
|
+
assert_equal 2, @result.fetch(0, 'b')
|
47
|
+
assert_raises(KeyError) { @result.fetch(0, :c) }
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_value
|
51
|
+
assert_equal @result.value, @result[0, 0]
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_enumerable
|
55
|
+
sum_a = @result.inject(0) { |carry, row| carry + row[:a] }
|
56
|
+
sum_b = @result.inject(0) { |carry, row| carry + row[1] }
|
57
|
+
|
58
|
+
assert_equal 4, sum_a
|
59
|
+
assert_equal 6, sum_b
|
60
|
+
end
|
61
|
+
end
|