316 lines
9.9 KiB
Go
316 lines
9.9 KiB
Go
// Copyright 2023 Dolthub, Inc.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package ast
|
|
|
|
import (
|
|
"github.com/cockroachdb/errors"
|
|
|
|
vitess "github.com/dolthub/vitess/go/vt/sqlparser"
|
|
|
|
"github.com/dolthub/doltgresql/postgres/parser/parser"
|
|
"github.com/dolthub/doltgresql/postgres/parser/sem/tree"
|
|
)
|
|
|
|
// UnknownColSentinelPrefix is prepended to the index position of unaliased string literals in a
|
|
// SELECT clause. This gives GMS a unique per-position alias so its alias scope map can distinguish
|
|
// multiple unnamed columns in the same SELECT. schemaToFieldDescriptions in doltgres_handler.go
|
|
// strips this prefix and returns Postgres's "?column?" placeholder on the wire.
|
|
const UnknownColSentinelPrefix = "__?column?__"
|
|
|
|
// Convert converts a Postgres AST into a Vitess AST.
|
|
func Convert(postgresStmt parser.Statement) (vitess.Statement, error) {
|
|
ctx := NewContext(postgresStmt)
|
|
switch stmt := postgresStmt.AST.(type) {
|
|
case *tree.AlterAggregate:
|
|
return nodeAlterAggregate(ctx, stmt)
|
|
case *tree.AlterDatabase:
|
|
return nodeAlterDatabase(ctx, stmt)
|
|
case *tree.AlterDefaultPrivileges:
|
|
return nodeAlterDefaultPrivileges(ctx, stmt)
|
|
case *tree.AlterDomain:
|
|
return nodeAlterDomain(ctx, stmt)
|
|
case *tree.AlterFunction:
|
|
return nodeAlterFunction(ctx, stmt)
|
|
case *tree.AlterIndex:
|
|
return nodeAlterIndex(ctx, stmt)
|
|
case *tree.AlterMaterializedView:
|
|
return nodeAlterMaterializedView(ctx, stmt)
|
|
case *tree.AlterProcedure:
|
|
return nodeAlterProcedure(ctx, stmt)
|
|
case *tree.AlterRole:
|
|
return nodeAlterRole(ctx, stmt)
|
|
case *tree.AlterSchema:
|
|
return nodeAlterSchema(ctx, stmt)
|
|
case *tree.AlterSequence:
|
|
return nodeAlterSequence(ctx, stmt)
|
|
case *tree.AlterTable:
|
|
return nodeAlterTable(ctx, stmt)
|
|
case *tree.AlterTablePartition:
|
|
return nodeAlterTablePartition(ctx, stmt)
|
|
case *tree.AlterTableSetSchema:
|
|
return nodeAlterTableSetSchema(ctx, stmt)
|
|
case *tree.AlterType:
|
|
return nodeAlterType(ctx, stmt)
|
|
case *tree.AlterView:
|
|
return nodeAlterView(ctx, stmt)
|
|
case *tree.Analyze:
|
|
return nodeAnalyze(ctx, stmt)
|
|
case *tree.Backup:
|
|
return nodeBackup(ctx, stmt)
|
|
case *tree.BeginTransaction:
|
|
return nodeBeginTransaction(ctx, stmt)
|
|
case *tree.Call:
|
|
return nodeCall(ctx, stmt)
|
|
case *tree.CancelQueries:
|
|
return nodeCancelQueries(ctx, stmt)
|
|
case *tree.CancelSessions:
|
|
return nodeCancelSessions(ctx, stmt)
|
|
case *tree.CannedOptPlan:
|
|
return nodeCannedOptPlan(ctx, stmt)
|
|
case *tree.Comment:
|
|
return nodeComment(ctx, stmt)
|
|
case *tree.CommitTransaction:
|
|
return nodeCommitTransaction(ctx, stmt)
|
|
case *tree.ControlJobs:
|
|
return nodeControlJobs(ctx, stmt)
|
|
case *tree.ControlJobsForSchedules:
|
|
return nodeControlJobsForSchedules(ctx, stmt)
|
|
case *tree.ControlSchedules:
|
|
return nodeControlSchedules(ctx, stmt)
|
|
case *tree.CopyFrom:
|
|
return nodeCopyFrom(ctx, stmt)
|
|
case *tree.CreateAggregate:
|
|
return nodeCreateAggregate(ctx, stmt)
|
|
case *tree.CreateCast:
|
|
return nodeCreateCast(ctx, stmt)
|
|
case *tree.CreateChangefeed:
|
|
return nodeCreateChangefeed(ctx, stmt)
|
|
case *tree.CreateDatabase:
|
|
return nodeCreateDatabase(ctx, stmt)
|
|
case *tree.CreateDomain:
|
|
return nodeCreateDomain(ctx, stmt)
|
|
case *tree.CreateExtension:
|
|
return nodeCreateExtension(ctx, stmt)
|
|
case *tree.CreateFunction:
|
|
return nodeCreateFunction(ctx, stmt)
|
|
case *tree.CreateIndex:
|
|
return nodeCreateIndex(ctx, stmt)
|
|
case *tree.CreateMaterializedView:
|
|
return nodeCreateMaterializedView(ctx, stmt)
|
|
case *tree.CreateProcedure:
|
|
return nodeCreateProcedure(ctx, stmt)
|
|
case *tree.CreateRole:
|
|
return nodeCreateRole(ctx, stmt)
|
|
case *tree.CreateSchema:
|
|
return nodeCreateSchema(ctx, stmt)
|
|
case *tree.CreateSequence:
|
|
return nodeCreateSequence(ctx, stmt)
|
|
case *tree.CreateStats:
|
|
return nodeCreateStats(ctx, stmt)
|
|
case *tree.CreateTable:
|
|
return nodeCreateTable(ctx, stmt)
|
|
case *tree.CreateTrigger:
|
|
return nodeCreateTrigger(ctx, stmt)
|
|
case *tree.CreateType:
|
|
return nodeCreateType(ctx, stmt)
|
|
case *tree.CreateView:
|
|
return nodeCreateView(ctx, stmt)
|
|
case *tree.Deallocate:
|
|
return nodeDeallocate(ctx, stmt)
|
|
case *tree.Delete:
|
|
return nodeDelete(ctx, stmt)
|
|
case *tree.Discard:
|
|
return nodeDiscard(ctx, stmt)
|
|
case *tree.DropAggregate:
|
|
return nodeDropAggregate(ctx, stmt)
|
|
case *tree.DropCast:
|
|
return nodeDropCast(ctx, stmt)
|
|
case *tree.DropDatabase:
|
|
return nodeDropDatabase(ctx, stmt)
|
|
case *tree.DropDomain:
|
|
return nodeDropDomain(ctx, stmt)
|
|
case *tree.DropExtension:
|
|
return nodeDropExtension(ctx, stmt)
|
|
case *tree.DropFunction:
|
|
return nodeDropFunction(ctx, stmt)
|
|
case *tree.DropIndex:
|
|
return nodeDropIndex(ctx, stmt)
|
|
case *tree.DropProcedure:
|
|
return nodeDropProcedure(ctx, stmt)
|
|
case *tree.DropRole:
|
|
return nodeDropRole(ctx, stmt)
|
|
case *tree.DropSchema:
|
|
return nodeDropSchema(ctx, stmt)
|
|
case *tree.DropSequence:
|
|
return nodeDropSequence(ctx, stmt)
|
|
case *tree.DropTable:
|
|
return nodeDropTable(ctx, stmt)
|
|
case *tree.DropTrigger:
|
|
return nodeDropTrigger(ctx, stmt)
|
|
case *tree.DropType:
|
|
return nodeDropType(ctx, stmt)
|
|
case *tree.DropView:
|
|
return nodeDropView(ctx, stmt)
|
|
case *tree.Execute:
|
|
return nodeExecute(ctx, stmt)
|
|
case *tree.Explain:
|
|
return nodeExplain(ctx, stmt)
|
|
case *tree.ExplainAnalyzeDebug:
|
|
return nodeExplainAnalyzeDebug(ctx, stmt)
|
|
case *tree.Export:
|
|
return nodeExport(ctx, stmt)
|
|
case *tree.Grant:
|
|
return nodeGrant(ctx, stmt)
|
|
case *tree.GrantRole:
|
|
return nodeGrantRole(ctx, stmt)
|
|
case *tree.Import:
|
|
return nodeImport(ctx, stmt)
|
|
case *tree.Insert:
|
|
return nodeInsert(ctx, stmt)
|
|
case *tree.ParenSelect:
|
|
return nodeParenSelect(ctx, stmt)
|
|
case *tree.Prepare:
|
|
return nodePrepare(ctx, stmt)
|
|
case *tree.RefreshMaterializedView:
|
|
return nodeRefreshMaterializedView(ctx, stmt)
|
|
case *tree.ReleaseSavepoint:
|
|
return nodeReleaseSavepoint(ctx, stmt)
|
|
case *tree.Relocate:
|
|
return nodeRelocate(ctx, stmt)
|
|
case *tree.RenameColumn:
|
|
return nodeRenameColumn(ctx, stmt)
|
|
case *tree.RenameDatabase:
|
|
return nodeRenameDatabase(ctx, stmt)
|
|
case *tree.RenameIndex:
|
|
return nodeRenameIndex(ctx, stmt)
|
|
case *tree.RenameTable:
|
|
return nodeRenameTable(ctx, stmt)
|
|
case *tree.ReparentDatabase:
|
|
return nodeReparentDatabase(ctx, stmt)
|
|
case *tree.Restore:
|
|
return nodeRestore(ctx, stmt)
|
|
case *tree.Return:
|
|
return nodeReturn(ctx, stmt)
|
|
case *tree.Revoke:
|
|
return nodeRevoke(ctx, stmt)
|
|
case *tree.RevokeRole:
|
|
return nodeRevokeRole(ctx, stmt)
|
|
case *tree.RollbackToSavepoint:
|
|
return nodeRollbackToSavepoint(ctx, stmt)
|
|
case *tree.RollbackTransaction:
|
|
return nodeRollbackTransaction(ctx, stmt)
|
|
case *tree.Savepoint:
|
|
return nodeSavepoint(ctx, stmt)
|
|
case *tree.Scatter:
|
|
return nodeScatter(ctx, stmt)
|
|
case *tree.ScheduledBackup:
|
|
return nodeScheduledBackup(ctx, stmt)
|
|
case *tree.Scrub:
|
|
return nodeScrub(ctx, stmt)
|
|
case *tree.Select:
|
|
return nodeSelect(ctx, stmt)
|
|
case *tree.SelectClause:
|
|
return nodeSelectClause(ctx, stmt)
|
|
case *tree.SetSessionAuthorization:
|
|
return nodeSetSessionAuthorization(ctx, stmt)
|
|
case *tree.SetSessionCharacteristics:
|
|
return nodeSetSessionCharacteristics(ctx, stmt)
|
|
case *tree.SetTransaction:
|
|
return nodeSetTransaction(ctx, stmt)
|
|
case *tree.SetVar:
|
|
return nodeSetVar(ctx, stmt)
|
|
case *tree.ShowBackup:
|
|
return nodeShowBackup(ctx, stmt)
|
|
case *tree.ShowColumns:
|
|
return nodeShowColumns(ctx, stmt)
|
|
case *tree.ShowConstraints:
|
|
return nodeShowConstraints(ctx, stmt)
|
|
case *tree.ShowCreate:
|
|
return nodeShowCreate(ctx, stmt)
|
|
case *tree.ShowDatabaseIndexes:
|
|
return nodeShowDatabaseIndexes(ctx, stmt)
|
|
case *tree.ShowDatabases:
|
|
return nodeShowDatabases(ctx, stmt)
|
|
case *tree.ShowEnums:
|
|
return nodeShowEnums(ctx, stmt)
|
|
case *tree.ShowFingerprints:
|
|
return nodeShowFingerprints(ctx, stmt)
|
|
case *tree.ShowGrants:
|
|
return nodeShowGrants(ctx, stmt)
|
|
case *tree.ShowHistogram:
|
|
return nodeShowHistogram(ctx, stmt)
|
|
case *tree.ShowIndexes:
|
|
return nodeShowIndexes(ctx, stmt)
|
|
case *tree.ShowJobs:
|
|
return nodeShowJobs(ctx, stmt)
|
|
case *tree.ShowLastQueryStatistics:
|
|
return nodeShowLastQueryStatistics(ctx, stmt)
|
|
case *tree.ShowPartitions:
|
|
return nodeShowPartitions(ctx, stmt)
|
|
case *tree.ShowQueries:
|
|
return nodeShowQueries(ctx, stmt)
|
|
case *tree.ShowRoleGrants:
|
|
return nodeShowRoleGrants(ctx, stmt)
|
|
case *tree.ShowRoles:
|
|
return nodeShowRoles(ctx, stmt)
|
|
case *tree.ShowSavepointStatus:
|
|
return nodeShowSavepointStatus(ctx, stmt)
|
|
case *tree.ShowSchedules:
|
|
return nodeShowSchedules(ctx, stmt)
|
|
case *tree.ShowSchemas:
|
|
return nodeShowSchemas(ctx, stmt)
|
|
case *tree.ShowSequences:
|
|
return nodeShowSequences(ctx, stmt)
|
|
case *tree.ShowSessions:
|
|
return nodeShowSessions(ctx, stmt)
|
|
case *tree.ShowSyntax:
|
|
return nodeShowSyntax(ctx, stmt)
|
|
case *tree.ShowTableStats:
|
|
return nodeShowTableStats(ctx, stmt)
|
|
case *tree.ShowTables:
|
|
return nodeShowTables(ctx, stmt)
|
|
case *tree.ShowTraceForSession:
|
|
return nodeShowTraceForSession(ctx, stmt)
|
|
case *tree.ShowTransactionStatus:
|
|
return nodeShowTransactionStatus(ctx, stmt)
|
|
case *tree.ShowTransactions:
|
|
return nodeShowTransactions(ctx, stmt)
|
|
case *tree.ShowTypes:
|
|
return nodeShowTypes(ctx, stmt)
|
|
case *tree.ShowUsers:
|
|
return nodeShowUsers(ctx, stmt)
|
|
case *tree.ShowVar:
|
|
return nodeShowVar(ctx, stmt)
|
|
case *tree.Split:
|
|
return nodeSplit(ctx, stmt)
|
|
case *tree.Truncate:
|
|
return nodeTruncate(ctx, stmt)
|
|
case *tree.UnionClause:
|
|
return nodeUnionClause(ctx, stmt)
|
|
case *tree.Unsplit:
|
|
return nodeUnsplit(ctx, stmt)
|
|
case *tree.Update:
|
|
return nodeUpdate(ctx, stmt)
|
|
case *tree.Vacuum:
|
|
return nodeVacuum(ctx, stmt)
|
|
case *tree.ValuesClause:
|
|
return nodeValuesClause(ctx, stmt)
|
|
case nil:
|
|
return nil, nil
|
|
default:
|
|
return nil, errors.Errorf("unknown statement type encountered: `%T`", stmt)
|
|
}
|
|
}
|