日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

How to DEBUG a trigger or procedure

發布時間:2023/12/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 How to DEBUG a trigger or procedure 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

DEBUGGING STORED PROCEDURES

Over the past several weeks, we’ve been working on debugging a stored procedure bug for a client. Coming from a software development background, I looked at the procedure like any piece of code — how can I debug the program and be able to use some means of knowing the values within the program while it’s running? In C, I’ve always used GDB, as well as Perl having it’s own debugger. Also useful are print statements! Those can be the most simplistic but also useful tools in debugging, especially in the case of a C program that’s so optimized that GDB gives you the famous “value optimized out” message, preventing you from knowing what the program is really doing.

Stored procedures are a whole different matter than compiled or interpreted code. They are executing within the database. The line numbers in your source file you inevitably create the procedure with don’t match the line numbers of the procedure as stored by the database. Furthermore, if you are a developer of other languages, you will find debugging stored procedures to be a exercise in misery. You can load a stored procedure into MySQL, and as long as the SQL is syntactically correct, it will not catch things such as specifying variables that don’t exist– you will have the joy of discovering those during run-time– and most often the error message displayed will be of little use.

How then, can you better observe the execution of a stored procedure?

In some cases, you could run it with print statements and simply observe the output when the procedure is executed. But in our case, that was not a solution as the procedure had mostly DML statements and we needed something that was more precise. We needed something that not only allows you to display the values of variables, but also show you when the statement was executed.

There is this very useful?article?on Dr. Dobbs, a concept that we expanded upon. The main idea of this article is that a temporary memory table is used during the execution of the stored procedure to insert stored procedure debug messages into, and being a memory table, won’t touch disk and will be as lightweight as possible. At the end of a debug session, these messages are copied from the temporary table into a permanent table with the same table definition. This gives you a means of reading the debug messages written during the execution of your stored procedure.

We built upon the idea from the article and came up with these useful stored procedures that are easy to load and utilize in a stored procedure. They allow you to print any message that you want to, along with the time and the connection/thread ID of the thread executing the procedure– something that was invaluable in debugging what we thought at first was a race condition.

Debugging stored procedures

The following debugging procedures can be used within your stored procedures. First, each will be introduced, and then a more descriptive explanation on how they work will be provided, along with source code. Note that these procedures are also available github:

http://github.com/CaptTofu/Stored-procedure-debugging-routines


setupProcLog()

This procedure you run once at the beginning of your procedure to set up the the temporary table for storing messages in, as well as ensuring that there is a permanent log table.

procLog()

This is the procedure you call for each debug message.

cleanup()

This is the procedure you call at the end of your debugging session

The code for each of these procedures:

CREATE PROCEDURE setupProcLog() BEGINDECLARE proclog_exists int default 0;/*check if proclog is existing. This check seems redundant, butsimply relying on 'create table if not exists' is not enough becausea warning is thrown which will be caught by your exception handler*/SELECT count(*) INTO proclog_existsFROM information_schema.tablesWHERE table_schema = database() AND table_name = 'proclog';IF proclog_exists = 0 THENcreate table if not exists proclog(entrytime datetime,connection_id int not null default 0,msg varchar(512));END IF;/** temp table is not checked in information_schema because it is a temp* table*/create temporary table if not exists tmp_proclog(entrytime timestamp,connection_id int not null default 0,msg varchar(512)) engine = memory; END

As you can see,?setupProcLog()?first checks to see if the permanent logging table exists, and if not, creates it. The second create statement creates the temporary memory table for logging messages to. Note that ‘if exists’ is not sufficient for avoiding warnings that will cause your exception handler to be called in the event the table already exists and is even created specifying an ‘if exists’ condition. Also note that a storage engine is not specified for?proclog. In this case,?proclog?should be a non-transactional table to avoid any issues with the stored procedure using the debugging procedures within a transaction– you don’t want all your debug messages rolled-back!

CREATE PROCEDURE procLog(in logMsg varchar(512)) BEGINdeclare continue handler for 1146 -- Table not foundBEGINcall setupProcLog();insert into tmp_proclog (connection_id, msg)values (connection_id(), 'reset tmp table');insert into tmp_proclog (connection_id, msg)values (connection_id(), logMsg);END;insert into tmp_proclog (connection_id, msg) values (connection_id(), logMsg); END

The?procLog()?procedure is what you use to log messages with. You can see an exception handler is set in case the table is not found,?setupProcLog()?is called to make sure the both the temporary and permanent log tables exist, as well as display a message that the temporary table has been set up. Then of course, in the case of no exception, the message is inserted into the table.

CREATE PROCEDURE cleanup(in logMsg varchar(512)) BEGINcall procLog(concat("cleanup() ",ifnull(logMsg, '')));insert into proclog select * from tmp_proclog;drop table tmp_proclog; END

Finally, the?cleanup()?procedure copies all entries made during the session into the permanent logging table, then the temporary logging table is truncated. Note that this procedure just drops the temporary table,?tmp_proclog. This is to allow you to be able to run?setupProcLog()without a warning about?tmp_proclog?existing. Since all the data has been copied to?proclog?as well as being temporary table that will be re-created if?setupProcLog()?is called, dropping it works out well.

These procedures are easy to use. Just load them into your MySQL instance:

mysql yourschema < proclog.sql

In your procedure code, you are able to now log messages!

First, you will call:

call setupProcLog();

Then you can log message:

call procLog("this is a message");

Or even with variables:

call procLog(concat("this is a message with a variable - foo = ", ifnull(foo,'NULL')));

Note above the use of?ifnull(). This is because?concat()?fails if the variable in the list being concatenated is is NULL.

Now, for an actual procedure. The procedure shown below is for demonstration purposes and will show as succinctly as possible the problem we encountered.

The issue was essentially that there is a stored procedure that has a number start of a transaction, a number insert statements that occur within a loop into tables relating to a single unique id and then a final check on the primary table to see if that unique id has been inserted already– and based on this, commits or rolls back the subsequent inserts. The procedure looked bullet-proof, and it seemed that there would be no way for any of the subsequent insert statements to ever be committed, but there was one problem: within the loop, there was a call to another stored procedure that also had it’s own call to start and commit a transaction. You cannot have nested transactions in MySQL, and this was the crux of the problem, and what the example procedure here will attempt to show, as well as show you how you can
practically utilize the debugging procedures.

CREATE PROCEDURE proc_example (_username varchar(32) ) BEGINDECLARE status_code int;DECLARE counter int default 0;DECLARE BAIL int default 0;DECLARE sleep_foo int;/** exit handler for anything that goes wrong during execution. This will* ensure the any subsequent DML statements are rolled back*/DECLARE EXIT HANDLER FOR SQLEXCEPTIONBEGINSET status_code = -1;ROLLBACK;SELECT status_code as status_code;call cleanup("line 65: exception handler");END;SET status_code = 0;CALL setupProcLog();CALL procLog("line 71: Entering proc_example");/* start the transaction - so that anything that follows will be atomic */START TRANSACTION;call procLog(concat("line 76: START TRANSACTION, status_code=",ifnull(status_code, NULL)));IF status_code = 0THEN/** the loop. The only thing that will cause this loop to end other* than the counter exceeding the value of 5 is if BAIL is set to 1*/myloop: LOOPCALL procLog(concat("line 85: loop iteration #",ifnull(counter, NULL)));/* leave the loop is counter exceeds the value of 5 */IF counter > 5 THENLEAVE myloop;END IF;/** this statement is just to show an example of an insert* statement that should NOT be committed until the end of* the procedure, or if the status_code is anything other than* zero then a rollback will result in this statement being rolled* back*/INSERT INTO userloop_count (username, count) VALUES (_username, counter);CALL procLog("line 103: CALL someother_proc()");/** This call to someother_proc() will set a value for BAIL. This* is the type of thing you want to be cognizant of in your stored* procedures - that a procedure that you call doesn't have it's* own transaction. Nested transactions are not supported by MySQL*/CALL someother_proc(rand(), _username, BAIL);CALL procLog(concat("line 111: BAIL = ", ifnull(BAIL, 'NULL')));IF BAIL THENSET status_code = 1;LEAVE myloop;END IF;SET counter = counter + 1;END LOOP;END IF;/** this is the do or die part of the procedure that will either commit or* roll back any subsequent DML statements (insert, update, delete, etc)* if the username exists, a status_code of 2 is set, which results in a* rollback, and if not, an insert into users is called. If the insert* fails for any reason, the EXIT handler will also roll back subsequent* statements**/IF (status_code = 0)THENIF (SELECT user_id FROM users WHERE username = _username) IS NOT NULLTHENcall procLog("line 135: user exists, setting status_code to 5");SET status_code = 2;ELSEcall procLog("line 138: user does not exist, inserting");INSERT INTO users (username) VALUES (_username);END IF;END IF;select sleep(3) into sleep_foo;call procLog(concat( "line 148 status_code = ", ifnull(status_code,'NULL')));/* if status_code of 0, then commit, else roll back */IF (status_code = 0) THENCOMMIT;ELSEROLLBACK;END IF;/** call cleanup() to ensure the temp proc logging table's entries are* copied to the proclog table*/call cleanup("line 160: end of proc");SELECT status_code as status_code;END

As you can see, the call to?procLog()?gives you the ability to see what line of the procedure was called. This all corresponds to the line numbers you have in whatever source file you use to add your stored procedure to your database from.

As you just saw, there was a call to the?someother_proc()?procedure. In this case,someother_proc()?contains a transaction which will demonstrate the problem with trying to attempted nested transactions– something that you should always be cognizant of in debugging stored procedures

DROP PROCEDURE IF EXISTS someother_proc | CREATE PROCEDURE someother_proc (_rand float,_username varchar(32),out _return_val int ) MODIFIES SQL DATABEGIN/** this is passed by the calling procedure and is available after the* program is called*/set _return_val = 0;/** this will cause grief for the test procedure that calls it because it* will result in an attempt of a nested procedure, which is not supported* in MySQL. This call will be an implicit commit, so all subsequent DML* statements in the calling procedure will be committed*/START TRANSACTION;/** Arbitrary. Just to have some way to randomly set a true value that the* calling procedure will use to test whether or not to leave the loop* that this procedure was called from*/IF (_rand > 0.5)THENSET _return_val = 1;END IF;/* this is here to provide a means to see what random value was tested */INSERT INTO randlog (username, rvalue, returned) VALUES (_username, _rand, _return_val);COMMIT; END

Now, to actually run this procedure and see what is entred into the proclog
table.

mysql> call proc_example('testuser'); +-------------+ | status_code | +-------------+ |?????????? 1 | +-------------+ 1 row in set (3.04 sec)

So, as can be seen, the status code returned is ‘1’, meaning that the user wasn’t inserted. How can this be? Well, now that the?procLog()?procedure is being utilized, you can query the tableproclog

mysql> select * from proclog; +---------------------+---------------+-------------------------------------------+ | entrytime?????????? | connection_id | msg?????????????????????????????????????? | +---------------------+---------------+-------------------------------------------+ | 2010-10-15 09:34:27 |??????????? 11 | line 71: Entering proc_example??????????? | | 2010-10-15 09:34:27 |??????????? 11 | line 76: START TRANSACTION, status_code=0 | | 2010-10-15 09:34:27 |??????????? 11 | line 85: loop iteration #0??????????????? | | 2010-10-15 09:34:27 |??????????? 11 | line 103: CALL someother_proc()?????????? | | 2010-10-15 09:34:27 |??????????? 11 | line 111: BAIL = 1??????????????????????? | | 2010-10-15 09:34:30 |??????????? 11 | line 145 status_code = 1????????????????? | | 2010-10-15 09:34:30 |??????????? 11 | cleanup() line 156: end of proc?????????? | +---------------------+---------------+-------------------------------------------+

Also,?randlog?can be queried to see what the random value was:

mysql> select * from randlog; +----+---------------------+----------+----------+----------+ | id | created???????????? | username | rvalue?? | returned | +----+---------------------+----------+----------+----------+ |? 1 | 2010-10-15 09:34:27 | testuser | 0.880542 |??????? 1 | +----+---------------------+----------+----------+----------+

Aha!?BAIL?was set to ‘1’ because of the random value being greater than .5, so the loop ended. This means that the subsequent insert statements should have not been committed, right?? (well, we know there’s a nested transaction, but for the sake of this example, let us forget about that momentarily)

The users table should be empty, and it is:

mysql> select * from users; Empty set (0.01 sec)

The next table to check is?userloop_count, it too should be empty:

mysql> select * from userloop_count; +----+---------------------+-------+----------+ | id | created???????????? | count | username | +----+---------------------+-------+----------+ |? 1 | 2010-10-15 09:34:27 |???? 0 | testuser | +----+---------------------+-------+----------+

Hmm, but it is not! How could this be? The status code was set to ‘1’, so the ROLLBACK having been issued would roll back all the previous insert statements. What else can we look at?

Binary Log

The binary log is like a closed circuit TV camera of your database– at least in terms of DML statements. Any statement that modifies your data will be found in your binary log. Not only that, you can see what thread issued the statement. The evidence is there for you to see!

The following is cleaned up to make clearer:

So, the first line below, the message “loop iteration #0” is inserted into?proclog:

#101015? 9:34:27 server id 2?end_log_pos 2733? Query?thread_id=11 exec_time=0 error_code=0 insert into tmp_proclog (connection_id, msg) values (connection_id(),? NAME_CONST('logMsg',_latin1'line 85: loop iteration #0'))/*!*/;

Next, the insertion into userloop_count is made:

#101015?9:34:27 server id 2?end_log_pos 2813?Query thread_id=11?exec_time=0 error_code=0 INSERT INTO userloop_count (username, count) VALUES ( NAME_CONST('_username',_latin1'testuser'),? NAME_CONST('counter',0))/*!*/;

The message indicating the call to?someother_proc()?is inserted into?proclog:

#101015? 9:34:27 server id 2?end_log_pos 3291?Query?? thread_id=11 exec_time=0 error_code=0 insert into tmp_proclog (connection_id, msg) values (connection_id(),? NAME_CONST('logMsg',_latin1'line 103: CALL someother_proc()'))/*!*/;

Next, the crux of the problem! A COMMIT is issued. How can this be? Well, because there is a ‘BEGIN TRANSACTION’, which there was already a ‘BEGIN TRANSACTION’ issued in the calling procedure. Nested transactions are not supported, and when you issue a ‘BEGIN TRANSACTION’ within a transaction, it acts as an implicite ‘COMMIT’

#101015? 9:34:27 server id 2? end_log_pos 3318? Xid = 809 COMMIT/*!*/;

So, now the problem is know and can be fixed accordingly!

Summary

This post was written to help those who are pulling their hair out debugging their stored procedures. This post was also written for those who might have come from more from a development role and might have an approach that is overly complex. When debugging stored procedures, here are some tips that will help:

* binary log – look at this first when something seems awry. It is the closed-circuit TV recording of what happened with your database
* utilize these logging procedures to debug your stored procedures
* look closely at the data in the tables affected by your stored procedures

You will develop an intuition for the types of issues stored procedures present over time. You just have to think a bit differently than with regular programming.

總結

以上是生活随笔為你收集整理的How to DEBUG a trigger or procedure的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

日b视频在线观看网址 | 色婷婷导航 | 伊人天天狠天天添日日拍 | 午夜精品婷婷 | 亚洲精品成人网 | 最近免费中文字幕mv在线视频3 | 色婷婷在线播放 | 久草视频免费在线播放 | 手机看片1042 | 天天操天天操天天 | 伊人导航 | 国产精品免费观看国产网曝瓜 | 日韩成人免费在线电影 | 欧美一级爽 | 国产日本在线 | 日韩影视精品 | 色婷婷亚洲婷婷 | 最新中文字幕在线资源 | 国产99久久久国产精品免费看 | 在线性视频日韩欧美 | 麻豆视频一区二区 | 99看视频在线观看 | 中文字幕国产精品一区二区 | 三级动图 | 狠狠干网站 | 开心丁香婷婷深爱五月 | av电影免费在线看 | 五月激情婷婷丁香 | 激情自拍av | 在线免费高清一区二区三区 | 伊人亚洲精品 | 狠狠躁日日躁夜夜躁av | 9999在线视频| 久久久久欠精品国产毛片国产毛生 | 免费日韩一区二区三区 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 国产精品一区二区视频 | 激情五月网站 | av线上看 | 国产精品久久久久久吹潮天美传媒 | av在线免费观看黄 | 伊人宗合网 | 91视频免费 | 日韩精品一区二区在线观看 | 国产第一福利网 | 久久婷婷精品视频 | 色成人亚洲 | 免费视频你懂得 | 欧美日本啪啪无遮挡网站 | 欧美五月婷婷 | 在线观看播放av | 国产精品露脸在线 | 中文字幕一区av | 在线电影av | 日韩一区二区免费视频 | 成人免费共享视频 | 久久久久久久久久久免费视频 | 97人人澡人人爽人人模亚洲 | 91精品久久久久 | 成人黄色片免费看 | 天天色天天射综合网 | 黄色网免费 | 亚洲视屏 | 久久久电影 | 91av精品| 欧美日韩精品在线视频 | 国产成人a v电影 | 欧洲成人免费 | 狠狠狠色丁香综合久久天下网 | 丁香婷婷综合五月 | 亚洲成年人在线播放 | 成年免费在线视频 | 国内精品久久久久久久影视简单 | 蜜桃视频在线观看一区 | 日本在线视频一区二区三区 | 亚洲精品麻豆 | 午夜性盈盈 | 国产精品免费高清 | 天天做天天爱天天爽综合网 | 中文在线a在线 | 久久久人人人 | 国产精品免费在线 | 中文字幕在线免费观看 | 九热在线 | 国产人在线成免费视频 | 国产精品资源在线 | 欧美日韩在线播放 | 91视频亚洲 | 美女黄色网在线播放 | 国产精品中文字幕在线播放 | 欧美精品久久久久久久久老牛影院 | 国产精品18久久久久vr手机版特色 | 成人禁用看黄a在线 | 国产成人综合精品 | 日韩av综合网站 | 中文字幕精品一区久久久久 | 色资源二区在线视频 | 欧美一级片在线播放 | 韩国精品在线 | 成人亚洲综合 | 在线观看91网站 | 亚洲精品美女在线观看 | 免费看污片 | 麻豆国产视频下载 | 欧美激情视频一区二区三区 | 日韩成人看片 | 五月在线 | 日韩中文字幕在线看 | 美女黄色网在线播放 | www.91av在线 | 国产成人99av超碰超爽 | av免费成人 | 国产在线一区观看 | 欧美精品久久久久久久久久 | 在线观看av中文字幕 | 亚洲精品在线观看av | 欧美二区三区91 | 国产精品国内免费一区二区三区 | 四虎国产精品成人免费4hu | 国产在线观看地址 | 丁香婷婷激情 | 网站免费黄 | 日日干影院 | 欧美国产不卡 | 青青久草在线 | 中文在线8新资源库 | 日韩国产精品久久久久久亚洲 | 看毛片网站| 国产成人精品免高潮在线观看 | 狠狠躁日日躁 | 日韩精品久久久久久中文字幕8 | 91高清视频在线 | 97电影院网 | 国产在线视频一区二区 | 久久精品一二三 | 91麻豆精品国产91久久久更新时间 | 操操操com| 久久99久久精品 | 日本高清dvd | 97高清视频 | 日日干网| 成人在线观看av | 日韩欧美在线观看一区二区 | 日韩精品黄 | 亚洲激情五月 | 国产精品专区一 | 狠狠干夜夜操天天爽 | 中文字幕 婷婷 | 午夜精品三区 | 欧美韩国在线 | 国内丰满少妇猛烈精品播放 | 精品国产成人在线 | 色婷婷av一区二 | 精品国产免费久久 | 国产中文字幕在线观看 | 欧美狠狠操 | 久久久久久久久网站 | 九九热视频在线 | 黄色官网在线观看 | www.夜夜夜| 久久久在线免费观看 | 婷婷激情综合五月天 | 国产精品视频免费观看 | 日三级在线 | 国产91对白在线播 | 久久久久久久免费看 | 成人精品视频久久久久 | 日韩在线视频观看免费 | 人人澡人人爽欧一区 | 97国产超碰| 97偷拍在线视频 | 激情综合国产 | 日韩欧美在线播放 | 精品国产1区2区3区 国产欧美精品在线观看 | 亚洲欧美成人网 | 久草在线91 | av电影不卡在线 | 亚洲专区在线播放 | 99精品视频在线看 | 7777精品伊人久久久大香线蕉 | 一级黄色在线免费观看 | 日日干美女 | 日韩一二三区不卡 | 黄色午夜 | 亚洲精品乱码 | 97超碰资源网 | 五月综合激情 | 韩国精品视频在线观看 | 国产黄| 97国产小视频| 亚洲日本欧美 | 一区二区三区动漫 | 黄色毛片网站在线观看 | 亚洲成免费| 日本久久成人 | 操操操日日日干干干 | 97视频免费播放 | 色偷偷网站视频 | 中文字幕免费观看视频 | 欧美另类人妖 | 亚洲综合视频在线 | 免费av在线网站 | 亚洲综合射| 日本韩国在线不卡 | 综合色爱| 亚洲国产精品99久久久久久久久 | 午夜精品久久久久久 | 综合久久久 | 久久久婷 | 国产精品成人免费 | 天天要夜夜操 | 亚洲免费色| 国产亚洲婷婷 | 欧美日韩视频在线播放 | 日韩天天干 | 欧美另类tv | 色综合狠狠干 | 天天操天天干天天操天天干 | 久久久久9999亚洲精品 | 亚洲女人天堂成人av在线 | 精品国产免费看 | 久久久99久久| 天天爽天天做 | 亚洲精品中文在线 | 精品久久久一区二区 | 精品国产一区二区三区在线 | 天天干天天射天天操 | 日韩精品欧美一区 | 在线观看中文字幕一区 | 国产999精品久久久久久麻豆 | 日韩电影精品 | 欧美最新大片在线看 | 黄色av网站在线免费观看 | 免费在线色电影 | 久久精品视频免费播放 | 蜜臀一区二区三区精品免费视频 | 天天射狠狠干 | 在线国产片 | 日韩高清精品一区二区 | 亚洲精品中文字幕在线观看 | 天天操夜夜操天天射 | 91av视频免费在线观看 | 91精品一| 视频在线观看91 | 欧美孕妇与黑人孕交 | 综合久色 | 在线观看免费国产小视频 | 国产手机在线视频 | 精品欧美一区二区在线观看 | 免费看毛片网站 | 视频一区在线播放 | 中日韩在线视频 | 久久精品国产第一区二区三区 | 久久国产一区二区 | 一区二区三区四区五区在线 | 国产精品永久免费 | 特黄特色特刺激视频免费播放 | 亚洲精品久久久蜜臀下载官网 | 日韩中文在线观看 | 久久精品国产一区二区电影 | 国产精品免费久久久久久久久久中文 | 99精品在线观看 | 成人在线播放av | 亚洲影院一区 | 蜜臀aⅴ国产精品久久久国产 | 天天做日日爱夜夜爽 | 日韩在线观看你懂的 | 视频三区在线 | 国产黄色精品在线 | 91免费的视频在线播放 | 亚洲人人精品 | 久久国产电影 | 美女视频又黄又免费 | 五月婷婷操 | av中文字幕av| 人人网av | 成人免费ⅴa | 久久公开免费视频 | 97视频在线观看网址 | 一区二区三区影院 | 激情综合网五月婷婷 | 久久精品视频播放 | 又黄又色又爽 | 国产麻豆剧果冻传媒视频播放量 | 亚洲成人精品在线观看 | av色图天堂网 | 六月婷婷久香在线视频 | 日日插日日干 | 中文字幕丰满人伦在线 | 国产精品成人一区二区三区吃奶 | 四虎国产精品免费观看视频优播 | 深夜免费小视频 | 99久久久国产免费 | 中文字幕国产一区二区 | 午夜视频在线观看一区二区三区 | 久久99久久99精品中文字幕 | 日韩av手机在线观看 | 日韩一级网站 | 射九九| 天天想夜夜操 | ,午夜性刺激免费看视频 | 国产中文a | 国产日产精品一区二区三区四区的观看方式 | 亚洲专区免费观看 | 亚洲精品久久久久中文字幕m男 | 激情久久综合网 | 91久久精品日日躁夜夜躁国产 | 综合天堂av久久久久久久 | 国产精品扒开做爽爽的视频 | 国产精品日韩在线观看 | 五月婷婷在线视频观看 | 免费中午字幕无吗 | 国产二区视频在线 | 国产一区在线免费观看 | 免费中文字幕 | 91福利视频久久久久 | 中文字幕a在线 | 一区二区三区在线免费 | 黄污网 | 99久久er热在这里只有精品66 | www久久国产 | 日本精品中文字幕在线观看 | 成片免费观看视频大全 | 婷婷色婷婷 | 免费看麻豆| 日韩欧美一区二区三区视频 | 丁香婷婷综合激情五月色 | 伊人婷婷色 | 在线观看岛国 | 免费在线观看不卡av | 日韩一区二区三区免费视频 | 在线免费观看视频一区 | 欧美日韩免费观看一区二区三区 | www免费| 精品欧美乱码久久久久久 | 国产一级电影在线 | 东方av在| 日日爽天天 | 一区二区久久久久 | 又黄又爽又湿又无遮挡的在线视频 | 91中文在线视频 | 色婷婷综合视频在线观看 | 色婷婷国产精品一区在线观看 | 三级av网 | 国产精品高潮呻吟久久久久 | 国产高清一区二区 | 亚洲无毛专区 | 天天爽人人爽夜夜爽 | 久久精品艹 | 免费在线观看黄色网 | 久久久人人人 | 91色一区二区三区 | 韩国精品一区二区三区六区色诱 | 91九色九色 | 天天干天天综合 | 五月综合网站 | 草久视频在线观看 | 日韩一区精品 | 亚洲国产精品久久 | 97福利视频| 亚洲天堂自拍视频 | 久久久久久久综合色一本 | 免费观看不卡av | 日本久久影视 | 亚洲精品美女久久久 | 亚洲精品免费播放 | 精品久久一级片 | 中文字幕色在线视频 | 91在线看视频 | 国产黄色免费看 | 91视频在线| 精品久操 | 久久亚洲免费视频 | 天堂av免费观看 | 久久精品国产精品亚洲 | 亚洲国产剧情 | 久久精品久久99精品久久 | 日韩在线二区 | 二区在线播放 | 亚洲最快最全在线视频 | 91视频在线免费下载 | 国产不卡网站 | 国产精品白浆视频 | 欧美精品久久久久久久 | 国产精品二区在线 | 午夜一级免费电影 | 日韩欧美亚州 | 久久久久久久国产精品视频 | 久久伊人八月婷婷综合激情 | 久久成熟| 久久首页| 国产精品麻豆99久久久久久 | 中文字幕永久在线 | 色婷婷狠狠五月综合天色拍 | 婷婷丁香国产 | 人人草人人草 | 国产精品午夜免费福利视频 | 久久99亚洲精品 | 久久好看| 特级西西人体444是什么意思 | 天天做天天爱天天综合网 | 欧美一级xxxx | 日韩电影在线观看一区 | 国产九色视频在线观看 | 天天爱综合| 麻豆va一区二区三区久久浪 | 91人人爱 | 波多在线视频 | 久久久999免费视频 日韩网站在线 | www.av在线播放 | 久草网视频在线观看 | 五月婷婷深开心 | 久久电影国产免费久久电影 | 免费黄色在线播放 | 一级一级一片免费 | 欧美黄色特级片 | 97品白浆高清久久久久久 | 91久久国产自产拍夜夜嗨 | 精品国自产在线观看 | 干干操操| 亚洲综合在线播放 | 91视频传媒 | 国产精品高潮在线观看 | 欧美日韩国产高清视频 | 欧美激情视频免费看 | 久久黄页| 91麻豆精品国产91久久久久 | 日本久久免费电影 | 成年免费在线视频 | 激情五月婷婷激情 | 欧美精品一区二区三区一线天视频 | 国产专区日韩专区 | 成人黄色视 | 丁香婷婷综合激情 | 韩日电影在线观看 | 成年人av在线播放 | 日韩理论在线播放 | 精品国内自产拍在线观看视频 | 日本视频网 | 在线91网| 一区二区三区免费播放 | 国产亚洲精品精品精品 | www.香蕉视频 | 久久国产精品99精国产 | 成人黄色大片在线观看 | 亚洲乱码精品久久久 | 久久精品视频网站 | 伊人天天操 | 精品国产福利在线 | 久久99久久99免费视频 | 欧洲精品亚洲精品 | 日日夜夜精品免费 | 国产欧美最新羞羞视频在线观看 | 亚洲欧美一区二区三区孕妇写真 | 亚洲欧美日韩在线看 | 午夜国产在线 | 国产伦理一区二区 | 中文字幕在线观看第三页 | 不卡视频在线看 | 欧美精品xxx | 免费看色网站 | 亚洲国产97在线精品一区 | 免费看av在线 | 天天天天天天干 | 麻豆91精品 | 在线中文字幕观看 | 中文字幕 国产精品 | 国产精品一区二区视频 | 久久人人爽人人 | 四虎成人精品永久免费av | 日本天天操 | 91精品免费看| 久久黄色网页 | 丝袜网站在线观看 | 免费三级大片 | 欧美日韩高清免费 | 午夜久久久久久久 | 黄在线免费看 | 精品久久久久久久久久久久久久久久 | 国产精品久久毛片 | 999久久久久久久久 69av视频在线观看 | 精品久久久久久电影 | 在线播放国产一区二区三区 | 久久综合九色综合欧美狠狠 | 精品久久久久久亚洲 | 9999免费视频 | 中文字幕在线高清 | 天天操天天干天天干 | 成人av在线看 | 99久久日韩精品免费热麻豆美女 | 最近高清中文字幕在线国语5 | 婷婷亚洲激情 | 在线免费观看的av | 天天天天天天天操 | 国产精品久久久久亚洲影视 | 亚洲人在线7777777精品 | 日本中文字幕高清 | 一级免费看| 韩国av一区二区三区 | 美女视频永久黄网站免费观看国产 | 久久久久亚洲精品中文字幕 | 欧美va天堂va视频va在线 | 超碰在线cao | 国产福利网站 | 亚洲视频国产 | 久久久久久国产一区二区三区 | 天天操综合网站 | 婷婷久久网站 | 中文字幕一区在线观看视频 | 久久影视一区二区 | 天天爽人人爽夜夜爽 | 中文字幕精品www乱入免费视频 | 天天射综合网视频 | 五月婷婷天堂 | 国产亚洲精品久久19p | 91桃色国产在线播放 | 狠狠操狠狠干天天操 | 国产打女人屁股调教97 | 国产日韩一区在线 | 久久成人国产精品一区二区 | 黄色日视频 | 欧美性生活小视频 | 久久综合久久综合久久综合 | 亚洲天天| 中文字幕 国产视频 | 97国产精品 | 亚洲人av免费网站 | 精品国产激情 | 国产精品一区二区三区电影 | 国产美女搞久久 | 午夜在线免费观看 | 久久国产香蕉视频 | www.黄色片.com | 亚洲日本韩国一区二区 | 女人18毛片a级毛片一区二区 | 亚洲天堂网在线视频 | 色94色欧美| 麻豆免费在线播放 | 免费亚洲片| 亚洲国产视频网站 | 久草免费在线观看视频 | 亚洲欧美日韩国产 | 久草视频一区 | 国产a级精品 | 五月激情片 | 精品国产综合区久久久久久 | 国产精品免费在线 | 亚洲人成精品久久久久 | 国产精品女同一区二区三区久久夜 | 五月天国产 | 五月天久久久久 | 91看片一区二区三区 | 亚洲国产网站 | 国产精品久久久久久爽爽爽 | 成人性生交大片免费看中文网站 | 欧美有色 | 国产一区二区三精品久久久无广告 | 色噜噜日韩精品一区二区三区视频 | 日韩av在线不卡 | 久热香蕉视频 | 国产xxxx做受性欧美88 | 在线观看的a站 | 亚洲欧美日韩国产一区二区 | 开心激情网五月天 | 91精品国产综合久久久久久久 | 欧美日韩免费观看一区二区三区 | 国产精品免费久久久 | 色婷婷成人网 | 色在线亚洲 | 奇米影视999 | 久久狠狠婷婷 | 麻豆久久一区 | 国产夫妻性生活自拍 | 欧美精品久久久久久久久免 | 不卡视频一区二区三区 | 日韩精品一区二区三区中文字幕 | 国产午夜精品av一区二区 | 精品国产精品一区二区夜夜嗨 | 亚洲精品小视频在线观看 | 激情久久网 | av在线网站大全 | 国产精品美女久久久 | 丰满少妇在线观看 | 国产v在线 | av线上看| 波多野结依在线观看 | 国产99爱 | 美女黄濒| 久99久精品视频免费观看 | 岛国av在线不卡 | 99精品视频免费 | 狠狠色丁香婷婷综合久小说久 | 日韩在线观看你懂得 | 激情综合婷婷 | 日韩黄色一级电影 | 美女中文字幕 | 精品国产亚洲日本 | 一区二区三区国产欧美 | 欧美黑吊大战白妞欧美 | 亚洲夜夜网 | 国产精品嫩草影院123 | 国产精品久久久久久久久久直播 | 中文字幕精品三区 | 超碰99人人| 欧美aaa级片 | 午夜狠狠干 | 国产资源| 日韩特级黄色片 | 久久免费视频8 | 亚洲综合视频在线播放 | 爱爱av网站 | 色婷婷啪啪免费在线电影观看 | 在线播放 日韩专区 | 五月情婷婷 | 91精品人成在线观看 | 伊人久久影视 | 男女啪啪视屏 | 手机看片久久 | 美女网站在线 | 亚洲高清色综合 | 国产亚洲精品女人久久久久久 | 国产精品国产三级国产aⅴ无密码 | 亚洲国产影院av久久久久 | 91桃花视频 | 最近免费在线观看 | 激情欧美丁香 | 激情五月婷婷激情 | 在线一级片 | www.五月天婷婷.com | 免费福利片2019潦草影视午夜 | a黄色影院 | 午夜精品导航 | 久久人人爽人人爽人人片 | 天天插伊人| 免费看黄色毛片 | 亚洲欧美日韩在线一区二区 | 日韩精品免费一区二区 | 国产美女精品视频 | 免费在线视频一区二区 | 久久不卡国产精品一区二区 | 2019中文字幕第一页 | 99热精品视 | 中文字幕第一页在线视频 | 日本激情视频中文字幕 | 波多野结衣电影一区 | www日韩欧美 | 久久影院中文字幕 | 中文字幕人成人 | 天天综合网 天天 | 国产精华国产精品 | 99久视频 | 久久久免费观看完整版 | www.天天操.com | 国产精品久久久久久一区二区三区 | 中文字幕丝袜制服 | 成年人视频在线观看免费 | 91中文字幕一区 | 国产伦精品一区二区三区四区视频 | 欧美大jb | 国产一区二区三区网站 | 欧美成人精品在线 | 最近高清中文在线字幕在线观看 | 狠狠干夜夜爽 | 伊人久久精品久久亚洲一区 | 伊甸园av在线| 日韩中文字幕免费在线观看 | 日日夜夜骑 | 欧美日韩在线精品一区二区 | 亚州精品天堂中文字幕 | 福利视频第一页 | 亚州av网站| 亚洲午夜久久久久久久久 | 天天草视频| 成人香蕉视频 | 国产精美视频 | 中文国产在线观看 | 91精品视频免费在线观看 | 亚洲永久av| 欧美日韩精品影院 | 日韩高清一区 | 国产91大片 | 在线黄色av | 欧美日韩网址 | 黄色亚洲大片免费在线观看 | 久久av电影 | 国产91精品一区二区麻豆亚洲 | 国产精久久久久久久 | 五月婷婷久草 | 人人爽人人澡人人添人人人人 | 精品久久1 | 黄色精品久久 | av资源免费在线观看 | 精品国产一区二区三区男人吃奶 | 久久久网 | 91精品国产91久久久久福利 | 成人黄色片在线播放 | 911香蕉视频| 丁香综合av | 欧女人精69xxxxxx | 日韩高清不卡一区二区三区 | 久久亚洲精品国产亚洲老地址 | 久久国产精品99久久久久久丝袜 | 深爱激情婷婷网 | 日韩免费在线看 | 激情婷婷丁香 | 国产日韩在线播放 | 国产丝袜| 91亚洲精品乱码久久久久久蜜桃 | 天天拍夜夜拍 | 中文字幕精品www乱入免费视频 | 激情影音 | 成人av影院在线观看 | 一区二区视频在线观看免费 | 免费在线激情电影 | 91久久奴性调教 | 亚洲永久在线 | 国产精品女同一区二区三区久久夜 | 午夜视频黄| 久艹视频在线免费观看 | av在线免费在线观看 | 韩日精品在线观看 | 91人人爱| 国产乱对白刺激视频不卡 | 精品久久久免费 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 99热精品久久 | 99久久精品日本一区二区免费 | 亚洲精品视频在线观看网站 | 久久精品3 | 免费在线观看国产精品 | 日本xxxx裸体xxxx17 | 韩国在线一区二区 | 国产精品久久一区二区无卡 | 国产色中涩 | 欧美精品三级在线观看 | 国产视频69 | 久久三级毛片 | 美女网站视频一区 | 天天天天天干 | 91精品啪在线观看国产81旧版 | 日韩av电影手机在线观看 | 99精品欧美一区二区蜜桃免费 | 日韩高清三区 | 日韩黄色av网站 | 精品免费久久久久久 | 久久免费视频一区 | 麻豆国产精品va在线观看不卡 | 国产淫a| 激情网在线观看 | 天天视频色版 | 黄色录像av| 综合激情| 日韩电影一区二区三区 | 97成人精品视频在线观看 | 久久久一本精品99久久精品66 | 五月婷婷丁香在线观看 | 国产一级做a | 亚州欧美精品 | 日韩欧美99 | 国产精品一区二区美女视频免费看 | 亚洲精品动漫久久久久 | 永久免费精品视频网站 | 免费观看的黄色片 | 色香蕉在线视频 | 992tv又爽又黄的免费视频 | 久草视频免费观 | 九九热精品视频在线观看 | 日韩欧美在线高清 | 最近日本mv字幕免费观看 | 一级欧美一级日韩 | 欧美xxxxx在线视频 | 久久精品理论 | 黄色最新网址 | 在线成人免费电影 | 日韩欧美电影在线观看 | 国产精品自在欧美一区 | 成人av网址大全 | 欧美一级片在线免费观看 | 日韩性片| 久久免费观看视频 | 日批网站免费观看 | av在线小说 | 亚洲激情 欧美激情 | 日韩中午字幕 | 伊人va| 天天干,夜夜操 | 久久99精品波多结衣一区 | 中文字幕三区 | av免费在线看网站 | 九九热只有这里有精品 | 日韩黄色中文字幕 | 久久精品艹 | 六月激情久久 | 中文字幕在线观看免费高清电影 | 99精品欧美一区二区蜜桃免费 | 久久视频热 | 激情av资源 | 91福利视频网站 | 九九免费在线观看 | 日本精品视频网站 | 精品爱爱| 久久国产精品99久久久久久丝袜 | 亚洲不卡av一区二区三区 | 中文字幕亚洲综合久久五月天色无吗'' | 日韩成人免费在线 | 午夜免费在线观看 | 精品一二| 国产v欧美 | 午夜一级免费电影 | 国产亚洲精品美女久久 | 视频在线观看一区 | 西西444www| 久久久久久久av | 992tv又爽又黄的免费视频 | 久久99精品久久久久婷婷 | 久久国产精品久久w女人spa | 激情欧美日韩一区二区 | 日韩在线观看免费 | 91福利小视频| 亚洲视频电影在线 | 国产精品精品久久久久久 | 五月天激情婷婷 | 激情丁香综合五月 | 中文字幕久久亚洲 | 国产精品国产三级在线专区 | 99久久99久久精品国产片果冰 | 亚洲精品午夜视频 | 久久99视频精品 | 天天综合精品 | 国产青草视频在线观看 | 国产精品福利av | 久久国产一二区 | 亚洲专区一二三 | 亚洲国产大片 | 免费av 在线 | 欧美 高跟鞋交 xxxxhd | 日韩免费一级a毛片在线播放一级 | 日韩中文在线播放 | 久久99九九99精品 | 国产不卡网站 | 在线午夜电影神马影院 | www免费看 | av九九| 欧美 日韩 国产 中文字幕 | 日韩精品久久一区二区 | 久精品一区| 狠狠色丁香 | 精品在线视频一区二区三区 | 激情视频一区二区三区 | 特黄特色特刺激视频免费播放 | 免费的成人av | 亚洲二区精品 | 97精品国产91久久久久久 | 久久在线| 免费在线观看国产黄 | 国产亚洲在线视频 | 伊人亚洲综合网 | 手机看片久久 | 97超碰国产精品女人人人爽 | 久久精品视频国产 | 久久久久久欧美二区电影网 | 91久久精品日日躁夜夜躁国产 | 不卡中文字幕av | 中文字幕精品一区二区三区电影 | 亚洲第一香蕉视频 | 成人久久久久久久久久 | 久久久国产一区二区三区四区小说 | 久草在线综合网 | 一本一本久久a久久精品牛牛影视 | 亚洲午夜久久久久久久久 | 日本中文字幕高清 | 国产一级免费片 | 色婷婷丁香 | 久久99久久精品国产 | 中文字幕在线观看免费高清电影 | 伊人激情网 | 久久婷婷久久 | 六月婷婷久香在线视频 | 一区二区三区四区免费视频 | 精品 激情 | 国产精品 亚洲精品 | 亚洲精品视频在 | 亚洲精品成人av在线 | 亚洲aⅴ久久精品 | 国产精品久久久久久久久久久杏吧 | 婷婷夜夜| 五月色丁香 | 97色狠狠| 天天操天天操天天操天天操天天操 | 日本丶国产丶欧美色综合 | 美女黄频在线观看 | 免费视频久久久 | 91视频国产免费 | 在线播放视频一区 | 91精品国自产在线 | 热精品 | 天天弄天天操 | 中文字幕中文中文字幕 | 黄色三级在线 | 天天天操操操 | 亚洲国产影院av久久久久 | 黄色三级网站 | 亚洲理论在线观看 | 国产午夜免费视频 | 欧美性极品xxxx做受 | 精品在线亚洲视频 | 亚洲高清国产视频 | 日韩精品免费一区二区三区 | 国产精品国产亚洲精品看不卡 | 国产午夜精品一区二区三区欧美 | 伊人狠狠色 | 看毛片的网址 | 国产精品亚洲综合久久 | 国内精品久久久久 | 久久一视频 | 97超碰人人澡人人爱 | 色老板在线 | 欧美日本一区 | 免费看国产视频 | 天天婷婷| 精品国产日本 | 亚洲精品玖玖玖av在线看 | 日韩手机在线观看 | 中文字幕黄色 | 久久午夜色播影院免费高清 | 天天草夜夜 | 在线观看日韩中文字幕 | 99产精品成人啪免费网站 | 网址你懂的在线观看 | 午夜久久福利视频 | 在线国产一区二区三区 | 日本最新高清不卡中文字幕 | 国产网站av | 午夜影视剧场 | 免费成人av在线看 | 亚洲精品乱码久久久久久高潮 | 国产成人一区二区三区久久精品 | 9在线观看免费高清完整版在线观看明 | 四虎影视精品成人 | www亚洲国产 | 免费电影播放 | 精品久久国产一区 | 国产精品爽爽久久久久久蜜臀 | 亚洲成人999 | 五月天婷婷在线播放 | 国内精品久久久久影院一蜜桃 | 欧美乱码精品一区 | 九色在线视频 | 99人久久精品视频最新地址 | 国产小视频国产精品 | 色先锋资源网 | 成年人视频免费在线 | 欧美视屏一区二区 | 97热久久免费频精品99 | av电影在线不卡 | 日本黄色大片免费看 | 久草电影在线 | 国产精品久久婷婷六月丁香 | 97在线观看免费观看高清 | 免费在线观看av不卡 | 国产成人在线免费观看 | 精品国产乱码久久久久 | 国产 一区二区三区 在线 | 欧美最爽乱淫视频播放 | 亚洲区精品视频 | 香蕉97视频观看在线观看 | 国产一区二区精品在线 | 亚洲美女精品区人人人人 | 精品久久一区二区三区 | 国产一区二区三区免费视频 | 国产品久精国精产拍 | 欧美亚洲久久 | av在线播放一区二区三区 | www夜夜操com | 91香蕉国产 | 日韩精品在线观看av | 日韩最新理论电影 | 麻豆国产视频下载 | 狠狠狠狠狠狠干 | av免费在线看网站 | 精品久久久久一区二区国产 | 色偷偷人人澡久久超碰69 | 草久久影院 | 一区二区三区四区在线免费观看 | 国产一区视频在线播放 | 精品99在线 | 国产日韩欧美在线免费观看 | 黄色在线免费观看网址 | 国产视频九色蝌蚪 | 91成人在线观看高潮 | 久久99国产精品免费 | 色婷婷视频 | 日韩欧美网址 | 亚洲精品美女久久久久网站 | 天堂av在线免费 | 成人性生交大片免费看中文网站 | 狠狠色丁香婷婷综合视频 | 99这里只有 |