﻿id,summary,reporter,owner,description,type,status,priority,milestone,component,version,severity,resolution,keywords,cc
11081,wp_insert_post() creates duplicates posts with two simultaneous mysql connections,maribge,ryan,"Hi,

I'm running the lates 2.8.5 wordpress release, but ""tested"" this bug with an older version too. Tested it on 2 Windows machines and one Unix with different mysql versions.

Precondition: create a sample plugin

<?php

/*
Plugin Name: Test plugin
Plugin URI: http://test
Description: test plugin.
Version: 1.0
Author: test
Author URI: http://test
*/


function test_insertPosts()
{
$post['post_title'] = 'test title';
$post['post_content'] = 'test content';
$post['post_status'] = 'publish';
$post['post_author'] = 1;
$post['post_category'] = array(0);
$post['guid'] = 'somethingsss';

$post = add_magic_quotes($post);
$postID = wp_insert_post($post);

if(is_wp_error($postID)) return false;

return $postID;
}

add_action('init', 'test_insertPosts');

?>

On each refresh of the blog's home page this plugin should generate one post, however occasionally it generates two or even three posts at a time by establishing two or more simultaneous connections with a mysql database. Generally multiple(duplicate) posts are generated at the first, second or third homepage refreshes.

Watch this video as an illustration: [http://www.youtube.com/watch?v=WdeDp4PjZnk] . Don't pay attention to other issues addressed in the video though, just the duplicate post issue.

I looked through the mysql log file to locate the problem. I found that occasionally wordpress creates two simultaneous mysql conncetions and makes INSERT INTO 'wp_posts' query twice, instead of one and than closes both connections. The log file is attached, but I'm posting a snippet of it here:


{{{
mysqld, Version: 5.1.34-community-log (MySQL Community Server (GPL)). started with:
TCP Port: 3306, Named Pipe: (null)
Time                 Id Command    Argument
091105 16:18:00    1 Connect	admin@localhost on 
		    1 Query	SET NAMES utf8
		    1 Init DB	wordpress
		    1 Query	SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'
		    1 Query	UPDATE `wp_options` SET `option_value` = '1257427080' WHERE `option_name` = '_transient_doing_cron'
		    2 Connect	admin@localhost on 
		    2 Query	SET NAMES utf8
		    2 Init DB	wordpress
		    2 Query	SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'
		    2 Query	SELECT option_value FROM wp_options WHERE option_name = 'sidebars_widgets' LIMIT 1
		    2 Query	SELECT post_name FROM wp_posts WHERE post_name = 'test-title' AND post_type = 'post' AND ID != 0 LIMIT 1
		    2 Query	INSERT INTO `wp_posts` (`post_author`,`post_date`,`post_date_gmt`,`post_content`,`post_content_filtered`,`post_title`,`post_excerpt`,`post_status`,`post_type`,`comment_status`,`ping_status`,`post_password`,`post_name`,`to_ping`,`pinged`,`post_modified`,`post_modified_gmt`,`post_parent`,`menu_order`,`guid`) VALUES ('1','2009-11-05 16:18:00','2009-11-05 13:18:00','test content','','test title','','publish','post','open','open','','test-title','','','2009-11-05 16:18:00','2009-11-05 13:18:00','0','0','somethingsss')
		    2 Query	SELECT tr.term_taxonomy_id FROM wp_term_relationships AS tr INNER JOIN wp_term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tr.object_id IN (3) AND tt.taxonomy IN ('category')
		    2 Query	SELECT * FROM wp_posts WHERE ID = 3 LIMIT 1
		    2 Query	SELECT ID FROM wp_posts WHERE post_parent = 3
		    2 Query	SELECT * FROM wp_posts WHERE ID = 3 LIMIT 1
		    2 Query	INSERT INTO `wp_postmeta` (`post_id`,`meta_value`,`meta_key`) VALUES ('3','1','_pingme')
		    2 Query	INSERT INTO `wp_postmeta` (`post_id`,`meta_value`,`meta_key`) VALUES ('3','1','_encloseme')
		    2 Query	SELECT ID FROM wp_posts WHERE post_parent = 3
		    2 Query	UPDATE `wp_options` SET `option_value` = 'a:2:{i:1257467774;a:3:{s:16:\""wp_version_check\"";a:1:{s:32:\""40cd750bba9870f18aada2478b24840a\"";a:3:{s:8:\""schedule\"";s:10:\""twicedaily\"";s:4:\""args\"";a:0:{}s:8:\""interval\"";i:43200;}}s:17:\""wp_update_plugins\"";a:1:{s:32:\""40cd750bba9870f18aada2478b24840a\"";a:3:{s:8:\""schedule\"";s:10:\""twicedaily\"";s:4:\""args\"";a:0:{}s:8:\""interval\"";i:43200;}}s:16:\""wp_update_themes\"";a:1:{s:32:\""40cd750bba9870f18aada2478b24840a\"";a:3:{s:8:\""schedule\"";s:10:\""twicedaily\"";s:4:\""args\"";a:0:{}s:8:\""interval\"";i:43200;}}}s:7:\""version\"";i:2;}' WHERE `option_name` = 'cron'
		    2 Query	SELECT * FROM wp_posts, wp_postmeta WHERE wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = '_pingme' LIMIT 1
		    2 Query	DELETE FROM wp_postmeta WHERE post_id = 3 AND meta_key = '_pingme'
		    2 Query	SELECT pinged FROM wp_posts WHERE ID = 3
		    2 Query	SELECT * FROM wp_posts, wp_postmeta WHERE wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = '_pingme' LIMIT 1
		    2 Query	SELECT * FROM wp_posts, wp_postmeta WHERE wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = '_encloseme' LIMIT 1
		    2 Query	DELETE FROM wp_postmeta WHERE post_id = 3 AND meta_key = '_encloseme'
		    2 Query	SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (3)
		    2 Query	SELECT * FROM wp_posts, wp_postmeta WHERE wp_posts.ID = wp_postmeta.post_id AND wp_postmeta.meta_key = '_encloseme' LIMIT 1
		    2 Query	SELECT ID FROM wp_posts WHERE to_ping <> '' AND post_status = 'publish'
091105 16:18:01    2 Quit	
		    1 Query	SELECT * FROM wp_users WHERE user_login = 'admin'
		    1 Query	SELECT meta_key, meta_value FROM wp_usermeta WHERE user_id = 1
		    1 Query	SELECT option_value FROM wp_options WHERE option_name = 'sidebars_widgets' LIMIT 1
		    1 Query	SELECT post_name FROM wp_posts WHERE post_name = 'test-title' AND post_type = 'post' AND ID != 0 LIMIT 1
		    1 Query	SELECT post_name FROM wp_posts WHERE post_name = 'test-title-2' AND post_type = 'post' AND ID != 0 LIMIT 1
		    1 Query	INSERT INTO `wp_posts` (`post_author`,`post_date`,`post_date_gmt`,`post_content`,`post_content_filtered`,`post_title`,`post_excerpt`,`post_status`,`post_type`,`comment_status`,`ping_status`,`post_password`,`post_name`,`to_ping`,`pinged`,`post_modified`,`post_modified_gmt`,`post_parent`,`menu_order`,`guid`) VALUES ('1','2009-11-05 16:18:01','2009-11-05 13:18:01','test content','','test title','','publish','post','open','open','','test-title-2','','','2009-11-05 16:18:01','2009-11-05 13:18:01','0','0','somethingsss')
		    1 Query	SELECT tr.term_taxonomy_id FROM wp_term_relationships AS tr INNER JOIN wp_term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tr.object_id IN (4) AND tt.taxonomy IN ('category')
		    1 Query	SELECT * FROM wp_posts WHERE ID = 4 LIMIT 1
		    1 Query	SELECT ID FROM wp_posts WHERE post_parent = 4
		    1 Query	SELECT * FROM wp_posts WHERE ID = 4 LIMIT 1
		    1 Query	INSERT INTO `wp_postmeta` (`post_id`,`meta_value`,`meta_key`) VALUES ('4','1','_pingme')
		    1 Query	INSERT INTO `wp_postmeta` (`post_id`,`meta_value`,`meta_key`) VALUES ('4','1','_encloseme')
		    1 Query	SELECT ID FROM wp_posts WHERE post_parent = 4
		    1 Query	SELECT SQL_CALC_FOUND_ROWS  wp_posts.* FROM wp_posts  WHERE 1=1  AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private')  ORDER BY wp_posts.post_date DESC LIMIT 0, 10
		    1 Query	SELECT FOUND_ROWS()
		    1 Query	SELECT t.*, tt.*, tr.object_id FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('category', 'post_tag') AND tr.object_id IN (4, 3) ORDER BY t.name ASC
		    1 Query	SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (4,3)
		    1 Query	SELECT option_value FROM wp_options WHERE option_name = 'kubrick_header_image' LIMIT 1
		    1 Query	SELECT option_value FROM wp_options WHERE option_name = 'kubrick_header_color' LIMIT 1
		    1 Query	SELECT option_value FROM wp_options WHERE option_name = 'kubrick_header_display' LIMIT 1
		    1 Query	SELECT * FROM wp_posts  WHERE (post_type = 'page' AND post_status = 'publish')     ORDER BY menu_order, post_title ASC
		    1 Query	SELECT option_value FROM wp_options WHERE option_name = 'page_for_posts' LIMIT 1
		    1 Query	SELECT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM wp_posts  WHERE post_type = 'post' AND post_status = 'publish' GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC
		    1 Query	SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN ('category')  ORDER BY t.name ASC
		    1 Query	SELECT t.*, tt.* FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON t.term_id = tt.term_id WHERE tt.taxonomy IN ('link_category')  AND tt.count > 0 ORDER BY t.name ASC
		    1 Query	SELECT *  , IF (DATE_ADD(link_updated, INTERVAL 120 MINUTE) >= NOW(), 1,0) as recently_updated   FROM wp_links  INNER JOIN wp_term_relationships AS tr ON (wp_links.link_id = tr.object_id) INNER JOIN wp_term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id WHERE 1=1 AND link_visible = 'Y'  AND ( tt.term_id = 2 ) AND taxonomy = 'link_category'    ORDER BY link_name ASC
		    1 Quit	
}}}

As you can clearly see, after the first connection had been extablished and two queries made:

{{{
091105 16:18:00    1 Connect	admin@localhost on 
		    1 Query	SET NAMES utf8
		    1 Init DB	wordpress
		    1 Query	SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'
		    1 Query	UPDATE `wp_options` SET `option_value` = '1257427080' WHERE `option_name` = '_transient_doing_cron'		    
}}}

wordpress initiates another mysql connection:

{{{
2 Connect	admin@localhost on 
		    2 Query	SET NAMES utf8
		    2 Init DB	wordpress
}}}

During the second connection query ""INSERT INTO `wp_posts`"" is performed. Then the second connection session ends:

{{{
091105 16:18:01    2 Quit
}}}

and queries of the first connection resume, and another ""INSERT INTO `wp_posts`"" query is made (which is a duplicate post). Then the first connection shuts down:

{{{
1 Quit
}}}

I've been trying to figure out what causes it (presumably two instances of the wpbd class are made), but failed to locate the problem in the wordpress code.

Thanks,
Merab.",defect (bug),closed,normal,,Query,,normal,invalid,reporter-feedback,
