【无标题】

Qt-无标题窗口         今天学习了下无标题窗口,于是来记录下我的学习过程首先建立一个Qt Widgets Application继承QWidget类创建完后直接运行就得到了如下效果那么,既然是无标题窗口就要去掉窗口栏啊,于是加上setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint);去掉标题栏,但是这样整个窗口就不能移动... 阅读详情

MySQL游标执行带有MINUS/INTERSECT查询导致core问题解析

一、问题发现

在客户现场提交的一次问题中发现某个带有MINUS联合查询cursor语句进行查询的时候,用MINUS和INTERSECT进行联合查询会导致core,但是用UNION却不会。

注意:这里用的版本是debug版本会core,release版本会报错。这个问题在MySQL 8.0.32版本会复现,最新的8.4.4版本关掉HASH_SET_OPERATIONS开关以后同样复现。

看下面例子:

1、准备表和sp

8032版本执行以下命令:
CREATE TABLE t1 (a INT, b VARCHAR(3));
INSERT INTO t1 values(1,'aa'),(2,'bb'),(3,'cc'),(6,'ee') ;
CREATE TABLE t2 (a INT, b VARCHAR(3));
INSERT INTO t2 values(1,'aa'),(4,'bb'),(3,'cc'),(5,'dd') ;
SET sql_mode=oracle;
DELIMITER $$
CREATE or replace PROCEDURE p1()
IS
BEGIN
FOR v IN(
SELECT * FROM t1
minus
SELECT * FROM t2
) LOOP
SELECT v.a ;
END LOOP;
END;$$
DELIMITER ;

2、执行sp

执行sp可以看到core了。

-- CALL p1; 结果core了
core堆栈如下:
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1 0x00007ffff6a068e4 in __GI_abort () at abort.c:79
#2 0x00007ffff6a067cf in __assert_fail_base (
fmt=0x7ffff6b60e90 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n",
assertion=0x6073198 "inited NONE || (inited RND && scan)",
file=0x6071b68 "sql/handler.cc",
line=3072, function=<optimized out>) at assert.c:92
#3 0x00007ffff6a13f02 in GI_assert_fail (
assertion=0x6073198 "inited NONE || (inited RND && scan)",
file=0x6071b68 "sql/handler.cc",
line=3072, function=0x6073178 "int handler::ha_rnd_init(bool)")
at assert.c:101
#4 0x00000000034fb3e1 in handler::ha_rnd_init (this=0x7fff2c9ab490,
scan=true) at sql/handler.cc:3072
#5 0x0000000003a339e0 in Materialized_cursor::open (
this=0x7fff2c88bff8, thd=0x7fff2c001010)
at sql/sql_cursor.cc:375
#6 0x0000000003a333e5 in mysql_open_cursor (thd=0x7fff2c001010, result=
0x7fff2c604ac8, pcursor=0x7fff2c604ab8)
at sql/sql_cursor.cc:280
#7 0x00000000039ad4dc in sp_cursor::open (this=0x7fff2c604ab0,
thd=0x7fff2c001010)
at sql/sp_rcontext.cc:1262
#8 0x0000000003997f6e in sp_instr_cpush_rowtype::exec_core (
this=0x7fff2c881560, thd=0x7fff2c001010)
at sql/sp_instr.cc:1986
#9 0x0000000003993ae5 in sp_lex_instr::reset_lex_and_exec_core (
this=0x7fff2c881560, thd=0x7fff2c001010, nextp=0x7fffd45f2998,
open_tables=false)
at sql/sp_instr.cc:462
#10 0x000000000399472a in sp_lex_instr::validate_lex_and_execute_core (
this=0x7fff2c881560, thd=0x7fff2c001010, nextp=0x7fffd45f2998,
open_tables=false)
at sql/sp_instr.cc:769
#11 0x0000000003998f89 in sp_instr_copen::execute (this=0x7fff2c881a88,
thd=0x7fff2c001010, nextp=0x7fffd45f2998)
at sql/sp_instr.cc:2282
(gdb) f 4
#4 0x00000000034fb3e1 in handler::ha_rnd_init (this=0x7fff2c9ab490,
scan=true) at sql/handler.cc:3072
3072 assert(inited NONE || (inited RND && scan));
(gdb) p inited 这里引擎变为索引了,说明在前面的过程里引擎的索引没有执行HA_INDEX_END
$1 = handler::INDEX

3、8.4.4版本执行sp

8.4.4版本的 HASH_SET_OPERATIONS 开关默认开启的,因此这里不需要设置。

# 首先创建正常sp。
SET sql_mode=oracle;
DELIMITER $$
CREATE or replace PROCEDURE p1()
IS
BEGIN
FOR v IN(
SELECT * FROM t1
minus
SELECT * FROM t2
) LOOP
SELECT v.a ;
END LOOP;
END;$$
DELIMITER ;
# 接着执行这个sp,发现有结果,符合预期。
greatsql> CALL p1;
+------+
| v.a  |
+------+
| 2    |
+------+
1 row in set (0.01 sec)
+------+
| v.a  |
+------+
| 6    |
+------+
1 row in set (0.01 sec)

没问题是不是说明bug解决了呢?现在关掉HASH_SET_OPERATIONS开关,再次创建这个sp再运行一次。可以看到结果core了,说明这个bug并没有解决。

SET sql_mode=oracle;
DELIMITER $$
CREATE OR replace PROCEDURE p1()
IS
BEGIN
FOR v IN(
SELECT /*+ set_var(optimizer_switch='HASH_SET_OPERATIONS=off') */ * FROM t1
minus
SELECT * from t2
) LOOP
SELECT v.a ;
END LOOP;
END;$$
DELIMITER ;
CALL p1; # 这里core了
堆栈如下,可以发现跟8032版本的堆栈完全一样:
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1 0x00007ffff5bba8e4 in __GI_abort () at abort.c:79
#2 0x00007ffff5bba7cf in __assert_fail_base (
fmt=0x7ffff5d14e90 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n",
assertion=0x62be3b8 "inited NONE || (inited RND && scan)",
file=0x62bce28 "sql/handler.cc",
line=3151, function=<optimized out>) at assert.c:92
#3 0x00007ffff5bc7f02 in GI_assert_fail (
assertion=0x62be3b8 "inited NONE || (inited RND && scan)",
file=0x62bce28 "sql/handler.cc",
line=3151, function=0x62be398 "int handler::ha_rnd_init(bool)")
at assert.c:101
#4 0x000000000358db35 in handler::ha_rnd_init (this=0x7fff34047850, scan=true)
at sql/handler.cc:3151
#5 0x0000000003b0f0b2 in Materialized_cursor::open (this=0x7fff341017c8,
thd=0x7fff34000ec0)
at sql/sql_cursor.cc:381
#6 0x0000000003b0eab7 in mysql_open_cursor (thd=0x7fff34000ec0,
result=0x7fff340d4248, pcursor=0x7fff340d4238)
at sql/sql_cursor.cc:286
#7 0x0000000003a7a6ee in sp_cursor::open (this=0x7fff340d4230,
thd=0x7fff34000ec0)

二、问题调查过程

1、8.0.32版本core问题调查

打开游标的时候内部会创建临时表用于保存结果数据,因此先看一下上面打开游标的代码执行流程:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从上面流程图可以看出,执行查询的时候临时表进行了索引初始化,但是没有进行关闭,接着在打开游标的时候又进行了一次初始化,于是core了。

2、8.4.4版本core问题调查

8.4.4版本要分2个场景讨论,首先第一个不core的场景,也就是optimizer_switch='HASH_SET_OPERATIONS=on'的场景,从代码看跟8032版本不同处在于Query_result_materialize::start_execution的时候,table->share->keys数量等于0,而8032版本这个地方的keys数量等于1。因此在8.4.4版本table->file->ha_index_init的时候inited没有设置为INDEX而是保持为NONE,后面打开游标的时候初始化不会core。

bool instantiate_tmp_table(THD thd, TABLE table) {
  // Ensure that "in_use" is synchronized with the current session
  assert(table->in_use nullptr || table->in_use thd);
  table->in_use = thd;
  TABLE_SHARE *const share = table->s;
  // 跟8032代码相比多了这一行,这里把keys值设为0,因此后面临时表不创建索引,也就不会导致打开cursor的core。
  if (table->uses_hash_map()) share->keys = 0;

而optimizer_switch='HASH_SET_OPERATIONS=off'的时候,代码流程跟8032一样,因此原因跟上图一致。

3、总结问题

对比上面1和2可以发现,8.4.4版本开启HASH_SET_OPERATIONS开关只是规避了问题,并没有解决问题。因此这个导致core的问题始终存在。

三、问题解决

结合上面分析,我们可以在第一次table->file->ha_index_init执行之后到结束的时候调用ha_index_end就可以了,这样接下来打开游标的时候引擎状态就是NONE,就不会core了。

添加如下代码,就可以解决这个问题了。

bool Query_result_materialize::send_eof(THD *) {
  bool rc = false;
  if (table->hash_field && table->file->inited == handler::INDEX)
    rc = table->file->ha_index_end();
  return rc;
}

修改之后的代码调用流程如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图绿色部分为修复新增的代码,当查询结束的时候执行一次索引状态重置,问题解决。

接着执行上面的查询,发现可以查出结果了。

greatsql> call p1;
+------+
| v.a  |
+------+
| 2    |
+------+
1 row in set (0.01 sec)
+------+
| v.a  |
+------+
| 6    |
+------+
1 row in set (0.01 sec)

四、问题总结

通过以上分析我们可以发现,执行带有 MINUS 和 INTERSECT 联合查询的cursor的时候,游标储存结果的临时表的索引状态会多次改变,如果索引状态的开启和结束没有配套设置的话,会影响后面 cursor 的打开。同时,不同版本的 MySQL 会有不同情况,像本次例子中,HASH_SET_OPERATIONS 开关也会对结果有影响。这就需要研发人员耐心多看代码,多尝试不同情况的查询 SQL 来分析问题,而不是看到某一种场景没问题了以为 BUG 修复了,那样会导致潜在 BUG 流出,造成后续的更多影响。

C# 移动无标题栏无边框窗体的3种方法 目录 第一种:手工移动 第二种:调用系统API 1.引入下面代码 前提需要引入命名空间using System.Runtime.InteropServices 2.增加鼠标按下事件发送消息,让系统误以为按下是标题栏 第三种,重写 WndProc 第一种:手工移动 直接通过修改窗体位置从而达到移动窗体的效果 //定义一个位置信息Point用于存储鼠标位置 private Point mPoint; /// <summary> 阅读详情

相关推荐

Windows10内核逆向-2-KiSystemCall64的调用流程剖析

本文深入剖析了Windows 10 x64系统中KiSystemCall64函数的完整调用流程。从用户态触发syscall指令开始,详细讲解了如何通过swapgs切换内核栈、构建KTRAP_FRAME陷阱帧、进行SMAP/CFG等安全检查,到最终通过SSDT寻址并执行目标系统服务的全过程,揭示了系统调用从Ring 3到Ring 0切换的核心机制与安全设计。

weixin_29209805的博客 82

Delphi无标题窗体增强功能实现:让无标题窗体更具交互性

Delphi无标题窗体增强功能实现:让无标题窗体更具交互性 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在软件开发领域,Delphi 语言因其高效的执行速度和清晰的语法结构,一直受到开发者的喜爱。然而,在使用无标题窗体(borderstyle=bsnone)时,开发者常常面临一个问题:用户无法通过常规方式来移动或调整窗体大小。本项目正是为了解决这一难题而诞生,它提供...

gitblog_06708的博客 1021

【商业化】【msix打包】Python 应用打包为 MSIX 的正确流程:入口点问题与解决方案

发现用msix打包工具打包python做的exe时总找不到程序入口点,后来理了一下才发现自己误会了,需要先生成一个基本的setup.exe,msix的打包是基于这个初始的安装程序进行的。只需要点击Buile-》Compile,然后Open Output Folder就可以得到exe安装程序了。可以使用免费工具inno setup来创建初始安装包。其中{group}这样的变量会自动匹配,不用自己指定。如果点击Run会运行安装程序。

每日出拳老爷子的博客 1103

无标题栏窗口拖动的实现

普通的Windows应用程序窗口都具有统一的窗口风格,它们一般都包括:用户区和非用户区两部分。非用户区包括标题条、窗口边框、最大化按钮、最小化按钮、关闭按钮和系统默认的快捷键及鼠标支持等。利用鼠标的左键通过拖动窗口的标题条可以在屏幕上任意移动整个窗口,当光标停止在窗口边框上时可以改变窗口的大小。在一些比较经典的软件中,有一类特殊的无标题条的窗口。这种窗口不需要改变窗口的大小,但必须具有窗口客户区域

ArduousBonze的专栏 4059

【Qualcomm高通音频】音效调试_录音文件播放有杂音,如何定位原因?

一、录音播放数据处理过程介绍 (1)TX方向 麦克风(硅麦克风或者主机体麦克风)采集模拟音频信号,经过内部CODEC芯片中的adc转换为数字信号,在经过高通音频DSP处理音效后编码为wav/aac/amr/mp3等格式文件。 (2)RX方向 音频文件经过解码、重采样还原为pcm数据,经过DSP处理音效后送到内部CODEC,然后经过DAC转换为模拟信号,送到喇叭。 二、分析步骤 1...

crow_ch的博客 5971

避开封号风险!wxauto+Claude API实现微信智能客服的合规方案

本文详细介绍了如何利用wxauto和Claude API构建合规的微信智能客服系统,避免封号风险。通过技术选型对比、防封策略设计及大模型接入实践,为企业提供了一套安全高效的解决方案,特别适合中小企业在微信生态中部署AI客服。

sql99的博客 446

无标题窗口的拖动

普通的Windows应用程序窗口都具有统一的窗口风格,它们一般都包括:用户区和非用户区两部分。非用户区包括标题条、窗口边框、最大化按钮、最小化按钮、关闭按钮和系统默认的快捷键及鼠标支持等。利用鼠标的左键通过拖动窗口的标题条可以在屏幕上任意移动整个窗口,当光标停止在窗口边框上时可以改变窗口的大小。在一些比较经典的软件中,有一类特殊的无标题条的窗口。这种窗口不需要改变窗口的大小,但必须具有窗口客户区域

lianxiao1314的专栏 1000

二维otsu算法python_OpenCV-Python系列之OTSU算法

上一个教程中,我们谈到了关于图像二值化的两种方法,一种是固定阈值法,另一种是自适应阈值法,总的来说,自适应阈值法在某些方面要由于固定阈值法,但还没完,这次我们将隆重介绍我们的重量级选手,也就是OTSU算法(又称为大津算法和最大类间方差法)。最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU,是一种基于全局的二值化算法,它是根据图像的灰度特性,将图像...

weixin_28834169的博客 1426

C#拖动无标题栏窗体

很长时间没有写博客了,今天又解决并测试通过了一个Delphi很简单的问题——无标题栏窗体的拖动 。其实是个很简单的问题,但是还是想写下来,一方面加深自己的记忆,一方面与朋友们分享!DeviceAnywhere在Ioicn发布了,反响似乎一般,我想是因为.net FrameWork环境的问题吧,希望Microsoft再出sp的时候把.net FrameWorkx.x集成到操作系统里吧,这样大家都方便

Windows Mobile 开发历险 1959

Apollo control模块横向控制原理及核心代码逐行解析

看完这篇文章,你会对apollo横向控制有一个整体的概念

weixin_39199083的博客 2万+

#systemverilog# 之 event region 和 timeslot 仿真调度(三)Verdi 辅助查看

通过今天的学习,我们知道:event region 是event sequence 的全集。我们打开了 event region feature 也就开启了event sequence 的功能。

那么菜的博客 1365

android设置activity全屏 | 无标题

1.设置activity无标题 方法一: 在Manifest.xml中为activity增加属性:  android:theme="@android:style/Theme.NoTitleBar" 方法二: 在activity的onCreate()中加入:requestWindowFeature(Window.FEATURE_NO_TITLE); 2.设置activity全屏

CNnumen 1万+

从 OPEN CURSOR 到 SELECT INTO TABLE:把 ABAP 数据读取的底层机制与性能差异讲透

ABAP数据库访问性能优化关键点 摘要:ABAP程序性能的核心在于数据读取方式的选择。本文分析了三种常见数据库访问方式的技术原理:显式游标(CURSOR)、SELECT-ENDSELECT循环和SELECT INTO TABLE。重点揭示了数据从数据库到应用服务器的传输机制,包括OPEN/REOPEN与FETCH操作、Array Fetch批量传输原理以及SAP游标缓存机制。通过VBAK表的性能测试数据对比,证明了不同场景下最优访问方式的选择依据:大数据量时显式游标性能优势明显,而SELECT INTO T

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 172

C#中的无标题栏窗体

所以谓的无标题栏窗体,与标题无关,看边框设置将窗体的FormBorderStyle属性设置为None就可以了,其它的一些属性只是一些显示样式.关于无标题栏窗体的拖动就用傻办法,至少我看到的都是这样的.关于这一方面的介绍不少,我就不在这里缀述了,如果有想要示例的,可以留下邮箱.

fqlove的专栏 1444

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android应用设置无标题栏的实现方式

去掉标题栏   第一,在代码中实现; requestWindowFeature(Window.FEATURE_NO_TITLE); 代码要写在setContentView()前。 第二,在xml文件中进行配置; 调用系统自带的样式; 实现全屏效果: android:theme="@android:style/Theme.NoTitleBar.Fullscree

三颗猴面包树 1500

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

delphi技巧——移动无标题窗口

 delphi技巧——移动无标题窗口关键词:移动,消息,无标题                      作者:朱能文   我们都知道windows是通过标题栏来移动窗体的,当我们在标题栏上按下鼠标左键时,windows将发送wM_NCHitTest消息,来告诉系统要移动窗体。但我们在实际编程时,有时为了界面的需要或特殊的要求,窗体没有标题栏,我们必须通过程序来移动窗体。下面我将介

nwen的专栏 1282

Delphi 无标题窗体增强功能实现

Delphi 无标题窗体增强功能实现 去发现同类优质开源项目:https://gitcode.com/ 资源简介 本资源提供了一种在 Delphi 开发环境中对无标题窗体(borderstyle=bsnone)进行增强的方法。默认情况下,无标题窗体不显示边框,用户无法通过常规方式移动或调整窗体大小。本资源通过特定的技术手段,为无标题窗体添加了边框,同时实现了窗体的拖拽调整大小和移动位置的功能。 功...

gitblog_06743的博客 433

Android 设置无标题栏(全屏)的两种方式

Android开发中,新建一个Activity默认情况会显示Title栏,如下图状态栏下层的应用图标和应用名。为了美观,我们通常会设置Activity无标题来隐藏Tittle栏。                                                                                             设置Activity无标题的方式

ArielYu's Blog 3529

android 设置为无标题,android无标题全屏的三种设置方式

注意,在设置前把XXX-Activity extends ActionBarActivity 修改成XXX-Activity extends Activity,否则activity无法启动1.在onCreat方法中setContentView()之前插入//设置无标题requestWindowFeature(Window.FEATURE_NO_TITLE);//设置全屏getWindow().s...

weixin_35398679的博客 825

移动无标题栏的窗口-java

import java.awt.Point; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener;

Ymy2011的专栏 591

android ActionBarActivity设置全屏无标题

新建的Activity继承自ActionBarActivity,设置全屏无标题本来很简单的事,但是没想到app竟然无缘无故的挂,要么就是白屏一片,要么就是黑屏。坑了我一个多小时!!! 原因是ActionBarActivity设置theme的时候只能使用v7包里的Theme.AppCompat***开头的主题,因此设置全屏无标题的话需要自定义个style: name="ActionBar

奥特曼超人的博客专栏 2274

android手机设置无标题后,程序挂掉 解决 (如何用最简短语句设置 手机 全屏无标题)

手机设置无标题后,总是挂掉,最初以为是布局的问题,换了还是不中,然后新建一个工程,发现还是不中!怎么回事?我以前是搞过着的啊,原来设置全屏无标题,这些语句一定要设在setContentView前面!谨记啊! 还是对这些知识不熟悉,所以我写到这,复习下! 设置无标题+全屏: requestWindowFeature(Window.FEATURE_NO_TITLE); int flag = Wi

yanzi1225627的专栏 3032

Android设置无标题窗口

在android中,有的时候要做一个无标题的窗口,包括没状态栏的,有两种方法实现:  1 在XML配置文件中:             package="de.vogella.android.temperature"        android:versionCode="1"        android:versionName="1.0">

Bottle's Blog 6万+

界面_无标题窗口的移动

使用OnNcHitTest消息实现无标题窗口的移动////////////////////////////////////////////////////////////UINT myWnd::OnNcHitTest(CPoint point){ // TODO: 在此添加消息处理程序代码和/或调用默认值 // rect 指定,鼠标点在什么地方时,可以移动窗口 // 其实就是把这部分区域当成是 标

2057
上一篇: GreatSQL MGR三节点基于时间点恢复
下一篇: 一次由隐藏大页配置引发的数据库OOM故障分析
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值