58 lines
4.0 KiB
Go
58 lines
4.0 KiB
Go
// Copyright 2025 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 plpgsql
|
|
|
|
// OpCode states the operation to be performed. Most operations have a direct analogue to a Pl/pgSQL operation, however
|
|
// some exist only in Doltgres (specific to our interpreter implementation).
|
|
type OpCode uint16
|
|
|
|
const (
|
|
// New OpCode values MUST be added to the END of this list!
|
|
// Function OpCodes are persisted to disk, so these values MUST be stable across Doltgres versions.
|
|
OpCode_Alias OpCode = 0 // https://www.postgresql.org/docs/15/plpgsql-declarations.html#PLPGSQL-DECLARATION-ALIAS
|
|
OpCode_Assign OpCode = 1 // https://www.postgresql.org/docs/15/plpgsql-statements.html#PLPGSQL-STATEMENTS-ASSIGNMENT
|
|
OpCode_Case OpCode = 2 // https://www.postgresql.org/docs/15/plpgsql-control-structures.html#PLPGSQL-CONDITIONALS
|
|
OpCode_Declare OpCode = 3 // https://www.postgresql.org/docs/15/plpgsql-declarations.html
|
|
OpCode_DeleteInto OpCode = 4 // https://www.postgresql.org/docs/15/plpgsql-statements.html
|
|
OpCode_Exception OpCode = 5 // https://www.postgresql.org/docs/15/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING
|
|
OpCode_Execute OpCode = 6 // Executing a standard SQL statement (expects no rows returned unless Target is specified)
|
|
OpCode_Get OpCode = 7 // https://www.postgresql.org/docs/15/plpgsql-statements.html#PLPGSQL-STATEMENTS-DIAGNOSTICS
|
|
OpCode_Goto OpCode = 8 // All control-flow structures can be represented using Goto
|
|
OpCode_If OpCode = 9 // https://www.postgresql.org/docs/15/plpgsql-control-structures.html#PLPGSQL-CONDITIONALS
|
|
OpCode_InsertInto OpCode = 10 // https://www.postgresql.org/docs/15/plpgsql-statements.html
|
|
OpCode_Perform OpCode = 11 // https://www.postgresql.org/docs/15/plpgsql-statements.html
|
|
OpCode_Raise OpCode = 12 // https://www.postgresql.org/docs/15/plpgsql-errors-and-messages.html
|
|
OpCode_Return OpCode = 13 // https://www.postgresql.org/docs/15/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-RETURNING
|
|
OpCode_ScopeBegin OpCode = 14 // This is used for scope control, specific to Doltgres
|
|
OpCode_ScopeEnd OpCode = 15 // This is used for scope control, specific to Doltgres
|
|
OpCode_SelectInto OpCode = 16 // https://www.postgresql.org/docs/15/plpgsql-statements.html
|
|
OpCode_UpdateInto OpCode = 17 // https://www.postgresql.org/docs/15/plpgsql-statements.html
|
|
OpCode_ReturnQuery OpCode = 18 // https://www.postgresql.org/docs/current/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-RETURNING-RETURN-NEXT
|
|
OpCode_ForQueryInit OpCode = 19 // Initialize a cursor for FOR record IN query LOOP
|
|
OpCode_ForQueryNext OpCode = 20 // Advance cursor and assign next row to record, or jump to exit
|
|
// New OpCode values MUST be added to the END of this list!
|
|
// Function OpCodes are persisted to disk, so these values MUST be stable across Doltgres versions.
|
|
)
|
|
|
|
// InterpreterOperation is an operation that will be performed by the interpreter.
|
|
type InterpreterOperation struct {
|
|
OpCode OpCode
|
|
PrimaryData string // This will represent the "main" data, such as the query for PERFORM, expression for IF, etc.
|
|
SecondaryData []string // This represents auxiliary data, such as bindings, strictness, etc.
|
|
Target string // This is the variable that will store the results (if applicable)
|
|
Index int // This is the index that should be set for operations that move the function counter
|
|
Options map[string]string // This is extra data for operations that need it
|
|
}
|