CUBRID Engine  latest
lock_table.c
Go to the documentation of this file.
1 /*
2  * Copyright 2008 Search Solution Corporation
3  * Copyright 2016 CUBRID Corporation
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 /*
20  * lock_table.c - lock managment module. (client + server)
21  * Definition of lock matrix tables
22  */
23 
24 #ident "$Id$"
25 
26 #include "config.h"
27 
28 #include "storage_common.h"
29 
30 /*
31  *
32  * LOCK COMPATIBILITY TABLE
33  *
34  * column : current lock mode (granted lock mode)
35  * row : request lock mode
36  * ----------------------------------------------------------------------------------------------------------
37  * | N/A NON2PL NULL SCH-S IS S IX BU SIX U X SCH-M
38  * ----------------------------------------------------------------------------------------------------------
39  * N/A | N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A
40  *
41  * NON2PL | N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A
42  *
43  * NULL | N/A N/A True True True True True True True True True True
44  *
45  * SCH-S | N/A N/A True True True True True True True N/A True False
46  *
47  * IS | N/A N/A True True True True True False True N/A False False
48  *
49  * S | N/A N/A True True True True False False False False False False
50  *
51  * IX | N/A N/A True True True False True False False N/A False False
52  *
53  * BU | N/A N/A True True False False False True False N/A False False
54  *
55  * SIX | N/A N/A True True True False False False False N/A False False
56  *
57  * U | N/A N/A True N/A N/A True N/A N/A N/A False False N/A
58  *
59  * X | N/A N/A True True False False False False False False False False
60  *
61  * SCH-M | N/A N/A True False False False False False False N/A False False
62  * ----------------------------------------------------------------------------------------------------------
63  * N/A : not applicable
64  */
65 
66 /* *INDENT-OFF* */
68  /* N/A */
69  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_UNKNOWN,
70  /* SCH-S */ LOCK_COMPAT_UNKNOWN, /* IS */ LOCK_COMPAT_UNKNOWN, /* S */ LOCK_COMPAT_UNKNOWN,
71  /* IX */ LOCK_COMPAT_UNKNOWN, /* BU */ LOCK_COMPAT_UNKNOWN, /* SIX */ LOCK_COMPAT_UNKNOWN,
72  /* U */ LOCK_COMPAT_UNKNOWN, /* X */ LOCK_COMPAT_UNKNOWN, /* SCH-M */ LOCK_COMPAT_UNKNOWN},
73 
74  /* NON2PL */
75  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_UNKNOWN,
76  /* SCH-S */ LOCK_COMPAT_UNKNOWN, /* IS */ LOCK_COMPAT_UNKNOWN, /* S */ LOCK_COMPAT_UNKNOWN,
77  /* IX */ LOCK_COMPAT_UNKNOWN, /* BU */ LOCK_COMPAT_UNKNOWN, /* SIX */ LOCK_COMPAT_UNKNOWN,
78  /* U */ LOCK_COMPAT_UNKNOWN, /* X */ LOCK_COMPAT_UNKNOWN, /* SCH-M */ LOCK_COMPAT_UNKNOWN},
79 
80  /* NULL */
81  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_YES,
82  /* SCH-S */ LOCK_COMPAT_YES, /* IS */ LOCK_COMPAT_YES, /* S */ LOCK_COMPAT_YES,
83  /* IX */ LOCK_COMPAT_YES, /* BU */ LOCK_COMPAT_YES, /* SIX */ LOCK_COMPAT_YES,
84  /* U */ LOCK_COMPAT_YES, /* X */ LOCK_COMPAT_YES, /* SCH-M */ LOCK_COMPAT_YES},
85 
86  /* SCH-S */
87  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_YES,
88  /* SCH-S */ LOCK_COMPAT_YES, /* IS */ LOCK_COMPAT_YES, /* S */ LOCK_COMPAT_YES,
89  /* IX */ LOCK_COMPAT_YES, /* BU */ LOCK_COMPAT_YES, /* SIX */ LOCK_COMPAT_YES,
90  /* U */ LOCK_COMPAT_UNKNOWN, /* X */ LOCK_COMPAT_YES, /* SCH-M */ LOCK_COMPAT_NO},
91 
92  /* IS */
93  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_YES,
94  /* SCH-S */ LOCK_COMPAT_YES, /* IS */ LOCK_COMPAT_YES, /* S */ LOCK_COMPAT_YES,
95  /* IX */ LOCK_COMPAT_YES, /* BU */ LOCK_COMPAT_NO, /* SIX */ LOCK_COMPAT_YES,
96  /* U */ LOCK_COMPAT_UNKNOWN, /* X */ LOCK_COMPAT_NO, /* SCH-M */ LOCK_COMPAT_NO},
97 
98  /* S */
99  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_YES,
100  /* SCH-S */ LOCK_COMPAT_YES, /* IS */ LOCK_COMPAT_YES, /* S */ LOCK_COMPAT_YES,
101  /* IX */ LOCK_COMPAT_NO, /* BU */ LOCK_COMPAT_NO, /* SIX */ LOCK_COMPAT_NO,
102  /* U */ LOCK_COMPAT_NO, /* X */ LOCK_COMPAT_NO, /* SCH-M */ LOCK_COMPAT_NO},
103 
104  /* IX */
105  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_YES,
106  /* SCH-S */ LOCK_COMPAT_YES, /* IS */ LOCK_COMPAT_YES, /* S */ LOCK_COMPAT_NO,
107  /* IX */ LOCK_COMPAT_YES, /* BU */ LOCK_COMPAT_NO, /* SIX */ LOCK_COMPAT_NO,
108  /* U */ LOCK_COMPAT_UNKNOWN, /* X */ LOCK_COMPAT_NO, /* SCH-M */ LOCK_COMPAT_NO},
109 
110  /* BU_LOCK */
111  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_YES,
112  /* SCH-S */ LOCK_COMPAT_YES, /* IS */ LOCK_COMPAT_NO, /* S */ LOCK_COMPAT_NO,
113  /* IX */ LOCK_COMPAT_NO, /* BU */ LOCK_COMPAT_YES, /* SIX */ LOCK_COMPAT_NO,
114  /* U */ LOCK_COMPAT_UNKNOWN, /* X */ LOCK_COMPAT_NO, /* SCH-M */ LOCK_COMPAT_NO},
115 
116  /* SIX */
117  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_YES,
118  /* SCH-S */ LOCK_COMPAT_YES, /* IS */ LOCK_COMPAT_YES, /* S */ LOCK_COMPAT_NO,
119  /* IX */ LOCK_COMPAT_NO, /* BU */ LOCK_COMPAT_NO, /* SIX */ LOCK_COMPAT_NO,
120  /* U */ LOCK_COMPAT_UNKNOWN, /* X */ LOCK_COMPAT_NO, /* SCH-M */ LOCK_COMPAT_NO},
121 
122  /* U */
123  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_YES,
124  /* SCH-S */ LOCK_COMPAT_UNKNOWN, /* IS */ LOCK_COMPAT_UNKNOWN, /* S */ LOCK_COMPAT_YES,
125  /* IX */ LOCK_COMPAT_UNKNOWN, /* BU */ LOCK_COMPAT_UNKNOWN, /* SIX */ LOCK_COMPAT_UNKNOWN,
126  /* U */ LOCK_COMPAT_NO, /* X */ LOCK_COMPAT_NO, /* SCH-M */ LOCK_COMPAT_UNKNOWN},
127 
128  /* X */
129  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_YES,
130  /* SCH-S */ LOCK_COMPAT_YES, /* IS */ LOCK_COMPAT_NO, /* S */ LOCK_COMPAT_NO,
131  /* IX */ LOCK_COMPAT_NO, /* BU */ LOCK_COMPAT_NO, /* SIX */ LOCK_COMPAT_NO,
132  /* U */ LOCK_COMPAT_NO, /* X */ LOCK_COMPAT_NO, /* SCH-M */ LOCK_COMPAT_NO},
133 
134  /* SCH-M */
135  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_YES,
136  /* SCH-S */ LOCK_COMPAT_NO, /* IS */ LOCK_COMPAT_NO, /* S */ LOCK_COMPAT_NO,
137  /* IX */ LOCK_COMPAT_NO, /* BU */ LOCK_COMPAT_NO, /* SIX */ LOCK_COMPAT_NO,
138  /* U */ LOCK_COMPAT_UNKNOWN, /* X */ LOCK_COMPAT_NO, /* SCH-M */ LOCK_COMPAT_NO}
139 };
140 /* *INDENT-ON* */
141 
142 /*
143  *
144  * LOCK CONVERSION TABLE
145  *
146  * column : current lock mode (granted lock mode)
147  * row : request lock mode
148  * -----------------------------------------------------------------------------------------------
149  * | N/A NON2PL NULL SCH-S IS S IX BU SIX U X SCH-M
150  * -----------------------------------------------------------------------------------------------
151  * N/A | N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A
152  *
153  * NON2PL | N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A N/A
154  *
155  * NULL | N/A N/A NULL SCH-S IS S IX BU SIX U X SCH-M
156  *
157  * SCH-S | N/A N/A SCH-S SCH-S IS S IX BU SIX N/A X SCH-M
158  *
159  * IS | N/A N/A IS IS IS S IX X SIX N/A X SCH-M
160  *
161  * S | N/A N/A S S S S SIX X SIX U X SCH-M
162  *
163  * IX | N/A N/A IX IX IX SIX IX X SIX N/A X SCH-M
164  *
165  * BU | N/A N/A BU BU BU X BU BU BU N/A X SCH-M
166  *
167  * SIX | N/A N/A SIX SIX SIX SIX SIX X SIX N/A X SCH-M
168  *
169  * U | N/A N/A U N/A N/A U N/A N/A N/A U X N/A
170  *
171  * X | N/A N/A X X X X X X X X X SCH-M
172  *
173  * SCH-M | N/A N/A SCH-M SCH-M SCH-M SCH-M SCH-M SCH-M SCH-M N/A SCH-M SCH-M
174  * -----------------------------------------------------------------------------------------------
175  * N/A : not applicable
176  */
177 
178 /* *INDENT-OFF* */
179 LOCK lock_Conv[12][12] = {
180  /* N/A */
181  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ NA_LOCK, /* SCH-S */ NA_LOCK,
182  /* IS */ NA_LOCK, /* S */ NA_LOCK, /* IX */ NA_LOCK, /* BU */ NA_LOCK, /* SIX */ NA_LOCK,
183  /* U */ NA_LOCK, /* X */ NA_LOCK, /* SCH-M */ NA_LOCK},
184 
185  /* NON2PL */
186  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ NA_LOCK, /* SCH-S */ NA_LOCK,
187  /* IS */ NA_LOCK, /* S */ NA_LOCK, /* IX */ NA_LOCK, /* BU */ NA_LOCK, /* SIX */ NA_LOCK,
188  /* U */ NA_LOCK, /* X */ NA_LOCK, /* SCH-M */ NA_LOCK},
189 
190  /* NULL */
191  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ NULL_LOCK, /* SCH-S */ SCH_S_LOCK,
192  /* IS */ IS_LOCK, /* S */ S_LOCK, /* IX */ IX_LOCK, /* BU */ BU_LOCK, /* SIX */ SIX_LOCK,
193  /* U */ U_LOCK, /* X */ X_LOCK, /* SCH-M */ SCH_M_LOCK},
194 
195  /* SCH-S */
196  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ SCH_S_LOCK, /* SCH-S */ SCH_S_LOCK,
197  /* IS */ IS_LOCK, /* S */ S_LOCK, /* IX */ IX_LOCK, /* BU */ BU_LOCK, /* SIX */ SIX_LOCK,
198  /* U */ NA_LOCK, /* X */ X_LOCK, /* SCH-M */ SCH_M_LOCK},
199 
200  /* IS */
201  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ IS_LOCK, /* SCH-S */ IS_LOCK,
202  /* IS */ IS_LOCK, /* S */ S_LOCK, /* IX */ IX_LOCK, /* BU */ X_LOCK, /* SIX */ SIX_LOCK,
203  /* U */ NA_LOCK, /* X */ X_LOCK, /* SCH-M */ SCH_M_LOCK},
204 
205  /* S */
206  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ S_LOCK, /* SCH-S */ S_LOCK,
207  /* IS */ S_LOCK, /* S */ S_LOCK, /* IX */ SIX_LOCK, /* BU */ X_LOCK, /* SIX */ SIX_LOCK,
208  /* U */ U_LOCK, /* X */ X_LOCK, /* SCH-M */ SCH_M_LOCK},
209 
210  /* IX */
211  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ IX_LOCK, /* SCH-S */ IX_LOCK,
212  /* IS */ IX_LOCK, /* S */ SIX_LOCK, /* IX */ IX_LOCK, /* BU */ X_LOCK, /* SIX */ SIX_LOCK,
213  /* U */ NA_LOCK, /* X */ X_LOCK, /* SCH-M */ SCH_M_LOCK},
214 
215  /* BU */
216  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ BU_LOCK, /* SCH-S */ BU_LOCK,
217  /* IS */ BU_LOCK, /* S */ X_LOCK, /* IX */ BU_LOCK, /* BU */ BU_LOCK, /* SIX */ BU_LOCK,
218  /* U */ NA_LOCK, /* X */ X_LOCK, /* SCH-M */ SCH_M_LOCK},
219 
220  /* SIX */
221  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ SIX_LOCK, /* SCH-S */ SIX_LOCK,
222  /* IS */ SIX_LOCK, /* S */ SIX_LOCK, /* IX */ SIX_LOCK, /* BU */ X_LOCK, /* SIX */ SIX_LOCK,
223  /* U */ NA_LOCK, /* X */ X_LOCK, /* SCH-M */ SCH_M_LOCK},
224 
225  /* U */
226  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ U_LOCK, /* SCH-S */ NA_LOCK,
227  /* IS */ NA_LOCK, /* S */ U_LOCK, /* IX */ NA_LOCK, /* BU */ NA_LOCK, /* SIX */ NA_LOCK,
228  /* U */ U_LOCK, /* X */ X_LOCK, /* SCH-M */ NA_LOCK},
229 
230  /* X */
231  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ X_LOCK, /* SCH-S */ X_LOCK,
232  /* IS */ X_LOCK, /* S */ X_LOCK, /* IX */ X_LOCK, /* BU */ X_LOCK, /* SIX */ X_LOCK,
233  /* U */ X_LOCK, /* X */ X_LOCK, /* SCH-M */ SCH_M_LOCK},
234 
235  /* SCH-M */
236  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ SCH_M_LOCK, /* SCH-S */ SCH_M_LOCK,
237  /* IS */ SCH_M_LOCK, /* S */ SCH_M_LOCK, /* IX */ SCH_M_LOCK, /* BU */ SCH_M_LOCK, /* SIX */ SCH_M_LOCK,
238  /* U */ NA_LOCK, /* X */ SCH_M_LOCK, /* SCH-M */ SCH_M_LOCK}
239 };
240 /* *INDENT-ON* */
LOCK_COMPATIBILITY lock_Comp[12][12]
Definition: lock_table.c:67
LOCK lock_Conv[12][12]
Definition: lock_table.c:179
LOCK
LOCK_COMPATIBILITY