vitess.io/vitess@v0.16.2/go/mysql/sql_error_test.go (about) 1 /* 2 Copyright 2020 The Vitess Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package mysql 18 19 import ( 20 "fmt" 21 "testing" 22 23 "vitess.io/vitess/go/vt/proto/vtrpc" 24 "vitess.io/vitess/go/vt/vterrors" 25 26 "github.com/stretchr/testify/assert" 27 ) 28 29 func TestDumuxResourceExhaustedErrors(t *testing.T) { 30 type testCase struct { 31 msg string 32 want int 33 } 34 35 cases := []testCase{ 36 {"misc", ERTooManyUserConnections}, 37 {"grpc: received message larger than max (99282 vs. 1234): trailer", ERNetPacketTooLarge}, 38 {"grpc: received message larger than max (1234 vs. 1234)", ERNetPacketTooLarge}, 39 {"header: grpc: received message larger than max (1234 vs. 1234)", ERNetPacketTooLarge}, 40 {"grpc: trying to send message larger than max (18015277 vs. 16777216)", ERNetPacketTooLarge}, 41 {"grpc: trying to send message larger than max (18015277 vs. 16777216): trailer", ERNetPacketTooLarge}, 42 {"header: grpc: trying to send message larger than max (18015277 vs. 16777216)", ERNetPacketTooLarge}, 43 // This should be explicitly handled by returning ERNetPacketTooLarge from the execturo directly 44 // and therefore shouldn't need to be teased out of another error. 45 {"in-memory row count exceeded allowed limit of 13", ERTooManyUserConnections}, 46 } 47 48 for _, c := range cases { 49 got := demuxResourceExhaustedErrors(c.msg) 50 assert.Equalf(t, c.want, got, c.msg) 51 } 52 } 53 54 func TestNewSQLErrorFromError(t *testing.T) { 55 var tCases = []struct { 56 err error 57 num int 58 ss string 59 }{ 60 { 61 err: vterrors.Errorf(vtrpc.Code_OK, "ok"), 62 num: ERUnknownError, 63 ss: SSUnknownSQLState, 64 }, 65 { 66 err: vterrors.Errorf(vtrpc.Code_CANCELED, "cancelled"), 67 num: ERQueryInterrupted, 68 ss: SSQueryInterrupted, 69 }, 70 { 71 err: vterrors.Errorf(vtrpc.Code_UNKNOWN, "unknown"), 72 num: ERUnknownError, 73 ss: SSUnknownSQLState, 74 }, 75 { 76 err: vterrors.Errorf(vtrpc.Code_INVALID_ARGUMENT, "invalid argument"), 77 num: ERUnknownError, 78 ss: SSUnknownSQLState, 79 }, 80 { 81 err: vterrors.Errorf(vtrpc.Code_DEADLINE_EXCEEDED, "deadline exceeded"), 82 num: ERQueryInterrupted, 83 ss: SSQueryInterrupted, 84 }, 85 { 86 err: vterrors.Errorf(vtrpc.Code_NOT_FOUND, "code not found"), 87 num: ERUnknownError, 88 ss: SSUnknownSQLState, 89 }, 90 { 91 err: vterrors.Errorf(vtrpc.Code_ALREADY_EXISTS, "already exists"), 92 num: ERUnknownError, 93 ss: SSUnknownSQLState, 94 }, 95 { 96 err: vterrors.Errorf(vtrpc.Code_PERMISSION_DENIED, "permission denied"), 97 num: ERAccessDeniedError, 98 ss: SSAccessDeniedError, 99 }, 100 { 101 err: vterrors.Errorf(vtrpc.Code_UNAUTHENTICATED, "unauthenticated"), 102 num: ERAccessDeniedError, 103 ss: SSAccessDeniedError, 104 }, 105 { 106 err: vterrors.Errorf(vtrpc.Code_RESOURCE_EXHAUSTED, "resource exhausted"), 107 num: ERTooManyUserConnections, 108 ss: SSClientError, 109 }, 110 { 111 err: vterrors.Errorf(vtrpc.Code_FAILED_PRECONDITION, "failed precondition"), 112 num: ERUnknownError, 113 ss: SSUnknownSQLState, 114 }, 115 { 116 err: vterrors.Errorf(vtrpc.Code_ABORTED, "aborted"), 117 num: ERQueryInterrupted, 118 ss: SSQueryInterrupted, 119 }, 120 { 121 err: vterrors.Errorf(vtrpc.Code_OUT_OF_RANGE, "out of range"), 122 num: ERUnknownError, 123 ss: SSUnknownSQLState, 124 }, 125 { 126 err: vterrors.Errorf(vtrpc.Code_UNIMPLEMENTED, "unimplemented"), 127 num: ERNotSupportedYet, 128 ss: SSClientError, 129 }, 130 { 131 err: vterrors.Errorf(vtrpc.Code_INTERNAL, "internal"), 132 num: ERInternalError, 133 ss: SSUnknownSQLState, 134 }, 135 { 136 err: vterrors.Errorf(vtrpc.Code_UNAVAILABLE, "unavailable"), 137 num: ERUnknownError, 138 ss: SSUnknownSQLState, 139 }, 140 { 141 err: vterrors.Errorf(vtrpc.Code_DATA_LOSS, "data loss"), 142 num: ERUnknownError, 143 ss: SSUnknownSQLState, 144 }, 145 { 146 err: vterrors.NewErrorf(vtrpc.Code_ALREADY_EXISTS, vterrors.DbCreateExists, "create db exists"), 147 num: ERDbCreateExists, 148 ss: SSUnknownSQLState, 149 }, 150 { 151 err: vterrors.NewErrorf(vtrpc.Code_FAILED_PRECONDITION, vterrors.NoDB, "no db selected"), 152 num: ERNoDb, 153 ss: SSNoDB, 154 }, 155 { 156 err: fmt.Errorf("just some random text here"), 157 num: ERUnknownError, 158 ss: SSUnknownSQLState, 159 }, 160 { 161 err: fmt.Errorf("task error: Column 'val' cannot be null (errno 1048) (sqlstate 23000) during query: insert into _edf4846d_ab65_11ed_abb1_0a43f95f28a3_20230213061619_vrepl(id,val,ts) values (1,2,'2023-02-13 04:46:16'), (2,3,'2023-02-13 04:46:16'), (3,null,'2023-02-13 04:46:16')"), 162 num: ERBadNullError, 163 ss: SSConstraintViolation, 164 }, 165 { 166 err: vterrors.Wrapf(fmt.Errorf("Column 'val' cannot be null (errno 1048) (sqlstate 23000) during query: insert into _edf4846d_ab65_11ed_abb1_0a43f95f28a3_20230213061619_vrepl(id,val,ts) values (1,2,'2023-02-13 04:46:16'), (2,3,'2023-02-13 04:46:16'), (3,null,'2023-02-13 04:46:16')"), "task error: %d", 17), 167 num: ERBadNullError, 168 ss: SSConstraintViolation, 169 }, 170 } 171 172 for _, tc := range tCases { 173 t.Run(tc.err.Error(), func(t *testing.T) { 174 err := NewSQLErrorFromError(tc.err).(*SQLError) 175 assert.Equal(t, tc.num, err.Number()) 176 assert.Equal(t, tc.ss, err.SQLState()) 177 }) 178 } 179 }