Skip to content

Parser support for PARTITION BY #2472

@xocasdashdash

Description

@xocasdashdash

Hey everyone!
I'm using this project for running tests starting a mysql DB in memory. I'm currently hitting an issue when using PARTITION BY clauses in my table definitions.

I've checked and the vitess sql parser does support it (attaching an example), but the fork used here doesn't

Trying to parse this table works in vitess using the vitess.io/vitess/go/vt/sqlparser package

CREATE TABLE Test (
		a_key varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
		created_at datetime,
		PRIMARY KEY (a_key, created_at)
	) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
	PARTITION BY RANGE (MONTH(created_at));

But it fails with a syntax error when running it in go-mysql-server

I'm assuming that the fork is from before this vitessio/vitess#9712 PR was merged into vitess, but i'm wondering if there's any plan to increase support for parsing these kind of statements.

package main

import (
	"fmt"
	"log"
	"vitess.io/vitess/go/vt/sqlparser"
)

func main() {
	sql := `CREATE TABLE Test (
		a_key varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
		created_at datetime,
		PRIMARY KEY (a_key, created_at)
	) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
	PARTITION BY RANGE (MONTH(created_at));`
	p := sqlparser.Parser{}
	stmt, err := p.Parse(sql)
	if err != nil {
		log.Fatalf("Error parsing SQL: %v", err)
	}

	// Asserting the parsed statement is a CreateTable statement
	createTable, ok := stmt.(*sqlparser.CreateTable)
	if !ok {
		log.Fatalf("Parsed query is not a CREATE TABLE statement")
	}

	fmt.Println("Table Name:", sqlparser.String(createTable.Table.Name))
	fmt.Println("Columns:")
	for _, col := range createTable.TableSpec.Columns {
		fmt.Printf("  - %s %s\n", sqlparser.String(col.Name), sqlparser.String(col.Type))
	}
	if createTable.TableSpec.PartitionOption != nil {
		fmt.Println("Partitioning Info:", sqlparser.String(createTable.TableSpec.PartitionOption))
	}

	sql2 := `ALTER TABLE Test MODIFY b_key VARCHAR(20) NOT NULL, ALGORITHM=INPLACE, LOCK=NONE;`

	stmt, err = p.Parse(sql2)
	if err != nil {
		log.Fatalf("Error parsing SQL: %v", err)
	}

	alterTable, ok := stmt.(*sqlparser.AlterTable)
	if !ok {
		log.Fatalf("Parsed query is not a CREATE TABLE statement")
	}

	fmt.Printf("%#v", alterTable)
	fmt.Println("Table Name:", sqlparser.String(alterTable.Table))
	fmt.Println("Alter Options:")
	for _, opt := range alterTable.AlterOptions {
		fmt.Printf("  - %s %s\n", sqlparser.String(opt), ))
	}
	if alterTable.PartitionOption != nil {
		fmt.Println("Partitioning Info:", sqlparser.String(createTable.TableSpec.PartitionOption))
	}

}

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions