1/*****************************************************************************
2
3Copyright (c) 1998, 2013, Oracle and/or its affiliates. All Rights Reserved.
4
5This program is free software; you can redistribute it and/or modify it under
6the terms of the GNU General Public License as published by the Free Software
7Foundation; version 2 of the License.
8
9This program is distributed in the hope that it will be useful, but WITHOUT
10ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12
13You should have received a copy of the GNU General Public License along with
14this program; if not, write to the Free Software Foundation, Inc.,
1551 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
16
17*****************************************************************************/
18
19/**************************************************//**
20@file include/eval0proc.ic
21Executes SQL stored procedures and their control structures
22
23Created 1/20/1998 Heikki Tuuri
24*******************************************************/
25
26#include "pars0pars.h"
27#include "que0que.h"
28#include "eval0eval.h"
29
30/**********************************************************************//**
31Performs an execution step of a procedure node.
32@return query thread to run next or NULL */
33UNIV_INLINE
34que_thr_t*
35proc_step(
36/*======*/
37 que_thr_t* thr) /*!< in: query thread */
38{
39 proc_node_t* node;
40
41 ut_ad(thr);
42
43 node = static_cast<proc_node_t*>(thr->run_node);
44 ut_ad(que_node_get_type(node) == QUE_NODE_PROC);
45
46 if (thr->prev_node == que_node_get_parent(node)) {
47 /* Start execution from the first statement in the statement
48 list */
49
50 thr->run_node = node->stat_list;
51 } else {
52 /* Move to the next statement */
53 ut_ad(que_node_get_next(thr->prev_node) == NULL);
54
55 thr->run_node = NULL;
56 }
57
58 if (thr->run_node == NULL) {
59 thr->run_node = que_node_get_parent(node);
60 }
61
62 return(thr);
63}
64
65/**********************************************************************//**
66Performs an execution step of a procedure call node.
67@return query thread to run next or NULL */
68UNIV_INLINE
69que_thr_t*
70proc_eval_step(
71/*===========*/
72 que_thr_t* thr) /*!< in: query thread */
73{
74 func_node_t* node;
75
76 ut_ad(thr);
77
78 node = static_cast<func_node_t*>(thr->run_node);
79 ut_ad(que_node_get_type(node) == QUE_NODE_FUNC);
80
81 /* Evaluate the procedure */
82
83 eval_exp(node);
84
85 thr->run_node = que_node_get_parent(node);
86
87 return(thr);
88}
89