|
Страници по тази тема: 1 | 2 | >> (покажи всички)
Тема
|
MySQL :: Stored Functions
|
|
Автор |
Dakota (erotoman) |
Публикувано | 14.04.05 12:36 |
|
Покрай на OLD FIEND, ми хрумна да си поиграя малко със съхранените функции в MySQL, но се натъкнах на нещо малко неочаквано. Не съм сигурен дали грешката е в мен или в MySQL, защото съм писал съхранени функции само на PostgreSQL досега, но ето какво става:
mysql> create table test (id int unsigned auto_increment primary key, name varchar(10));
Query OK, 0 rows affected (0.10 sec)
mysql> insert into test (name) values ('A'), ('B'), ('C');
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from test;
+----+------+
| id | name |
+----+------+
| 1 | A |
| 2 | B |
| 3 | C |
+----+------+
3 rows in set (0.00 sec)
mysql> set @x := 1;
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter //
mysql> create function inc () returns int
-> begin
-> set @x := @x + 1;
-> return @x;
-> end
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> select inc();
+-------+
| inc() |
+-------+
| 2 |
+-------+
1 row in set (0.01 sec)
mysql> select inc();
+-------+
| inc() |
+-------+
| 3 |
+-------+
1 row in set (0.01 sec)
mysql> select inc();
+-------+
| inc() |
+-------+
| 4 |
+-------+
1 row in set (0.00 sec)
mysql> select inc();
+-------+
| inc() |
+-------+
| 5 |
+-------+
1 row in set (0.00 sec)
mysql> select inc();
+-------+
| inc() |
+-------+
| 6 |
+-------+
1 row in set (0.00 sec)
mysql> select id, name, inc() from test;
ERROR 2013 (HY000): Lost connection to MySQL server during query
mysql> select id, name, inc() from test;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
ERROR:
Can't connect to the server
Everything louder than everything else...Редактирано от Dakota на 14.04.05 12:38.
| |
Тема
|
Re: Е защо не го пусна в bugs.mysql.com ?
[re: Dakota]
|
|
Автор |
salle (един такъв) |
Публикувано | 14.04.05 15:41 |
|
Сървърът очевидно гърми и това трябва да се поправи.
Най смахнатото е, че не ще да гръмне под gdb :(
Много мразя такива бъгове дето не дават да ги дебъгваш
| |
Тема
|
Re: Е защо не го пусна в bugs.mysql.com ?
[re: salle]
|
|
Автор |
Dakota (erotoman) |
Публикувано | 14.04.05 15:53 |
|
Ще го пусна, но исках да съм сигурен, че не е bogus.
Everything louder than everything else...
| |
Тема
|
Re: Недей! вече го направих
[re: Dakota]
|
|
Автор |
salle (един такъв) |
Публикувано | 14.04.05 16:24 |
|
| |
Тема
|
Re: Недей! вече го направих
[re: Dakota]
|
|
Автор |
salle (един такъв) |
Публикувано | 14.04.05 16:24 |
|
| |
Тема
|
Re: Между другото благодаря!
[re: Dakota]
|
|
Автор |
salle (един такъв) |
Публикувано | 14.04.05 16:40 |
|
Мерси, че каза за този бъг. Колегите вече умуват какво да го правят.
Въпросната случка е комбинация от "user defined variable" и извикване на такава във функция при това за всеки ред от таблица.
Друг път като ти гръмне mysqld не се чуди дали проблема е в теб :)
Между другото ще те помоля да добавиш коментар на http://bugs.mysql.com/9902 и д акажеш с каква ОС гърми при теб защото нещо колегите не успяват да го повторят
| |
Тема
|
Re: Между другото благодаря!
[re: salle]
|
|
Автор |
Dakota (erotoman) |
Публикувано | 14.04.05 17:14 |
|
Добре, че refresh-нах клубчетата преди да събмитна в бъгс, че щеше да стане кофти дублиране...
Добавих и коментар, с Windows NT и MySQL 5.0.3 съм, свалено и инсталирано вчера от огледалото на Online.
Everything louder than everything else...
| |
Тема
|
кеширане на функциите
[re: Dakota]
|
|
Автор |
Dakota (erotoman) |
Публикувано | 14.04.05 22:08 |
|
Във връзка с разкритията по бъга се сетих да питам MySQL планира ли да осъществи някакво кеширане на функциите? Това не знам изобщо дали е стандартно, но в PostgreSQL има три опции (IMMUTABLE, STABLE и VOLATILE), които указват по какъв начин извикването на функцията да се оптимизира.
Та, в конкретния случай inc() трябва да се дефинира като некешируема, т.е. VOLATILE.
Надявам се да не се приеме като заяждане, но наистина има отношение към решаването на бъга.
А и не съм съвсем наясно с вътрешната имплементация на кеширането в MySQL и съответно - връзката с функциите.
Everything louder than everything else...Редактирано от Dakota на 14.04.05 22:10.
| |
Тема
|
Re: кеширане на функциите
[re: Dakota]
|
|
Автор |
salle (един такъв) |
Публикувано | 15.04.05 02:43 |
|
Надявам се да не се приеме като заяждане, но MySQL стриктно следва стандарта по отношение на съхранените Процедури и[ Функции като се започне от това, че поддържа и двата вида (И Процедури и Функции)
Никъде в стандарта поне до SQL 92 не се споменават ключови думи IMMUTABLE, STABLE и VOLATILE така, че не виждам защо да трябва да се дефинира функцията по нестандартен начин.
Честно казано ми е омръзнало да чета как понеже в PostgreSQL или в Oracle или в MSSQL това се прави така значи е правилно
Ами аз няма да твърдя, че в MySQL нещата са правилни, но пък ще си позволя удоволствието да се наслаждавам тихичко на опитите на много хора да си завъртят аргументите на 180 градуса от "MySQL грубо нарушава стандарта" на "Е да де то това MySQL го прави по стандарта ама той стандарта е глупав ..."
Колкото до "вътрешната имплементация на кеширането" - кеширането на кое?
Защото те кешовете в MySQL не са един и два. И нито един от тях не е стандартен между другото.
| |
Тема
|
Re: кеширане на функциите
[re: salle]
|
|
Автор |
phpGuru (член) |
Публикувано | 15.04.05 10:48 |
|
според мен mysql си смени политиката към по-стрикно спазване на стандарта, а не хората мнението :-)
а какво наричаш нестандартен кеш (в спецификациите пише ли, кое може да се кешира и не) не е ли важното резултата да е ОК, а не как е постигнат (т.е. с кеш или без кеш)?
| |
|
Страници по тази тема: 1 | 2 | >> (покажи всички)
|
|
|