vitess.io/vitess@v0.16.2/go/vt/vtgate/semantics/info_schema_gen_test.go (about)

     1  /*
     2  Copyright 2022 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 semantics
    18  
    19  import (
    20  	"database/sql"
    21  	"fmt"
    22  	"regexp"
    23  	"strings"
    24  	"testing"
    25  
    26  	_ "github.com/go-sql-driver/mysql"
    27  	"github.com/stretchr/testify/require"
    28  
    29  	"vitess.io/vitess/go/vt/sqlparser"
    30  )
    31  
    32  func TestGenerateInfoSchemaMap(t *testing.T) {
    33  	t.Skip("run manually to re-create the content of the getInfoSchema functions")
    34  	b := new(strings.Builder)
    35  
    36  	db, err := sql.Open("mysql", "root@tcp(127.0.0.1:3306)/test")
    37  	require.NoError(t, err)
    38  	defer db.Close()
    39  
    40  	for _, tbl := range informationSchemaTables80 {
    41  		b.WriteString("cols = []vindexes.Column{}\n")
    42  		result, err := db.Query(fmt.Sprintf("show columns from information_schema.`%s`", tbl))
    43  		require.NoError(t, err)
    44  		defer result.Close()
    45  		for result.Next() {
    46  			var r row
    47  			result.Scan(&r.Field, &r.Type, &r.Null, &r.Key, &r.Default, &r.Extra)
    48  			allString := re.FindStringSubmatch(r.Type)
    49  			var typ string
    50  			if allString == nil {
    51  				typ = r.Type
    52  			} else {
    53  				typ = allString[1]
    54  			}
    55  			unsigned := false
    56  			if idx := strings.Index(typ, "unsigned"); idx > 0 {
    57  				typ = typ[:idx-1]
    58  				unsigned = true
    59  			}
    60  			i2 := sqlparser.SQLTypeToQueryType(typ, unsigned)
    61  			if int(i2) == 0 {
    62  				t.Fatalf("%s %s", tbl, r.Field)
    63  			}
    64  			b.WriteString(fmt.Sprintf("cols = append(cols, createCol(\"%s\", %d))\n", r.Field, int(i2)))
    65  		}
    66  		b.WriteString(fmt.Sprintf("infSchema[\"%s\"] = cols\n", tbl))
    67  	}
    68  
    69  	fmt.Println(b.String())
    70  }
    71  
    72  var (
    73  	informationSchemaTables57 = []string{
    74  		"CHARACTER_SETS",
    75  		"COLLATION_CHARACTER_SET_APPLICABILITY",
    76  		"COLLATIONS",
    77  		"COLUMN_PRIVILEGES",
    78  		"COLUMNS",
    79  		"ENGINES",
    80  		"EVENTS",
    81  		"FILES",
    82  		"GLOBAL_STATUS",
    83  		"GLOBAL_VARIABLES",
    84  		"INNODB_BUFFER_PAGE",
    85  		"INNODB_BUFFER_PAGE_LRU",
    86  		"INNODB_BUFFER_POOL_STATS",
    87  		"INNODB_CMP",
    88  		"INNODB_CMP_PER_INDEX",
    89  		"INNODB_CMP_PER_INDEX_RESET",
    90  		"INNODB_CMP_RESET",
    91  		"INNODB_CMPMEM",
    92  		"INNODB_CMPMEM_RESET",
    93  		"INNODB_FT_BEING_DELETED",
    94  		"INNODB_FT_CONFIG",
    95  		"INNODB_FT_DEFAULT_STOPWORD",
    96  		"INNODB_FT_DELETED",
    97  		"INNODB_FT_INDEX_CACHE",
    98  		"INNODB_FT_INDEX_TABLE",
    99  		"INNODB_LOCK_WAITS",
   100  		"INNODB_LOCKS",
   101  		"INNODB_METRICS",
   102  		"INNODB_SYS_COLUMNS",
   103  		"INNODB_SYS_DATAFILES",
   104  		"INNODB_SYS_FIELDS",
   105  		"INNODB_SYS_FOREIGN",
   106  		"INNODB_SYS_FOREIGN_COLS",
   107  		"INNODB_SYS_INDEXES",
   108  		"INNODB_SYS_TABLES",
   109  		"INNODB_SYS_TABLESPACES",
   110  		"INNODB_SYS_TABLESTATS",
   111  		"INNODB_SYS_VIRTUAL",
   112  		"INNODB_TEMP_TABLE_INFO",
   113  		"INNODB_TRX",
   114  		"KEY_COLUMN_USAGE",
   115  		"OPTIMIZER_TRACE",
   116  		"PARAMETERS",
   117  		"PARTITIONS",
   118  		"PLUGINS",
   119  		"PROCESSLIST",
   120  		"PROFILING",
   121  		"REFERENTIAL_CONSTRAINTS",
   122  		"ROUTINES",
   123  		"SCHEMA_PRIVILEGES",
   124  		"SCHEMATA",
   125  		"SESSION_STATUS",
   126  		"SESSION_VARIABLES",
   127  		"STATISTICS",
   128  		"TABLE_CONSTRAINTS",
   129  		"TABLE_PRIVILEGES",
   130  		"TABLES",
   131  		"TABLESPACES",
   132  		"TRIGGERS",
   133  		"USER_PRIVILEGES",
   134  		"VIEWS",
   135  	}
   136  	informationSchemaTables80 = []string{
   137  		"ADMINISTRABLE_ROLE_AUTHORIZATIONS",
   138  		"APPLICABLE_ROLES",
   139  		"CHARACTER_SETS",
   140  		"CHECK_CONSTRAINTS",
   141  		"COLLATION_CHARACTER_SET_APPLICABILITY",
   142  		"COLLATIONS",
   143  		"COLUMN_PRIVILEGES",
   144  		"COLUMN_STATISTICS",
   145  		"COLUMNS",
   146  		"COLUMNS_EXTENSIONS",
   147  		"ENABLED_ROLES",
   148  		"ENGINES",
   149  		"EVENTS",
   150  		"FILES",
   151  		"INNODB_BUFFER_PAGE",
   152  		"INNODB_BUFFER_PAGE_LRU",
   153  		"INNODB_BUFFER_POOL_STATS",
   154  		"INNODB_CACHED_INDEXES",
   155  		"INNODB_CMP",
   156  		"INNODB_CMP_PER_INDEX",
   157  		"INNODB_CMP_PER_INDEX_RESET",
   158  		"INNODB_CMP_RESET",
   159  		"INNODB_CMPMEM",
   160  		"INNODB_CMPMEM_RESET",
   161  		"INNODB_COLUMNS",
   162  		"INNODB_DATAFILES",
   163  		"INNODB_FIELDS",
   164  		"INNODB_FOREIGN",
   165  		"INNODB_FOREIGN_COLS",
   166  		"INNODB_FT_BEING_DELETED",
   167  		"INNODB_FT_CONFIG",
   168  		"INNODB_FT_DEFAULT_STOPWORD",
   169  		"INNODB_FT_DELETED",
   170  		"INNODB_FT_INDEX_CACHE",
   171  		"INNODB_FT_INDEX_TABLE",
   172  		"INNODB_INDEXES",
   173  		"INNODB_METRICS",
   174  		"INNODB_SESSION_TEMP_TABLESPACES",
   175  		"INNODB_TABLES",
   176  		"INNODB_TABLESPACES",
   177  		"INNODB_TABLESPACES_BRIEF",
   178  		"INNODB_TABLESTATS",
   179  		"INNODB_TEMP_TABLE_INFO",
   180  		"INNODB_TRX",
   181  		"INNODB_VIRTUAL",
   182  		"KEY_COLUMN_USAGE",
   183  		"KEYWORDS",
   184  		"OPTIMIZER_TRACE",
   185  		"PARAMETERS",
   186  		"PARTITIONS",
   187  		"PLUGINS",
   188  		"PROCESSLIST",
   189  		"PROFILING",
   190  		"REFERENTIAL_CONSTRAINTS",
   191  		"RESOURCE_GROUPS",
   192  		"ROLE_COLUMN_GRANTS",
   193  		"ROLE_ROUTINE_GRANTS",
   194  		"ROLE_TABLE_GRANTS",
   195  		"ROUTINES",
   196  		"SCHEMA_PRIVILEGES",
   197  		"SCHEMATA",
   198  		"SCHEMATA_EXTENSIONS",
   199  		"ST_GEOMETRY_COLUMNS",
   200  		"ST_SPATIAL_REFERENCE_SYSTEMS",
   201  		"ST_UNITS_OF_MEASURE",
   202  		"STATISTICS",
   203  		"TABLE_CONSTRAINTS",
   204  		"TABLE_CONSTRAINTS_EXTENSIONS",
   205  		"TABLE_PRIVILEGES",
   206  		"TABLES",
   207  		"TABLES_EXTENSIONS",
   208  		"TABLESPACES",
   209  		"TABLESPACES_EXTENSIONS",
   210  		"TRIGGERS",
   211  		"USER_ATTRIBUTES",
   212  		"USER_PRIVILEGES",
   213  		"VIEW_ROUTINE_USAGE",
   214  		"VIEW_TABLE_USAGE",
   215  		"VIEWS",
   216  	}
   217  )
   218  
   219  type row struct {
   220  	Field   string
   221  	Type    string
   222  	Null    string
   223  	Key     any
   224  	Default any
   225  	Extra   any
   226  }
   227  
   228  var re = regexp.MustCompile(`(.*)\((.*)\)`)