Commit 3db332ca authored by unknown's avatar unknown
Browse files

row0mysql.c, row0mysql.h, ha_innodb.cc:

  Inside LOCK TABLES, use either LOCK_S or LOCK_X in locking reads; an improvent over the previous patch


sql/ha_innodb.cc:
  Inside LOCK TABLES, use either LOCK_S or LOCK_X in locking reads; an improvent over the previous patch
innobase/include/row0mysql.h:
  Inside LOCK TABLES, use either LOCK_S or LOCK_X in locking reads; an improvent over the previous patch
innobase/row/row0mysql.c:
  Inside LOCK TABLES, use either LOCK_S or LOCK_X in locking reads; an improvent over the previous patch
parent 80c66247
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -507,6 +507,9 @@ struct row_prebuilt_struct {
	dtuple_t*	clust_ref;	/* prebuilt dtuple used in
					sel/upd/del */
	ulint		select_lock_type;/* LOCK_NONE, LOCK_S, or LOCK_X */
	ulint		stored_select_lock_type;/* inside LOCK TABLES, either
					LOCK_S or LOCK_X depending on the lock
					type */
	ulint		mysql_row_len;	/* length in bytes of a row in the
					MySQL format */
	ulint		n_rows_fetched;	/* number of rows fetched after
+1 −0
Original line number Diff line number Diff line
@@ -380,6 +380,7 @@ row_create_prebuilt(
  	prebuilt->clust_pcur = btr_pcur_create_for_mysql();

	prebuilt->select_lock_type = LOCK_NONE;
	prebuilt->stored_select_lock_type = 99999999;

	prebuilt->sel_graph = NULL;

+32 −10
Original line number Diff line number Diff line
@@ -4505,16 +4505,38 @@ ha_innobase::start_stmt(
	  
	        prebuilt->select_lock_type = LOCK_X;
	} else {
		/* When we first come here after LOCK TABLES,
		select_lock_type is set to LOCK_S or LOCK_X. Store the value
		in case we run also consistent reads and need to restore the
		value later. */

		if (prebuilt->select_lock_type != LOCK_NONE) {
			prebuilt->stored_select_lock_type =
					prebuilt->select_lock_type;
		}

		if (prebuilt->stored_select_lock_type != LOCK_S
		    && prebuilt->stored_select_lock_type != LOCK_X) {
			fprintf(stderr,
"InnoDB: Error: select_lock_type is %lu inside ::start_stmt()!\n",
			prebuilt->stored_select_lock_type);

			ut_error;
		}

		if (thd->lex.sql_command == SQLCOM_SELECT
					&& thd->lex.lock_option == TL_READ) {
	
			/* For other than temporary tables, we obtain
		no lock for consistent read (plain SELECT), and
		an exclusive lock for SELECT ... FOR UPDATE or
		SELECT ... LOCK IN SHARE MODE. */
			no lock for consistent read (plain SELECT) */

			prebuilt->select_lock_type = LOCK_NONE;
		} else {
			/* Not a consistent read: restore the
			select_lock_type value */
			prebuilt->select_lock_type =
			thd->lex.sql_command == SQLCOM_SELECT
			&& thd->lex.lock_option == TL_READ
			? LOCK_NONE
			: LOCK_X;
				prebuilt->stored_select_lock_type;
		}
	}
	
	/* Set the MySQL flag to mark that there is an active transaction */