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  }