// Execute the statement(s) in the given request and return a response. // On error, the returned integer is an HTTP error code. func (e *Executor) Execute(args driver.Request) (driver.Response, int, error) { planMaker := plannerPool.Get().(*planner) defer plannerPool.Put(planMaker) *planMaker = planner{ user: args.GetUser(), evalCtx: parser.EvalContext{ NodeID: e.nodeID, ReCache: e.reCache, // Copy existing GetLocation closure. See plannerPool.New() for the // initial setting. GetLocation: planMaker.evalCtx.GetLocation, }, leaseMgr: e.leaseMgr, systemConfig: e.getSystemConfig(), } // Pick up current session state. if err := proto.Unmarshal(args.Session, &planMaker.session); err != nil { return args.CreateReply(), http.StatusBadRequest, err } // Resume a pending transaction if present. if planMaker.session.Txn != nil { txn := client.NewTxn(e.db) txn.Proto = planMaker.session.Txn.Txn if planMaker.session.MutatesSystemDB { txn.SetSystemDBTrigger() } planMaker.setTxn(txn, planMaker.session.Txn.Timestamp.GoTime()) } // Send the Request for SQL execution and set the application-level error // for each result in the reply. planMaker.params = parameters(args.Params) reply := e.execStmts(args.Sql, planMaker) // Send back the session state even if there were application-level errors. // Add transaction to session state. if planMaker.txn != nil { // TODO(pmattis): Need to record the leases used by a transaction within // the transaction state and restore it when the transaction is restored. planMaker.releaseLeases(e.db) planMaker.session.Txn = &Session_Transaction{Txn: planMaker.txn.Proto, Timestamp: driver.Timestamp(planMaker.evalCtx.TxnTimestamp.Time)} planMaker.session.MutatesSystemDB = planMaker.txn.SystemDBTrigger() } else { planMaker.session.Txn = nil planMaker.session.MutatesSystemDB = false } bytes, err := proto.Marshal(&planMaker.session) if err != nil { return args.CreateReply(), http.StatusInternalServerError, err } reply.Session = bytes return reply, 0, nil }
// Execute the statement(s) in the given request and return a response. // On error, the returned integer is an HTTP error code. func (e *Executor) Execute(args driver.Request) (driver.Response, int, error) { planMaker := &planner{ user: args.GetUser(), evalCtx: parser.EvalContext{ NodeID: e.nodeID, ReCache: e.reCache, }, leaseMgr: e.leaseMgr, systemConfig: e.getSystemConfig(), } // Pick up current session state. if err := proto.Unmarshal(args.Session, &planMaker.session); err != nil { return args.CreateReply(), http.StatusBadRequest, err } // Resume a pending transaction if present. if planMaker.session.Txn != nil { txn := client.NewTxn(e.db) txn.Proto = planMaker.session.Txn.Txn if planMaker.session.MutatesSystemDB { txn.SetSystemDBTrigger() } planMaker.setTxn(txn, planMaker.session.Txn.Timestamp.GoTime()) } planMaker.evalCtx.GetLocation = planMaker.session.getLocation // Send the Request for SQL execution and set the application-level error // for each result in the reply. reply := e.execStmts(args.Sql, parameters(args.Params), planMaker) // Send back the session state even if there were application-level errors. // Add transaction to session state. if planMaker.txn != nil { planMaker.session.Txn = &Session_Transaction{Txn: planMaker.txn.Proto, Timestamp: driver.Timestamp(planMaker.evalCtx.TxnTimestamp.Time)} planMaker.session.MutatesSystemDB = planMaker.txn.SystemDBTrigger() } else { planMaker.session.Txn = nil planMaker.session.MutatesSystemDB = false } bytes, err := proto.Marshal(&planMaker.session) if err != nil { return args.CreateReply(), http.StatusInternalServerError, err } reply.Session = bytes return reply, 0, nil }
// Execute the statement(s) in the given request and return a response. // On error, the returned integer is an HTTP error code. func (e Executor) Execute(args driver.Request) (driver.Response, int, error) { planMaker := planner{ user: args.GetUser(), evalCtx: parser.EvalContext{ NodeID: e.nodeID, }, } // Pick up current session state. if err := gogoproto.Unmarshal(args.Session, &planMaker.session); err != nil { return args.CreateReply(), http.StatusBadRequest, err } // Open a pending transaction if needed. if planMaker.session.Txn != nil { txn := client.NewTxn(e.db) txn.Proto = *planMaker.session.Txn if planMaker.session.MutatesSystemDB { txn.SetSystemDBTrigger() } planMaker.txn = txn } // Send the Request for SQL execution and set the application-level error // for each result in the reply. reply := e.execStmts(args.Sql, parameters(args.Params), &planMaker) // Send back the session state even if there were application-level errors. // Add transaction to session state. if planMaker.txn != nil { planMaker.session.Txn = &planMaker.txn.Proto planMaker.session.MutatesSystemDB = planMaker.txn.SystemDBTrigger() } else { planMaker.session.Txn = nil planMaker.session.MutatesSystemDB = false } bytes, err := gogoproto.Marshal(&planMaker.session) if err != nil { return args.CreateReply(), http.StatusInternalServerError, err } reply.Session = bytes return reply, 0, nil }