modernc.org/ql@v1.4.7/stmt.go (about)

     1  // Copyright (c) 2014 ql Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package ql // import "modernc.org/ql"
     6  
     7  import (
     8  	"bytes"
     9  	"fmt"
    10  	"strings"
    11  
    12  	"sync"
    13  
    14  	"modernc.org/strutil"
    15  )
    16  
    17  // NOTE: all stmt implementations must be safe for concurrent use by multiple
    18  // goroutines.  If the exec method requires any execution domain local data,
    19  // they must be held out of the implementing instance.
    20  var (
    21  	_ stmt = (*alterTableAddStmt)(nil)
    22  	_ stmt = (*alterTableDropColumnStmt)(nil)
    23  	_ stmt = (*createIndexStmt)(nil)
    24  	_ stmt = (*createTableStmt)(nil)
    25  	_ stmt = (*deleteStmt)(nil) //TODO optimizer plan
    26  	_ stmt = (*dropIndexStmt)(nil)
    27  	_ stmt = (*dropTableStmt)(nil)
    28  	_ stmt = (*explainStmt)(nil)
    29  	_ stmt = (*insertIntoStmt)(nil)
    30  	_ stmt = (*selectStmt)(nil)
    31  	_ stmt = (*truncateTableStmt)(nil)
    32  	_ stmt = (*updateStmt)(nil) //TODO optimizer plan
    33  	_ stmt = beginTransactionStmt{}
    34  	_ stmt = commitStmt{}
    35  	_ stmt = rollbackStmt{}
    36  )
    37  
    38  var (
    39  	createColumn2 = mustCompile(`
    40  		create table if not exists __Column2 (
    41  			TableName string,
    42  			Name string,
    43  			NotNull bool,
    44  			ConstraintExpr string,
    45  			DefaultExpr string,
    46  		);
    47  		create index if not exists __Column2TableName on __Column2(TableName);
    48  	`)
    49  
    50  	insertColumn2 = mustCompile(`insert into __Column2 values($1, $2, $3, $4, $5)`)
    51  
    52  	selectColumn2 = MustCompile(`
    53  		select Name, NotNull, ConstraintExpr, DefaultExpr
    54  		from __Column2
    55  		where TableName == $1
    56  	`)
    57  
    58  	deleteColumn2 = mustCompile(`
    59  		delete from __Column2
    60  		where TableName == $1 && Name == $2
    61  	`)
    62  
    63  	createIndex2 = mustCompile(`
    64  		// Index register 2.
    65  		create table if not exists __Index2(
    66  			TableName string,
    67  			IndexName string,
    68  			IsUnique  bool,
    69  			IsSimple  bool,   // Just a column name or id().
    70  			Root      int64,  // BTree handle
    71  		);
    72  
    73  		// Expressions for given index. Compared in order of id(__Index2_Expr).
    74  		create table if not exists __Index2_Expr(
    75  			Index2_ID int,
    76  			Expr      string,
    77  		);
    78  
    79  		create index if not exists __xIndex2_TableName on __Index2(TableName);
    80  		create unique index if not exists __xIndex2_IndexName on __Index2(IndexName);
    81  		create index if not exists __xIndex2_ID on __Index2(id());
    82  		create index if not exists __xIndex2_Expr_Index2_ID on __Index2_Expr(Index2_ID);
    83  `)
    84  
    85  	insertIndex2     = mustCompile("insert into __Index2 values($1, $2, $3, $4, $5)")
    86  	insertIndex2Expr = mustCompile("insert into __Index2_Expr values($1, $2)")
    87  
    88  	deleteIndex2ByIndexName = mustCompile(`
    89  		delete from __Index2_Expr
    90  		where Index2_ID in (
    91  			select id() from __Index2 where IndexName == $1;
    92  		);	
    93  
    94  		delete from __Index2
    95  		where IndexName == $1;
    96  `)
    97  	deleteIndex2ByTableName = mustCompile(`
    98  		delete from __Index2_Expr
    99  		where Index2_ID in (
   100  			select id() from __Index2 where TableName == $1;
   101  		);	
   102  
   103  		delete from __Index2
   104  		where TableName == $1;
   105  `)
   106  )
   107  
   108  type stmt interface {
   109  	// never invoked for
   110  	// - beginTransactionStmt
   111  	// - commitStmt
   112  	// - rollbackStmt
   113  	exec(ctx *execCtx) (Recordset, error)
   114  
   115  	explain(ctx *execCtx, w strutil.Formatter)
   116  
   117  	// return value ignored for
   118  	// - beginTransactionStmt
   119  	// - commitStmt
   120  	// - rollbackStmt
   121  	isUpdating() bool
   122  	String() string
   123  }
   124  
   125  type execCtx struct { //LATER +shared temp
   126  	db    *DB
   127  	arg   []interface{}
   128  	cache map[interface{}]interface{}
   129  	mu    sync.RWMutex
   130  }
   131  
   132  func newExecCtx(db *DB, arg []interface{}) *execCtx {
   133  	return &execCtx{
   134  		db:    db,
   135  		arg:   arg,
   136  		cache: make(map[interface{}]interface{}),
   137  	}
   138  }
   139  
   140  type explainStmt struct {
   141  	s stmt
   142  }
   143  
   144  func (s *explainStmt) explain(ctx *execCtx, w strutil.Formatter) {
   145  	for {
   146  		x, ok := s.s.(*explainStmt)
   147  		if !ok {
   148  			s.s.explain(ctx, w)
   149  			return
   150  		}
   151  
   152  		s = x
   153  	}
   154  }
   155  
   156  func (s *explainStmt) String() string {
   157  	return "EXPLAIN " + s.s.String()
   158  }
   159  
   160  func (*explainStmt) isUpdating() bool { return false }
   161  
   162  func (s *explainStmt) exec(ctx *execCtx) (_ Recordset, err error) {
   163  	return recordset{ctx, &explainDefaultPlan{s.s}, ctx.db.cc}, nil
   164  }
   165  
   166  type updateStmt struct {
   167  	tableName string
   168  	list      []assignment
   169  	where     expression
   170  }
   171  
   172  func (s *updateStmt) explain(ctx *execCtx, w strutil.Formatter) {
   173  	w.Format("%s\n", s)
   174  }
   175  
   176  func (s *updateStmt) String() string {
   177  	u := fmt.Sprintf("UPDATE %s", s.tableName)
   178  	a := make([]string, len(s.list))
   179  	for i, v := range s.list {
   180  		a[i] = v.String()
   181  	}
   182  	w := ""
   183  	if s.where != nil {
   184  		w = fmt.Sprintf(" WHERE %s", s.where)
   185  	}
   186  	return fmt.Sprintf("%s %s%s;", u, strings.Join(a, ", "), w)
   187  }
   188  
   189  func (s *updateStmt) exec(ctx *execCtx) (_ Recordset, err error) {
   190  	t, ok := ctx.db.root.tables[s.tableName]
   191  	if !ok {
   192  		return nil, fmt.Errorf("UPDATE: table %s does not exist", s.tableName)
   193  	}
   194  
   195  	tcols := make([]*col, len(s.list))
   196  	for i, asgn := range s.list {
   197  		col := findCol(t.cols, asgn.colName)
   198  		if col == nil {
   199  			return nil, fmt.Errorf("UPDATE: unknown column %s", asgn.colName)
   200  		}
   201  		tcols[i] = col
   202  	}
   203  
   204  	m := map[interface{}]interface{}{}
   205  	var nh int64
   206  	expr := s.where
   207  	blobCols := t.blobCols()
   208  	cc := ctx.db.cc
   209  	var old []interface{}
   210  	var touched []bool
   211  	if t.hasIndices() {
   212  		old = make([]interface{}, len(t.cols0))
   213  		touched = make([]bool, len(t.cols0))
   214  	}
   215  	for h := t.head; h != 0; h = nh {
   216  		// Read can return lazily expanded chunks
   217  		data, err := t.store.Read(nil, h, t.cols...)
   218  		if err != nil {
   219  			return nil, err
   220  		}
   221  
   222  		nh = data[0].(int64)
   223  		for _, col := range t.cols {
   224  			m[col.name] = data[2+col.index]
   225  		}
   226  		id := data[1].(int64)
   227  		m["$id"] = id
   228  		if expr != nil {
   229  			val, err := s.where.eval(ctx, m)
   230  			if err != nil {
   231  				return nil, err
   232  			}
   233  
   234  			if val == nil {
   235  				continue
   236  			}
   237  
   238  			x, ok := val.(bool)
   239  			if !ok {
   240  				return nil, fmt.Errorf("invalid WHERE expression %s (value of type %T)", val, val)
   241  			}
   242  
   243  			if !x {
   244  				continue
   245  			}
   246  		}
   247  
   248  		// hit
   249  		for _, ix := range t.indices2 {
   250  			vlist, err := ix.eval(ctx, t.cols, id, data[2:])
   251  			if err != nil {
   252  				return nil, err
   253  			}
   254  
   255  			if err := ix.x.Delete(vlist, h); err != nil {
   256  				return nil, err
   257  			}
   258  		}
   259  		for i, asgn := range s.list {
   260  			val, err := asgn.expr.eval(ctx, m)
   261  			if err != nil {
   262  				return nil, err
   263  			}
   264  
   265  			colIndex := tcols[i].index
   266  			if t.hasIndices() {
   267  				old[colIndex] = data[2+colIndex]
   268  				touched[colIndex] = true
   269  			}
   270  			data[2+colIndex] = val
   271  		}
   272  		if err = typeCheck(data[2:], t.cols); err != nil {
   273  			return nil, err
   274  		}
   275  
   276  		if err = t.checkConstraintsAndDefaults(ctx, data[2:], m); err != nil {
   277  			return nil, err
   278  		}
   279  
   280  		for i, v := range t.indices {
   281  			if i == 0 { // id() N/A
   282  				continue
   283  			}
   284  
   285  			if v == nil || !touched[i-1] {
   286  				continue
   287  			}
   288  
   289  			if err = v.x.Delete([]interface{}{old[i-1]}, h); err != nil {
   290  				return nil, err
   291  			}
   292  		}
   293  
   294  		if err = t.store.UpdateRow(h, blobCols, data...); err != nil { //LATER detect which blobs are actually affected
   295  			return nil, err
   296  		}
   297  
   298  		for i, v := range t.indices {
   299  			if i == 0 { // id() N/A
   300  				continue
   301  			}
   302  
   303  			if v == nil || !touched[i-1] {
   304  				continue
   305  			}
   306  
   307  			if err = v.x.Create([]interface{}{data[2+i-1]}, h); err != nil {
   308  				return nil, err
   309  			}
   310  		}
   311  		for _, ix := range t.indices2 {
   312  			vlist, err := ix.eval(ctx, t.cols, id, data[2:])
   313  			if err != nil {
   314  				return nil, err
   315  			}
   316  
   317  			if err := ix.x.Create(vlist, h); err != nil {
   318  				return nil, err
   319  			}
   320  		}
   321  
   322  		cc.RowsAffected++
   323  	}
   324  	return
   325  }
   326  
   327  func (s *updateStmt) isUpdating() bool { return true }
   328  
   329  type deleteStmt struct {
   330  	tableName string
   331  	where     expression
   332  }
   333  
   334  func (s *deleteStmt) explain(ctx *execCtx, w strutil.Formatter) {
   335  	w.Format("%s\n", s)
   336  }
   337  
   338  func (s *deleteStmt) String() string {
   339  	switch {
   340  	case s.where == nil:
   341  		return fmt.Sprintf("DELETE FROM %s;", s.tableName)
   342  	default:
   343  		return fmt.Sprintf("DELETE FROM %s WHERE %s;", s.tableName, s.where)
   344  	}
   345  }
   346  
   347  func (s *deleteStmt) exec(ctx *execCtx) (_ Recordset, err error) {
   348  	t, ok := ctx.db.root.tables[s.tableName]
   349  	if !ok {
   350  		return nil, fmt.Errorf("DELETE FROM: table %s does not exist", s.tableName)
   351  	}
   352  
   353  	m := map[interface{}]interface{}{}
   354  	var ph, h, nh int64
   355  	var data []interface{}
   356  	blobCols := t.blobCols()
   357  	cc := ctx.db.cc
   358  	for h = t.head; h != 0; ph, h = h, nh {
   359  		for i, v := range data {
   360  			c, ok := v.(chunk)
   361  			if !ok {
   362  				continue
   363  			}
   364  
   365  			data[i] = c.b
   366  		}
   367  		// Read can return lazily expanded chunks
   368  		data, err = t.store.Read(nil, h, t.cols...)
   369  		if err != nil {
   370  			return nil, err
   371  		}
   372  
   373  		nh = data[0].(int64)
   374  		for _, col := range t.cols {
   375  			m[col.name] = data[2+col.index]
   376  		}
   377  		id := data[1].(int64)
   378  		m["$id"] = id
   379  		val, err := s.where.eval(ctx, m)
   380  		if err != nil {
   381  			return nil, err
   382  		}
   383  
   384  		if val == nil {
   385  			continue
   386  		}
   387  
   388  		x, ok := val.(bool)
   389  		if !ok {
   390  			return nil, fmt.Errorf("invalid WHERE expression %s (value of type %T)", val, val)
   391  		}
   392  
   393  		if !x {
   394  			continue
   395  		}
   396  
   397  		// hit
   398  		for i, v := range t.indices {
   399  			if v == nil {
   400  				continue
   401  			}
   402  
   403  			// overflow chunks left in place
   404  			if err = v.x.Delete([]interface{}{data[i+1]}, h); err != nil {
   405  				return nil, err
   406  			}
   407  		}
   408  		for _, ix := range t.indices2 {
   409  			vlist, err := ix.eval(ctx, t.cols, id, data[2:])
   410  			if err != nil {
   411  				return nil, err
   412  			}
   413  
   414  			if err := ix.x.Delete(vlist, h); err != nil {
   415  				return nil, err
   416  			}
   417  		}
   418  
   419  		// overflow chunks freed here
   420  		if err = t.store.Delete(h, blobCols...); err != nil {
   421  			return nil, err
   422  		}
   423  
   424  		cc.RowsAffected++
   425  		switch {
   426  		case ph == 0 && nh == 0: // "only"
   427  			fallthrough
   428  		case ph == 0 && nh != 0: // "first"
   429  			if err = t.store.Update(t.hhead, nh); err != nil {
   430  				return nil, err
   431  			}
   432  
   433  			t.head, h = nh, 0
   434  		case ph != 0 && nh == 0: // "last"
   435  			fallthrough
   436  		case ph != 0 && nh != 0: // "inner"
   437  			pdata, err := t.store.Read(nil, ph, t.cols...)
   438  			if err != nil {
   439  				return nil, err
   440  			}
   441  
   442  			for i, v := range pdata {
   443  				if x, ok := v.(chunk); ok {
   444  					pdata[i] = x.b
   445  				}
   446  			}
   447  			pdata[0] = nh
   448  			if err = t.store.Update(ph, pdata...); err != nil {
   449  				return nil, err
   450  			}
   451  
   452  			h = ph
   453  		}
   454  	}
   455  
   456  	return
   457  }
   458  
   459  func (s *deleteStmt) isUpdating() bool { return true }
   460  
   461  type truncateTableStmt struct {
   462  	tableName string
   463  }
   464  
   465  func (s *truncateTableStmt) explain(ctx *execCtx, w strutil.Formatter) {
   466  	w.Format("%s\n", s)
   467  }
   468  
   469  func (s *truncateTableStmt) String() string { return fmt.Sprintf("TRUNCATE TABLE %s;", s.tableName) }
   470  
   471  func (s *truncateTableStmt) exec(ctx *execCtx) (Recordset, error) {
   472  	t, ok := ctx.db.root.tables[s.tableName]
   473  	if !ok {
   474  		return nil, fmt.Errorf("TRUNCATE TABLE: table %s does not exist", s.tableName)
   475  	}
   476  
   477  	return nil, t.truncate()
   478  }
   479  
   480  func (s *truncateTableStmt) isUpdating() bool { return true }
   481  
   482  type dropIndexStmt struct {
   483  	ifExists  bool
   484  	indexName string
   485  }
   486  
   487  func (s *dropIndexStmt) explain(ctx *execCtx, w strutil.Formatter) {
   488  	w.Format("%s\n", s)
   489  }
   490  
   491  func (s *dropIndexStmt) String() string { return fmt.Sprintf("DROP INDEX %s;", s.indexName) }
   492  
   493  func (s *dropIndexStmt) exec(ctx *execCtx) (Recordset, error) {
   494  	t, x := ctx.db.root.findIndexByName(s.indexName)
   495  	if x == nil {
   496  		if s.ifExists {
   497  			return nil, nil
   498  		}
   499  
   500  		return nil, fmt.Errorf("DROP INDEX: index %s does not exist", s.indexName)
   501  	}
   502  
   503  	if ctx.db.hasAllIndex2() {
   504  		if err := ctx.db.deleteIndex2ByIndexName(s.indexName); err != nil {
   505  			return nil, err
   506  		}
   507  	}
   508  
   509  	switch ix := x.(type) {
   510  	case *indexedCol:
   511  		for i, v := range t.indices {
   512  			if v == nil || v.name != s.indexName {
   513  				continue
   514  			}
   515  
   516  			return nil, t.dropIndex(i)
   517  		}
   518  	case *index2:
   519  		delete(t.indices2, s.indexName)
   520  		return nil, ix.x.Drop()
   521  	}
   522  
   523  	panic("internal error 058")
   524  }
   525  
   526  func (s *dropIndexStmt) isUpdating() bool { return true }
   527  
   528  type dropTableStmt struct {
   529  	ifExists  bool
   530  	tableName string
   531  }
   532  
   533  func (s *dropTableStmt) explain(ctx *execCtx, w strutil.Formatter) {
   534  	w.Format("%s\n", s)
   535  }
   536  
   537  func (s *dropTableStmt) String() string { return fmt.Sprintf("DROP TABLE %s;", s.tableName) }
   538  
   539  func (s *dropTableStmt) exec(ctx *execCtx) (Recordset, error) {
   540  	t, ok := ctx.db.root.tables[s.tableName]
   541  	if !ok {
   542  		if s.ifExists {
   543  			return nil, nil
   544  		}
   545  
   546  		return nil, fmt.Errorf("DROP TABLE: table %s does not exist", s.tableName)
   547  	}
   548  
   549  	if ctx.db.hasAllIndex2() {
   550  		if err := ctx.db.deleteIndex2ByTableName(s.tableName); err != nil {
   551  			return nil, err
   552  		}
   553  	}
   554  
   555  	return nil, ctx.db.root.dropTable(t)
   556  }
   557  
   558  func (s *dropTableStmt) isUpdating() bool { return true }
   559  
   560  type alterTableDropColumnStmt struct {
   561  	tableName, colName string
   562  }
   563  
   564  func (s *alterTableDropColumnStmt) explain(ctx *execCtx, w strutil.Formatter) {
   565  	w.Format("%s\n", s)
   566  }
   567  
   568  func (s *alterTableDropColumnStmt) String() string {
   569  	return fmt.Sprintf("ALTER TABLE %s DROP COLUMN %s;", s.tableName, s.colName)
   570  }
   571  
   572  func (s *alterTableDropColumnStmt) exec(ctx *execCtx) (Recordset, error) {
   573  	t, ok := ctx.db.root.tables[s.tableName]
   574  	if !ok {
   575  		return nil, fmt.Errorf("ALTER TABLE: table %s does not exist", s.tableName)
   576  	}
   577  
   578  	cols := t.cols
   579  	for _, c := range cols {
   580  		if c.name == s.colName {
   581  			if len(cols) == 1 {
   582  				return nil, fmt.Errorf("ALTER TABLE %s DROP COLUMN: cannot drop the only column: %s", s.tableName, s.colName)
   583  			}
   584  
   585  			if _, ok := ctx.db.root.tables["__Column2"]; ok {
   586  				if _, err := deleteColumn2.l[0].exec(newExecCtx(ctx.db, []interface{}{s.tableName, c.name})); err != nil {
   587  					return nil, err
   588  				}
   589  			}
   590  
   591  			c.name = ""
   592  			t.cols0[c.index].name = ""
   593  			if t.hasIndices() {
   594  				if len(t.indices) != 0 {
   595  					if v := t.indices[c.index+1]; v != nil {
   596  						if err := t.dropIndex(c.index + 1); err != nil {
   597  							return nil, err
   598  						}
   599  
   600  						if ctx.db.hasAllIndex2() {
   601  							if err := ctx.db.deleteIndex2ByIndexName(v.name); err != nil {
   602  								return nil, err
   603  							}
   604  						}
   605  					}
   606  				}
   607  
   608  				for nm, ix := range t.indices2 {
   609  					for _, e := range ix.exprList {
   610  						m := mentionedColumns(e)
   611  						if _, ok := m[s.colName]; ok {
   612  							if err := ctx.db.deleteIndex2ByIndexName(nm); err != nil {
   613  								return nil, err
   614  							}
   615  
   616  							if err := ix.x.Drop(); err != nil {
   617  								return nil, err
   618  							}
   619  
   620  							delete(t.indices2, nm)
   621  							break
   622  						}
   623  					}
   624  				}
   625  			}
   626  			if err := t.constraintsAndDefaults(ctx); err != nil {
   627  				return nil, err
   628  			}
   629  
   630  			return nil, t.updated()
   631  		}
   632  	}
   633  
   634  	return nil, fmt.Errorf("ALTER TABLE %s DROP COLUMN: column %s does not exist", s.tableName, s.colName)
   635  }
   636  
   637  func (s *alterTableDropColumnStmt) isUpdating() bool { return true }
   638  
   639  type alterTableAddStmt struct {
   640  	tableName string
   641  	c         *col
   642  }
   643  
   644  func (s *alterTableAddStmt) explain(ctx *execCtx, w strutil.Formatter) {
   645  	w.Format("%s\n", s)
   646  }
   647  
   648  func (s *alterTableAddStmt) String() string {
   649  	r := fmt.Sprintf("ALTER TABLE %s ADD %s %s", s.tableName, s.c.name, typeStr(s.c.typ))
   650  	c := s.c
   651  	if x := c.constraint; x != nil { //TODO add (*col).String()
   652  		switch e := x.expr; {
   653  		case e != nil:
   654  			r += " " + e.String()
   655  		default:
   656  			r += " NOT NULL"
   657  		}
   658  	}
   659  	if x := c.dflt; x != nil {
   660  		r += " DEFAULT " + x.String()
   661  	}
   662  	return r + ";"
   663  }
   664  
   665  func (s *alterTableAddStmt) exec(ctx *execCtx) (Recordset, error) {
   666  	t, ok := ctx.db.root.tables[s.tableName]
   667  	if !ok {
   668  		return nil, fmt.Errorf("ALTER TABLE: table %s does not exist", s.tableName)
   669  	}
   670  
   671  	hasRecords := t.head != 0
   672  	c := s.c
   673  	if c.constraint != nil && hasRecords {
   674  		return nil, fmt.Errorf("ALTER TABLE %s ADD %s: cannot add constrained column to table with existing data", s.tableName, c.name)
   675  	}
   676  
   677  	cols := t.cols
   678  	for _, c := range cols {
   679  		nm := c.name
   680  		if nm == s.c.name {
   681  			return nil, fmt.Errorf("ALTER TABLE %s ADD: column %s exists", s.tableName, nm)
   682  		}
   683  	}
   684  
   685  	if len(t.indices) != 0 {
   686  		t.indices = append(t.indices, nil)
   687  		t.xroots = append(t.xroots, 0)
   688  		if err := t.store.Update(t.hxroots, t.xroots...); err != nil {
   689  			return nil, err
   690  		}
   691  	}
   692  
   693  	if c.constraint != nil || c.dflt != nil {
   694  		for _, s := range createColumn2.l {
   695  			_, err := s.exec(newExecCtx(ctx.db, nil))
   696  			if err != nil {
   697  				return nil, err
   698  			}
   699  		}
   700  		notNull := c.constraint != nil && c.constraint.expr == nil
   701  		var co, d string
   702  		if c.constraint != nil && c.constraint.expr != nil {
   703  			co = c.constraint.expr.String()
   704  		}
   705  		if e := c.dflt; e != nil {
   706  			d = e.String()
   707  		}
   708  		if _, err := insertColumn2.l[0].exec(newExecCtx(ctx.db, []interface{}{s.tableName, c.name, notNull, co, d})); err != nil {
   709  			return nil, err
   710  		}
   711  	}
   712  
   713  	t.cols0 = append(t.cols0, s.c)
   714  	if err := t.constraintsAndDefaults(ctx); err != nil {
   715  		return nil, err
   716  	}
   717  
   718  	return nil, t.updated()
   719  }
   720  
   721  func (s *alterTableAddStmt) isUpdating() bool { return true }
   722  
   723  type selectStmt struct {
   724  	distinct      bool
   725  	flds          []*fld
   726  	from          *joinRset
   727  	group         *groupByRset
   728  	hasAggregates bool
   729  	limit         *limitRset
   730  	offset        *offsetRset
   731  	order         *orderByRset
   732  	where         *whereRset
   733  }
   734  
   735  func (s *selectStmt) explain(ctx *execCtx, w strutil.Formatter) {
   736  	p, err := s.plan(ctx)
   737  	if err != nil {
   738  		w.Format("ERROR: %v\n", err)
   739  		return
   740  	}
   741  
   742  	p.explain(w)
   743  }
   744  
   745  func (s *selectStmt) String() string {
   746  	var b bytes.Buffer
   747  	b.WriteString("SELECT")
   748  	if s.distinct {
   749  		b.WriteString(" DISTINCT")
   750  	}
   751  	switch {
   752  	case len(s.flds) == 0:
   753  		b.WriteString(" *")
   754  	default:
   755  		a := make([]string, len(s.flds))
   756  		for i, v := range s.flds {
   757  			s := v.expr.String()
   758  			if v.name != "" && v.name != s {
   759  				s += " AS " + v.name
   760  			}
   761  			a[i] = s
   762  		}
   763  		b.WriteString(" " + strings.Join(a, ", "))
   764  	}
   765  	if s.from != nil {
   766  		if !s.from.isZero() {
   767  			b.WriteString(" FROM ")
   768  			b.WriteString(s.from.String())
   769  		}
   770  	}
   771  
   772  	if s.where != nil {
   773  		b.WriteString(" WHERE ")
   774  		b.WriteString(s.where.String())
   775  	}
   776  	if s.group != nil {
   777  		b.WriteString(" GROUP BY ")
   778  		b.WriteString(strings.Join(s.group.colNames, ", "))
   779  	}
   780  	if s.order != nil {
   781  		b.WriteString(" ORDER BY ")
   782  		b.WriteString(s.order.String())
   783  	}
   784  	if s.limit != nil {
   785  		b.WriteString(" LIMIT ")
   786  		b.WriteString(s.limit.expr.String())
   787  	}
   788  	if s.offset != nil {
   789  		b.WriteString(" OFFSET ")
   790  		b.WriteString(s.offset.expr.String())
   791  	}
   792  	b.WriteRune(';')
   793  	return b.String()
   794  }
   795  
   796  func (s *selectStmt) plan(ctx *execCtx) (plan, error) { //LATER overlapping goroutines/pipelines
   797  	var r plan
   798  	var err error
   799  	if s.from != nil {
   800  		r, err = s.from.plan(ctx)
   801  		if err != nil {
   802  			return nil, err
   803  		}
   804  	}
   805  	if r == nil {
   806  		return &selectDummyPlan{flds: s.flds}, nil
   807  	}
   808  	if w := s.where; w != nil {
   809  		if r, err = (&whereRset{expr: w.expr, src: r, sel: w.sel, exists: w.exists}).plan(ctx); err != nil {
   810  			return nil, err
   811  		}
   812  	}
   813  	switch {
   814  	case !s.hasAggregates && s.group == nil: // nop
   815  	case !s.hasAggregates && s.group != nil:
   816  		if r, err = (&groupByRset{colNames: s.group.colNames, src: r}).plan(ctx); err != nil {
   817  			return nil, err
   818  		}
   819  	case s.hasAggregates && s.group == nil:
   820  		if r, err = (&groupByRset{src: r}).plan(ctx); err != nil {
   821  			return nil, err
   822  		}
   823  	case s.hasAggregates && s.group != nil:
   824  		if r, err = (&groupByRset{colNames: s.group.colNames, src: r}).plan(ctx); err != nil {
   825  			return nil, err
   826  		}
   827  	}
   828  	if r, err = (&selectRset{flds: s.flds, src: r}).plan(ctx); err != nil {
   829  		return nil, err
   830  	}
   831  
   832  	if s.distinct {
   833  		if r, err = (&distinctRset{src: r}).plan(ctx); err != nil {
   834  			return nil, err
   835  		}
   836  	}
   837  	if s := s.order; s != nil {
   838  		if r, err = (&orderByRset{asc: s.asc, by: s.by, src: r}).plan(ctx); err != nil {
   839  			return nil, err
   840  		}
   841  	}
   842  	if s := s.offset; s != nil {
   843  		if r, err = (&offsetRset{s.expr, r}).plan(ctx); err != nil {
   844  			return nil, err
   845  		}
   846  	}
   847  	if s := s.limit; s != nil {
   848  		if r, err = (&limitRset{s.expr, r}).plan(ctx); err != nil {
   849  			return nil, err
   850  		}
   851  	}
   852  	return r, nil
   853  }
   854  
   855  func (s *selectStmt) exec(ctx *execCtx) (rs Recordset, err error) {
   856  	r, err := s.plan(ctx)
   857  	if err != nil {
   858  		return nil, err
   859  	}
   860  
   861  	return recordset{ctx, r, nil}, nil
   862  }
   863  
   864  func (s *selectStmt) isUpdating() bool { return false }
   865  
   866  type insertIntoStmt struct {
   867  	colNames  []string
   868  	lists     [][]expression
   869  	sel       *selectStmt
   870  	tableName string
   871  
   872  	ifNotExists bool
   873  }
   874  
   875  func (s *insertIntoStmt) explain(ctx *execCtx, w strutil.Formatter) {
   876  	w.Format("%s\n", s)
   877  }
   878  
   879  func (s *insertIntoStmt) String() string {
   880  	cn := ""
   881  	if len(s.colNames) != 0 {
   882  		cn = fmt.Sprintf(" (%s)", strings.Join(s.colNames, ", "))
   883  	}
   884  	var ifNotExists string
   885  	if s.ifNotExists {
   886  		ifNotExists = " IF NOT EXISTS"
   887  	}
   888  	switch {
   889  	case s.sel != nil:
   890  		return fmt.Sprintf("INSERT INTO %s%s%s %s;", s.tableName, ifNotExists, cn, s.sel)
   891  	default:
   892  		a := make([]string, len(s.lists))
   893  		for i, v := range s.lists {
   894  			b := make([]string, len(v))
   895  			for i, v := range v {
   896  				b[i] = v.String()
   897  			}
   898  			a[i] = fmt.Sprintf("(%s)", strings.Join(b, ", "))
   899  		}
   900  		return fmt.Sprintf("INSERT INTO %s%s%s VALUES %s;", s.tableName, ifNotExists, cn, strings.Join(a, ", "))
   901  	}
   902  }
   903  
   904  func (s *insertIntoStmt) execSelect(t *table, cols []*col, ctx *execCtx) (_ Recordset, err error) {
   905  	//TODO missing rs column number eq check
   906  	r, err := s.sel.plan(ctx)
   907  	if err != nil {
   908  		return nil, err
   909  	}
   910  
   911  	h := t.head
   912  	data0 := make([]interface{}, len(t.cols0)+2)
   913  	cc := ctx.db.cc
   914  	m := map[interface{}]interface{}{}
   915  	if err = r.do(ctx, func(_ interface{}, data []interface{}) (more bool, err error) {
   916  		for i, d := range data {
   917  			data0[cols[i].index+2] = d
   918  		}
   919  		if err = typeCheck(data0[2:], cols); err != nil {
   920  			return
   921  		}
   922  
   923  		if err = t.checkConstraintsAndDefaults(ctx, data0[2:], m); err != nil {
   924  			return false, err
   925  		}
   926  
   927  		if s.ifNotExists {
   928  			id := int64(-1)
   929  			data0[1] = id
   930  			for i, v := range t.indices {
   931  				if v == nil {
   932  					continue
   933  				}
   934  
   935  				ok, err := v.x.Exists([]interface{}{data0[i+1]})
   936  				if err != nil {
   937  					return false, err
   938  				}
   939  
   940  				if ok {
   941  					return true, nil
   942  				}
   943  			}
   944  			for _, ix := range t.indices2 {
   945  				vlist, err := ix.eval(ctx, t.cols, id, data0[2:])
   946  				if err != nil {
   947  					return false, err
   948  				}
   949  
   950  				ok, err := ix.x.Exists(vlist)
   951  				if err != nil {
   952  					return false, err
   953  				}
   954  
   955  				if ok {
   956  					return true, nil
   957  				}
   958  			}
   959  		}
   960  
   961  		id, err := t.store.ID()
   962  		if err != nil {
   963  			return false, err
   964  		}
   965  
   966  		data0[0] = h
   967  		data0[1] = id
   968  
   969  		// Any overflow chunks are written here.
   970  		if h, err = t.store.Create(data0...); err != nil {
   971  			return false, err
   972  		}
   973  
   974  		for i, v := range t.indices {
   975  			if v == nil {
   976  				continue
   977  			}
   978  
   979  			// Any overflow chunks are shared with the BTree key
   980  			if err = v.x.Create([]interface{}{data0[i+1]}, h); err != nil {
   981  				return false, err
   982  			}
   983  		}
   984  		for _, ix := range t.indices2 {
   985  			vlist, err := ix.eval(ctx, t.cols, id, data0[2:])
   986  			if err != nil {
   987  				return false, err
   988  			}
   989  
   990  			if err := ix.x.Create(vlist, h); err != nil {
   991  				return false, err
   992  			}
   993  		}
   994  
   995  		cc.RowsAffected++
   996  		ctx.db.root.lastInsertID = id
   997  		return true, nil
   998  	}); err != nil {
   999  		return nil, err
  1000  	}
  1001  
  1002  	t.head = h
  1003  	return nil, t.store.Update(t.hhead, h)
  1004  }
  1005  
  1006  func (s *insertIntoStmt) exec(ctx *execCtx) (_ Recordset, err error) {
  1007  	root := ctx.db.root
  1008  	t, ok := root.tables[s.tableName]
  1009  	if !ok {
  1010  		return nil, fmt.Errorf("INSERT INTO %s: table does not exist", s.tableName)
  1011  	}
  1012  
  1013  	var cols []*col
  1014  	switch len(s.colNames) {
  1015  	case 0:
  1016  		cols = t.cols
  1017  	default:
  1018  		for _, colName := range s.colNames {
  1019  			if col := findCol(t.cols, colName); col != nil {
  1020  				cols = append(cols, col)
  1021  				continue
  1022  			}
  1023  
  1024  			return nil, fmt.Errorf("INSERT INTO %s: unknown column %s", s.tableName, colName)
  1025  		}
  1026  	}
  1027  
  1028  	if s.sel != nil {
  1029  		return s.execSelect(t, cols, ctx)
  1030  	}
  1031  
  1032  	for _, list := range s.lists {
  1033  		if g, e := len(list), len(cols); g != e {
  1034  			return nil, fmt.Errorf("INSERT INTO %s: expected %d value(s), have %d", s.tableName, e, g)
  1035  		}
  1036  	}
  1037  
  1038  	cc := ctx.db.cc
  1039  	r := make([]interface{}, len(t.cols0))
  1040  	m := map[interface{}]interface{}{}
  1041  	for _, list := range s.lists {
  1042  		for i, expr := range list {
  1043  			val, err := expr.eval(ctx, m)
  1044  			if err != nil {
  1045  				return nil, err
  1046  			}
  1047  
  1048  			r[cols[i].index] = val
  1049  		}
  1050  		if err = typeCheck(r, cols); err != nil {
  1051  			return nil, err
  1052  		}
  1053  
  1054  		if err = t.checkConstraintsAndDefaults(ctx, r, m); err != nil {
  1055  			return nil, err
  1056  		}
  1057  
  1058  		id, err := t.addRecord(ctx, r, s.ifNotExists)
  1059  		if err != nil {
  1060  			return nil, err
  1061  		}
  1062  
  1063  		if id < 0 {
  1064  			continue
  1065  		}
  1066  
  1067  		cc.RowsAffected++
  1068  		root.lastInsertID = id
  1069  	}
  1070  	return nil, nil
  1071  }
  1072  
  1073  func (s *insertIntoStmt) isUpdating() bool { return true }
  1074  
  1075  type beginTransactionStmt struct{}
  1076  
  1077  func (s beginTransactionStmt) explain(ctx *execCtx, w strutil.Formatter) {
  1078  	w.Format("%s\n", s)
  1079  }
  1080  
  1081  func (beginTransactionStmt) String() string { return "BEGIN TRANSACTION;" }
  1082  func (beginTransactionStmt) exec(*execCtx) (Recordset, error) {
  1083  	panic("internal error 059")
  1084  }
  1085  func (beginTransactionStmt) isUpdating() bool {
  1086  	panic("internal error 060")
  1087  }
  1088  
  1089  type commitStmt struct{}
  1090  
  1091  func (s commitStmt) explain(ctx *execCtx, w strutil.Formatter) {
  1092  	w.Format("%s\n", s)
  1093  }
  1094  
  1095  func (commitStmt) String() string { return "COMMIT;" }
  1096  func (commitStmt) exec(*execCtx) (Recordset, error) {
  1097  	panic("internal error 061")
  1098  }
  1099  func (commitStmt) isUpdating() bool {
  1100  	panic("internal error 062")
  1101  }
  1102  
  1103  type rollbackStmt struct{}
  1104  
  1105  func (s rollbackStmt) explain(ctx *execCtx, w strutil.Formatter) {
  1106  	w.Format("%s\n", s)
  1107  }
  1108  
  1109  func (rollbackStmt) String() string { return "ROLLBACK;" }
  1110  func (rollbackStmt) exec(*execCtx) (Recordset, error) {
  1111  	panic("internal error 063")
  1112  }
  1113  func (rollbackStmt) isUpdating() bool {
  1114  	panic("internal error 064")
  1115  }
  1116  
  1117  type createIndexStmt struct {
  1118  	colName     string // alt. "id()" for simple index on id()
  1119  	ifNotExists bool
  1120  	indexName   string
  1121  	tableName   string
  1122  	unique      bool
  1123  	exprList    []expression
  1124  }
  1125  
  1126  func (s *createIndexStmt) explain(ctx *execCtx, w strutil.Formatter) {
  1127  	w.Format("%s\n", s)
  1128  }
  1129  
  1130  func (s *createIndexStmt) isSimpleIndex() bool { return s.colName != "" }
  1131  
  1132  func (s *createIndexStmt) String() string {
  1133  	u := ""
  1134  	if s.unique {
  1135  		u = "UNIQUE "
  1136  	}
  1137  	e := ""
  1138  	if s.ifNotExists {
  1139  		e = "IF NOT EXISTS "
  1140  	}
  1141  	expr := s.colName
  1142  	if !s.isSimpleIndex() {
  1143  		var a []string
  1144  		for _, v := range s.exprList {
  1145  			a = append(a, v.String())
  1146  		}
  1147  		expr = strings.Join(a, ", ")
  1148  	}
  1149  	return fmt.Sprintf("CREATE %sINDEX %s%s ON %s (%s);", u, e, s.indexName, s.tableName, expr)
  1150  }
  1151  
  1152  func (s *createIndexStmt) exec(ctx *execCtx) (Recordset, error) {
  1153  	root := ctx.db.root
  1154  	if t, i := root.findIndexByName(s.indexName); i != nil {
  1155  		if s.ifNotExists {
  1156  			return nil, nil
  1157  		}
  1158  
  1159  		return nil, fmt.Errorf("CREATE INDEX: table %s already has an index named %s", t.name, s.indexName)
  1160  	}
  1161  
  1162  	if root.tables[s.indexName] != nil {
  1163  		return nil, fmt.Errorf("CREATE INDEX: index name collision with existing table: %s", s.indexName)
  1164  	}
  1165  
  1166  	t, ok := root.tables[s.tableName]
  1167  	if !ok {
  1168  		return nil, fmt.Errorf("CREATE INDEX: table does not exist %s", s.tableName)
  1169  	}
  1170  
  1171  	if findCol(t.cols, s.indexName) != nil {
  1172  		return nil, fmt.Errorf("CREATE INDEX: index name collision with existing column: %s", s.indexName)
  1173  	}
  1174  
  1175  	var h int64
  1176  	var err error
  1177  	switch {
  1178  	case s.isSimpleIndex():
  1179  		colIndex := -1
  1180  		if s.colName != "id()" {
  1181  			c := findCol(t.cols, s.colName)
  1182  			if c == nil {
  1183  				return nil, fmt.Errorf("CREATE INDEX: column does not exist: %s", s.colName)
  1184  			}
  1185  
  1186  			colIndex = c.index
  1187  		}
  1188  
  1189  		if h, err = t.addIndex(s.unique, s.indexName, colIndex); err != nil {
  1190  			return nil, fmt.Errorf("CREATE INDEX: %v", err)
  1191  		}
  1192  
  1193  		if err = t.updated(); err != nil {
  1194  			return nil, err
  1195  		}
  1196  	default:
  1197  		for _, e := range s.exprList {
  1198  			m := mentionedColumns(e)
  1199  			for colName := range m {
  1200  				c := findCol(t.cols, colName)
  1201  				if c == nil {
  1202  					return nil, fmt.Errorf("CREATE INDEX: column does not exist: %s", colName)
  1203  				}
  1204  			}
  1205  		}
  1206  		if h, err = t.addIndex2(ctx, s.unique, s.indexName, s.exprList); err != nil {
  1207  			return nil, fmt.Errorf("CREATE INDEX: %v", err)
  1208  		}
  1209  	}
  1210  
  1211  	switch ctx.db.hasIndex2 {
  1212  	case 0:
  1213  		if err := ctx.db.createIndex2(); err != nil {
  1214  			return nil, err
  1215  		}
  1216  
  1217  		if s.isSimpleIndex() {
  1218  			return nil, nil
  1219  		}
  1220  	case 1:
  1221  		return nil, nil
  1222  	case 2:
  1223  		if s.isSimpleIndex() {
  1224  			return nil, ctx.db.insertIndex2(s.tableName, s.indexName, []string{s.colName}, s.unique, true, h)
  1225  		}
  1226  	default:
  1227  		panic("internal error 011")
  1228  	}
  1229  
  1230  	exprList := make([]string, 0, len(s.exprList))
  1231  	for _, e := range s.exprList {
  1232  		exprList = append(exprList, e.String())
  1233  	}
  1234  	return nil, ctx.db.insertIndex2(s.tableName, s.indexName, exprList, s.unique, false, h)
  1235  }
  1236  
  1237  func (s *createIndexStmt) isUpdating() bool { return true }
  1238  
  1239  type createTableStmt struct {
  1240  	ifNotExists bool
  1241  	tableName   string
  1242  	cols        []*col
  1243  }
  1244  
  1245  func (s *createTableStmt) explain(ctx *execCtx, w strutil.Formatter) {
  1246  	w.Format("%s\n", s)
  1247  }
  1248  
  1249  func (s *createTableStmt) String() string {
  1250  	a := make([]string, len(s.cols))
  1251  	for i, v := range s.cols {
  1252  		var c, d string
  1253  		if x := v.constraint; x != nil {
  1254  			switch e := x.expr; {
  1255  			case e != nil:
  1256  				c = " " + e.String()
  1257  			default:
  1258  				c = " NOT NULL"
  1259  			}
  1260  		}
  1261  		if x := v.dflt; x != nil {
  1262  			d = " DEFAULT " + x.String()
  1263  		}
  1264  		a[i] = fmt.Sprintf("%s %s%s%s", v.name, typeStr(v.typ), c, d)
  1265  	}
  1266  	e := ""
  1267  	if s.ifNotExists {
  1268  		e = "IF NOT EXISTS "
  1269  	}
  1270  	return fmt.Sprintf("CREATE TABLE %s%s (%s);", e, s.tableName, strings.Join(a, ", "))
  1271  }
  1272  
  1273  func (s *createTableStmt) exec(ctx *execCtx) (_ Recordset, err error) {
  1274  	var cols []*col
  1275  	for _, v := range s.cols {
  1276  		cols = append(cols, v.clone())
  1277  	}
  1278  	root := ctx.db.root
  1279  	if _, ok := root.tables[s.tableName]; ok {
  1280  		if s.ifNotExists {
  1281  			return nil, nil
  1282  		}
  1283  
  1284  		return nil, fmt.Errorf("CREATE TABLE: table exists %s", s.tableName)
  1285  	}
  1286  
  1287  	if t, x := root.findIndexByName(s.tableName); x != nil {
  1288  		return nil, fmt.Errorf("CREATE TABLE: table %s has index %s", t.name, s.tableName)
  1289  	}
  1290  
  1291  	m := map[string]bool{}
  1292  	mustCreateColumn2 := true
  1293  	for i, c := range cols {
  1294  		nm := c.name
  1295  		if m[nm] {
  1296  			return nil, fmt.Errorf("CREATE TABLE: duplicate column %s", nm)
  1297  		}
  1298  
  1299  		m[nm] = true
  1300  		c.index = i
  1301  		if c.constraint != nil || c.dflt != nil {
  1302  			if mustCreateColumn2 {
  1303  				for _, stmt := range createColumn2.l {
  1304  					_, err := stmt.exec(newExecCtx(ctx.db, nil))
  1305  					if err != nil {
  1306  						return nil, err
  1307  					}
  1308  				}
  1309  			}
  1310  
  1311  			mustCreateColumn2 = false
  1312  			notNull := c.constraint != nil && c.constraint.expr == nil
  1313  			var co, d string
  1314  			if c.constraint != nil && c.constraint.expr != nil {
  1315  				co = c.constraint.expr.String()
  1316  			}
  1317  			if e := c.dflt; e != nil {
  1318  				d = e.String()
  1319  			}
  1320  			if _, err := insertColumn2.l[0].exec(newExecCtx(ctx.db, []interface{}{s.tableName, c.name, notNull, co, d})); err != nil {
  1321  				return nil, err
  1322  			}
  1323  		}
  1324  	}
  1325  	t, err := root.createTable(s.tableName, cols)
  1326  	if err != nil {
  1327  		return nil, err
  1328  	}
  1329  
  1330  	return nil, t.constraintsAndDefaults(ctx)
  1331  }
  1332  
  1333  func (s *createTableStmt) isUpdating() bool { return true }