Repository: cloudspannerecosystem/memefish
Pull request #80 (2024-06-07 01:53:33)

Configure Renovate
Welcome to [Renovate](https://redirect.github.com/renovatebot/renovate)! This is an onboarding PR to help you understand and configure settings before regular Pull Requests begin.

🚦 To activate Renovate, merge this Pull Request. To disable Renovate, simply close this Pull Request unmerged.



---
### Detected Package Files

 * `.github/workflows/docs.yml` (github-actions)
 * `.github/workflows/go.yml` (github-actions)
 * `docs/go.mod` (gomod)
 * `go.mod` (gomod)

### Configuration Summary

Based on the default config's presets, Renovate will:

  - Start dependency updates only once this onboarding PR is merged
  - Show all Merge Confidence badges for pull requests.
  - Enable Renovate Dependency Dashboard creation.
  - Use semantic commit type `fix` for dependencies and `chore` for all others if semantic commits are in use.
  - Ignore `node_modules`, `bower_components`, `vendor` and various test/tests (except for nuget) directories.
  - Group known monorepo packages together.
  - Use curated list of recommended non-monorepo package groupings.
  - Apply crowd-sourced package replacement rules.
  - Apply crowd-sourced workarounds for known problems with packages.

🔡 Do you want to change how Renovate upgrades your dependencies? Add your custom config to `renovate.json` in this branch. Renovate will update the Pull Request description the next time it runs.

---

### What to Expect

With your current configuration, Renovate will create 4 Pull Requests:

<details>
<summary>Update module github.com/google/go-cmp to v0.6.0</summary>

  - Schedule: ["at any time"]
  - Branch name: `renovate/github.com-google-go-cmp-0.x`
  - Merge into: `main`
  - Upgrade [github.com/google/go-cmp](https://redirect.github.com/google/go-cmp) to `v0.6.0`


</details>

<details>
<summary>Update actions/checkout action to v4</summary>

  - Schedule: ["at any time"]
  - Branch name: `renovate/actions-checkout-4.x`
  - Merge into: `main`
  - Upgrade [actions/checkout](https://redirect.github.com/actions/checkout) to `v4`


</details>

<details>
<summary>Update actions/setup-go action to v5</summary>

  - Schedule: ["at any time"]
  - Branch name: `renovate/actions-setup-go-5.x`
  - Merge into: `main`
  - Upgrade [actions/setup-go](https://redirect.github.com/actions/setup-go) to `v5`


</details>

<details>
<summary>Update peaceiris/actions-hugo action to v3</summary>

  - Schedule: ["at any time"]
  - Branch name: `renovate/peaceiris-actions-hugo-3.x`
  - Merge into: `main`
  - Upgrade [peaceiris/actions-hugo](https://redirect.github.com/peaceiris/actions-hugo) to `v3`


</details>



🚸 Branch creation will be limited to maximum 2 per hour, so it doesn't swamp any CI resources or overwhelm the project. See docs for `prhourlylimit` for details.


---
> 
> [!WARNING]
> Please correct - or verify that you can safely ignore - these dependency lookup failures before you merge this PR.
> 
> -   `Could not determine new digest for update (go package github.com/k0kubun/pp)`
> 
> Files affected: `go.mod`


---

❓ Got questions? Check out Renovate's [Docs](https://docs.renovatebot.com/), particularly the Getting Started section.
If you need any further assistance then you can also [request help here](https://redirect.github.com/renovatebot/renovate/discussions).


---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/cloudspannerecosystem/memefish).

<!--renovate-config-hash:e80b4e42a3043bc12fa0640db4bac392d2bf770acf841360d7c8ceeeac2ec1a9-->



Patch:
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index 216cef1..6c020fe 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -5,7 +5,7 @@ on:
     branches: [main]
 
 jobs:
-  deploy:
+  build:
     runs-on: ubuntu-latest
     steps:
       - name: Check out code into the Go module directory
@@ -15,13 +15,26 @@ jobs:
       - name: Set up Hugo
         uses: peaceiris/actions-hugo@v2
         with:
-          hugo-version: '0.63.2'
+          hugo-version: '0.133.0'
           extended: true
       - name: Build docs
         run: make docs
-      - name: Deploy
-        uses: docker://peaceiris/gh-pages:v2
-        env:
-          ACTIONS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
-          PUBLISH_BRANCH: gh-pages
-          PUBLISH_DIR: ./docs/public
+      - name: Upload Pages artifact
+        uses: actions/upload-pages-artifact@v3
+        with:
+          path: ./docs/public
+
+  deploy:
+    needs: build
+    name: Deploy to GitHub Pages
+    permissions:
+      pages: write
+      id-token: write
+    environment:
+      name: github-pages
+      url: ${{ steps.deployment.outputs.page_url }}
+    runs-on: ubuntu-latest
+    steps:
+      - name: Deploy to GitHub Pages
+        id: deployment
+        uses: actions/deploy-pages@v4
diff --git a/.gitignore b/.gitignore
index 3f9d989..3474865 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,3 +19,5 @@ bin
 
 # Go workspace file
 go.work
+
+docs/.hugo_*
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index 29ce44a..0000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "docs/themes/hugo-whisper-theme"]
-	path = docs/themes/hugo-whisper-theme
-	url = https://github.com/jugglerx/hugo-whisper-theme.git
diff --git a/Makefile b/Makefile
index 62b994f..2ac24ad 100644
--- a/Makefile
+++ b/Makefile
@@ -27,7 +27,7 @@ docs:
 	@echo "  (x x) < memefish: docs"
 	@echo "  /|||\\"
 	@echo
-	cd docs && hugo
+	cd docs && hugo mod get -u && hugo
 
 .PHONY: ci
 ci: lint test
diff --git a/ast/ast.go b/ast/ast.go
index 03fbe48..a58895c 100644
--- a/ast/ast.go
+++ b/ast/ast.go
@@ -56,11 +56,15 @@ func (CreateTable) isStatement()        {}
 func (CreateSequence) isStatement()     {}
 func (CreateView) isStatement()         {}
 func (CreateIndex) isStatement()        {}
+func (CreateVectorIndex) isStatement()  {}
 func (CreateRole) isStatement()         {}
 func (AlterTable) isStatement()         {}
 func (AlterIndex) isStatement()         {}
+func (AlterSequence) isStatement()      {}
 func (DropTable) isStatement()          {}
 func (DropIndex) isStatement()          {}
+func (DropVectorIndex) isStatement()    {}
+func (DropSequence) isStatement()       {}
 func (DropRole) isStatement()           {}
 func (Insert) isStatement()             {}
 func (Delete) isStatement()             {}
@@ -226,8 +230,12 @@ func (CreateSequence) isDDL()     {}
 func (AlterTable) isDDL()         {}
 func (DropTable) isDDL()          {}
 func (CreateIndex) isDDL()        {}
+func (CreateVectorIndex) isDDL()  {}
 func (AlterIndex) isDDL()         {}
+func (AlterSequence) isDDL()      {}
 func (DropIndex) isDDL()          {}
+func (DropVectorIndex) isDDL()    {}
+func (DropSequence) isDDL()       {}
 func (CreateRole) isDDL()         {}
 func (DropRole) isDDL()           {}
 func (Grant) isDDL()              {}
@@ -1444,14 +1452,13 @@ type CreateTable struct {
 //	CREATE SEQUENCE {{if .IfNotExists}}IF NOT EXISTS{{end}} {{.Name | sql}} }} OPTIONS ({{.Options | sqlJoin ","}})
 type CreateSequence struct {
 	// pos = Create
-	// end = Rparen + 1
+	// end = Options.end
 
 	Create token.Pos // position of "CREATE" keyword
-	Rparen token.Pos // position of ")" of OPTIONS clause
 
 	Name        *Ident
 	IfNotExists bool
-	Options     []*SequenceOption // len(Options) > 0
+	Options     *SequenceOptions
 }
 
 // ColumnDef is column definition in CREATE TABLE.
@@ -1650,6 +1657,17 @@ type AlterIndex struct {
 	IndexAlteration IndexAlteration
 }
 
+// AlterSequence is ALTER SEQUENCE statement node.
+type AlterSequence struct {
+	// pos = Alter
+	// end = Options.end
+
+	Alter token.Pos // position of "ALTER" keyword
+
+	Name    *Ident
+	Options *SequenceOptions
+}
+
 // AlterChangeStream is ALTER CHANGE STREAM statement node.
 //
 //	ALTER CHANGE STREAM {{.Name | sql}} {{.ChangeStreamAlteration | sql}}
@@ -1829,6 +1847,56 @@ type CreateIndex struct {
 	InterleaveIn *InterleaveIn // optional
 }
 
+// CreateVectorIndex is CREATE VECTOR INDEX statement node.
+//
+//	CREATE VECTOR INDEX {if .IfNotExists}}IF NOT EXISTS{{end}} {{.Name | sql}}
+//	ON {{.TableName | sql}}({{.ColumnName | sql}})
+//	{{if .Where}}WHERE {{.Where | sql}}{{end}}
+//	{{.Options | sql}}
+
+type CreateVectorIndex struct {
+	// pos = Create
+	// end = Options.end
+
+	Create token.Pos // position of "CREATE" keyword
+
+	IfNotExists bool // optional
+	Name        *Ident
+	TableName   *Ident
+	ColumnName  *Ident
+
+	// It only allows `WHERE column_name IS NOT NULL` for now, but we still relax the condition
+	// by reusing the `parseWhere` function for sake of it may be extended more conditions in the future.
+	//
+	// Reference: https://cloud.google.com/spanner/docs/reference/standard-sql/data-definition-language#vector_index_statements
+	Where   *Where // optional
+	Options *VectorIndexOptions
+}
+
+// VectorIndexOptions is OPTIONS clause node in CREATE VECTOR INDEX.
+//
+//	OPTIONS ({{.Records | sqlJoin ","}})
+type VectorIndexOptions struct {
+	// pos = Options
+	// end = Rparen + 1
+
+	Options token.Pos // position of "OPTIONS" keyword
+	Rparen  token.Pos // position of ")"
+
+	Records []*VectorIndexOption // len(Records) > 0
+}
+
+// VectorIndexOption is OPTIONS record node.
+//
+//	{{.Key | sql}}={{.Expr | sql}}
+type VectorIndexOption struct {
+	// pos = Key.pos
+	// end = Value.end
+
+	Key   *Ident
+	Value Expr
+}
+
 // CreateChangeStream is CREATE CHANGE STREAM statement node.
 //
 //	CREATE CHANGE STREAM {{.Name | sql}} {{.For | sqlOpt}} {{.Options | sqlOpt}}
@@ -2000,6 +2068,30 @@ type DropIndex struct {
 	Name     *Ident
 }
 
+// DropVectorIndex is DROP VECTOR INDEX statement node.
+//
+//	DROP VECTOR INDEX {{if .IfExists}}IF EXISTS{{end}} {{.Name | sql}}
+type DropVectorIndex struct {
+	// pos = Drop
+	// end = Name.end
+
+	Drop token.Pos // position of "DROP" keyword
+
+	IfExists bool
+	Name     *Ident
+}
+
+// DropSequence is DROP SEQUENCE statement node.
+//
+//	DROP SEQUENCE {{if .IfExists}}IF EXISTS{{end}} {{.Name | sql}}
+type DropSequence struct {
+	// pos = Drop
+	// end = Name.end
+	Drop     token.Pos
+	IfExists bool
+	Name     *Ident
+}
+
 // CreateRole is CREATE ROLE statement node.
 //
 //	CREATE ROLE {{.Name | sql}}
@@ -2325,3 +2417,16 @@ type SequenceOption struct {
 	Name  *Ident
 	Value Expr
 }
+
+// SequenceOptions is OPTIONS clause node in CREATE|ALTER SEQUENCE .
+//
+//	OPTIONS ({{.Records | sqlJoin ","}})
+type SequenceOptions struct {
+	// pos = Options
+	// end = Rparen + 1
+
+	Options token.Pos // position of "OPTIONS" keyword
+	Rparen  token.Pos // position of ")"
+
+	Records []*SequenceOption // len(Records) > 0
+}
diff --git a/ast/const.go b/ast/const.go
index 9e3a974..7d1ae6f 100644
--- a/ast/const.go
+++ b/ast/const.go
@@ -101,6 +101,7 @@ type ScalarTypeName string
 const (
 	BoolTypeName      ScalarTypeName = "BOOL"
 	Int64TypeName     ScalarTypeName = "INT64"
+	Float32TypeName   ScalarTypeName = "FLOAT32"
 	Float64TypeName   ScalarTypeName = "FLOAT64"
 	StringTypeName    ScalarTypeName = "STRING"
 	BytesTypeName     ScalarTypeName = "BYTES"
diff --git a/ast/pos.go b/ast/pos.go
index 0b2e059..ad28dca 100644
--- a/ast/pos.go
+++ b/ast/pos.go
@@ -500,7 +500,7 @@ func (c *CreateSequence) Pos() token.Pos {
 }
 
 func (c *CreateSequence) End() token.Pos {
-	return c.Rparen + 1
+	return c.Options.End()
 }
 
 func (c *CreateView) Pos() token.Pos {
@@ -664,6 +664,14 @@ func (c *CreateIndex) End() token.Pos {
 	return c.Rparen + 1
 }
 
+func (c *CreateVectorIndex) Pos() token.Pos {
+	return c.Create
+}
+
+func (c *CreateVectorIndex) End() token.Pos {
+	return c.Options.Rparen + 1
+}
+
 func (c *CreateChangeStream) Pos() token.Pos {
 	return c.Create
 }
@@ -695,6 +703,9 @@ func (i *InterleaveIn) End() token.Pos { return i.TableName.End() }
 func (a *AlterIndex) Pos() token.Pos { return a.Alter }
 func (a *AlterIndex) End() token.Pos { return a.IndexAlteration.End() }
 
+func (a *AlterSequence) Pos() token.Pos { return a.Alter }
+func (a *AlterSequence) End() token.Pos { return a.Options.End() }
+
 func (a *AddStoredColumn) Pos() token.Pos { return a.Add }
 func (a *AddStoredColumn) End() token.Pos { return a.Name.End() }
 
@@ -704,6 +715,12 @@ func (a *DropStoredColumn) End() token.Pos { return a.Name.End() }
 func (d *DropIndex) Pos() token.Pos { return d.Drop }
 func (d *DropIndex) End() token.Pos { return d.Name.End() }
 
+func (d *DropVectorIndex) Pos() token.Pos { return d.Drop }
+func (d *DropVectorIndex) End() token.Pos { return d.Name.End() }
+
+func (d *DropSequence) Pos() token.Pos { return d.Drop }
+func (d *DropSequence) End() token.Pos { return d.Name.End() }
+
 func (c *CreateRole) Pos() token.Pos { return c.Create }
 func (c *CreateRole) End() token.Pos { return c.Name.End() }
 
@@ -713,11 +730,11 @@ func (d *DropRole) End() token.Pos { return d.Name.End() }
 func (d *DropChangeStream) Pos() token.Pos { return d.Drop }
 func (d *DropChangeStream) End() token.Pos { return d.Name.End() }
 
-func (a *AlterChangeStream) Pos() token.Pos      { return a.Alter }
-func (a *AlterChangeStream) End() token.Pos      { return a.ChangeStreamAlteration.End() }
+func (a *AlterChangeStream) Pos() token.Pos { return a.Alter }
+func (a *AlterChangeStream) End() token.Pos { return a.ChangeStreamAlteration.End() }
 
-func (a *ChangeStreamSetFor) Pos() token.Pos     { return a.Set }
-func (a *ChangeStreamSetFor) End() token.Pos     { return a.For.End() }
+func (a *ChangeStreamSetFor) Pos() token.Pos { return a.Set }
+func (a *ChangeStreamSetFor) End() token.Pos { return a.For.End() }
 
 func (a *ChangeStreamDropForAll) Pos() token.Pos { return a.Drop }
 func (a *ChangeStreamDropForAll) End() token.Pos { return a.All + 3 }
@@ -844,3 +861,6 @@ func (u *UpdateItem) End() token.Pos { return u.Expr.End() }
 
 func (o *SequenceOption) Pos() token.Pos { return o.Name.Pos() }
 func (o *SequenceOption) End() token.Pos { return o.Value.End() }
+
+func (o *SequenceOptions) Pos() token.Pos { return o.Options }
+func (o *SequenceOptions) End() token.Pos { return o.Rparen + 1 }
diff --git a/ast/sql.go b/ast/sql.go
index 1574db0..8c3fdad 100644
--- a/ast/sql.go
+++ b/ast/sql.go
@@ -482,6 +482,18 @@ func (o *SequenceOption) SQL() string {
 	return o.Name.SQL() + " = " + o.Value.SQL()
 }
 
+func (o *SequenceOptions) SQL() string {
+	sql := "OPTIONS ("
+	for i, o := range o.Records {
+		if i > 0 {
+			sql += ", "
+		}
+		sql += o.SQL()
+	}
+	sql += ")"
+	return sql
+}
+
 func (s *ExprArg) SQL() string {
 	return s.Expr.SQL()
 }
@@ -755,17 +767,14 @@ func (c *CreateSequence) SQL() string {
 	if c.IfNotExists {
 		sql += "IF NOT EXISTS "
 	}
-	sql += c.Name.SQL() + " OPTIONS ("
-	for i, o := range c.Options {
-		if i > 0 {
-			sql += ", "
-		}
-		sql += o.SQL()
-	}
-	sql += ")"
+	sql += c.Name.SQL() + " " + c.Options.SQL()
 	return sql
 }
 
+func (c *AlterSequence) SQL() string {
+	return "ALTER SEQUENCE " + c.Name.SQL() + " SET " + c.Options.SQL()
+}
+
 func (c *CreateView) SQL() string {
 	sql := "CREATE"
 	if c.OrReplace {
@@ -968,6 +977,36 @@ func (c *CreateIndex) SQL() string {
 	return sql
 }
 
+func (c *CreateVectorIndex) SQL() string {
+	sql := "CREATE VECTOR INDEX "
+	if c.IfNotExists {
+		sql += "IF NOT EXISTS "
+	}
+	sql += c.Name.SQL()
+	sql += " ON " + c.TableName.SQL() + " (" + c.ColumnName.SQL() + ") "
+	if c.Where != nil {
+		sql += c.Where.SQL() + " "
+	}
+	sql += c.Options.SQL()
+	return sql
+}
+
+func (v *VectorIndexOptions) SQL() string {
+	sql := "OPTIONS ("
+	for i, o := range v.Records {
+		if i > 0 {
+			sql += ", "
+		}
+		sql += o.SQL()
+	}
+	sql += ")"
+	return sql
+}
+
+func (v *VectorIndexOption) SQL() string {
+	return v.Key.SQL() + "=" + v.Value.SQL()
+}
+
 func (c *CreateChangeStream) SQL() string {
 	sql := "CREATE CHANGE STREAM " + c.Name.SQL()
 	if c.For != nil {
@@ -1077,6 +1116,22 @@ func (d *DropIndex) SQL() string {
 	return sql + d.Name.SQL()
 }
 
+func (d *DropVectorIndex) SQL() string {
+	sql := "DROP VECTOR INDEX "
+	if d.IfExists {
+		sql += "IF EXISTS "
+	}
+	return sql + d.Name.SQL()
+}
+
+func (d *DropSequence) SQL() string {
+	sql := "DROP SEQUENCE "
+	if d.IfExists {
+		sql += "IF EXISTS "
+	}
+	return sql + d.Name.SQL()
+}
+
 func (c *CreateRole) SQL() string {
 	return "CREATE ROLE " + c.Name.SQL()
 }
diff --git a/docs/config.toml b/docs/config.toml
deleted file mode 100644
index 2d9b45d..0000000
--- a/docs/config.toml
+++ /dev/null
@@ -1,36 +0,0 @@
-baseurl = "https://cloudspannerecosystem.github.io/memefish"
-title = "méméfish"
-theme = "hugo-whisper-theme"
-languagecode = "en"
-defaultcontentlanguage = "en"
-
-paginate = 20
-canonifyurls = true
-
-pygmentsstyle = "bw"
-pygmentscodefences = true
-pygmentscodefencesguesssyntax = true
-
-summaryLength = 30
-
-[params]
-  homepage_button_link = "/docs"
-  homepage_button_text = "Read The Docs"
-  homepage_intro = "Spanner SQL parser for Go"
-
-  [params.logo]
-    mobile = "/images/memefish.svg"
-    standard  = "/images/memefish.svg"
-
-[[menu.main]]
-    name = "Docs"
-    weight = 1
-    url  = "/docs/"
-[[menu.main]]
-    name = "GoDoc"
-    weight = 3
-    url = "https://pkg.go.dev/github.com/cloudspannerecosystem/memefish"
-[[menu.main]]
-    name = "GitHub"
-    weight = 3
-    url = "https://github.com/cloudspannerecosystem/memefish"
diff --git a/docs/content/docs/_index.md b/docs/content/_index.md
similarity index 92%
rename from docs/content/docs/_index.md
rename to docs/content/_index.md
index bd5681e..e4cadb7 100644
--- a/docs/content/docs/_index.md
+++ b/docs/content/_index.md
@@ -1,9 +1,9 @@
 ---
-title: README
+title: Home
 ---
 
 <p align="center">
-  <img src="images/memefish.png" width="220px">
+  <img src="images/memefish.svg" width="220px">
 </p>
 
 # méméfish
diff --git a/docs/content/docs/example-parse/index.md b/docs/content/example-parse/_index.md
similarity index 100%
rename from docs/content/docs/example-parse/index.md
rename to docs/content/example-parse/_index.md
diff --git a/docs/go.mod b/docs/go.mod
new file mode 100644
index 0000000..89b35ca
--- /dev/null
+++ b/docs/go.mod
@@ -0,0 +1,5 @@
+module github.com/couldspannerecosystem/memefish/docs
+
+go 1.21.0
+
+require github.com/thingsym/hugo-theme-techdoc v1.0.1 // indirect
diff --git a/docs/go.sum b/docs/go.sum
new file mode 100644
index 0000000..cd9e238
--- /dev/null
+++ b/docs/go.sum
@@ -0,0 +1,2 @@
+github.com/thingsym/hugo-theme-techdoc v1.0.1 h1:YesixDLh7bRLFpcoyqflL3KUA+VFFw4l/9g/PuRHa4M=
+github.com/thingsym/hugo-theme-techdoc v1.0.1/go.mod h1:LTThnoCpG8nsum5q10OLrG1LdJNI3BXzV4Qr557cmAY=
diff --git a/docs/hugo.toml b/docs/hugo.toml
new file mode 100644
index 0000000..c881e52
--- /dev/null
+++ b/docs/hugo.toml
@@ -0,0 +1,52 @@
+theme = "github.com/thingsym/hugo-theme-techdoc"
+
+baseURL = "https://cloudspannerecosystem.dev/memefish/"
+title = "méméfish"
+languageCode = "en-US"
+defaultContentLanguage = "en"
+
+canonifyurls = true
+
+pygmentsstyle = "bw"
+pygmentscodefences = true
+pygmentscodefencesguesssyntax = true
+
+summaryLength = 30
+
+[markup]
+  defaultMarkdownHandler = "goldmark"
+  [markup.goldmark.renderer]
+    unsafe= true
+  [markup.tableOfContents]
+    startLevel = 2
+    endLevel = 6
+    ordered = false
+
+[params]
+  description = "Spanner SQL parser for Go"
+  github_repository = "https://github.com/cloudspannerecosystem/memefish"
+  version = ""
+
+  github_doc_repository = "https://github.com/cloudspannerecosystem/memefish"
+  github_doc_repository_branch = "main"
+  github_doc_repository_path = "docs"
+
+  menu_style = "open-menu"
+
+[menu]
+  [[menu.main]]
+    name = "Docs"
+    weight = 1
+    url  = "/"
+  [[menu.main]]
+    name = "GoDoc"
+    weight = 2
+    url = "https://pkg.go.dev/github.com/cloudspannerecosystem/memefish"
+  [[menu.main]]
+    name = "GitHub"
+    weight = 3
+    url = "https://github.com/cloudspannerecosystem/memefish"
+
+[module]
+  [[module.imports]]
+    path = "github.com/thingsym/hugo-theme-techdoc"
diff --git a/docs/layouts/_default/list.html b/docs/layouts/_default/list.html
deleted file mode 100644
index b23d375..0000000
--- a/docs/layouts/_default/list.html
+++ /dev/null
@@ -1,12 +0,0 @@
-{{ define "header_css" }}{{ end }}
-{{ define "body_classes" }}page-default-list{{ end }}
-{{ define "header_classes" }}{{ end }}
-
-{{ define "main" }}
-
-<h1 class="title">{{ .Title }}</h1>
-<div class="content">
-  {{ .Content }}
-</div>
-
-{{ end }}
diff --git a/docs/layouts/partials/sub-footer.html b/docs/layouts/partials/sub-footer.html
deleted file mode 100644
index 47be19c..0000000
--- a/docs/layouts/partials/sub-footer.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<div class="sub-footer">
-    <div class="container">
-      <div class="row">
-        <div class="col-12">
-          <div class="sub-footer-inner">
-            <ul>
-              <li class="zerostatic"><a href="https://github.com/JugglerX/hugo-whisper-theme">Hugo Whisper Theme</a> by <a href="https://www.zerostatic.io">www.zerostatic.io</a></li>
-              <li>/</li>
-              <li>(C) 2019-2023 TSUYUSATO "<a href="https://github.com/MakeNowJust">MakeNowJust</a>" Kitsune</li>
-            </ul>
-          </div>
-        </div>
-      </div>
-    </div>
-  </div>
-  
\ No newline at end of file
diff --git a/docs/static/images/terminal.svg b/docs/static/images/terminal.svg
deleted file mode 120000
index ae07bd8..0000000
--- a/docs/static/images/terminal.svg
+++ /dev/null
@@ -1,1 +0,0 @@
-../../../images/terminal.svg
\ No newline at end of file
diff --git a/docs/themes/hugo-whisper-theme b/docs/themes/hugo-whisper-theme
deleted file mode 160000
index 3993979..0000000
--- a/docs/themes/hugo-whisper-theme
+++ /dev/null
@@ -1,1 +0,0 @@
-Subproject commit 399397966bef75c48c818f1b24fa3ca1c6560ac3
diff --git a/parser.go b/parser.go
index 3362f1b..fb5473c 100644
--- a/parser.go
+++ b/parser.go
@@ -1851,6 +1851,7 @@ func (p *Parser) parseType() ast.Type {
 var simpleTypes = []string{
 	"BOOL",
 	"INT64",
+	"FLOAT32",
 	"FLOAT64",
 	"DATE",
 	"TIMESTAMP",
@@ -1986,6 +1987,8 @@ func (p *Parser) parseDDL() ast.DDL {
 			return p.parseCreateView(pos)
 		case p.Token.IsKeywordLike("INDEX") || p.Token.IsKeywordLike("UNIQUE") || p.Token.IsKeywordLike("NULL_FILTERED"):
 			return p.parseCreateIndex(pos)
+		case p.Token.IsKeywordLike("VECTOR"):
+			return p.parseCreateVectorIndex(pos)
 		case p.Token.IsKeywordLike("ROLE"):
 			return p.parseCreateRole(pos)
 		case p.Token.IsKeywordLike("CHANGE"):
@@ -1999,6 +2002,8 @@ func (p *Parser) parseDDL() ast.DDL {
 			return p.parseAlterTable(pos)
 		case p.Token.IsKeywordLike("INDEX"):
 			return p.parseAlterIndex(pos)
+		case p.Token.IsKeywordLike("SEQUENCE"):
+			return p.parseAlterSequence(pos)
 		case p.Token.IsKeywordLike("CHANGE"):
 			return p.parseAlterChangeStream(pos)
 		}
@@ -2010,6 +2015,10 @@ func (p *Parser) parseDDL() ast.DDL {
 			return p.parseDropTable(pos)
 		case p.Token.IsKeywordLike("INDEX"):
 			return p.parseDropIndex(pos)
+		case p.Token.IsKeywordLike("VECTOR"):
+			return p.parseDropVectorIndex(pos)
+		case p.Token.IsKeywordLike("SEQUENCE"):
+			return p.parseDropSequence(pos)
 		case p.Token.IsKeywordLike("ROLE"):
 			return p.parseDropRole(pos)
 		case p.Token.IsKeywordLike("CHANGE"):
@@ -2106,14 +2115,10 @@ func (p *Parser) parseCreateTable(pos token.Pos) *ast.CreateTable {
 	}
 }
 
-func (p *Parser) parseCreateSequence(pos token.Pos) *ast.CreateSequence {
-	p.expectKeywordLike("SEQUENCE")
-	ifNotExists := p.parseIfNotExists()
-	name := p.parseIdent()
-
+func (p *Parser) parseSequenceOptions(pos token.Pos) *ast.SequenceOptions {
 	p.expectKeywordLike("OPTIONS")
 	p.expect("(")
-	var options []*ast.SequenceOption
+	var records []*ast.SequenceOption
 	for p.Token.Kind != token.TokenEOF {
 		if p.Token.Kind == ")" {
 			break
@@ -2129,7 +2134,7 @@ func (p *Parser) parseCreateSequence(pos token.Pos) *ast.CreateSequence {
 		default:
 			p.panicfAtToken(&p.Token, "expected token: <int>, <string>, but: %s", p.Token.Kind)
 		}
-		options = append(options, &ast.SequenceOption{
+		records = append(records, &ast.SequenceOption{
 			Name:  optionName,
 			Value: value,
 		})
@@ -2139,14 +2144,25 @@ func (p *Parser) parseCreateSequence(pos token.Pos) *ast.CreateSequence {
 		p.nextToken()
 
 	}
-	if len(options) == 0 {
+	rparen := p.expect(")").Pos
+	if len(records) == 0 {
 		p.panicfAtToken(&p.Token, "required at least one option")
 	}
+	return &ast.SequenceOptions{
+		Options: pos,
+		Rparen:  rparen,
+		Records: records,
+	}
+}
+
+func (p *Parser) parseCreateSequence(pos token.Pos) *ast.CreateSequence {
+	p.expectKeywordLike("SEQUENCE")
+	ifNotExists := p.parseIfNotExists()
+	name := p.parseIdent()
+	options := p.parseSequenceOptions(p.Token.Pos)
 
-	rparent := p.expect(")").Pos
 	return &ast.CreateSequence{
 		Create:      pos,
-		Rparen:      rparent,
 		Name:        name,
 		IfNotExists: ifNotExists,
 		Options:     options,
@@ -2453,6 +2469,55 @@ func (p *Parser) parseOnDeleteAction() (onDelete ast.OnDeleteAction, onDeleteEnd
 	return
 }
 
+func (p *Parser) parseVectorIndexOptions() *ast.VectorIndexOptions {
+	pos := p.expectKeywordLike("OPTIONS").Pos
+	p.expect("(")
+	options := &ast.VectorIndexOptions{Options: pos}
+	for {
+		key := p.parseIdent()
+		p.expect("=")
+		value := p.parseExpr()
+		options.Records = append(options.Records, &ast.VectorIndexOption{Key: key, Value: value})
+		if p.Token.Kind == "," {
+			p.nextToken()
+			continue
+		}
+		if p.Token.Kind == ")" {
+			options.Rparen = p.Token.Pos
+			p.nextToken()
+			break
+		}
+		p.panicfAtToken(&p.Token, "expected expr or , or ), but: %s", p.Token.AsString)
+	}
+
+	return options
+}
+
+func (p *Parser) parseCreateVectorIndex(pos token.Pos) *ast.CreateVectorIndex {
+	p.expectKeywordLike("VECTOR")
+	p.expectKeywordLike("INDEX")
+	ifNotExists := p.parseIfNotExists()
+	name := p.parseIdent()
+	p.expect("ON")
+	tableName := p.parseIdent()
+	p.expect("(")
+	columnName := p.parseIdent()
+	p.expect(")")
+
+	where := p.tryParseWhere()
+	options := p.parseVectorIndexOptions()
+
+	return &ast.CreateVectorIndex{
+		Create:      pos,
+		IfNotExists: ifNotExists,
+		Name:        name,
+		TableName:   tableName,
+		ColumnName:  columnName,
+		Where:       where,
+		Options:     options,
+	}
+}
+
 func (p *Parser) parseCreateIndex(pos token.Pos) *ast.CreateIndex {
 	unique := false
 	if p.Token.IsKeywordLike("UNIQUE") {
@@ -2875,6 +2940,19 @@ func (p *Parser) parseAlterIndex(pos token.Pos) *ast.AlterIndex {
 	}
 }
 
+func (p *Parser) parseAlterSequence(pos token.Pos) *ast.AlterSequence {
+	p.expectKeywordLike("SEQUENCE")
+	name := p.parseIdent()
+	p.expect("SET")
+	options := p.parseSequenceOptions(p.Token.Pos)
+
+	return &ast.AlterSequence{
+		Alter:   pos,
+		Name:    name,
+		Options: options,
+	}
+}
+
 func (p *Parser) parseAddStoredColumn() ast.IndexAlteration {
 	pos := p.expectKeywordLike("ADD").Pos
 	p.expectKeywordLike("STORED")
@@ -2922,6 +3000,29 @@ func (p *Parser) parseDropIndex(pos token.Pos) *ast.DropIndex {
 	}
 }
 
+func (p *Parser) parseDropVectorIndex(pos token.Pos) *ast.DropVectorIndex {
+	p.expectKeywordLike("VECTOR")
+	p.expectKeywordLike("INDEX")
+	ifExists := p.parseIfExists()
+	name := p.parseIdent()
+	return &ast.DropVectorIndex{
+		Drop:     pos,
+		IfExists: ifExists,
+		Name:     name,
+	}
+}
+
+func (p *Parser) parseDropSequence(pos token.Pos) *ast.DropSequence {
+	p.expectKeywordLike("SEQUENCE")
+	ifExists := p.parseIfExists()
+	name := p.parseIdent()
+	return &ast.DropSequence{
+		Drop:     pos,
+		IfExists: ifExists,
+		Name:     name,
+	}
+}
+
 func (p *Parser) parseCreateRole(pos token.Pos) *ast.CreateRole {
 	p.expectKeywordLike("ROLE")
 	name := p.parseIdent()
@@ -3144,6 +3245,7 @@ func (p *Parser) parseSchemaType() ast.SchemaType {
 var scalarSchemaTypes = []string{
 	"BOOL",
 	"INT64",
+	"FLOAT32",
 	"FLOAT64",
 	"DATE",
 	"TIMESTAMP",
@@ -3191,7 +3293,7 @@ func (p *Parser) parseScalarSchemaType() ast.SchemaType {
 		}
 	}
 
-	panic(p.errorfAtToken(id, "expect ident: %s, %s, but: %s", strings.Join(scalarSchemaTypes, ","), strings.Join(sizedSchemaTypes, ","), id.AsString))
+	panic(p.errorfAtToken(id, "expect ident: %s, %s, but: %s", strings.Join(scalarSchemaTypes, ", "), strings.Join(sizedSchemaTypes, ", "), id.AsString))
 }
 
 func (p *Parser) parseIfNotExists() bool {
diff --git a/renovate.json b/renovate.json
new file mode 100644
index 0000000..5db72dd
--- /dev/null
+++ b/renovate.json
@@ -0,0 +1,6 @@
+{
+  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
+  "extends": [
+    "config:recommended"
+  ]
+}


Test patch:
diff --git a/ast/ast_test.go b/ast/ast_test.go
index 5199e2d..e3ab0b7 100644
--- a/ast/ast_test.go
+++ b/ast/ast_test.go
@@ -16,6 +16,7 @@ func TestStatement(t *testing.T) {
 	Statement(&AlterIndex{}).isStatement()
 	Statement(&DropTable{}).isStatement()
 	Statement(&DropIndex{}).isStatement()
+	Statement(&DropVectorIndex{}).isStatement()
 	Statement(&DropRole{}).isStatement()
 	Statement(&Insert{}).isStatement()
 	Statement(&Delete{}).isStatement()
@@ -124,13 +125,17 @@ func TestDDL(t *testing.T) {
 	DDL(&CreateDatabase{}).isDDL()
 	DDL(&CreateTable{}).isDDL()
 	DDL(&CreateIndex{}).isDDL()
+	DDL(&CreateVectorIndex{}).isDDL()
 	DDL(&CreateSequence{}).isDDL()
+	DDL(&AlterSequence{}).isDDL()
+	DDL(&DropSequence{}).isDDL()
 	DDL(&CreateView{}).isDDL()
 	DDL(&AlterTable{}).isDDL()
 	DDL(&DropTable{}).isDDL()
 	DDL(&CreateIndex{}).isDDL()
 	DDL(&AlterIndex{}).isDDL()
 	DDL(&DropIndex{}).isDDL()
+	DDL(&DropVectorIndex{}).isDDL()
 	DDL(&CreateRole{}).isDDL()
 	DDL(&DropRole{}).isDDL()
 	DDL(&Grant{}).isDDL()
diff --git a/testdata/input/ddl/alter_sequence.sql b/testdata/input/ddl/alter_sequence.sql
new file mode 100644
index 0000000..bdaab1f
--- /dev/null
+++ b/testdata/input/ddl/alter_sequence.sql
@@ -0,0 +1,1 @@
+ALTER SEQUENCE my_sequence SET OPTIONS (skip_range_min=1, skip_range_max=1234567)
diff --git a/testdata/input/ddl/create_table_types.sql b/testdata/input/ddl/create_table_types.sql
index 340a0dc..a2d6879 100644
--- a/testdata/input/ddl/create_table_types.sql
+++ b/testdata/input/ddl/create_table_types.sql
@@ -1,6 +1,7 @@
 create table types (
   b bool,
   i int64,
+  f32 float32,
   f float64,
   d date,
   t timestamp,
diff --git a/testdata/input/ddl/create_vector_index.sql b/testdata/input/ddl/create_vector_index.sql
new file mode 100644
index 0000000..b02a891
--- /dev/null
+++ b/testdata/input/ddl/create_vector_index.sql
@@ -0,0 +1,2 @@
+CREATE VECTOR INDEX IF NOT EXISTS hello_vector_index ON hello(embedding)
+OPTIONS(distance_type = 'COSINE')
\ No newline at end of file
diff --git a/testdata/input/ddl/create_vector_index_where_column_not_null.sql b/testdata/input/ddl/create_vector_index_where_column_not_null.sql
new file mode 100644
index 0000000..cc19519
--- /dev/null
+++ b/testdata/input/ddl/create_vector_index_where_column_not_null.sql
@@ -0,0 +1,3 @@
+CREATE VECTOR INDEX hello_vector_index ON hello(embedding)
+WHERE embedding IS NOT NULL
+OPTIONS(distance_type = 'COSINE')
\ No newline at end of file
diff --git a/testdata/input/ddl/drop_sequence.sql b/testdata/input/ddl/drop_sequence.sql
new file mode 100644
index 0000000..5233216
--- /dev/null
+++ b/testdata/input/ddl/drop_sequence.sql
@@ -0,0 +1,1 @@
+DROP SEQUENCE my_sequence
diff --git a/testdata/input/ddl/drop_sequence_if_exits.sql b/testdata/input/ddl/drop_sequence_if_exits.sql
new file mode 100644
index 0000000..fc6962b
--- /dev/null
+++ b/testdata/input/ddl/drop_sequence_if_exits.sql
@@ -0,0 +1,1 @@
+DROP SEQUENCE IF EXISTS my_sequence
diff --git a/testdata/input/ddl/drop_vector_index.sql b/testdata/input/ddl/drop_vector_index.sql
new file mode 100644
index 0000000..0b36c17
--- /dev/null
+++ b/testdata/input/ddl/drop_vector_index.sql
@@ -0,0 +1,1 @@
+DROP VECTOR INDEX hello_vector_index
\ No newline at end of file
diff --git a/testdata/input/query/select_cast.sql b/testdata/input/query/select_cast.sql
index 04556a7..031c10e 100644
--- a/testdata/input/query/select_cast.sql
+++ b/testdata/input/query/select_cast.sql
@@ -1,4 +1,4 @@
-select cast(1 as INT64), cast((struct(), 1, [2, 3], ["4", "5"]) as struct<struct<>, x int64, y array<int64>, z array<string>>)
+select cast(1 as INT64), cast(0.1 as float32), cast((struct(), 1, [2, 3], ["4", "5"]) as struct<struct<>, x int64, y array<int64>, z array<string>>)
 from x tablesample BERNOULLI (cast(0.1 as float64) percent),
      y tablesample BERNOULLI (cast(1 as int64) rows),
      z tablesample BERNOULLI (cast(@param as int64) rows)
diff --git a/testdata/result/ddl/alter_sequence.sql.txt b/testdata/result/ddl/alter_sequence.sql.txt
new file mode 100644
index 0000000..c8e8305
--- /dev/null
+++ b/testdata/result/ddl/alter_sequence.sql.txt
@@ -0,0 +1,47 @@
+--- alter_sequence.sql
+ALTER SEQUENCE my_sequence SET OPTIONS (skip_range_min=1, skip_range_max=1234567)
+
+--- AST
+&ast.AlterSequence{
+  Alter: 0,
+  Name:  &ast.Ident{
+    NamePos: 15,
+    NameEnd: 26,
+    Name:    "my_sequence",
+  },
+  Options: &ast.SequenceOptions{
+    Options: 31,
+    Rparen:  80,
+    Records: []*ast.SequenceOption{
+      &ast.SequenceOption{
+        Name: &ast.Ident{
+          NamePos: 40,
+          NameEnd: 54,
+          Name:    "skip_range_min",
+        },
+        Value: &ast.IntLiteral{
+          ValuePos: 55,
+          ValueEnd: 56,
+          Base:     10,
+          Value:    "1",
+        },
+      },
+      &ast.SequenceOption{
+        Name: &ast.Ident{
+          NamePos: 58,
+          NameEnd: 72,
+          Name:    "skip_range_max",
+        },
+        Value: &ast.IntLiteral{
+          ValuePos: 73,
+          ValueEnd: 80,
+          Base:     10,
+          Value:    "1234567",
+        },
+      },
+    },
+  },
+}
+
+--- SQL
+ALTER SEQUENCE my_sequence SET OPTIONS (skip_range_min = 1, skip_range_max = 1234567)
diff --git a/testdata/result/ddl/create_sequance.sql.txt b/testdata/result/ddl/create_sequance.sql.txt
index 37c68aa..9d6a557 100644
--- a/testdata/result/ddl/create_sequance.sql.txt
+++ b/testdata/result/ddl/create_sequance.sql.txt
@@ -8,63 +8,66 @@ CREATE SEQUENCE IF NOT EXISTS MySequence OPTIONS (
 --- AST
 &ast.CreateSequence{
   Create: 0,
-  Rparen: 172,
   Name:   &ast.Ident{
     NamePos: 30,
     NameEnd: 40,
     Name:    "MySequence",
   },
   IfNotExists: true,
-  Options:     []*ast.SequenceOption{
-    &ast.SequenceOption{
-      Name: &ast.Ident{
-        NamePos: 55,
-        NameEnd: 68,
-        Name:    "sequence_kind",
+  Options:     &ast.SequenceOptions{
+    Options: 41,
+    Rparen:  172,
+    Records: []*ast.SequenceOption{
+      &ast.SequenceOption{
+        Name: &ast.Ident{
+          NamePos: 55,
+          NameEnd: 68,
+          Name:    "sequence_kind",
+        },
+        Value: &ast.StringLiteral{
+          ValuePos: 69,
+          ValueEnd: 92,
+          Value:    "bit_reversed_positive",
+        },
       },
-      Value: &ast.StringLiteral{
-        ValuePos: 69,
-        ValueEnd: 92,
-        Value:    "bit_reversed_positive",
+      &ast.SequenceOption{
+        Name: &ast.Ident{
+          NamePos: 98,
+          NameEnd: 112,
+          Name:    "skip_range_min",
+        },
+        Value: &ast.IntLiteral{
+          ValuePos: 115,
+          ValueEnd: 116,
+          Base:     10,
+          Value:    "1",
+        },
       },
-    },
-    &ast.SequenceOption{
-      Name: &ast.Ident{
-        NamePos: 98,
-        NameEnd: 112,
-        Name:    "skip_range_min",
-      },
-      Value: &ast.IntLiteral{
-        ValuePos: 115,
-        ValueEnd: 116,
-        Base:     10,
-        Value:    "1",
-      },
-    },
-    &ast.SequenceOption{
-      Name: &ast.Ident{
-        NamePos: 122,
-        NameEnd: 136,
-        Name:    "skip_range_max",
-      },
-      Value: &ast.IntLiteral{
-        ValuePos: 139,
-        ValueEnd: 143,
-        Base:     10,
-        Value:    "1000",
-      },
-    },
-    &ast.SequenceOption{
-      Name: &ast.Ident{
-        NamePos: 149,
-        NameEnd: 167,
-        Name:    "start_with_counter",
+      &ast.SequenceOption{
+        Name: &ast.Ident{
+          NamePos: 122,
+          NameEnd: 136,
+          Name:    "skip_range_max",
+        },
+        Value: &ast.IntLiteral{
+          ValuePos: 139,
+          ValueEnd: 143,
+          Base:     10,
+          Value:    "1000",
+        },
       },
-      Value: &ast.IntLiteral{
-        ValuePos: 170,
-        ValueEnd: 172,
-        Base:     10,
-        Value:    "50",
+      &ast.SequenceOption{
+        Name: &ast.Ident{
+          NamePos: 149,
+          NameEnd: 167,
+          Name:    "start_with_counter",
+        },
+        Value: &ast.IntLiteral{
+          ValuePos: 170,
+          ValueEnd: 172,
+          Base:     10,
+          Value:    "50",
+        },
       },
     },
   },
diff --git a/testdata/result/ddl/create_table_types.sql.txt b/testdata/result/ddl/create_table_types.sql.txt
index 349c0f4..efee150 100644
--- a/testdata/result/ddl/create_table_types.sql.txt
+++ b/testdata/result/ddl/create_table_types.sql.txt
@@ -2,6 +2,7 @@
 create table types (
   b bool,
   i int64,
+  f32 float32,
   f float64,
   d date,
   t timestamp,
@@ -16,7 +17,7 @@ create table types (
 --- AST
 &ast.CreateTable{
   Create:      0,
-  Rparen:      212,
+  Rparen:      227,
   IfNotExists: false,
   Name:        &ast.Ident{
     NamePos: 13,
@@ -60,11 +61,27 @@ create table types (
       Null: -1,
       Name: &ast.Ident{
         NamePos: 44,
-        NameEnd: 45,
+        NameEnd: 47,
+        Name:    "f32",
+      },
+      Type: &ast.ScalarSchemaType{
+        NamePos: 48,
+        Name:    "FLOAT32",
+      },
+      NotNull:       false,
+      DefaultExpr:   (*ast.ColumnDefaultExpr)(nil),
+      GeneratedExpr: (*ast.GeneratedColumnExpr)(nil),
+      Options:       (*ast.ColumnDefOptions)(nil),
+    },
+    &ast.ColumnDef{
+      Null: -1,
+      Name: &ast.Ident{
+        NamePos: 59,
+        NameEnd: 60,
         Name:    "f",
       },
       Type: &ast.ScalarSchemaType{
-        NamePos: 46,
+        NamePos: 61,
         Name:    "FLOAT64",
       },
       NotNull:       false,
@@ -75,12 +92,12 @@ create table types (
     &ast.ColumnDef{
       Null: -1,
       Name: &ast.Ident{
-        NamePos: 57,
-        NameEnd: 58,
+        NamePos: 72,
+        NameEnd: 73,
         Name:    "d",
       },
       Type: &ast.ScalarSchemaType{
-        NamePos: 59,
+        NamePos: 74,
         Name:    "DATE",
       },
       NotNull:       false,
@@ -91,12 +108,12 @@ create table types (
     &ast.ColumnDef{
       Null: -1,
       Name: &ast.Ident{
-        NamePos: 67,
-        NameEnd: 68,
+        NamePos: 82,
+        NameEnd: 83,
         Name:    "t",
       },
       Type: &ast.ScalarSchemaType{
-        NamePos: 69,
+        NamePos: 84,
         Name:    "TIMESTAMP",
       },
       NotNull:       false,
@@ -107,18 +124,18 @@ create table types (
     &ast.ColumnDef{
       Null: -1,
       Name: &ast.Ident{
-        NamePos: 82,
-        NameEnd: 83,
+        NamePos: 97,
+        NameEnd: 98,
         Name:    "s",
       },
       Type: &ast.SizedSchemaType{
-        NamePos: 84,
-        Rparen:  94,
+        NamePos: 99,
+        Rparen:  109,
         Name:    "STRING",
         Max:     false,
         Size:    &ast.IntLiteral{
-          ValuePos: 91,
-          ValueEnd: 94,
+          ValuePos: 106,
+          ValueEnd: 109,
           Base:     10,
           Value:    "256",
         },
@@ -131,13 +148,13 @@ create table types (
     &ast.ColumnDef{
       Null: -1,
       Name: &ast.Ident{
-        NamePos: 99,
-        NameEnd: 103,
+        NamePos: 114,
+        NameEnd: 118,
         Name:    "smax",
       },
       Type: &ast.SizedSchemaType{
-        NamePos: 104,
-        Rparen:  114,
+        NamePos: 119,
+        Rparen:  129,
         Name:    "STRING",
         Max:     true,
         Size:    nil,
@@ -150,18 +167,18 @@ create table types (
     &ast.ColumnDef{
       Null: -1,
       Name: &ast.Ident{
-        NamePos: 119,
-        NameEnd: 121,
+        NamePos: 134,
+        NameEnd: 136,
         Name:    "bs",
       },
       Type: &ast.SizedSchemaType{
-        NamePos: 122,
-        Rparen:  131,
+        NamePos: 137,
+        Rparen:  146,
         Name:    "BYTES",
         Max:     false,
         Size:    &ast.IntLiteral{
-          ValuePos: 128,
-          ValueEnd: 131,
+          ValuePos: 143,
+          ValueEnd: 146,
           Base:     10,
           Value:    "256",
         },
@@ -174,13 +191,13 @@ create table types (
     &ast.ColumnDef{
       Null: -1,
       Name: &ast.Ident{
-        NamePos: 136,
-        NameEnd: 141,
+        NamePos: 151,
+        NameEnd: 156,
         Name:    "bsmax",
       },
       Type: &ast.SizedSchemaType{
-        NamePos: 142,
-        Rparen:  151,
+        NamePos: 157,
+        Rparen:  166,
         Name:    "BYTES",
         Max:     true,
         Size:    nil,
@@ -193,15 +210,15 @@ create table types (
     &ast.ColumnDef{
       Null: -1,
       Name: &ast.Ident{
-        NamePos: 156,
-        NameEnd: 158,
+        NamePos: 171,
+        NameEnd: 173,
         Name:    "ab",
       },
       Type: &ast.ArraySchemaType{
-        Array: 159,
-        Gt:    170,
+        Array: 174,
+        Gt:    185,
         Item:  &ast.ScalarSchemaType{
-          NamePos: 165,
+          NamePos: 180,
           Name:    "BOOL",
         },
       },
@@ -213,16 +230,16 @@ create table types (
     &ast.ColumnDef{
       Null: -1,
       Name: &ast.Ident{
-        NamePos: 174,
-        NameEnd: 177,
+        NamePos: 189,
+        NameEnd: 192,
         Name:    "abs",
       },
       Type: &ast.ArraySchemaType{
-        Array: 178,
-        Gt:    195,
+        Array: 193,
+        Gt:    210,
         Item:  &ast.SizedSchemaType{
-          NamePos: 184,
-          Rparen:  193,
+          NamePos: 199,
+          Rparen:  208,
           Name:    "BYTES",
           Max:     true,
           Size:    nil,
@@ -239,8 +256,8 @@ create table types (
     &ast.IndexKey{
       DirPos: -1,
       Name:   &ast.Ident{
-        NamePos: 211,
-        NameEnd: 212,
+        NamePos: 226,
+        NameEnd: 227,
         Name:    "i",
       },
       Dir: "",
@@ -251,4 +268,4 @@ create table types (
 }
 
 --- SQL
-CREATE TABLE types (b BOOL, i INT64, f FLOAT64, d DATE, t TIMESTAMP, s STRING(256), smax STRING(MAX), bs BYTES(256), bsmax BYTES(MAX), ab ARRAY<BOOL>, abs ARRAY<BYTES(MAX)>) PRIMARY KEY (i)
+CREATE TABLE types (b BOOL, i INT64, f32 FLOAT32, f FLOAT64, d DATE, t TIMESTAMP, s STRING(256), smax STRING(MAX), bs BYTES(256), bsmax BYTES(MAX), ab ARRAY<BOOL>, abs ARRAY<BYTES(MAX)>) PRIMARY KEY (i)
diff --git a/testdata/result/ddl/create_vector_index.sql.txt b/testdata/result/ddl/create_vector_index.sql.txt
new file mode 100644
index 0000000..7d5cf1e
--- /dev/null
+++ b/testdata/result/ddl/create_vector_index.sql.txt
@@ -0,0 +1,45 @@
+--- create_vector_index.sql
+CREATE VECTOR INDEX IF NOT EXISTS hello_vector_index ON hello(embedding)
+OPTIONS(distance_type = 'COSINE')
+--- AST
+&ast.CreateVectorIndex{
+  Create:      0,
+  IfNotExists: true,
+  Name:        &ast.Ident{
+    NamePos: 34,
+    NameEnd: 52,
+    Name:    "hello_vector_index",
+  },
+  TableName: &ast.Ident{
+    NamePos: 56,
+    NameEnd: 61,
+    Name:    "hello",
+  },
+  ColumnName: &ast.Ident{
+    NamePos: 62,
+    NameEnd: 71,
+    Name:    "embedding",
+  },
+  Where:   (*ast.Where)(nil),
+  Options: &ast.VectorIndexOptions{
+    Options: 73,
+    Rparen:  105,
+    Records: []*ast.VectorIndexOption{
+      &ast.VectorIndexOption{
+        Key: &ast.Ident{
+          NamePos: 81,
+          NameEnd: 94,
+          Name:    "distance_type",
+        },
+        Value: &ast.StringLiteral{
+          ValuePos: 97,
+          ValueEnd: 105,
+          Value:    "COSINE",
+        },
+      },
+    },
+  },
+}
+
+--- SQL
+CREATE VECTOR INDEX IF NOT EXISTS hello_vector_index ON hello (embedding) OPTIONS (distance_type="COSINE")
diff --git a/testdata/result/ddl/create_vector_index_where_column_not_null.sql.txt b/testdata/result/ddl/create_vector_index_where_column_not_null.sql.txt
new file mode 100644
index 0000000..da02696
--- /dev/null
+++ b/testdata/result/ddl/create_vector_index_where_column_not_null.sql.txt
@@ -0,0 +1,57 @@
+--- create_vector_index_where_column_not_null.sql
+CREATE VECTOR INDEX hello_vector_index ON hello(embedding)
+WHERE embedding IS NOT NULL
+OPTIONS(distance_type = 'COSINE')
+--- AST
+&ast.CreateVectorIndex{
+  Create:      0,
+  IfNotExists: false,
+  Name:        &ast.Ident{
+    NamePos: 20,
+    NameEnd: 38,
+    Name:    "hello_vector_index",
+  },
+  TableName: &ast.Ident{
+    NamePos: 42,
+    NameEnd: 47,
+    Name:    "hello",
+  },
+  ColumnName: &ast.Ident{
+    NamePos: 48,
+    NameEnd: 57,
+    Name:    "embedding",
+  },
+  Where: &ast.Where{
+    Where: 59,
+    Expr:  &ast.IsNullExpr{
+      Null: 82,
+      Not:  true,
+      Left: &ast.Ident{
+        NamePos: 65,
+        NameEnd: 74,
+        Name:    "embedding",
+      },
+    },
+  },
+  Options: &ast.VectorIndexOptions{
+    Options: 87,
+    Rparen:  119,
+    Records: []*ast.VectorIndexOption{
+      &ast.VectorIndexOption{
+        Key: &ast.Ident{
+          NamePos: 95,
+          NameEnd: 108,
+          Name:    "distance_type",
+        },
+        Value: &ast.StringLiteral{
+          ValuePos: 111,
+          ValueEnd: 119,
+          Value:    "COSINE",
+        },
+      },
+    },
+  },
+}
+
+--- SQL
+CREATE VECTOR INDEX hello_vector_index ON hello (embedding) WHERE embedding IS NOT NULL OPTIONS (distance_type="COSINE")
diff --git a/testdata/result/ddl/drop_sequence.sql.txt b/testdata/result/ddl/drop_sequence.sql.txt
new file mode 100644
index 0000000..5cf3fb9
--- /dev/null
+++ b/testdata/result/ddl/drop_sequence.sql.txt
@@ -0,0 +1,16 @@
+--- drop_sequence.sql
+DROP SEQUENCE my_sequence
+
+--- AST
+&ast.DropSequence{
+  Drop:     0,
+  IfExists: false,
+  Name:     &ast.Ident{
+    NamePos: 14,
+    NameEnd: 25,
+    Name:    "my_sequence",
+  },
+}
+
+--- SQL
+DROP SEQUENCE my_sequence
diff --git a/testdata/result/ddl/drop_sequence_if_exits.sql.txt b/testdata/result/ddl/drop_sequence_if_exits.sql.txt
new file mode 100644
index 0000000..8d420cb
--- /dev/null
+++ b/testdata/result/ddl/drop_sequence_if_exits.sql.txt
@@ -0,0 +1,16 @@
+--- drop_sequence_if_exits.sql
+DROP SEQUENCE IF EXISTS my_sequence
+
+--- AST
+&ast.DropSequence{
+  Drop:     0,
+  IfExists: true,
+  Name:     &ast.Ident{
+    NamePos: 24,
+    NameEnd: 35,
+    Name:    "my_sequence",
+  },
+}
+
+--- SQL
+DROP SEQUENCE IF EXISTS my_sequence
diff --git a/testdata/result/ddl/drop_vector_index.sql.txt b/testdata/result/ddl/drop_vector_index.sql.txt
new file mode 100644
index 0000000..6c7fa9e
--- /dev/null
+++ b/testdata/result/ddl/drop_vector_index.sql.txt
@@ -0,0 +1,15 @@
+--- drop_vector_index.sql
+DROP VECTOR INDEX hello_vector_index
+--- AST
+&ast.DropVectorIndex{
+  Drop:     0,
+  IfExists: false,
+  Name:     &ast.Ident{
+    NamePos: 18,
+    NameEnd: 36,
+    Name:    "hello_vector_index",
+  },
+}
+
+--- SQL
+DROP VECTOR INDEX hello_vector_index
diff --git a/testdata/result/query/select_cast.sql.txt b/testdata/result/query/select_cast.sql.txt
index 42b1d82..108a656 100644
--- a/testdata/result/query/select_cast.sql.txt
+++ b/testdata/result/query/select_cast.sql.txt
@@ -1,5 +1,5 @@
 --- select_cast.sql
-select cast(1 as INT64), cast((struct(), 1, [2, 3], ["4", "5"]) as struct<struct<>, x int64, y array<int64>, z array<string>>)
+select cast(1 as INT64), cast(0.1 as float32), cast((struct(), 1, [2, 3], ["4", "5"]) as struct<struct<>, x int64, y array<int64>, z array<string>>)
 from x tablesample BERNOULLI (cast(0.1 as float64) percent),
      y tablesample BERNOULLI (cast(1 as int64) rows),
      z tablesample BERNOULLI (cast(@param as int64) rows)
@@ -33,41 +33,56 @@ limit cast(1 as INT64) offset cast(@foo as INT64)
       &ast.ExprSelectItem{
         Expr: &ast.CastExpr{
           Cast:   25,
-          Rparen: 125,
+          Rparen: 44,
+          Expr:   &ast.FloatLiteral{
+            ValuePos: 30,
+            ValueEnd: 33,
+            Value:    "0.1",
+          },
+          Type: &ast.SimpleType{
+            NamePos: 37,
+            Name:    "FLOAT32",
+          },
+        },
+      },
+      &ast.ExprSelectItem{
+        Expr: &ast.CastExpr{
+          Cast:   47,
+          Rparen: 147,
           Expr:   &ast.StructLiteral{
             Struct: 0,
-            Lparen: 30,
-            Rparen: 62,
+            Lparen: 52,
+            Rparen: 84,
             Fields: []*ast.StructField(nil),
             Values: []ast.Expr{
               &ast.StructLiteral{
-                Struct: 31,
-                Lparen: 37,
-                Rparen: 38,
+                Struct: 53,
+                Lparen: 59,
+                Rparen: 60,
                 Fields: []*ast.StructField(nil),
                 Values: []ast.Expr(nil),
               },
               &ast.IntLiteral{
-                ValuePos: 41,
-                ValueEnd: 42,
+                ValuePos: 63,
+                ValueEnd: 64,
                 Base:     10,
                 Value:    "1",
               },
               &ast.ArrayLiteral{
                 Array:  0,
-                Lbrack: 44,
-                Rbrack: 49,
+                Lbrack: 66,
+                Rbrack: 71,
                 Type:   nil,
                 Values: []ast.Expr{
                   &ast.IntLiteral{
-                    ValuePos: 45,
-                    ValueEnd: 46,
+                    ValuePos: 67,
+                    ValueEnd: 68,
                     Base:     10,
                     Value:    "2",
                   },
                   &ast.IntLiteral{
-                    ValuePos: 48,
-                    ValueEnd: 49,
+                    ValuePos: 70,
+                    ValueEnd: 71,
                     Base:     10,
                     Value:    "3",
                   },
@@ -75,18 +90,18 @@ limit cast(1 as INT64) offset cast(@foo as INT64)
               },
               &ast.ArrayLiteral{
                 Array:  0,
-                Lbrack: 52,
-                Rbrack: 61,
+                Lbrack: 74,
+                Rbrack: 83,
                 Type:   nil,
                 Values: []ast.Expr{
                   &ast.StringLiteral{
-                    ValuePos: 53,
-                    ValueEnd: 56,
+                    ValuePos: 75,
+                    ValueEnd: 78,
                     Value:    "4",
                   },
                   &ast.StringLiteral{
-                    ValuePos: 58,
-                    ValueEnd: 61,
+                    ValuePos: 80,
+                    ValueEnd: 83,
                     Value:    "5",
                   },
                 },
@@ -94,54 +109,54 @@ limit cast(1 as INT64) offset cast(@foo as INT64)
             },
           },
           Type: &ast.StructType{
-            Struct: 67,
-            Gt:     124,
+            Struct: 89,
+            Gt:     146,
             Fields: []*ast.StructField{
               &ast.StructField{
                 Ident: (*ast.Ident)(nil),
                 Type:  &ast.StructType{
-                  Struct: 74,
-                  Gt:     81,
+                  Struct: 96,
+                  Gt:     103,
                   Fields: []*ast.StructField{},
                 },
               },
               &ast.StructField{
                 Ident: &ast.Ident{
-                  NamePos: 84,
-                  NameEnd: 85,
+                  NamePos: 106,
+                  NameEnd: 107,
                   Name:    "x",
                 },
                 Type: &ast.SimpleType{
-                  NamePos: 86,
+                  NamePos: 108,
                   Name:    "INT64",
                 },
               },
               &ast.StructField{
                 Ident: &ast.Ident{
-                  NamePos: 93,
-                  NameEnd: 94,
+                  NamePos: 115,
+                  NameEnd: 116,
                   Name:    "y",
                 },
                 Type: &ast.ArrayType{
-                  Array: 95,
-                  Gt:    106,
+                  Array: 117,
+                  Gt:    128,
                   Item:  &ast.SimpleType{
-                    NamePos: 101,
+                    NamePos: 123,
                     Name:    "INT64",
                   },
                 },
               },
               &ast.StructField{
                 Ident: &ast.Ident{
-                  NamePos: 109,
-                  NameEnd: 110,
+                  NamePos: 131,
+                  NameEnd: 132,
                   Name:    "z",
                 },
                 Type: &ast.ArrayType{
-                  Array: 111,
-                  Gt:    123,
+                  Array: 133,
+                  Gt:    145,
                   Item:  &ast.SimpleType{
-                    NamePos: 117,
+                    NamePos: 139,
                     Name:    "STRING",
                   },
                 },
@@ -152,7 +167,7 @@ limit cast(1 as INT64) offset cast(@foo as INT64)
       },
     },
     From: &ast.From{
-      From:   127,
+      From:   149,
       Source: &ast.Join{
         Op:     ",",
         Method: "",
@@ -163,24 +178,24 @@ limit cast(1 as INT64) offset cast(@foo as INT64)
           Hint:   (*ast.Hint)(nil),
           Left:   &ast.TableName{
             Table: &ast.Ident{
-              NamePos: 132,
-              NameEnd: 133,
+              NamePos: 154,
+              NameEnd: 155,
               Name:    "x",
             },
             Hint:   (*ast.Hint)(nil),
             As:     (*ast.AsAlias)(nil),
             Sample: &ast.TableSample{
-              TableSample: 134,
+              TableSample: 156,
               Method:      "BERNOULLI",
               Size:        &ast.TableSampleSize{
-                Lparen: 156,
-                Rparen: 185,
+                Lparen: 178,
+                Rparen: 207,
                 Value:  &ast.CastNumValue{
-                  Cast:   157,
-                  Rparen: 176,
+                  Cast:   179,
+                  Rparen: 198,
                   Expr:   &ast.FloatLiteral{
-                    ValuePos: 162,
-                    ValueEnd: 165,
+                    ValuePos: 184,
+                    ValueEnd: 187,
                     Value:    "0.1",
                   },
                   Type: "FLOAT64",
@@ -191,24 +206,24 @@ limit cast(1 as INT64) offset cast(@foo as INT64)
           },
           Right: &ast.TableName{
             Table: &ast.Ident{
-              NamePos: 193,
-              NameEnd: 194,
+              NamePos: 215,
+              NameEnd: 216,
               Name:    "y",
             },
             Hint:   (*ast.Hint)(nil),
             As:     (*ast.AsAlias)(nil),
             Sample: &ast.TableSample{
-              TableSample: 195,
+              TableSample: 217,
               Method:      "BERNOULLI",
               Size:        &ast.TableSampleSize{
-                Lparen: 217,
-                Rparen: 239,
+                Lparen: 239,
+                Rparen: 261,
                 Value:  &ast.CastNumValue{
-                  Cast:   218,
-                  Rparen: 233,
+                  Cast:   240,
+                  Rparen: 255,
                   Expr:   &ast.IntLiteral{
-                    ValuePos: 223,
-                    ValueEnd: 224,
+                    ValuePos: 245,
+                    ValueEnd: 246,
                     Base:     10,
                     Value:    "1",
                   },
@@ -222,23 +237,23 @@ limit cast(1 as INT64) offset cast(@foo as INT64)
         },
         Right: &ast.TableName{
           Table: &ast.Ident{
-            NamePos: 247,
-            NameEnd: 248,
+            NamePos: 269,
+            NameEnd: 270,
             Name:    "z",
           },
           Hint:   (*ast.Hint)(nil),
           As:     (*ast.AsAlias)(nil),
           Sample: &ast.TableSample{
-            TableSample: 249,
+            TableSample: 271,
             Method:      "BERNOULLI",
             Size:        &ast.TableSampleSize{
-              Lparen: 271,
-              Rparen: 298,
+              Lparen: 293,
+              Rparen: 320,
               Value:  &ast.CastNumValue{
-                Cast:   272,
-                Rparen: 292,
+                Cast:   294,
+                Rparen: 314,
                 Expr:   &ast.Param{
-                  Atmark: 277,
+                  Atmark: 299,
                   Name:   "param",
                 },
                 Type: "INT64",
@@ -255,24 +270,24 @@ limit cast(1 as INT64) offset cast(@foo as INT64)
     Having:  (*ast.Having)(nil),
     OrderBy: (*ast.OrderBy)(nil),
     Limit:   &ast.Limit{
-      Limit: 300,
+      Limit: 322,
       Count: &ast.CastIntValue{
-        Cast:   306,
-        Rparen: 321,
+        Cast:   328,
+        Rparen: 343,
         Expr:   &ast.IntLiteral{
-          ValuePos: 311,
-          ValueEnd: 312,
+          ValuePos: 333,
+          ValueEnd: 334,
           Base:     10,
           Value:    "1",
         },
       },
       Offset: &ast.Offset{
-        Offset: 323,
+        Offset: 345,
         Value:  &ast.CastIntValue{
-          Cast:   330,
-          Rparen: 348,
+          Cast:   352,
+          Rparen: 370,
           Expr:   &ast.Param{
-            Atmark: 335,
+            Atmark: 357,
             Name:   "foo",
           },
         },
@@ -282,4 +297,4 @@ limit cast(1 as INT64) offset cast(@foo as INT64)
 }
 
 --- SQL
-SELECT CAST(1 AS INT64), CAST(STRUCT(STRUCT(), 1, ARRAY[2, 3], ARRAY["4", "5"]) AS STRUCT<STRUCT<>, x INT64, y ARRAY<INT64>, z ARRAY<STRING>>) FROM x TABLESAMPLE BERNOULLI (CAST(0.1 AS FLOAT64) PERCENT), y TABLESAMPLE BERNOULLI (CAST(1 AS INT64) ROWS), z TABLESAMPLE BERNOULLI (CAST(@param AS INT64) ROWS) LIMIT CAST(1 AS INT64) OFFSET CAST(@foo AS INT64)
+SELECT CAST(1 AS INT64), CAST(0.1 AS FLOAT32), CAST(STRUCT(STRUCT(), 1, ARRAY[2, 3], ARRAY["4", "5"]) AS STRUCT<STRUCT<>, x INT64, y ARRAY<INT64>, z ARRAY<STRING>>) FROM x TABLESAMPLE BERNOULLI (CAST(0.1 AS FLOAT64) PERCENT), y TABLESAMPLE BERNOULLI (CAST(1 AS INT64) ROWS), z TABLESAMPLE BERNOULLI (CAST(@param AS INT64) ROWS) LIMIT CAST(1 AS INT64) OFFSET CAST(@foo AS INT64)
diff --git a/testdata/result/statement/alter_sequence.sql.txt b/testdata/result/statement/alter_sequence.sql.txt
new file mode 100644
index 0000000..c8e8305
--- /dev/null
+++ b/testdata/result/statement/alter_sequence.sql.txt
@@ -0,0 +1,47 @@
+--- alter_sequence.sql
+ALTER SEQUENCE my_sequence SET OPTIONS (skip_range_min=1, skip_range_max=1234567)
+
+--- AST
+&ast.AlterSequence{
+  Alter: 0,
+  Name:  &ast.Ident{
+    NamePos: 15,
+    NameEnd: 26,
+    Name:    "my_sequence",
+  },
+  Options: &ast.SequenceOptions{
+    Options: 31,
+    Rparen:  80,
+    Records: []*ast.SequenceOption{
+      &ast.SequenceOption{
+        Name: &ast.Ident{
+          NamePos: 40,
+          NameEnd: 54,
+          Name:    "skip_range_min",
+        },
+        Value: &ast.IntLiteral{
+          ValuePos: 55,
+          ValueEnd: 56,
+          Base:     10,
+          Value:    "1",
+        },
+      },
+      &ast.SequenceOption{
+        Name: &ast.Ident{
+          NamePos: 58,
+          NameEnd: 72,
+          Name:    "skip_range_max",
+        },
+        Value: &ast.IntLiteral{
+          ValuePos: 73,
+          ValueEnd: 80,
+          Base:     10,
+          Value:    "1234567",
+        },
+      },
+    },
+  },
+}
+
+--- SQL
+ALTER SEQUENCE my_sequence SET OPTIONS (skip_range_min = 1, skip_range_max = 1234567)
diff --git a/testdata/result/statement/create_sequance.sql.txt b/testdata/result/statement/create_sequance.sql.txt
index 37c68aa..9d6a557 100644
--- a/testdata/result/statement/create_sequance.sql.txt
+++ b/testdata/result/statement/create_sequance.sql.txt
@@ -8,63 +8,66 @@ CREATE SEQUENCE IF NOT EXISTS MySequence OPTIONS (
 --- AST
 &ast.CreateSequence{
   Create: 0,
-  Rparen: 172,
   Name:   &ast.Ident{
     NamePos: 30,
     NameEnd: 40,
     Name:    "MySequence",
   },
   IfNotExists: true,
-  Options:     []*ast.SequenceOption{
-    &ast.SequenceOption{
-      Name: &ast.Ident{
-        NamePos: 55,
-        NameEnd: 68,
-        Name:    "sequence_kind",
+  Options:     &ast.SequenceOptions{
+    Options: 41,
+    Rparen:  172,
+    Records: []*ast.SequenceOption{
+      &ast.SequenceOption{
+        Name: &ast.Ident{
+          NamePos: 55,
+          NameEnd: 68,
+          Name:    "sequence_kind",
+        },
+        Value: &ast.StringLiteral{
+          ValuePos: 69,
+          ValueEnd: 92,
+          Value:    "bit_reversed_positive",
+        },
       },
-      Value: &ast.StringLiteral{
-        ValuePos: 69,
-        ValueEnd: 92,
-        Value:    "bit_reversed_positive",
+      &ast.SequenceOption{
+        Name: &ast.Ident{
+          NamePos: 98,
+          NameEnd: 112,
+          Name:    "skip_range_min",
+        },
+        Value: &ast.IntLiteral{
+          ValuePos: 115,
+          ValueEnd: 116,
+          Base:     10,
+          Value:    "1",
+        },
       },
-    },
-    &ast.SequenceOption{
-      Name: &ast.Ident{
-        NamePos: 98,
-        NameEnd: 112,
-        Name:    "skip_range_min",
-      },
-      Value: &ast.IntLiteral{
-        ValuePos: 115,
-        ValueEnd: 116,
-        Base:     10,
-        Value:    "1",
-      },
-    },
-    &ast.SequenceOption{
-      Name: &ast.Ident{
-        NamePos: 122,
-        NameEnd: 136,
-        Name:    "skip_range_max",
-      },
-      Value: &ast.IntLiteral{
-        ValuePos: 139,
-        ValueEnd: 143,
-        Base:     10,
-        Value:    "1000",
-      },
-    },
-    &ast.SequenceOption{
-      Name: &ast.Ident{
-        NamePos: 149,
-        NameEnd: 167,
-        Name:    "start_with_counter",
+      &ast.SequenceOption{
+        Name: &ast.Ident{
+          NamePos: 122,
+          NameEnd: 136,
+          Name:    "skip_range_max",
+        },
+        Value: &ast.IntLiteral{
+          ValuePos: 139,
+          ValueEnd: 143,
+          Base:     10,
+          Value:    "1000",
+        },
       },
-      Value: &ast.IntLiteral{
-        ValuePos: 170,
-        ValueEnd: 172,
-        Base:     10,
-        Value:    "50",
+      &ast.SequenceOption{
+        Name: &ast.Ident{
+          NamePos: 149,
+          NameEnd: 167,
+          Name:    "start_with_counter",
+        },
+        Value: &ast.IntLiteral{
+          ValuePos: 170,
+          ValueEnd: 172,
+          Base:     10,
+          Value:    "50",
+        },
       },
     },
   },
diff --git a/testdata/result/statement/create_table_types.sql.txt b/testdata/result/statement/create_table_types.sql.txt
index 349c0f4..efee150 100644
--- a/testdata/result/statement/create_table_types.sql.txt
+++ b/testdata/result/statement/create_table_types.sql.txt
@@ -2,6 +2,7 @@
 create table types (
   b bool,
   i int64,
+  f32 float32,
   f float64,
   d date,
   t timestamp,
@@ -16,7 +17,7 @@ create table types (
 --- AST
 &ast.CreateTable{
   Create:      0,
-  Rparen:      212,
+  Rparen:      227,
   IfNotExists: false,
   Name:        &ast.Ident{
     NamePos: 13,
@@ -60,11 +61,27 @@ create table types (
       Null: -1,
       Name: &ast.Ident{
         NamePos: 44,
-        NameEnd: 45,
+        NameEnd: 47,
+        Name:    "f32",
+      },
+      Type: &ast.ScalarSchemaType{
+        NamePos: 48,
+        Name:    "FLOAT32",
+      },
+      NotNull:       false,
+      DefaultExpr:   (*ast.ColumnDefaultExpr)(nil),
+      GeneratedExpr: (*ast.GeneratedColumnExpr)(nil),
+      Options:       (*ast.ColumnDefOptions)(nil),
+    },
+    &ast.ColumnDef{
+      Null: -1,
+      Name: &ast.Ident{
+        NamePos: 59,
+        NameEnd: 60,
         Name:    "f",
       },
       Type: &ast.ScalarSchemaType{
-        NamePos: 46,
+        NamePos: 61,
         Name:    "FLOAT64",
       },
       NotNull:       false,
@@ -75,12 +92,12 @@ create table types (
     &ast.ColumnDef{
       Null: -1,
       Name: &ast.Ident{
-        NamePos: 57,
-        NameEnd: 58,
+        NamePos: 72,
+        NameEnd: 73,
         Name:    "d",
       },
       Type: &ast.ScalarSchemaType{
-        NamePos: 59,
+        NamePos: 74,
         Name:    "DATE",
       },
       NotNull:       false,
@@ -91,12 +108,12 @@ create table types (
     &ast.ColumnDef{
       Null: -1,
       Name: &ast.Ident{
-        NamePos: 67,
-        NameEnd: 68,
+        NamePos: 82,
+        NameEnd: 83,
         Name:    "t",
       },
       Type: &ast.ScalarSchemaType{
-        NamePos: 69,
+        NamePos: 84,
         Name:    "TIMESTAMP",
       },
       NotNull:       false,
@@ -107,18 +124,18 @@ create table types (
     &ast.ColumnDef{
       Null: -1,
       Name: &ast.Ident{
-        NamePos: 82,
-        NameEnd: 83,
+        NamePos: 97,
+        NameEnd: 98,
         Name:    "s",
       },
       Type: &ast.SizedSchemaType{
-        NamePos: 84,
-        Rparen:  94,
+        NamePos: 99,
+        Rparen:  109,
         Name:    "STRING",
         Max:     false,
         Size:    &ast.IntLiteral{
-          ValuePos: 91,
-          ValueEnd: 94,
+          ValuePos: 106,
+          ValueEnd: 109,
           Base:     10,
           Value:    "256",
         },
@@ -131,13 +148,13 @@ create table types (
     &ast.ColumnDef{
       Null: -1,
       Name: &ast.Ident{
-        NamePos: 99,
-        NameEnd: 103,
+        NamePos: 114,
+        NameEnd: 118,
         Name:    "smax",
       },
       Type: &ast.SizedSchemaType{
-        NamePos: 104,
-        Rparen:  114,
+        NamePos: 119,
+        Rparen:  129,
         Name:    "STRING",
         Max:     true,
         Size:    nil,
@@ -150,18 +167,18 @@ create table types (
     &ast.ColumnDef{
       Null: -1,
       Name: &ast.Ident{
-        NamePos: 119,
-        NameEnd: 121,
+        NamePos: 134,
+        NameEnd: 136,
         Name:    "bs",
       },
       Type: &ast.SizedSchemaType{
-        NamePos: 122,
-        Rparen:  131,
+        NamePos: 137,
+        Rparen:  146,
         Name:    "BYTES",
         Max:     false,
         Size:    &ast.IntLiteral{
-          ValuePos: 128,
-          ValueEnd: 131,
+          ValuePos: 143,
+          ValueEnd: 146,
           Base:     10,
           Value:    "256",
         },
@@ -174,13 +191,13 @@ create table types (
     &ast.ColumnDef{
       Null: -1,
       Name: &ast.Ident{
-        NamePos: 136,
-        NameEnd: 141,
+        NamePos: 151,
+        NameEnd: 156,
         Name:    "bsmax",
       },
       Type: &ast.SizedSchemaType{
-        NamePos: 142,
-        Rparen:  151,
+        NamePos: 157,
+        Rparen:  166,
         Name:    "BYTES",
         Max:     true,
         Size:    nil,
@@ -193,15 +210,15 @@ create table types (
     &ast.ColumnDef{
       Null: -1,
       Name: &ast.Ident{
-        NamePos: 156,
-        NameEnd: 158,
+        NamePos: 171,
+        NameEnd: 173,
         Name:    "ab",
       },
       Type: &ast.ArraySchemaType{
-        Array: 159,
-        Gt:    170,
+        Array: 174,
+        Gt:    185,
         Item:  &ast.ScalarSchemaType{
-          NamePos: 165,
+          NamePos: 180,
           Name:    "BOOL",
         },
       },
@@ -213,16 +230,16 @@ create table types (
     &ast.ColumnDef{
       Null: -1,
       Name: &ast.Ident{
-        NamePos: 174,
-        NameEnd: 177,
+        NamePos: 189,
+        NameEnd: 192,
         Name:    "abs",
       },
       Type: &ast.ArraySchemaType{
-        Array: 178,
-        Gt:    195,
+        Array: 193,
+        Gt:    210,
         Item:  &ast.SizedSchemaType{
-          NamePos: 184,
-          Rparen:  193,
+          NamePos: 199,
+          Rparen:  208,
           Name:    "BYTES",
           Max:     true,
           Size:    nil,
@@ -239,8 +256,8 @@ create table types (
     &ast.IndexKey{
       DirPos: -1,
       Name:   &ast.Ident{
-        NamePos: 211,
-        NameEnd: 212,
+        NamePos: 226,
+        NameEnd: 227,
         Name:    "i",
       },
       Dir: "",
@@ -251,4 +268,4 @@ create table types (
 }
 
 --- SQL
-CREATE TABLE types (b BOOL, i INT64, f FLOAT64, d DATE, t TIMESTAMP, s STRING(256), smax STRING(MAX), bs BYTES(256), bsmax BYTES(MAX), ab ARRAY<BOOL>, abs ARRAY<BYTES(MAX)>) PRIMARY KEY (i)
+CREATE TABLE types (b BOOL, i INT64, f32 FLOAT32, f FLOAT64, d DATE, t TIMESTAMP, s STRING(256), smax STRING(MAX), bs BYTES(256), bsmax BYTES(MAX), ab ARRAY<BOOL>, abs ARRAY<BYTES(MAX)>) PRIMARY KEY (i)
diff --git a/testdata/result/statement/create_vector_index.sql.txt b/testdata/result/statement/create_vector_index.sql.txt
new file mode 100644
index 0000000..7d5cf1e
--- /dev/null
+++ b/testdata/result/statement/create_vector_index.sql.txt
@@ -0,0 +1,45 @@
+--- create_vector_index.sql
+CREATE VECTOR INDEX IF NOT EXISTS hello_vector_index ON hello(embedding)
+OPTIONS(distance_type = 'COSINE')
+--- AST
+&ast.CreateVectorIndex{
+  Create:      0,
+  IfNotExists: true,
+  Name:        &ast.Ident{
+    NamePos: 34,
+    NameEnd: 52,
+    Name:    "hello_vector_index",
+  },
+  TableName: &ast.Ident{
+    NamePos: 56,
+    NameEnd: 61,
+    Name:    "hello",
+  },
+  ColumnName: &ast.Ident{
+    NamePos: 62,
+    NameEnd: 71,
+    Name:    "embedding",
+  },
+  Where:   (*ast.Where)(nil),
+  Options: &ast.VectorIndexOptions{
+    Options: 73,
+    Rparen:  105,
+    Records: []*ast.VectorIndexOption{
+      &ast.VectorIndexOption{
+        Key: &ast.Ident{
+          NamePos: 81,
+          NameEnd: 94,
+          Name:    "distance_type",
+        },
+        Value: &ast.StringLiteral{
+          ValuePos: 97,
+          ValueEnd: 105,
+          Value:    "COSINE",
+        },
+      },
+    },
+  },
+}
+
+--- SQL
+CREATE VECTOR INDEX IF NOT EXISTS hello_vector_index ON hello (embedding) OPTIONS (distance_type="COSINE")
diff --git a/testdata/result/statement/create_vector_index_where_column_not_null.sql.txt b/testdata/result/statement/create_vector_index_where_column_not_null.sql.txt
new file mode 100644
index 0000000..da02696
--- /dev/null
+++ b/testdata/result/statement/create_vector_index_where_column_not_null.sql.txt
@@ -0,0 +1,57 @@
+--- create_vector_index_where_column_not_null.sql
+CREATE VECTOR INDEX hello_vector_index ON hello(embedding)
+WHERE embedding IS NOT NULL
+OPTIONS(distance_type = 'COSINE')
+--- AST
+&ast.CreateVectorIndex{
+  Create:      0,
+  IfNotExists: false,
+  Name:        &ast.Ident{
+    NamePos: 20,
+    NameEnd: 38,
+    Name:    "hello_vector_index",
+  },
+  TableName: &ast.Ident{
+    NamePos: 42,
+    NameEnd: 47,
+    Name:    "hello",
+  },
+  ColumnName: &ast.Ident{
+    NamePos: 48,
+    NameEnd: 57,
+    Name:    "embedding",
+  },
+  Where: &ast.Where{
+    Where: 59,
+    Expr:  &ast.IsNullExpr{
+      Null: 82,
+      Not:  true,
+      Left: &ast.Ident{
+        NamePos: 65,
+        NameEnd: 74,
+        Name:    "embedding",
+      },
+    },
+  },
+  Options: &ast.VectorIndexOptions{
+    Options: 87,
+    Rparen:  119,
+    Records: []*ast.VectorIndexOption{
+      &ast.VectorIndexOption{
+        Key: &ast.Ident{
+          NamePos: 95,
+          NameEnd: 108,
+          Name:    "distance_type",
+        },
+        Value: &ast.StringLiteral{
+          ValuePos: 111,
+          ValueEnd: 119,
+          Value:    "COSINE",
+        },
+      },
+    },
+  },
+}
+
+--- SQL
+CREATE VECTOR INDEX hello_vector_index ON hello (embedding) WHERE embedding IS NOT NULL OPTIONS (distance_type="COSINE")
diff --git a/testdata/result/statement/drop_sequence.sql.txt b/testdata/result/statement/drop_sequence.sql.txt
new file mode 100644
index 0000000..5cf3fb9
--- /dev/null
+++ b/testdata/result/statement/drop_sequence.sql.txt
@@ -0,0 +1,16 @@
+--- drop_sequence.sql
+DROP SEQUENCE my_sequence
+
+--- AST
+&ast.DropSequence{
+  Drop:     0,
+  IfExists: false,
+  Name:     &ast.Ident{
+    NamePos: 14,
+    NameEnd: 25,
+    Name:    "my_sequence",
+  },
+}
+
+--- SQL
+DROP SEQUENCE my_sequence
diff --git a/testdata/result/statement/drop_sequence_if_exits.sql.txt b/testdata/result/statement/drop_sequence_if_exits.sql.txt
new file mode 100644
index 0000000..8d420cb
--- /dev/null
+++ b/testdata/result/statement/drop_sequence_if_exits.sql.txt
@@ -0,0 +1,16 @@
+--- drop_sequence_if_exits.sql
+DROP SEQUENCE IF EXISTS my_sequence
+
+--- AST
+&ast.DropSequence{
+  Drop:     0,
+  IfExists: true,
+  Name:     &ast.Ident{
+    NamePos: 24,
+    NameEnd: 35,
+    Name:    "my_sequence",
+  },
+}
+
+--- SQL
+DROP SEQUENCE IF EXISTS my_sequence
diff --git a/testdata/result/statement/drop_vector_index.sql.txt b/testdata/result/statement/drop_vector_index.sql.txt
new file mode 100644
index 0000000..6c7fa9e
--- /dev/null
+++ b/testdata/result/statement/drop_vector_index.sql.txt
@@ -0,0 +1,15 @@
+--- drop_vector_index.sql
+DROP VECTOR INDEX hello_vector_index
+--- AST
+&ast.DropVectorIndex{
+  Drop:     0,
+  IfExists: false,
+  Name:     &ast.Ident{
+    NamePos: 18,
+    NameEnd: 36,
+    Name:    "hello_vector_index",
+  },
+}
+
+--- SQL
+DROP VECTOR INDEX hello_vector_index
diff --git a/testdata/result/statement/select_cast.sql.txt b/testdata/result/statement/select_cast.sql.txt
index 42b1d82..108a656 100644
--- a/testdata/result/statement/select_cast.sql.txt
+++ b/testdata/result/statement/select_cast.sql.txt
@@ -1,5 +1,5 @@
 --- select_cast.sql
-select cast(1 as INT64), cast((struct(), 1, [2, 3], ["4", "5"]) as struct<struct<>, x int64, y array<int64>, z array<string>>)
+select cast(1 as INT64), cast(0.1 as float32), cast((struct(), 1, [2, 3], ["4", "5"]) as struct<struct<>, x int64, y array<int64>, z array<string>>)
 from x tablesample BERNOULLI (cast(0.1 as float64) percent),
      y tablesample BERNOULLI (cast(1 as int64) rows),
      z tablesample BERNOULLI (cast(@param as int64) rows)
@@ -33,41 +33,56 @@ limit cast(1 as INT64) offset cast(@foo as INT64)
       &ast.ExprSelectItem{
         Expr: &ast.CastExpr{
           Cast:   25,
-          Rparen: 125,
+          Rparen: 44,
+          Expr:   &ast.FloatLiteral{
+            ValuePos: 30,
+            ValueEnd: 33,
+            Value:    "0.1",
+          },
+          Type: &ast.SimpleType{
+            NamePos: 37,
+            Name:    "FLOAT32",
+          },
+        },
+      },
+      &ast.ExprSelectItem{
+        Expr: &ast.CastExpr{
+          Cast:   47,
+          Rparen: 147,
           Expr:   &ast.StructLiteral{
             Struct: 0,
-            Lparen: 30,
-            Rparen: 62,
+            Lparen: 52,
+            Rparen: 84,
             Fields: []*ast.StructField(nil),
             Values: []ast.Expr{
               &ast.StructLiteral{
-                Struct: 31,
-                Lparen: 37,
-                Rparen: 38,
+                Struct: 53,
+                Lparen: 59,
+                Rparen: 60,
                 Fields: []*ast.StructField(nil),
                 Values: []ast.Expr(nil),
               },
               &ast.IntLiteral{
-                ValuePos: 41,
-                ValueEnd: 42,
+                ValuePos: 63,
+                ValueEnd: 64,
                 Base:     10,
                 Value:    "1",
               },
               &ast.ArrayLiteral{
                 Array:  0,
-                Lbrack: 44,
-                Rbrack: 49,
+                Lbrack: 66,
+                Rbrack: 71,
                 Type:   nil,
                 Values: []ast.Expr{
                   &ast.IntLiteral{
-                    ValuePos: 45,
-                    ValueEnd: 46,
+                    ValuePos: 67,
+                    ValueEnd: 68,
                     Base:     10,
                     Value:    "2",
                   },
                   &ast.IntLiteral{
-                    ValuePos: 48,
-                    ValueEnd: 49,
+                    ValuePos: 70,
+                    ValueEnd: 71,
                     Base:     10,
                     Value:    "3",
                   },
@@ -75,18 +90,18 @@ limit cast(1 as INT64) offset cast(@foo as INT64)
               },
               &ast.ArrayLiteral{
                 Array:  0,
-                Lbrack: 52,
-                Rbrack: 61,
+                Lbrack: 74,
+                Rbrack: 83,
                 Type:   nil,
                 Values: []ast.Expr{
                   &ast.StringLiteral{
-                    ValuePos: 53,
-                    ValueEnd: 56,
+                    ValuePos: 75,
+                    ValueEnd: 78,
                     Value:    "4",
                   },
                   &ast.StringLiteral{
-                    ValuePos: 58,
-                    ValueEnd: 61,
+                    ValuePos: 80,
+                    ValueEnd: 83,
                     Value:    "5",
                   },
                 },
@@ -94,54 +109,54 @@ limit cast(1 as INT64) offset cast(@foo as INT64)
             },
           },
           Type: &ast.StructType{
-            Struct: 67,
-            Gt:     124,
+            Struct: 89,
+            Gt:     146,
             Fields: []*ast.StructField{
               &ast.StructField{
                 Ident: (*ast.Ident)(nil),
                 Type:  &ast.StructType{
-                  Struct: 74,
-                  Gt:     81,
+                  Struct: 96,
+                  Gt:     103,
                   Fields: []*ast.StructField{},
                 },
               },
               &ast.StructField{
                 Ident: &ast.Ident{
-                  NamePos: 84,
-                  NameEnd: 85,
+                  NamePos: 106,
+                  NameEnd: 107,
                   Name:    "x",
                 },
                 Type: &ast.SimpleType{
-                  NamePos: 86,
+                  NamePos: 108,
                   Name:    "INT64",
                 },
               },
               &ast.StructField{
                 Ident: &ast.Ident{
-                  NamePos: 93,
-                  NameEnd: 94,
+                  NamePos: 115,
+                  NameEnd: 116,
                   Name:    "y",
                 },
                 Type: &ast.ArrayType{
-                  Array: 95,
-                  Gt:    106,
+                  Array: 117,
+                  Gt:    128,
                   Item:  &ast.SimpleType{
-                    NamePos: 101,
+                    NamePos: 123,
                     Name:    "INT64",
                   },
                 },
               },
               &ast.StructField{
                 Ident: &ast.Ident{
-                  NamePos: 109,
-                  NameEnd: 110,
+                  NamePos: 131,
+                  NameEnd: 132,
                   Name:    "z",
                 },
                 Type: &ast.ArrayType{
-                  Array: 111,
-                  Gt:    123,
+                  Array: 133,
+                  Gt:    145,
                   Item:  &ast.SimpleType{
-                    NamePos: 117,
+                    NamePos: 139,
                     Name:    "STRING",
                   },
                 },
@@ -152,7 +167,7 @@ limit cast(1 as INT64) offset cast(@foo as INT64)
       },
     },
     From: &ast.From{
-      From:   127,
+      From:   149,
       Source: &ast.Join{
         Op:     ",",
         Method: "",
@@ -163,24 +178,24 @@ limit cast(1 as INT64) offset cast(@foo as INT64)
           Hint:   (*ast.Hint)(nil),
           Left:   &ast.TableName{
             Table: &ast.Ident{
-              NamePos: 132,
-              NameEnd: 133,
+              NamePos: 154,
+              NameEnd: 155,
               Name:    "x",
             },
             Hint:   (*ast.Hint)(nil),
             As:     (*ast.AsAlias)(nil),
             Sample: &ast.TableSample{
-              TableSample: 134,
+              TableSample: 156,
               Method:      "BERNOULLI",
               Size:        &ast.TableSampleSize{
-                Lparen: 156,
-                Rparen: 185,
+                Lparen: 178,
+                Rparen: 207,
                 Value:  &ast.CastNumValue{
-                  Cast:   157,
-                  Rparen: 176,
+                  Cast:   179,
+                  Rparen: 198,
                   Expr:   &ast.FloatLiteral{
-                    ValuePos: 162,
-                    ValueEnd: 165,
+                    ValuePos: 184,
+                    ValueEnd: 187,
                     Value:    "0.1",
                   },
                   Type: "FLOAT64",
@@ -191,24 +206,24 @@ limit cast(1 as INT64) offset cast(@foo as INT64)
           },
           Right: &ast.TableName{
             Table: &ast.Ident{
-              NamePos: 193,
-              NameEnd: 194,
+              NamePos: 215,
+              NameEnd: 216,
               Name:    "y",
             },
             Hint:   (*ast.Hint)(nil),
             As:     (*ast.AsAlias)(nil),
             Sample: &ast.TableSample{
-              TableSample: 195,
+              TableSample: 217,
               Method:      "BERNOULLI",
               Size:        &ast.TableSampleSize{
-                Lparen: 217,
-                Rparen: 239,
+                Lparen: 239,
+                Rparen: 261,
                 Value:  &ast.CastNumValue{
-                  Cast:   218,
-                  Rparen: 233,
+                  Cast:   240,
+                  Rparen: 255,
                   Expr:   &ast.IntLiteral{
-                    ValuePos: 223,
-                    ValueEnd: 224,
+                    ValuePos: 245,
+                    ValueEnd: 246,
                     Base:     10,
                     Value:    "1",
                   },
@@ -222,23 +237,23 @@ limit cast(1 as INT64) offset cast(@foo as INT64)
         },
         Right: &ast.TableName{
           Table: &ast.Ident{
-            NamePos: 247,
-            NameEnd: 248,
+            NamePos: 269,
+            NameEnd: 270,
             Name:    "z",
           },
           Hint:   (*ast.Hint)(nil),
           As:     (*ast.AsAlias)(nil),
           Sample: &ast.TableSample{
-            TableSample: 249,
+            TableSample: 271,
             Method:      "BERNOULLI",
             Size:        &ast.TableSampleSize{
-              Lparen: 271,
-              Rparen: 298,
+              Lparen: 293,
+              Rparen: 320,
               Value:  &ast.CastNumValue{
-                Cast:   272,
-                Rparen: 292,
+                Cast:   294,
+                Rparen: 314,
                 Expr:   &ast.Param{
-                  Atmark: 277,
+                  Atmark: 299,
                   Name:   "param",
                 },
                 Type: "INT64",
@@ -255,24 +270,24 @@ limit cast(1 as INT64) offset cast(@foo as INT64)
     Having:  (*ast.Having)(nil),
     OrderBy: (*ast.OrderBy)(nil),
     Limit:   &ast.Limit{
-      Limit: 300,
+      Limit: 322,
       Count: &ast.CastIntValue{
-        Cast:   306,
-        Rparen: 321,
+        Cast:   328,
+        Rparen: 343,
         Expr:   &ast.IntLiteral{
-          ValuePos: 311,
-          ValueEnd: 312,
+          ValuePos: 333,
+          ValueEnd: 334,
           Base:     10,
           Value:    "1",
         },
       },
       Offset: &ast.Offset{
-        Offset: 323,
+        Offset: 345,
         Value:  &ast.CastIntValue{
-          Cast:   330,
-          Rparen: 348,
+          Cast:   352,
+          Rparen: 370,
           Expr:   &ast.Param{
-            Atmark: 335,
+            Atmark: 357,
             Name:   "foo",
           },
         },
@@ -282,4 +297,4 @@ limit cast(1 as INT64) offset cast(@foo as INT64)
 }
 
 --- SQL
-SELECT CAST(1 AS INT64), CAST(STRUCT(STRUCT(), 1, ARRAY[2, 3], ARRAY["4", "5"]) AS STRUCT<STRUCT<>, x INT64, y ARRAY<INT64>, z ARRAY<STRING>>) FROM x TABLESAMPLE BERNOULLI (CAST(0.1 AS FLOAT64) PERCENT), y TABLESAMPLE BERNOULLI (CAST(1 AS INT64) ROWS), z TABLESAMPLE BERNOULLI (CAST(@param AS INT64) ROWS) LIMIT CAST(1 AS INT64) OFFSET CAST(@foo AS INT64)
+SELECT CAST(1 AS INT64), CAST(0.1 AS FLOAT32), CAST(STRUCT(STRUCT(), 1, ARRAY[2, 3], ARRAY["4", "5"]) AS STRUCT<STRUCT<>, x INT64, y ARRAY<INT64>, z ARRAY<STRING>>) FROM x TABLESAMPLE BERNOULLI (CAST(0.1 AS FLOAT64) PERCENT), y TABLESAMPLE BERNOULLI (CAST(1 AS INT64) ROWS), z TABLESAMPLE BERNOULLI (CAST(@param AS INT64) ROWS) LIMIT CAST(1 AS INT64) OFFSET CAST(@foo AS INT64)