Skip to content

File lock_table.c

File List > cubrid > src > transaction > lock_table.c

Go to the documentation of this file

/*
 * Copyright 2008 Search Solution Corporation
 * Copyright 2016 CUBRID Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */

/*
 * lock_table.c - lock managment module. (client + server)
 *          Definition of lock matrix tables
 */

#ident "$Id$"

#include "lock_table.h"
// XXX: SHOULD BE THE LAST INCLUDE HEADER
#include "memory_wrapper.hpp"

/*
 *
 *                       LOCK COMPATIBILITY TABLE
 *
 * column : current lock mode (granted lock mode)
 * row    : request lock mode
 * ----------------------------------------------------------------------------------------------------------
 *         |   N/A  NON2PL  NULL  SCH-S     IS       S      IX      BU    SIX       U       X   SCH-M
 * ----------------------------------------------------------------------------------------------------------
 *    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
 *
 * 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
 *
 *   NULL  |   N/A    N/A   True   True   True    True    True    True   True    True    True    True
 *
 *  SCH-S  |   N/A    N/A   True   True   True    True    True    True   True     N/A    True   False
 *
 *     IS  |   N/A    N/A   True   True   True    True    True   False   True     N/A   False   False
 *
 *      S  |   N/A    N/A   True   True   True    True   False   False  False   False   False   False
 *
 *     IX  |   N/A    N/A   True   True   True   False    True   False  False     N/A   False   False
 *
 *     BU  |   N/A    N/A   True   True  False   False   False    True  False     N/A   False   False
 *
 *    SIX  |   N/A    N/A   True   True   True   False   False   False  False     N/A   False   False
 *
 *      U  |   N/A    N/A   True    N/A    N/A    True     N/A     N/A    N/A   False   False     N/A
 *
 *      X  |   N/A    N/A   True   True  False   False   False   False  False   False   False   False
 *
 *  SCH-M  |   N/A    N/A   True  False  False   False   False   False  False     N/A   False   False
 * ----------------------------------------------------------------------------------------------------------
 * N/A : not applicable
 */

/* *INDENT-OFF* */
const LOCK_COMPATIBILITY lock_Comp[LOCK_COUNT][LOCK_COUNT] = {
  /* N/A */
  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_UNKNOWN,
    /* SCH-S */ LOCK_COMPAT_UNKNOWN, /* IS */ LOCK_COMPAT_UNKNOWN, /* S */ LOCK_COMPAT_UNKNOWN,
    /* IX */ LOCK_COMPAT_UNKNOWN, /* BU */ LOCK_COMPAT_UNKNOWN, /* SIX */ LOCK_COMPAT_UNKNOWN,
    /* U */ LOCK_COMPAT_UNKNOWN, /* X */ LOCK_COMPAT_UNKNOWN, /* SCH-M */ LOCK_COMPAT_UNKNOWN},

  /* NON2PL */
  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_UNKNOWN,
    /* SCH-S */ LOCK_COMPAT_UNKNOWN, /* IS */ LOCK_COMPAT_UNKNOWN, /* S */ LOCK_COMPAT_UNKNOWN,
    /* IX */ LOCK_COMPAT_UNKNOWN, /* BU */ LOCK_COMPAT_UNKNOWN, /* SIX */ LOCK_COMPAT_UNKNOWN,
    /* U */ LOCK_COMPAT_UNKNOWN, /* X */ LOCK_COMPAT_UNKNOWN, /* SCH-M */ LOCK_COMPAT_UNKNOWN},

  /* NULL */
  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_YES,
    /* SCH-S */ LOCK_COMPAT_YES, /* IS */ LOCK_COMPAT_YES, /* S */ LOCK_COMPAT_YES,
    /* IX */ LOCK_COMPAT_YES, /* BU */ LOCK_COMPAT_YES, /* SIX */ LOCK_COMPAT_YES,
    /* U */ LOCK_COMPAT_YES, /* X */ LOCK_COMPAT_YES, /* SCH-M */ LOCK_COMPAT_YES},

  /* SCH-S */
  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_YES,
    /* SCH-S */ LOCK_COMPAT_YES, /* IS */ LOCK_COMPAT_YES, /* S */ LOCK_COMPAT_YES,
    /* IX */ LOCK_COMPAT_YES, /* BU */ LOCK_COMPAT_YES, /* SIX */ LOCK_COMPAT_YES,
    /* U */ LOCK_COMPAT_UNKNOWN, /* X */ LOCK_COMPAT_YES, /* SCH-M */ LOCK_COMPAT_NO},

  /* IS */
  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_YES,
    /* SCH-S */ LOCK_COMPAT_YES, /* IS */ LOCK_COMPAT_YES, /* S */ LOCK_COMPAT_YES,
    /* IX */ LOCK_COMPAT_YES, /* BU */ LOCK_COMPAT_NO, /* SIX */ LOCK_COMPAT_YES,
    /* U */ LOCK_COMPAT_UNKNOWN, /* X */ LOCK_COMPAT_NO, /* SCH-M */ LOCK_COMPAT_NO},

  /* S */
  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_YES,
    /* SCH-S */ LOCK_COMPAT_YES, /* IS */ LOCK_COMPAT_YES, /* S */ LOCK_COMPAT_YES,
    /* IX */ LOCK_COMPAT_NO, /* BU */ LOCK_COMPAT_NO, /* SIX */ LOCK_COMPAT_NO,
    /* U */ LOCK_COMPAT_NO, /* X */ LOCK_COMPAT_NO, /* SCH-M */ LOCK_COMPAT_NO},

  /* IX */
  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_YES,
    /* SCH-S */ LOCK_COMPAT_YES, /* IS */ LOCK_COMPAT_YES, /* S */ LOCK_COMPAT_NO,
    /* IX */ LOCK_COMPAT_YES, /* BU */ LOCK_COMPAT_NO, /* SIX */ LOCK_COMPAT_NO,
    /* U */ LOCK_COMPAT_UNKNOWN, /* X */ LOCK_COMPAT_NO, /* SCH-M */ LOCK_COMPAT_NO},

  /* BU_LOCK */
  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_YES,
    /* SCH-S */ LOCK_COMPAT_YES, /* IS */ LOCK_COMPAT_NO, /* S */ LOCK_COMPAT_NO,
    /* IX */ LOCK_COMPAT_NO, /* BU */ LOCK_COMPAT_YES, /* SIX */ LOCK_COMPAT_NO,
    /* U */ LOCK_COMPAT_UNKNOWN, /* X */ LOCK_COMPAT_NO, /* SCH-M */ LOCK_COMPAT_NO},

  /* SIX */
  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_YES,
    /* SCH-S */ LOCK_COMPAT_YES, /* IS */ LOCK_COMPAT_YES, /* S */ LOCK_COMPAT_NO,
    /* IX */ LOCK_COMPAT_NO, /* BU */ LOCK_COMPAT_NO, /* SIX */ LOCK_COMPAT_NO,
    /* U */ LOCK_COMPAT_UNKNOWN, /* X */ LOCK_COMPAT_NO, /* SCH-M */ LOCK_COMPAT_NO},

  /* U */
  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_YES,
    /* SCH-S */ LOCK_COMPAT_UNKNOWN, /* IS */ LOCK_COMPAT_UNKNOWN, /* S */ LOCK_COMPAT_YES,
    /* IX */ LOCK_COMPAT_UNKNOWN, /* BU */ LOCK_COMPAT_UNKNOWN, /* SIX */ LOCK_COMPAT_UNKNOWN,
    /* U */ LOCK_COMPAT_NO, /* X */ LOCK_COMPAT_NO, /* SCH-M */ LOCK_COMPAT_UNKNOWN},

  /* X */
  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_YES,
    /* SCH-S */ LOCK_COMPAT_YES, /* IS */ LOCK_COMPAT_NO, /* S */ LOCK_COMPAT_NO,
    /* IX */ LOCK_COMPAT_NO, /* BU */ LOCK_COMPAT_NO, /* SIX */ LOCK_COMPAT_NO,
    /* U */ LOCK_COMPAT_NO, /* X */ LOCK_COMPAT_NO, /* SCH-M */ LOCK_COMPAT_NO},

  /* SCH-M */
  { /* N/A */ LOCK_COMPAT_UNKNOWN, /* NON2PL */ LOCK_COMPAT_UNKNOWN, /* NULL */ LOCK_COMPAT_YES,
    /* SCH-S */ LOCK_COMPAT_NO, /* IS */ LOCK_COMPAT_NO, /* S */ LOCK_COMPAT_NO,
    /* IX */ LOCK_COMPAT_NO, /* BU */ LOCK_COMPAT_NO, /* SIX */ LOCK_COMPAT_NO,
    /* U */ LOCK_COMPAT_UNKNOWN, /* X */ LOCK_COMPAT_NO, /* SCH-M */ LOCK_COMPAT_NO}
};
/* *INDENT-ON* */

/*
 *
 *                         LOCK CONVERSION TABLE
 *
 * column : current lock mode (granted lock mode)
 * row    : request lock mode
 * -----------------------------------------------------------------------------------------------
 *         | N/A  NON2PL   NULL  SCH-S     IS      S     IX     BU   SIX      U      X  SCH-M
 * -----------------------------------------------------------------------------------------------
 *     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
 *
 *  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
 *
 *    NULL | N/A     N/A   NULL  SCH-S     IS      S     IX     BU   SIX      U      X  SCH-M
 *
 *   SCH-S | N/A     N/A  SCH-S  SCH-S     IS      S     IX     BU   SIX    N/A      X  SCH-M
 *
 *      IS | N/A     N/A     IS     IS     IS      S     IX      X   SIX    N/A      X  SCH-M
 *
 *       S | N/A     N/A      S      S      S      S    SIX      X   SIX      U      X  SCH-M
 *
 *      IX | N/A     N/A     IX     IX     IX    SIX     IX      X   SIX    N/A      X  SCH-M
 *
 *      BU | N/A     N/A     BU     BU     BU      X     BU     BU    BU    N/A      X  SCH-M
 *
 *     SIX | N/A     N/A    SIX    SIX    SIX    SIX    SIX      X   SIX    N/A      X  SCH-M
 *
 *       U | N/A     N/A      U    N/A    N/A      U    N/A    N/A   N/A      U      X    N/A
 *
 *       X | N/A     N/A      X      X      X      X      X      X     X      X      X  SCH-M
 *
 *   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
 * -----------------------------------------------------------------------------------------------
 * N/A : not applicable
 */

/* *INDENT-OFF* */
const LOCK lock_Conv[LOCK_COUNT][LOCK_COUNT] = {
  /* N/A */
  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ NA_LOCK, /* SCH-S */ NA_LOCK,
    /* IS */ NA_LOCK, /* S */ NA_LOCK, /* IX */ NA_LOCK, /* BU */ NA_LOCK, /* SIX */ NA_LOCK,
    /* U */ NA_LOCK, /* X */ NA_LOCK, /* SCH-M */ NA_LOCK},

  /* NON2PL */
  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ NA_LOCK, /* SCH-S */ NA_LOCK,
    /* IS */ NA_LOCK, /* S */ NA_LOCK, /* IX */ NA_LOCK, /* BU */ NA_LOCK, /* SIX */ NA_LOCK,
    /* U */ NA_LOCK, /* X */ NA_LOCK, /* SCH-M */ NA_LOCK},

  /* NULL */
  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ NULL_LOCK, /* SCH-S */ SCH_S_LOCK,
    /* IS */ IS_LOCK, /* S */ S_LOCK, /* IX */ IX_LOCK, /* BU */ BU_LOCK, /* SIX */ SIX_LOCK,
    /* U */ U_LOCK, /* X */ X_LOCK, /* SCH-M */ SCH_M_LOCK},

  /* SCH-S */
  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ SCH_S_LOCK, /* SCH-S */ SCH_S_LOCK,
    /* IS */ IS_LOCK, /* S */ S_LOCK, /* IX */ IX_LOCK, /* BU */ BU_LOCK, /* SIX */ SIX_LOCK,
    /* U */ NA_LOCK, /* X */ X_LOCK, /* SCH-M */ SCH_M_LOCK},

  /* IS */
  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ IS_LOCK, /* SCH-S */ IS_LOCK,
    /* IS */ IS_LOCK, /* S */ S_LOCK, /* IX */ IX_LOCK, /* BU */ X_LOCK, /* SIX */ SIX_LOCK,
    /* U */ NA_LOCK, /* X */ X_LOCK, /* SCH-M */ SCH_M_LOCK},

  /* S */
  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ S_LOCK, /* SCH-S */ S_LOCK,
    /* IS */ S_LOCK, /* S */ S_LOCK, /* IX */ SIX_LOCK, /* BU */ X_LOCK, /* SIX */ SIX_LOCK,
    /* U */ U_LOCK, /* X */ X_LOCK, /* SCH-M */ SCH_M_LOCK},

  /* IX */
  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ IX_LOCK, /* SCH-S */ IX_LOCK,
    /* IS */ IX_LOCK, /* S */ SIX_LOCK, /* IX */ IX_LOCK, /* BU */ X_LOCK, /* SIX */ SIX_LOCK,
    /* U */ NA_LOCK, /* X */ X_LOCK, /* SCH-M */ SCH_M_LOCK},

  /* BU */
  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ BU_LOCK, /* SCH-S */ BU_LOCK,
    /* IS */ BU_LOCK, /* S */ X_LOCK, /* IX */ BU_LOCK, /* BU */ BU_LOCK, /* SIX */ BU_LOCK,
    /* U */ NA_LOCK, /* X */ X_LOCK, /* SCH-M */ SCH_M_LOCK},

  /* SIX */
  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ SIX_LOCK, /* SCH-S */ SIX_LOCK,
    /* IS */ SIX_LOCK, /* S */ SIX_LOCK, /* IX */ SIX_LOCK, /* BU */ X_LOCK, /* SIX */ SIX_LOCK,
    /* U */ NA_LOCK, /* X */ X_LOCK, /* SCH-M */ SCH_M_LOCK},

  /* U */
  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ U_LOCK, /* SCH-S */ NA_LOCK,
    /* IS */ NA_LOCK, /* S */ U_LOCK, /* IX */ NA_LOCK, /* BU */ NA_LOCK, /* SIX */ NA_LOCK,
    /* U */ U_LOCK, /* X */ X_LOCK, /* SCH-M */ NA_LOCK},

  /* X */
  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ X_LOCK, /* SCH-S */ X_LOCK,
    /* IS */ X_LOCK, /* S */ X_LOCK, /* IX */ X_LOCK, /* BU */ X_LOCK, /* SIX */ X_LOCK,
    /* U */ X_LOCK, /* X */ X_LOCK, /* SCH-M */ SCH_M_LOCK},

  /* SCH-M */
  { /* N/A */ NA_LOCK, /* NON2PL */ NA_LOCK, /* NULL */ SCH_M_LOCK, /* SCH-S */ SCH_M_LOCK,
    /* IS */ SCH_M_LOCK, /* S */ SCH_M_LOCK, /* IX */ SCH_M_LOCK, /* BU */ SCH_M_LOCK, /* SIX */ SCH_M_LOCK,
    /* U */ NA_LOCK, /* X */ SCH_M_LOCK, /* SCH-M */ SCH_M_LOCK}
};
/* *INDENT-ON* */