本文整理汇总了Golang中github.com/cockroachdb/cockroach/sql/parser.Insert.DefaultValues方法的典型用法代码示例。如果您正苦于以下问题:Golang Insert.DefaultValues方法的具体用法?Golang Insert.DefaultValues怎么用?Golang Insert.DefaultValues使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类github.com/cockroachdb/cockroach/sql/parser.Insert
的用法示例。
在下文中一共展示了Insert.DefaultValues方法的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: fillDefaults
func (p *planner) fillDefaults(defaultExprs []parser.Expr,
cols []ColumnDescriptor, n *parser.Insert) parser.SelectStatement {
if n.DefaultValues() {
row := make(parser.Tuple, 0, len(cols))
for i := range cols {
if defaultExprs == nil {
row = append(row, parser.DNull)
continue
}
row = append(row, defaultExprs[i])
}
return parser.Values{row}
}
switch values := n.Rows.(type) {
case parser.Values:
for _, tuple := range values {
for i, val := range tuple {
switch val.(type) {
case parser.DefaultVal:
if defaultExprs == nil {
tuple[i] = parser.DNull
continue
}
tuple[i] = defaultExprs[i]
}
}
}
}
return n.Rows
}
示例2: fillDefaults
func (p *planner) fillDefaults(defaultExprs []parser.TypedExpr,
cols []sqlbase.ColumnDescriptor, n *parser.Insert) (parser.SelectStatement, error) {
if n.DefaultValues() {
row := make(parser.Exprs, 0, len(cols))
for i := range cols {
if defaultExprs == nil {
row = append(row, parser.DNull)
continue
}
row = append(row, defaultExprs[i])
}
return &parser.ValuesClause{Tuples: []*parser.Tuple{{Exprs: row}}}, nil
}
values, ok := n.Rows.Select.(*parser.ValuesClause)
if !ok {
return n.Rows.Select, nil
}
ret := values
for tIdx, tuple := range values.Tuples {
tupleCopied := false
for eIdx, val := range tuple.Exprs {
switch val.(type) {
case parser.DefaultVal:
if !tupleCopied {
if ret == values {
ret = &parser.ValuesClause{Tuples: append([]*parser.Tuple(nil), values.Tuples...)}
}
ret.Tuples[tIdx] =
&parser.Tuple{Exprs: append([]parser.Expr(nil), tuple.Exprs...)}
tupleCopied = true
}
if defaultExprs == nil || eIdx >= len(defaultExprs) {
// The case where eIdx is too large for defaultExprs will be
// transformed into an error by the check on the number of
// columns in Insert().
ret.Tuples[tIdx].Exprs[eIdx] = parser.DNull
} else {
ret.Tuples[tIdx].Exprs[eIdx] = defaultExprs[eIdx]
}
}
}
}
return ret, nil
}
示例3: fillDefaults
func (p *planner) fillDefaults(defaultExprs []parser.Expr,
cols []ColumnDescriptor, n *parser.Insert) parser.SelectStatement {
if n.DefaultValues() {
row := make(parser.Exprs, 0, len(cols))
for i := range cols {
if defaultExprs == nil {
row = append(row, parser.DNull)
continue
}
row = append(row, defaultExprs[i])
}
return &parser.Values{Tuples: []*parser.Tuple{{Exprs: row}}}
}
values, ok := n.Rows.(*parser.Values)
if !ok {
return n.Rows
}
ret := values
for tIdx, tuple := range values.Tuples {
tupleCopied := false
for eIdx, val := range tuple.Exprs {
switch val.(type) {
case parser.DefaultVal:
if !tupleCopied {
if ret == values {
ret = &parser.Values{Tuples: append([]*parser.Tuple(nil), values.Tuples...)}
}
ret.Tuples[tIdx] =
&parser.Tuple{Exprs: append([]parser.Expr(nil), tuple.Exprs...)}
tupleCopied = true
}
if defaultExprs == nil {
ret.Tuples[tIdx].Exprs[eIdx] = parser.DNull
} else {
ret.Tuples[tIdx].Exprs[eIdx] = defaultExprs[eIdx]
}
}
}
}
return ret
}
示例4: Insert
// Insert inserts rows into the database.
// Privileges: INSERT on table. Also requires UPDATE on "ON DUPLICATE KEY UPDATE".
// Notes: postgres requires INSERT. No "on duplicate key update" option.
// mysql requires INSERT. Also requires UPDATE on "ON DUPLICATE KEY UPDATE".
func (p *planner) Insert(
n *parser.Insert, desiredTypes []parser.Datum, autoCommit bool,
) (planNode, error) {
en, err := p.makeEditNode(n.Table, n.Returning, desiredTypes, autoCommit, privilege.INSERT)
if err != nil {
return nil, err
}
if n.OnConflict != nil {
if err := p.checkPrivilege(en.tableDesc, privilege.UPDATE); err != nil {
return nil, err
}
// TODO(dan): Support RETURNING in UPSERTs.
if n.Returning != nil {
return nil, fmt.Errorf("RETURNING is not supported with UPSERT")
}
}
var cols []sqlbase.ColumnDescriptor
// Determine which columns we're inserting into.
if n.DefaultValues() {
cols = en.tableDesc.Columns
} else {
var err error
if cols, err = p.processColumns(en.tableDesc, n.Columns); err != nil {
return nil, err
}
}
// Number of columns expecting an input. This doesn't include the
// columns receiving a default value.
numInputColumns := len(cols)
colIDSet := make(map[sqlbase.ColumnID]struct{}, len(cols))
for _, col := range cols {
colIDSet[col.ID] = struct{}{}
}
// Add the column if it has a DEFAULT expression.
addIfDefault := func(col sqlbase.ColumnDescriptor) {
if col.DefaultExpr != nil {
if _, ok := colIDSet[col.ID]; !ok {
colIDSet[col.ID] = struct{}{}
cols = append(cols, col)
}
}
}
// Add any column that has a DEFAULT expression.
for _, col := range en.tableDesc.Columns {
addIfDefault(col)
}
// Also add any column in a mutation that is WRITE_ONLY and has
// a DEFAULT expression.
for _, m := range en.tableDesc.Mutations {
if m.State != sqlbase.DescriptorMutation_WRITE_ONLY {
continue
}
if col := m.GetColumn(); col != nil {
addIfDefault(*col)
}
}
defaultExprs, err := makeDefaultExprs(cols, &p.parser, p.evalCtx)
if err != nil {
return nil, err
}
// Replace any DEFAULT markers with the corresponding default expressions.
insertRows, err := p.fillDefaults(defaultExprs, cols, n)
if err != nil {
return nil, err
}
// Construct the check expressions. The returned slice will be nil if no
// column in the table has a check expression.
checkExprs, err := p.makeCheckExprs(cols)
if err != nil {
return nil, err
}
// Prepare the check expressions.
var qvals qvalMap
typedCheckExprs := make([]parser.TypedExpr, 0, len(checkExprs))
if len(checkExprs) > 0 {
qvals = make(qvalMap)
table := tableInfo{
columns: makeResultColumns(en.tableDesc.Columns),
}
for i := range checkExprs {
expr, err := resolveQNames(checkExprs[i], &table, qvals, &p.qnameVisitor)
if err != nil {
return nil, err
}
typedExpr, err := parser.TypeCheck(expr, nil, parser.TypeBool)
if err != nil {
return nil, err
}
//.........这里部分代码省略.........
示例5: Insert
// Insert inserts rows into the database.
// Privileges: INSERT on table. Also requires UPDATE on "ON DUPLICATE KEY UPDATE".
// Notes: postgres requires INSERT. No "on duplicate key update" option.
// mysql requires INSERT. Also requires UPDATE on "ON DUPLICATE KEY UPDATE".
func (p *planner) Insert(
n *parser.Insert, desiredTypes []parser.Datum, autoCommit bool,
) (planNode, error) {
tn, err := p.getAliasedTableName(n.Table)
if err != nil {
return nil, err
}
en, err := p.makeEditNode(tn, autoCommit, privilege.INSERT)
if err != nil {
return nil, err
}
if n.OnConflict != nil {
if !n.OnConflict.DoNothing {
if err := p.checkPrivilege(en.tableDesc, privilege.UPDATE); err != nil {
return nil, err
}
}
// TODO(dan): Support RETURNING in UPSERTs.
if n.Returning != nil {
return nil, fmt.Errorf("RETURNING is not supported with UPSERT")
}
}
var cols []sqlbase.ColumnDescriptor
// Determine which columns we're inserting into.
if n.DefaultValues() {
cols = en.tableDesc.Columns
} else {
var err error
if cols, err = p.processColumns(en.tableDesc, n.Columns); err != nil {
return nil, err
}
}
// Number of columns expecting an input. This doesn't include the
// columns receiving a default value.
numInputColumns := len(cols)
colIDSet := make(map[sqlbase.ColumnID]struct{}, len(cols))
for _, col := range cols {
colIDSet[col.ID] = struct{}{}
}
// Add the column if it has a DEFAULT expression.
addIfDefault := func(col sqlbase.ColumnDescriptor) {
if col.DefaultExpr != nil {
if _, ok := colIDSet[col.ID]; !ok {
colIDSet[col.ID] = struct{}{}
cols = append(cols, col)
}
}
}
// Add any column that has a DEFAULT expression.
for _, col := range en.tableDesc.Columns {
addIfDefault(col)
}
// Also add any column in a mutation that is WRITE_ONLY and has
// a DEFAULT expression.
for _, m := range en.tableDesc.Mutations {
if m.State != sqlbase.DescriptorMutation_WRITE_ONLY {
continue
}
if col := m.GetColumn(); col != nil {
addIfDefault(*col)
}
}
defaultExprs, err := makeDefaultExprs(cols, &p.parser, &p.evalCtx)
if err != nil {
return nil, err
}
// Replace any DEFAULT markers with the corresponding default expressions.
insertRows, err := p.fillDefaults(defaultExprs, cols, n)
if err != nil {
return nil, err
}
// Analyze the expressions for column information and typing.
desiredTypesFromSelect := make([]parser.Datum, len(cols))
for i, col := range cols {
desiredTypesFromSelect[i] = col.Type.ToDatumType()
}
// Create the plan for the data source.
// This performs type checking on source expressions, collecting
// types for placeholders in the process.
rows, err := p.newPlan(insertRows, desiredTypesFromSelect, false)
if err != nil {
return nil, err
}
if expressions := len(rows.Columns()); expressions > numInputColumns {
return nil, fmt.Errorf("INSERT error: table %s has %d columns but %d values were supplied", n.Table, numInputColumns, expressions)
}
//.........这里部分代码省略.........
示例6: Insert
// Insert inserts rows into the database.
// Privileges: INSERT on table
// Notes: postgres requires INSERT. No "on duplicate key update" option.
// mysql requires INSERT. Also requires UPDATE on "ON DUPLICATE KEY UPDATE".
func (p *planner) Insert(n *parser.Insert, autoCommit bool) (planNode, *roachpb.Error) {
// TODO(marcb): We can't use the cached descriptor here because a recent
// update of the schema (e.g. the addition of an index) might not be
// reflected in the cached version (yet). Perhaps schema modification
// routines such as CREATE INDEX should not return until the schema change
// has been pushed everywhere.
tableDesc, pErr := p.getTableLease(n.Table)
if pErr != nil {
return nil, pErr
}
if err := p.checkPrivilege(&tableDesc, privilege.INSERT); err != nil {
return nil, roachpb.NewError(err)
}
var cols []ColumnDescriptor
// Determine which columns we're inserting into.
if n.DefaultValues() {
cols = tableDesc.Columns
} else {
var err error
if cols, err = p.processColumns(&tableDesc, n.Columns); err != nil {
return nil, roachpb.NewError(err)
}
}
// Number of columns expecting an input. This doesn't include the
// columns receiving a default value.
numInputColumns := len(cols)
// Construct a map from column ID to the index the value appears at within a
// row.
colIDtoRowIndex := map[ColumnID]int{}
for i, c := range cols {
colIDtoRowIndex[c.ID] = i
}
// Add the column if it has a DEFAULT expression.
addIfDefault := func(col ColumnDescriptor) {
if col.DefaultExpr != nil {
if _, ok := colIDtoRowIndex[col.ID]; !ok {
colIDtoRowIndex[col.ID] = len(cols)
cols = append(cols, col)
}
}
}
// Add any column that has a DEFAULT expression.
for _, col := range tableDesc.Columns {
addIfDefault(col)
}
// Also add any column in a mutation that is WRITE_ONLY and has
// a DEFAULT expression.
for _, m := range tableDesc.Mutations {
if m.State != DescriptorMutation_WRITE_ONLY {
continue
}
if col := m.GetColumn(); col != nil {
addIfDefault(*col)
}
}
// Verify we have at least the columns that are part of the primary key.
primaryKeyCols := map[ColumnID]struct{}{}
for i, id := range tableDesc.PrimaryIndex.ColumnIDs {
if _, ok := colIDtoRowIndex[id]; !ok {
return nil, roachpb.NewUErrorf("missing %q primary key column", tableDesc.PrimaryIndex.ColumnNames[i])
}
primaryKeyCols[id] = struct{}{}
}
// Construct the default expressions. The returned slice will be nil if no
// column in the table has a default expression.
defaultExprs, err := p.makeDefaultExprs(cols)
if err != nil {
return nil, roachpb.NewError(err)
}
// Replace any DEFAULT markers with the corresponding default expressions.
insertRows := p.fillDefaults(defaultExprs, cols, n)
// Transform the values into a rows object. This expands SELECT statements or
// generates rows from the values contained within the query.
rows, pErr := p.makePlan(insertRows, false)
if pErr != nil {
return nil, pErr
}
if expressions := len(rows.Columns()); expressions > numInputColumns {
return nil, roachpb.NewUErrorf("INSERT has more expressions than target columns: %d/%d", expressions, numInputColumns)
}
primaryIndex := tableDesc.PrimaryIndex
primaryIndexKeyPrefix := MakeIndexKeyPrefix(tableDesc.ID, primaryIndex.ID)
marshalled := make([]interface{}, len(cols))
//.........这里部分代码省略.........
示例7: Insert
// Insert inserts rows into the database.
// Privileges: INSERT on table. Also requires UPDATE on "ON DUPLICATE KEY UPDATE".
// Notes: postgres requires INSERT. No "on duplicate key update" option.
// mysql requires INSERT. Also requires UPDATE on "ON DUPLICATE KEY UPDATE".
func (p *planner) Insert(
n *parser.Insert, desiredTypes []parser.Datum, autoCommit bool,
) (planNode, error) {
en, err := p.makeEditNode(n.Table, n.Returning, desiredTypes, autoCommit, privilege.INSERT)
if err != nil {
return nil, err
}
if n.OnConflict != nil {
if !n.OnConflict.DoNothing {
if err := p.checkPrivilege(en.tableDesc, privilege.UPDATE); err != nil {
return nil, err
}
}
// TODO(dan): Support RETURNING in UPSERTs.
if n.Returning != nil {
return nil, fmt.Errorf("RETURNING is not supported with UPSERT")
}
}
var cols []sqlbase.ColumnDescriptor
// Determine which columns we're inserting into.
if n.DefaultValues() {
cols = en.tableDesc.Columns
} else {
var err error
if cols, err = p.processColumns(en.tableDesc, n.Columns); err != nil {
return nil, err
}
}
// Number of columns expecting an input. This doesn't include the
// columns receiving a default value.
numInputColumns := len(cols)
colIDSet := make(map[sqlbase.ColumnID]struct{}, len(cols))
for _, col := range cols {
colIDSet[col.ID] = struct{}{}
}
// Add the column if it has a DEFAULT expression.
addIfDefault := func(col sqlbase.ColumnDescriptor) {
if col.DefaultExpr != nil {
if _, ok := colIDSet[col.ID]; !ok {
colIDSet[col.ID] = struct{}{}
cols = append(cols, col)
}
}
}
// Add any column that has a DEFAULT expression.
for _, col := range en.tableDesc.Columns {
addIfDefault(col)
}
// Also add any column in a mutation that is WRITE_ONLY and has
// a DEFAULT expression.
for _, m := range en.tableDesc.Mutations {
if m.State != sqlbase.DescriptorMutation_WRITE_ONLY {
continue
}
if col := m.GetColumn(); col != nil {
addIfDefault(*col)
}
}
defaultExprs, err := makeDefaultExprs(cols, &p.parser, p.evalCtx)
if err != nil {
return nil, err
}
// Replace any DEFAULT markers with the corresponding default expressions.
insertRows, err := p.fillDefaults(defaultExprs, cols, n)
if err != nil {
return nil, err
}
// Analyze the expressions for column information and typing.
desiredTypesFromSelect := make([]parser.Datum, len(cols))
for i, col := range cols {
desiredTypesFromSelect[i] = col.Type.ToDatumType()
}
rows, err := p.newPlan(insertRows, desiredTypesFromSelect, false)
if err != nil {
return nil, err
}
if expressions := len(rows.Columns()); expressions > numInputColumns {
return nil, fmt.Errorf("INSERT has more expressions than target columns: %d/%d", expressions, numInputColumns)
}
// Type check the tuples, if any, to collect placeholder types.
if values, ok := n.Rows.Select.(*parser.ValuesClause); ok {
for _, tuple := range values.Tuples {
for eIdx, val := range tuple.Exprs {
if _, ok := val.(parser.DefaultVal); ok {
continue
}
typedExpr, err := parser.TypeCheck(val, &p.semaCtx, desiredTypesFromSelect[eIdx])
//.........这里部分代码省略.........