本文整理汇总了Golang中github.com/cockroachdb/cockroach/pkg/sql/parser.NewDString函数的典型用法代码示例。如果您正苦于以下问题:Golang NewDString函数的具体用法?Golang NewDString怎么用?Golang NewDString使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了NewDString函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Golang代码示例。
示例1: populateExplain
// populateExplain invokes explain() with a makeRow method
// which populates a valuesNode.
func (e *explainer) populateExplain(v *valuesNode, plan planNode) error {
e.makeRow = func(level int, name, field, description string, plan planNode) {
if e.err != nil {
return
}
row := parser.DTuple{
parser.NewDInt(parser.DInt(level)),
parser.NewDString(name),
parser.NewDString(field),
parser.NewDString(description),
}
if e.showMetadata {
if plan != nil {
row = append(row, parser.NewDString(formatColumns(plan.Columns(), e.showTypes)))
row = append(row, parser.NewDString(plan.Ordering().AsString(plan.Columns())))
} else {
row = append(row, emptyString, emptyString)
}
}
if _, err := v.rows.AddRow(row); err != nil {
e.err = err
}
}
e.err = nil
e.explain(plan)
return e.err
}
开发者ID:EvilMcJerkface,项目名称:cockroach,代码行数:31,代码来源:explain_plan.go
示例2: SetUIData
// SetUIData is an endpoint that stores the given key/value pairs in the
// system.ui table. See GetUIData for more details on semantics.
func (s *adminServer) SetUIData(
ctx context.Context, req *serverpb.SetUIDataRequest,
) (*serverpb.SetUIDataResponse, error) {
if len(req.KeyValues) == 0 {
return nil, grpc.Errorf(codes.InvalidArgument, "KeyValues cannot be empty")
}
args := sql.SessionArgs{User: s.getUser(req)}
session := s.NewSessionForRPC(ctx, args)
defer session.Finish(s.server.sqlExecutor)
for key, val := range req.KeyValues {
// Do an upsert of the key. We update each key in a separate transaction to
// avoid long-running transactions and possible deadlocks.
br := s.server.sqlExecutor.ExecuteStatements(session, "BEGIN;", nil)
defer br.Close()
if err := s.checkQueryResults(br.ResultList, 1); err != nil {
return nil, s.serverError(err)
}
// See if the key already exists.
resp, err := s.getUIData(session, s.getUser(req), []string{key})
if err != nil {
return nil, s.serverError(err)
}
_, alreadyExists := resp.KeyValues[key]
// INSERT or UPDATE as appropriate.
if alreadyExists {
query := "UPDATE system.ui SET value = $1, lastUpdated = NOW() WHERE key = $2; COMMIT;"
qargs := parser.NewPlaceholderInfo()
qargs.SetValue(`1`, parser.NewDString(string(val)))
qargs.SetValue(`2`, parser.NewDString(key))
r := s.server.sqlExecutor.ExecuteStatements(session, query, qargs)
defer r.Close()
if err := s.checkQueryResults(r.ResultList, 2); err != nil {
return nil, s.serverError(err)
}
if a, e := r.ResultList[0].RowsAffected, 1; a != e {
return nil, s.serverErrorf("rows affected %d != expected %d", a, e)
}
} else {
query := "INSERT INTO system.ui (key, value, lastUpdated) VALUES ($1, $2, NOW()); COMMIT;"
qargs := parser.NewPlaceholderInfo()
qargs.SetValue(`1`, parser.NewDString(key))
qargs.SetValue(`2`, parser.NewDBytes(parser.DBytes(val)))
r := s.server.sqlExecutor.ExecuteStatements(session, query, qargs)
defer r.Close()
if err := s.checkQueryResults(r.ResultList, 2); err != nil {
return nil, s.serverError(err)
}
if a, e := r.ResultList[0].RowsAffected, 1; a != e {
return nil, s.serverErrorf("rows affected %d != expected %d", a, e)
}
}
}
return &serverpb.SetUIDataResponse{}, nil
}
开发者ID:knz,项目名称:cockroach,代码行数:61,代码来源:admin.go
示例3: ShowGrants
// ShowGrants returns grant details for the specified objects and users.
// TODO(marc): implement no targets (meaning full scan).
// Privileges: None.
// Notes: postgres does not have a SHOW GRANTS statement.
// mysql only returns the user's privileges.
func (p *planner) ShowGrants(n *parser.ShowGrants) (planNode, error) {
if n.Targets == nil {
return nil, errors.Errorf("TODO(marc): implement SHOW GRANT with no targets")
}
descriptors, err := p.getDescriptorsFromTargetList(*n.Targets)
if err != nil {
return nil, err
}
objectType := "Database"
if n.Targets.Tables != nil {
objectType = "Table"
}
columns := ResultColumns{
{Name: objectType, Typ: parser.TypeString},
{Name: "User", Typ: parser.TypeString},
{Name: "Privileges", Typ: parser.TypeString},
}
return &delayedNode{
p: p,
name: "SHOW GRANTS",
columns: columns,
constructor: func(p *planner) (planNode, error) {
v := p.newContainerValuesNode(columns, 0)
var wantedUsers map[string]struct{}
if len(n.Grantees) != 0 {
wantedUsers = make(map[string]struct{})
}
for _, u := range n.Grantees {
wantedUsers[string(u)] = struct{}{}
}
for _, descriptor := range descriptors {
userPrivileges := descriptor.GetPrivileges().Show()
for _, userPriv := range userPrivileges {
if wantedUsers != nil {
if _, ok := wantedUsers[userPriv.User]; !ok {
continue
}
}
newRow := parser.DTuple{
parser.NewDString(descriptor.GetName()),
parser.NewDString(userPriv.User),
parser.NewDString(userPriv.PrivilegeString()),
}
if err := v.rows.AddRow(newRow); err != nil {
v.rows.Close()
return nil, err
}
}
}
return v, nil
},
}, nil
}
开发者ID:bdarnell,项目名称:cockroach,代码行数:62,代码来源:show.go
示例4: Show
// Show a session-local variable name.
func (p *planner) Show(n *parser.Show) (planNode, error) {
name := strings.ToUpper(n.Name)
var columns ResultColumns
switch name {
case `ALL`:
columns = ResultColumns{
{Name: "Variable", Typ: parser.TypeString},
{Name: "Value", Typ: parser.TypeString},
}
default:
if _, ok := varGen[name]; !ok {
return nil, fmt.Errorf("unknown variable: %q", name)
}
columns = ResultColumns{{Name: name, Typ: parser.TypeString}}
}
return &delayedNode{
p: p,
name: "SHOW " + name,
columns: columns,
constructor: func(p *planner) (planNode, error) {
v := p.newContainerValuesNode(columns, 0)
switch name {
case `ALL`:
for _, vName := range varNames {
gen := varGen[vName]
value := gen(p)
if _, err := v.rows.AddRow(
parser.DTuple{parser.NewDString(vName), parser.NewDString(value)},
); err != nil {
v.rows.Close()
return nil, err
}
}
default:
// The key in varGen is guaranteed to exist thanks to the
// check above.
gen := varGen[name]
value := gen(p)
if _, err := v.rows.AddRow(parser.DTuple{parser.NewDString(value)}); err != nil {
v.rows.Close()
return nil, err
}
}
return v, nil
},
}, nil
}
开发者ID:BramGruneir,项目名称:cockroach,代码行数:53,代码来源:show.go
示例5: benchmarkWriteTuple
func benchmarkWriteTuple(b *testing.B, format formatCode) {
i := parser.NewDInt(1234)
f := parser.NewDFloat(12.34)
s := parser.NewDString("testing")
t := &parser.DTuple{i, f, s}
benchmarkWriteType(b, t, format)
}
开发者ID:hvaara,项目名称:cockroach,代码行数:7,代码来源:types_test.go
示例6: ShowColumns
// ShowColumns of a table.
// Privileges: Any privilege on table.
// Notes: postgres does not have a SHOW COLUMNS statement.
// mysql only returns columns you have privileges on.
func (p *planner) ShowColumns(n *parser.ShowColumns) (planNode, error) {
tn, err := n.Table.NormalizeWithDatabaseName(p.session.Database)
if err != nil {
return nil, err
}
desc, err := p.mustGetTableDesc(tn)
if err != nil {
return nil, err
}
if err := p.anyPrivilege(desc); err != nil {
return nil, err
}
columns := ResultColumns{
{Name: "Field", Typ: parser.TypeString},
{Name: "Type", Typ: parser.TypeString},
{Name: "Null", Typ: parser.TypeBool},
{Name: "Default", Typ: parser.TypeString},
}
return &delayedNode{
p: p,
name: "SHOW COLUMNS FROM " + tn.String(),
columns: columns,
constructor: func(p *planner) (planNode, error) {
v := p.newContainerValuesNode(columns, 0)
for i, col := range desc.Columns {
defaultExpr := parser.DNull
if e := desc.Columns[i].DefaultExpr; e != nil {
defaultExpr = parser.NewDString(*e)
}
newRow := parser.DTuple{
parser.NewDString(desc.Columns[i].Name),
parser.NewDString(col.Type.SQLString()),
parser.MakeDBool(parser.DBool(desc.Columns[i].Nullable)),
defaultExpr,
}
if err := v.rows.AddRow(newRow); err != nil {
v.rows.Close()
return nil, err
}
}
return v, nil
},
}, nil
}
开发者ID:bdarnell,项目名称:cockroach,代码行数:51,代码来源:show.go
示例7: golangFillQueryArguments
// golangFillQueryArguments populates the placeholder map with
// types and values from an array of Go values.
// TODO: This does not support arguments of the SQL 'Date' type, as there is not
// an equivalent type in Go's standard library. It's not currently needed by any
// of our internal tables.
func golangFillQueryArguments(pinfo *parser.PlaceholderInfo, args []interface{}) {
pinfo.Clear()
for i, arg := range args {
k := fmt.Sprint(i + 1)
if arg == nil {
pinfo.SetValue(k, parser.DNull)
continue
}
// A type switch to handle a few explicit types with special semantics:
// - Datums are passed along as is.
// - Time datatypes get special representation in the database.
var d parser.Datum
switch t := arg.(type) {
case parser.Datum:
d = t
case time.Time:
d = parser.MakeDTimestamp(t, time.Microsecond)
case time.Duration:
d = &parser.DInterval{Duration: duration.Duration{Nanos: t.Nanoseconds()}}
case *inf.Dec:
dd := &parser.DDecimal{}
dd.Set(t)
d = dd
}
if d == nil {
// Handle all types which have an underlying type that can be stored in the
// database.
// Note: if this reflection becomes a performance concern in the future,
// commonly used types could be added explicitly into the type switch above
// for a performance gain.
val := reflect.ValueOf(arg)
switch val.Kind() {
case reflect.Bool:
d = parser.MakeDBool(parser.DBool(val.Bool()))
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
d = parser.NewDInt(parser.DInt(val.Int()))
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
d = parser.NewDInt(parser.DInt(val.Uint()))
case reflect.Float32, reflect.Float64:
d = parser.NewDFloat(parser.DFloat(val.Float()))
case reflect.String:
d = parser.NewDString(val.String())
case reflect.Slice:
// Handle byte slices.
if val.Type().Elem().Kind() == reflect.Uint8 {
d = parser.NewDBytes(parser.DBytes(val.Bytes()))
}
}
if d == nil {
panic(fmt.Sprintf("unexpected type %T", arg))
}
}
pinfo.SetValue(k, d)
}
}
开发者ID:hvaara,项目名称:cockroach,代码行数:62,代码来源:executor.go
示例8: ShowDatabases
// ShowDatabases returns all the databases.
// Privileges: None.
// Notes: postgres does not have a "show databases"
// mysql has a "SHOW DATABASES" permission, but we have no system-level permissions.
func (p *planner) ShowDatabases(n *parser.ShowDatabases) (planNode, error) {
// TODO(pmattis): This could be implemented as:
//
// SELECT id FROM system.namespace WHERE parentID = 0
columns := ResultColumns{{Name: "Database", Typ: parser.TypeString}}
return &delayedNode{
p: p,
name: "SHOW DATABASES",
columns: columns,
constructor: func(p *planner) (planNode, error) {
prefix := sqlbase.MakeNameMetadataKey(keys.RootNamespaceID, "")
sr, err := p.txn.Scan(prefix, prefix.PrefixEnd(), 0)
if err != nil {
return nil, err
}
v := p.newContainerValuesNode(columns, 0)
for _, db := range p.session.virtualSchemas.orderedNames {
if err := v.rows.AddRow(parser.DTuple{parser.NewDString(db)}); err != nil {
v.rows.Close()
return nil, err
}
}
for _, row := range sr {
_, name, err := encoding.DecodeUnsafeStringAscending(
bytes.TrimPrefix(row.Key, prefix), nil)
if err != nil {
v.rows.Close()
return nil, err
}
if err := v.rows.AddRow(parser.DTuple{parser.NewDString(name)}); err != nil {
v.rows.Close()
return nil, err
}
}
return v, nil
},
}, nil
}
开发者ID:bdarnell,项目名称:cockroach,代码行数:44,代码来源:show.go
示例9: ShowTables
// ShowTables returns all the tables.
// Privileges: None.
// Notes: postgres does not have a SHOW TABLES statement.
// mysql only returns tables you have privileges on.
func (p *planner) ShowTables(n *parser.ShowTables) (planNode, error) {
// TODO(pmattis): This could be implemented as:
//
// SELECT name FROM system.namespace
// WHERE parentID = (SELECT id FROM system.namespace
// WHERE parentID = 0 AND name = <database>)
name := p.session.Database
if n.Database != "" {
name = string(n.Database)
}
if name == "" {
return nil, errNoDatabase
}
columns := ResultColumns{{Name: "Table", Typ: parser.TypeString}}
return &delayedNode{
p: p,
name: "SHOW TABLES FROM " + name,
columns: columns,
constructor: func(p *planner) (planNode, error) {
dbDesc, err := p.mustGetDatabaseDesc(name)
if err != nil {
return nil, err
}
tableNames, err := p.getTableNames(dbDesc)
if err != nil {
return nil, err
}
v := p.newContainerValuesNode(columns, len(tableNames))
for _, name := range tableNames {
tableName := name.Table()
// Check to see if the table has been dropped.
if _, err := p.mustGetTableOrViewDesc(&name); err != nil {
if err == errTableDropped {
tableName += " (dropped)"
} else {
return nil, err
}
}
if err := v.rows.AddRow(parser.DTuple{parser.NewDString(tableName)}); err != nil {
v.rows.Close()
return nil, err
}
}
return v, nil
},
}, nil
}
开发者ID:bdarnell,项目名称:cockroach,代码行数:56,代码来源:show.go
示例10: Help
// Help returns usage information for the builtin functions
// Privileges: None
func (p *planner) Help(n *parser.Help) (planNode, error) {
name := strings.ToLower(n.Name.String())
columns := ResultColumns{
{Name: "Function", Typ: parser.TypeString},
{Name: "Signature", Typ: parser.TypeString},
{Name: "Category", Typ: parser.TypeString},
{Name: "Details", Typ: parser.TypeString},
}
return &delayedNode{
p: p,
name: "HELP " + name,
columns: columns,
constructor: func(p *planner) (planNode, error) {
v := p.newContainerValuesNode(columns, 0)
matches, ok := parser.Builtins[name]
// TODO(dt): support fuzzy matching.
if !ok {
return v, nil
}
for _, f := range matches {
row := parser.DTuple{
parser.NewDString(name),
parser.NewDString(f.Signature()),
parser.NewDString(f.Category()),
parser.NewDString(f.Info),
}
if _, err := v.rows.AddRow(row); err != nil {
v.Close()
return nil, err
}
}
return v, nil
},
}, nil
}
开发者ID:BramGruneir,项目名称:cockroach,代码行数:39,代码来源:show.go
示例11: colIDArrayToDatum
// colIDArrayToDatum returns a mock int[] as a DString for a slice of ColumnIDs.
// TODO(nvanbenschoten) use real int arrays when they are supported.
func colIDArrayToDatum(arr []sqlbase.ColumnID) parser.Datum {
if len(arr) == 0 {
return parser.DNull
}
var buf bytes.Buffer
buf.WriteByte('{')
for i, val := range arr {
if i > 0 {
buf.WriteByte(',')
}
buf.WriteString(strconv.Itoa(int(val)))
}
buf.WriteByte('}')
return parser.NewDString(buf.String())
}
开发者ID:hvaara,项目名称:cockroach,代码行数:17,代码来源:pg_catalog.go
示例12: runShowTransactionState
// runShowTransactionState returns the state of current transaction.
func (p *planner) runShowTransactionState(txnState *txnState, implicitTxn bool) (Result, error) {
var result Result
result.PGTag = (*parser.Show)(nil).StatementTag()
result.Type = (*parser.Show)(nil).StatementType()
result.Columns = ResultColumns{{Name: "TRANSACTION STATUS", Typ: parser.TypeString}}
result.Rows = NewRowContainer(p.session.makeBoundAccount(), result.Columns, 0)
state := txnState.State
if implicitTxn {
state = NoTxn
}
if _, err := result.Rows.AddRow(parser.DTuple{parser.NewDString(state.String())}); err != nil {
result.Rows.Close()
result.Err = err
return result, err
}
return result, nil
}
开发者ID:jmptrader,项目名称:cockroach,代码行数:18,代码来源:planner.go
示例13: RandDatum
// RandDatum generates a random Datum of the given type.
// If null is true, the datum can be DNull.
func RandDatum(rng *rand.Rand, typ ColumnType_Kind, null bool) parser.Datum {
if null && rng.Intn(10) == 0 {
return parser.DNull
}
switch typ {
case ColumnType_BOOL:
return parser.MakeDBool(rng.Intn(2) == 1)
case ColumnType_INT:
return parser.NewDInt(parser.DInt(rng.Int63()))
case ColumnType_FLOAT:
return parser.NewDFloat(parser.DFloat(rng.NormFloat64()))
case ColumnType_DECIMAL:
d := &parser.DDecimal{}
d.Dec.SetScale(inf.Scale(rng.Intn(40) - 20))
d.Dec.SetUnscaled(rng.Int63())
return d
case ColumnType_DATE:
return parser.NewDDate(parser.DDate(rng.Intn(10000)))
case ColumnType_TIMESTAMP:
return &parser.DTimestamp{Time: time.Unix(rng.Int63n(1000000), rng.Int63n(1000000))}
case ColumnType_INTERVAL:
return &parser.DInterval{Duration: duration.Duration{Months: rng.Int63n(1000),
Days: rng.Int63n(1000),
Nanos: rng.Int63n(1000000),
}}
case ColumnType_STRING:
// Generate a random ASCII string.
p := make([]byte, rng.Intn(10))
for i := range p {
p[i] = byte(1 + rng.Intn(127))
}
return parser.NewDString(string(p))
case ColumnType_BYTES:
p := make([]byte, rng.Intn(10))
_, _ = rng.Read(p)
return parser.NewDBytes(parser.DBytes(p))
case ColumnType_TIMESTAMPTZ:
return &parser.DTimestampTZ{Time: time.Unix(rng.Int63n(1000000), rng.Int63n(1000000))}
case ColumnType_INT_ARRAY:
// TODO(cuongdo): we don't support for persistence of arrays yet
return parser.DNull
default:
panic(fmt.Sprintf("invalid type %s", typ))
}
}
开发者ID:jmptrader,项目名称:cockroach,代码行数:47,代码来源:testutils.go
示例14: MakePrimaryIndexKey
// MakePrimaryIndexKey creates a key prefix that corresponds to a table row
// (in the primary index); it is intended for tests.
//
// The value types must match the primary key columns (or a prefix of them);
// supported types are: - Datum
// - bool (converts to DBool)
// - int (converts to DInt)
// - string (converts to DString)
func MakePrimaryIndexKey(desc *TableDescriptor, vals ...interface{}) (roachpb.Key, error) {
index := &desc.PrimaryIndex
if len(vals) > len(index.ColumnIDs) {
return nil, errors.Errorf("got %d values, PK has %d columns", len(vals), len(index.ColumnIDs))
}
datums := make([]parser.Datum, len(vals))
for i, v := range vals {
switch v := v.(type) {
case bool:
datums[i] = parser.MakeDBool(parser.DBool(v))
case int:
datums[i] = parser.NewDInt(parser.DInt(v))
case string:
datums[i] = parser.NewDString(v)
case parser.Datum:
datums[i] = v
default:
return nil, errors.Errorf("unexpected value type %T", v)
}
// Check that the value type matches.
colID := index.ColumnIDs[i]
for _, c := range desc.Columns {
if c.ID == colID {
if t := DatumTypeToColumnKind(datums[i].ResolvedType()); t != c.Type.Kind {
return nil, errors.Errorf("column %d of type %s, got value of type %s", i, c.Type.Kind, t)
}
break
}
}
}
// Create the ColumnID to index in datums slice map needed by
// MakeIndexKeyPrefix.
colIDToRowIndex := make(map[ColumnID]int)
for i := range vals {
colIDToRowIndex[index.ColumnIDs[i]] = i
}
keyPrefix := MakeIndexKeyPrefix(desc, index.ID)
key, _, err := EncodeIndexKey(desc, index, colIDToRowIndex, datums, keyPrefix)
if err != nil {
return nil, err
}
return roachpb.Key(key), nil
}
开发者ID:maxlang,项目名称:cockroach,代码行数:52,代码来源:table.go
示例15: init
// Add a placeholder implementation to test the plan hook. It accepts statements
// of the form `SHOW planhook` and returns a single row with the string value
// 'planhook'.
func init() {
testingPlanHook := func(
ctx context.Context, stmt parser.Statement, cfg *sql.ExecutorConfig,
) (func() ([]parser.DTuple, error), sql.ResultColumns, error) {
show, ok := stmt.(*parser.Show)
if !ok || show.Name != "planhook" {
return nil, nil, nil
}
header := sql.ResultColumns{
{Name: "value", Typ: parser.TypeString},
}
return func() ([]parser.DTuple, error) {
return []parser.DTuple{
{parser.NewDString(show.Name)},
}, nil
}, header, nil
}
sql.AddPlanHook(testingPlanHook)
}
开发者ID:BramGruneir,项目名称:cockroach,代码行数:22,代码来源:main_test.go
示例16: makePrefixRange
func makePrefixRange(prefix parser.DString, datum parser.TypedExpr, complete bool) parser.TypedExpr {
if complete {
return parser.NewTypedComparisonExpr(
parser.EQ,
datum,
&prefix,
)
}
if len(prefix) == 0 {
return parser.MakeDBool(true)
}
return parser.NewTypedAndExpr(
parser.NewTypedComparisonExpr(
parser.GE,
datum,
&prefix,
),
parser.NewTypedComparisonExpr(
parser.LT,
datum,
parser.NewDString(string(roachpb.Key(prefix).PrefixEnd())),
),
)
}
开发者ID:knz,项目名称:cockroach,代码行数:24,代码来源:analyze.go
示例17: ShowConstraints
// ShowConstraints returns all the constraints for a table.
// Privileges: Any privilege on table.
// Notes: postgres does not have a SHOW CONSTRAINTS statement.
// mysql requires some privilege for any column.
func (p *planner) ShowConstraints(n *parser.ShowConstraints) (planNode, error) {
tn, err := n.Table.NormalizeWithDatabaseName(p.session.Database)
if err != nil {
return nil, err
}
desc, err := p.mustGetTableDesc(tn)
if err != nil {
return nil, err
}
if err := p.anyPrivilege(desc); err != nil {
return nil, err
}
columns := ResultColumns{
{Name: "Table", Typ: parser.TypeString},
{Name: "Name", Typ: parser.TypeString},
{Name: "Type", Typ: parser.TypeString},
{Name: "Column(s)", Typ: parser.TypeString},
{Name: "Details", Typ: parser.TypeString},
}
return &delayedNode{
p: p,
name: "SHOW CONSTRAINTS FROM " + tn.String(),
columns: columns,
constructor: func(p *planner) (planNode, error) {
v := p.newContainerValuesNode(columns, 0)
info, err := desc.GetConstraintInfo(p.txn)
if err != nil {
return nil, err
}
for name, c := range info {
detailsDatum := parser.DNull
if c.Details != "" {
detailsDatum = parser.NewDString(c.Details)
}
columnsDatum := parser.DNull
if c.Columns != nil {
columnsDatum = parser.NewDString(strings.Join(c.Columns, ", "))
}
kind := string(c.Kind)
if c.Unvalidated {
kind += " (UNVALIDATED)"
}
newRow := []parser.Datum{
parser.NewDString(tn.Table()),
parser.NewDString(name),
parser.NewDString(kind),
columnsDatum,
detailsDatum,
}
if _, err := v.rows.AddRow(newRow); err != nil {
v.Close()
return nil, err
}
}
// Sort the results by constraint name.
sort := &sortNode{
ctx: p.ctx(),
p: p,
ordering: sqlbase.ColumnOrdering{
{ColIdx: 0, Direction: encoding.Ascending},
{ColIdx: 1, Direction: encoding.Ascending},
},
columns: v.columns,
}
return &selectTopNode{source: v, sort: sort}, nil
},
}, nil
}
开发者ID:BramGruneir,项目名称:cockroach,代码行数:77,代码来源:show.go
示例18: ShowIndex
// ShowIndex returns all the indexes for a table.
// Privileges: Any privilege on table.
// Notes: postgres does not have a SHOW INDEXES statement.
// mysql requires some privilege for any column.
func (p *planner) ShowIndex(n *parser.ShowIndex) (planNode, error) {
tn, err := n.Table.NormalizeWithDatabaseName(p.session.Database)
if err != nil {
return nil, err
}
desc, err := p.mustGetTableDesc(tn)
if err != nil {
return nil, err
}
if err := p.anyPrivilege(desc); err != nil {
return nil, err
}
columns := ResultColumns{
{Name: "Table", Typ: parser.TypeString},
{Name: "Name", Typ: parser.TypeString},
{Name: "Unique", Typ: parser.TypeBool},
{Name: "Seq", Typ: parser.TypeInt},
{Name: "Column", Typ: parser.TypeString},
{Name: "Direction", Typ: parser.TypeString},
{Name: "Storing", Typ: parser.TypeBool},
}
return &delayedNode{
p: p,
name: "SHOW INDEX FROM " + tn.String(),
columns: columns,
constructor: func(p *planner) (planNode, error) {
v := p.newContainerValuesNode(columns, 0)
appendRow := func(index sqlbase.IndexDescriptor, colName string, sequence int,
direction string, isStored bool) error {
newRow := parser.DTuple{
parser.NewDString(tn.Table()),
parser.NewDString(index.Name),
parser.MakeDBool(parser.DBool(index.Unique)),
parser.NewDInt(parser.DInt(sequence)),
parser.NewDString(colName),
parser.NewDString(direction),
parser.MakeDBool(parser.DBool(isStored)),
}
_, err := v.rows.AddRow(newRow)
return err
}
for _, index := range append([]sqlbase.IndexDescriptor{desc.PrimaryIndex}, desc.Indexes...) {
sequence := 1
for i, col := range index.ColumnNames {
if err := appendRow(index, col, sequence, index.ColumnDirections[i].String(), false); err != nil {
v.rows.Close()
return nil, err
}
sequence++
}
for _, col := range index.StoreColumnNames {
if err := appendRow(index, col, sequence, "N/A", true); err != nil {
v.rows.Close()
return nil, err
}
sequence++
}
}
return v, nil
},
}, nil
}
开发者ID:BramGruneir,项目名称:cockroach,代码行数:71,代码来源:show.go
示例19: ShowCreateView
// ShowCreateView returns a CREATE VIEW statement for the specified view in
// Traditional syntax.
// Privileges: Any privilege on view.
func (p *planner) ShowCreateView(n *parser.ShowCreateView) (planNode, error) {
tn, err := n.View.NormalizeWithDatabaseName(p.session.Database)
if err != nil {
return nil, err
}
desc, err := p.mustGetViewDesc(tn)
if err != nil {
return nil, err
}
if err := p.anyPrivilege(desc); err != nil {
return nil, err
}
columns := ResultColumns{
{Name: "View", Typ: parser.TypeString},
{Name: "CreateView", Typ: parser.TypeString},
}
return &delayedNode{
p: p,
name: "SHOW CREATE VIEW " + tn.String(),
columns: columns,
constructor: func(p *planner) (planNode, error) {
v := p.newContainerValuesNode(columns, 0)
var buf bytes.Buffer
fmt.Fprintf(&buf, "CREATE VIEW %s ", quoteNames(n.View.String()))
// Determine whether custom column names were specified when the view
// was created, and include them if so.
customColNames := false
stmt, err := parser.ParseOneTraditional(desc.ViewQuery)
if err != nil {
return nil, errors.Wrapf(err, "failed to parse underlying query from view %q", tn)
}
sel, ok := stmt.(*parser.Select)
if !ok {
return nil, errors.Errorf("failed to parse underlying query from view %q as a select", tn)
}
// When constructing the Select plan, make sure we don't require any
// privileges on the underlying tables.
p.skipSelectPrivilegeChecks = true
defer func() { p.skipSelectPrivilegeChecks = false }()
sourcePlan, err := p.Select(sel, []parser.Type{}, false)
if err != nil {
return nil, err
}
for i, col := range sourcePlan.Columns() {
if col.Name != desc.Columns[i].Name {
customColNames = true
break
}
}
if customColNames {
colNames := make([]string, 0, len(desc.Columns))
for _, col := range desc.Columns {
colNames = append(colNames, col.Name)
}
fmt.Fprintf(&buf, "(%s) ", strings.Join(colNames, ", "))
}
fmt.Fprintf(&buf, "AS %s", desc.ViewQuery)
if _, err := v.rows.AddRow(parser.DTuple{
parser.NewDString(n.View.String()),
parser.NewDString(buf.String()),
}); err != nil {
v.rows.Close()
return nil, err
}
return v, nil
},
}, nil
}
开发者ID:BramGruneir,项目名称:cockroach,代码行数:78,代码来源:show.go
示例20: ShowCreateTable
//.........这里部分代码省略.........
return nil, err
}
columns := ResultColumns{
{Name: "Table", Typ: parser.TypeString},
{Name: "CreateTable", Typ: parser.TypeString},
}
return &delayedNode{
p: p,
name: "SHOW CREATE TABLE " + tn.String(),
columns: columns,
constructor: func(p *planner) (planNode, error) {
v := p.newContainerValuesNode(columns, 0)
var buf bytes.Buffer
fmt.Fprintf(&buf, "CREATE TABLE %s (", quoteNames(n.Table.String()))
var primary string
for i, col := range desc.VisibleColumns() {
if i != 0 {
buf.WriteString(",")
}
buf.WriteString("\n\t")
fmt.Fprintf(&buf, "%s %s", quoteNames(col.Name), col.Type.SQLString())
if col.Nullable {
buf.WriteString(" NULL")
} else {
buf.WriteString(" NOT NULL")
}
if col.DefaultExpr != nil {
fmt.Fprintf(&buf, " DEFAULT %s", *col.DefaultExpr)
}
if desc.IsPhysicalTable() && desc.PrimaryIndex.ColumnIDs[0] == col.ID {
// Only set primary if the primary key is on a visible column (not rowid).
primary = fmt.Sprintf(",\n\tCONSTRAINT %s PRIMARY KEY (%s)",
quoteNames(desc.PrimaryIndex.Name),
quoteNames(desc.PrimaryIndex.ColumnNames...),
)
}
}
buf.WriteString(primary)
for _, idx := range desc.Indexes {
var storing string
if len(idx.StoreColumnNames) > 0 {
storing = fmt.Sprintf(" STORING (%s)", quoteNames(idx.StoreColumnNames...))
}
interleave, err := p.showCreateInterleave(&idx)
if err != nil {
v.rows.Close()
return nil, err
}
fmt.Fprintf(&buf, ",\n\t%sINDEX %s (%s)%s%s",
isUnique[idx.Unique],
quoteNames(idx.Name),
quoteNames(idx.ColumnNames...),
storing,
interleave,
)
}
for _, fam := range desc.Families {
activeColumnNames := make([]string, 0, len(fam.ColumnNames))
for i, colID := range fam.ColumnIDs {
if _, err := desc.FindActiveColumnByID(colID); err == nil {
activeColumnNames = append(activeColumnNames, fam.ColumnNames[i])
}
}
fmt.Fprintf(&buf, ",\n\tFAMILY %s (%s)",
quoteNames(fam.Name),
quoteNames(activeColumnNames...),
)
}
for _, e := range desc.Checks {
fmt.Fprintf(&buf, ",\n\t")
if len(e.Name) > 0 {
fmt.Fprintf(&buf, "CONSTRAINT %s ", quoteNames(e.Name))
}
fmt.Fprintf(&buf, "CHECK (%s)", e.Expr)
}
buf.WriteString("\n)")
interleave, err := p.showCreateInterleave(&desc.PrimaryIndex)
if err != nil {
v.rows.Close()
return nil, err
}
buf.WriteString(interleave)
if _, err := v.rows.AddRow(parser.DTuple{
parser.NewDString(n.Table.String()),
parser.NewDString(buf.String()),
}); err != nil {
v.rows.Close()
return nil, err
}
return v, nil
},
}, nil
}
开发者ID:BramGruneir,项目名称:cockroach,代码行数:101,代码来源:show.go
注:本文中的github.com/cockroachdb/cockroach/pkg/sql/parser.NewDString函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论